Paul Martin
2016-04-16 eecaad8b8e2c447429c31a01d49260ddd6b4ee03
commit | author | age
d896e6 1 /*
JM 2  * Copyright 2012 gitblit.com.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.gitblit.tests;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import org.eclipse.jgit.lib.Repository;
2aa131 22 import org.junit.After;
JM 23 import org.junit.Before;
d896e6 24 import org.junit.Test;
JM 25
cacf8b 26 import com.gitblit.Keys;
eecaad 27 import com.gitblit.manager.FilestoreManager;
95cdba 28 import com.gitblit.manager.RepositoryManager;
JM 29 import com.gitblit.manager.RuntimeManager;
30 import com.gitblit.manager.UserManager;
40ca5c 31 import com.gitblit.models.RefModel;
JM 32 import com.gitblit.models.RepositoryModel;
d896e6 33 import com.gitblit.models.SearchResult;
7bf6e1 34 import com.gitblit.service.LuceneService;
874be0 35 import com.gitblit.tests.mock.MemorySettings;
1aa6e0 36 import com.gitblit.utils.FileUtils;
40ca5c 37 import com.gitblit.utils.JGitUtils;
fc3a39 38 import com.gitblit.utils.XssFilter;
JM 39 import com.gitblit.utils.XssFilter.AllowXssFilter;
d896e6 40
JM 41 /**
42  * Tests Lucene indexing and querying.
c00577 43  *
d896e6 44  * @author James Moger
c00577 45  *
d896e6 46  */
db4f6b 47 public class LuceneExecutorTest extends GitblitUnitTest {
d896e6 48
7bf6e1 49     LuceneService lucene;
c00577 50
7bf6e1 51     private LuceneService newLuceneExecutor() {
cacf8b 52         MemorySettings settings = new MemorySettings();
JM 53         settings.put(Keys.git.repositoriesFolder, GitBlitSuite.REPOSITORIES);
fc3a39 54         XssFilter xssFilter = new AllowXssFilter();
JM 55         RuntimeManager runtime = new RuntimeManager(settings, xssFilter, GitBlitSuite.BASEFOLDER).start();
ca4d98 56         UserManager users = new UserManager(runtime, null).start();
eecaad 57         RepositoryManager repos = new RepositoryManager(runtime, null, users, null);
PM 58         //TODO: May need filestore
59         return new LuceneService(settings, repos, null);
d896e6 60     }
c00577 61
JM 62     private RepositoryModel newRepositoryModel(Repository repository) {
40ca5c 63         RepositoryModel model = new RepositoryModel();
1aa6e0 64         model.name = FileUtils.getRelativePath(GitBlitSuite.REPOSITORIES, repository.getDirectory());
40ca5c 65         model.hasCommits = JGitUtils.hasCommits(repository);
c00577 66
40ca5c 67         // index all local branches
JM 68         model.indexedBranches = new ArrayList<String>();
69         for (RefModel ref : JGitUtils.getLocalBranches(repository, true, -1)) {
70             model.indexedBranches.add(ref.getName());
71         }
72         return model;
d896e6 73     }
c00577 74
2aa131 75     @Before
JM 76     public void setup() {
77         lucene = newLuceneExecutor();
78     }
c00577 79
2aa131 80     @After
JM 81     public void tearDown() {
82         lucene.close();
83     }
c00577 84
d896e6 85     @Test
f8f6aa 86     public void testIndex() {
d896e6 87         // reindex helloworld
JM 88         Repository repository = GitBlitSuite.getHelloworldRepository();
40ca5c 89         RepositoryModel model = newRepositoryModel(repository);
JM 90         lucene.reindex(model, repository);
d896e6 91         repository.close();
c00577 92
JM 93         SearchResult result = lucene.search("type:blob AND path:bit.bit", 1, 1, model.name).get(0);
d896e6 94         assertEquals("Mike Donaghy", result.author);
c00577 95         result = lucene.search("type:blob AND path:clipper.prg", 1, 1, model.name).get(0);
JM 96         assertEquals("tinogomes", result.author);
d896e6 97
JM 98         // reindex JGit
99         repository = GitBlitSuite.getJGitRepository();
40ca5c 100         model = newRepositoryModel(repository);
JM 101         lucene.reindex(model, repository);
d896e6 102         repository.close();
JM 103     }
104
105     @Test
106     public void testQuery() throws Exception {
107         // 2 occurrences on the master branch
c00577 108         Repository repository = GitBlitSuite.getHelloworldRepository();
40ca5c 109         RepositoryModel model = newRepositoryModel(repository);
d896e6 110         repository.close();
c00577 111
d04009 112         List<SearchResult> results = lucene.search("ada", 1, 10, model.name);
d896e6 113         assertEquals(2, results.size());
JM 114         for (SearchResult res : results) {
115             assertEquals("refs/heads/master", res.branch);
116         }
117
118         // author test
d04009 119         results = lucene.search("author: tinogomes AND type:commit", 1, 10, model.name);
d896e6 120         assertEquals(2, results.size());
c00577 121
d896e6 122         // blob test
d04009 123         results = lucene.search("type: blob AND \"import std.stdio\"", 1, 10, model.name);
d896e6 124         assertEquals(1, results.size());
JM 125         assertEquals("d.D", results.get(0).path);
c00577 126
2aa131 127         // commit test
d896e6 128         repository = GitBlitSuite.getJGitRepository();
40ca5c 129         model = newRepositoryModel(repository);
d896e6 130         repository.close();
c00577 131
2aa131 132         results = lucene.search("\"initial jgit contribution to eclipse.org\"", 1, 10, model.name);
JM 133         assertEquals(1, results.size());
134         assertEquals("Git Development Community", results.get(0).author);
135         assertEquals("1a6964c8274c50f0253db75f010d78ef0e739343", results.get(0).commitId);
136         assertEquals("refs/heads/master", results.get(0).branch);
c00577 137
2aa131 138         // hash id tests
JM 139         results = lucene.search("type:commit AND commit:1a6964c8274c50f0253db75f010d78ef0e739343", 1, 10, model.name);
140         assertEquals(1, results.size());
141
142         results = lucene.search("type:commit AND commit:1a6964c8274*", 1, 10, model.name);
143         assertEquals("Shawn O. Pearce", results.get(0).committer);
c00577 144         assertEquals(1, results.size());
JM 145
2aa131 146         // annotated tag test
d04009 147         results = lucene.search("I663208919f297836a9c16bf458e4a43ffaca4c12", 1, 10, model.name);
d896e6 148         assertEquals(1, results.size());
c00577 149         assertEquals("[v1.3.0.201202151440-r]", results.get(0).tags.toString());
d896e6 150     }
c00577 151
d896e6 152     @Test
JM 153     public void testMultiSearch() throws Exception {
154         List<String> list = new ArrayList<String>();
155         Repository repository = GitBlitSuite.getHelloworldRepository();
40ca5c 156         list.add(newRepositoryModel(repository).name);
d896e6 157         repository.close();
JM 158
159         repository = GitBlitSuite.getJGitRepository();
40ca5c 160         list.add(newRepositoryModel(repository).name);
d896e6 161         repository.close();
JM 162
d04009 163         List<SearchResult> results = lucene.search("test", 1, 10, list);
d896e6 164         assertEquals(10, results.size());
JM 165     }
c00577 166
87ee94 167     @Test
JM 168     public void testDeleteBlobFromIndex() throws Exception {
169         // start with a fresh reindex of entire repository
170         Repository repository = GitBlitSuite.getHelloworldRepository();
171         RepositoryModel model = newRepositoryModel(repository);
172         lucene.reindex(model, repository);
c00577 173
87ee94 174         // now delete a blob
JM 175         assertTrue(lucene.deleteBlob(model.name, "refs/heads/master", "java.java"));
176         assertFalse(lucene.deleteBlob(model.name, "refs/heads/master", "java.java"));
177     }
d896e6 178 }