James Moger
2014-06-09 ca4d98678c20e4033fdaca09ecbbf0f5952e0b84
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;
95cdba 27 import com.gitblit.manager.RepositoryManager;
JM 28 import com.gitblit.manager.RuntimeManager;
29 import com.gitblit.manager.UserManager;
40ca5c 30 import com.gitblit.models.RefModel;
JM 31 import com.gitblit.models.RepositoryModel;
d896e6 32 import com.gitblit.models.SearchResult;
7bf6e1 33 import com.gitblit.service.LuceneService;
874be0 34 import com.gitblit.tests.mock.MemorySettings;
1aa6e0 35 import com.gitblit.utils.FileUtils;
40ca5c 36 import com.gitblit.utils.JGitUtils;
d896e6 37
JM 38 /**
39  * Tests Lucene indexing and querying.
c00577 40  *
d896e6 41  * @author James Moger
c00577 42  *
d896e6 43  */
db4f6b 44 public class LuceneExecutorTest extends GitblitUnitTest {
d896e6 45
7bf6e1 46     LuceneService lucene;
c00577 47
7bf6e1 48     private LuceneService newLuceneExecutor() {
cacf8b 49         MemorySettings settings = new MemorySettings();
JM 50         settings.put(Keys.git.repositoriesFolder, GitBlitSuite.REPOSITORIES);
f8f6aa 51         RuntimeManager runtime = new RuntimeManager(settings, GitBlitSuite.BASEFOLDER).start();
ca4d98 52         UserManager users = new UserManager(runtime, null).start();
JM 53         RepositoryManager repos = new RepositoryManager(runtime, null, users);
7bf6e1 54         return new LuceneService(settings, repos);
d896e6 55     }
c00577 56
JM 57     private RepositoryModel newRepositoryModel(Repository repository) {
40ca5c 58         RepositoryModel model = new RepositoryModel();
1aa6e0 59         model.name = FileUtils.getRelativePath(GitBlitSuite.REPOSITORIES, repository.getDirectory());
40ca5c 60         model.hasCommits = JGitUtils.hasCommits(repository);
c00577 61
40ca5c 62         // index all local branches
JM 63         model.indexedBranches = new ArrayList<String>();
64         for (RefModel ref : JGitUtils.getLocalBranches(repository, true, -1)) {
65             model.indexedBranches.add(ref.getName());
66         }
67         return model;
d896e6 68     }
c00577 69
2aa131 70     @Before
JM 71     public void setup() {
72         lucene = newLuceneExecutor();
73     }
c00577 74
2aa131 75     @After
JM 76     public void tearDown() {
77         lucene.close();
78     }
c00577 79
d896e6 80     @Test
f8f6aa 81     public void testIndex() {
d896e6 82         // reindex helloworld
JM 83         Repository repository = GitBlitSuite.getHelloworldRepository();
40ca5c 84         RepositoryModel model = newRepositoryModel(repository);
JM 85         lucene.reindex(model, repository);
d896e6 86         repository.close();
c00577 87
JM 88         SearchResult result = lucene.search("type:blob AND path:bit.bit", 1, 1, model.name).get(0);
d896e6 89         assertEquals("Mike Donaghy", result.author);
c00577 90         result = lucene.search("type:blob AND path:clipper.prg", 1, 1, model.name).get(0);
JM 91         assertEquals("tinogomes", result.author);
d896e6 92
JM 93         // reindex JGit
94         repository = GitBlitSuite.getJGitRepository();
40ca5c 95         model = newRepositoryModel(repository);
JM 96         lucene.reindex(model, repository);
d896e6 97         repository.close();
JM 98     }
99
100     @Test
101     public void testQuery() throws Exception {
102         // 2 occurrences on the master branch
c00577 103         Repository repository = GitBlitSuite.getHelloworldRepository();
40ca5c 104         RepositoryModel model = newRepositoryModel(repository);
d896e6 105         repository.close();
c00577 106
d04009 107         List<SearchResult> results = lucene.search("ada", 1, 10, model.name);
d896e6 108         assertEquals(2, results.size());
JM 109         for (SearchResult res : results) {
110             assertEquals("refs/heads/master", res.branch);
111         }
112
113         // author test
d04009 114         results = lucene.search("author: tinogomes AND type:commit", 1, 10, model.name);
d896e6 115         assertEquals(2, results.size());
c00577 116
d896e6 117         // blob test
d04009 118         results = lucene.search("type: blob AND \"import std.stdio\"", 1, 10, model.name);
d896e6 119         assertEquals(1, results.size());
JM 120         assertEquals("d.D", results.get(0).path);
c00577 121
2aa131 122         // commit test
d896e6 123         repository = GitBlitSuite.getJGitRepository();
40ca5c 124         model = newRepositoryModel(repository);
d896e6 125         repository.close();
c00577 126
2aa131 127         results = lucene.search("\"initial jgit contribution to eclipse.org\"", 1, 10, model.name);
JM 128         assertEquals(1, results.size());
129         assertEquals("Git Development Community", results.get(0).author);
130         assertEquals("1a6964c8274c50f0253db75f010d78ef0e739343", results.get(0).commitId);
131         assertEquals("refs/heads/master", results.get(0).branch);
c00577 132
2aa131 133         // hash id tests
JM 134         results = lucene.search("type:commit AND commit:1a6964c8274c50f0253db75f010d78ef0e739343", 1, 10, model.name);
135         assertEquals(1, results.size());
136
137         results = lucene.search("type:commit AND commit:1a6964c8274*", 1, 10, model.name);
138         assertEquals("Shawn O. Pearce", results.get(0).committer);
c00577 139         assertEquals(1, results.size());
JM 140
2aa131 141         // annotated tag test
d04009 142         results = lucene.search("I663208919f297836a9c16bf458e4a43ffaca4c12", 1, 10, model.name);
d896e6 143         assertEquals(1, results.size());
c00577 144         assertEquals("[v1.3.0.201202151440-r]", results.get(0).tags.toString());
d896e6 145     }
c00577 146
d896e6 147     @Test
JM 148     public void testMultiSearch() throws Exception {
149         List<String> list = new ArrayList<String>();
150         Repository repository = GitBlitSuite.getHelloworldRepository();
40ca5c 151         list.add(newRepositoryModel(repository).name);
d896e6 152         repository.close();
JM 153
154         repository = GitBlitSuite.getJGitRepository();
40ca5c 155         list.add(newRepositoryModel(repository).name);
d896e6 156         repository.close();
JM 157
d04009 158         List<SearchResult> results = lucene.search("test", 1, 10, list);
d896e6 159         assertEquals(10, results.size());
JM 160     }
c00577 161
87ee94 162     @Test
JM 163     public void testDeleteBlobFromIndex() throws Exception {
164         // start with a fresh reindex of entire repository
165         Repository repository = GitBlitSuite.getHelloworldRepository();
166         RepositoryModel model = newRepositoryModel(repository);
167         lucene.reindex(model, repository);
c00577 168
87ee94 169         // now delete a blob
JM 170         assertTrue(lucene.deleteBlob(model.name, "refs/heads/master", "java.java"));
171         assertFalse(lucene.deleteBlob(model.name, "refs/heads/master", "java.java"));
172     }
d896e6 173 }