James Moger
2012-10-01 eb1405f736f2f98e14215774dd53eea9b9a77017
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 static org.junit.Assert.assertEquals;
87ee94 19 import static org.junit.Assert.assertFalse;
JM 20 import static org.junit.Assert.assertTrue;
d896e6 21
JM 22 import java.util.ArrayList;
874be0 23 import java.util.HashMap;
d896e6 24 import java.util.List;
874be0 25 import java.util.Map;
d896e6 26
JM 27 import org.eclipse.jgit.lib.Repository;
28 import org.junit.Test;
29
30 import com.gitblit.LuceneExecutor;
40ca5c 31 import com.gitblit.models.RefModel;
JM 32 import com.gitblit.models.RepositoryModel;
d896e6 33 import com.gitblit.models.SearchResult;
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.
40  * 
41  * @author James Moger
42  * 
43  */
44 public class LuceneExecutorTest {
45
46     private LuceneExecutor newLuceneExecutor() {
874be0 47         Map<String, Object> map = new HashMap<String, Object>();
JM 48         MemorySettings settings = new MemorySettings(map);        
49         return new LuceneExecutor(settings, GitBlitSuite.REPOSITORIES);
d896e6 50     }
JM 51     
40ca5c 52     private RepositoryModel newRepositoryModel(Repository repository) {        
JM 53         RepositoryModel model = new RepositoryModel();
1aa6e0 54         model.name = FileUtils.getRelativePath(GitBlitSuite.REPOSITORIES, repository.getDirectory());
40ca5c 55         model.hasCommits = JGitUtils.hasCommits(repository);
JM 56         
57         // index all local branches
58         model.indexedBranches = new ArrayList<String>();
59         for (RefModel ref : JGitUtils.getLocalBranches(repository, true, -1)) {
60             model.indexedBranches.add(ref.getName());
61         }
62         return model;
d896e6 63     }
JM 64     
65     @Test
66     public void testIndex() throws Exception {
67         LuceneExecutor lucene = newLuceneExecutor();
68         
69         // reindex helloworld
70         Repository repository = GitBlitSuite.getHelloworldRepository();
40ca5c 71         RepositoryModel model = newRepositoryModel(repository);
JM 72         lucene.reindex(model, repository);
d896e6 73         repository.close();
JM 74         
d04009 75         SearchResult result = lucene.search("type:blob AND path:bit.bit", 1, 1, model.name).get(0);        
d896e6 76         assertEquals("Mike Donaghy", result.author);
d04009 77         result = lucene.search("type:blob AND path:clipper.prg", 1, 1, model.name).get(0);        
d896e6 78         assertEquals("tinogomes", result.author);        
JM 79
80         // reindex theoretical physics
81         repository = GitBlitSuite.getTheoreticalPhysicsRepository();
40ca5c 82         model = newRepositoryModel(repository);
JM 83         lucene.reindex(model, repository);
d896e6 84         repository.close();
JM 85         
86         // reindex JGit
87         repository = GitBlitSuite.getJGitRepository();
40ca5c 88         model = newRepositoryModel(repository);
JM 89         lucene.reindex(model, repository);
d896e6 90         repository.close();
JM 91         
92         lucene.close();
93     }
94
95     @Test
96     public void testQuery() throws Exception {
97         LuceneExecutor lucene = new LuceneExecutor(null, GitBlitSuite.REPOSITORIES);
98         
99         // 2 occurrences on the master branch
100         Repository repository = GitBlitSuite.getHelloworldRepository();                
40ca5c 101         RepositoryModel model = newRepositoryModel(repository);
d896e6 102         repository.close();
JM 103         
d04009 104         List<SearchResult> results = lucene.search("ada", 1, 10, model.name);
d896e6 105         assertEquals(2, results.size());
JM 106         for (SearchResult res : results) {
107             assertEquals("refs/heads/master", res.branch);
108         }
109
110         // author test
d04009 111         results = lucene.search("author: tinogomes AND type:commit", 1, 10, model.name);
d896e6 112         assertEquals(2, results.size());
JM 113         
114         // blob test
d04009 115         results = lucene.search("type: blob AND \"import std.stdio\"", 1, 10, model.name);
d896e6 116         assertEquals(1, results.size());
JM 117         assertEquals("d.D", results.get(0).path);
118         
119         // 1 occurrence on the gh-pages branch
120         repository = GitBlitSuite.getTheoreticalPhysicsRepository();
40ca5c 121         model = newRepositoryModel(repository);
d896e6 122         repository.close();
JM 123         
d04009 124         results = lucene.search("\"add the .nojekyll file\"", 1, 10, model.name);
d896e6 125         assertEquals(1, results.size());
JM 126         assertEquals("Ondrej Certik", results.get(0).author);
127         assertEquals("2648c0c98f2101180715b4d432fc58d0e21a51d7", results.get(0).commitId);
128         assertEquals("refs/heads/gh-pages", results.get(0).branch);
129         
d04009 130         results = lucene.search("type:blob AND \"src/intro.rst\"", 1, 10, model.name);
d896e6 131         assertEquals(4, results.size());
JM 132         
133         // hash id tests
d04009 134         results = lucene.search("commit:57c4f26f157ece24b02f4f10f5f68db1d2ce7ff5", 1, 10, model.name);
d896e6 135         assertEquals(1, results.size());
JM 136
d04009 137         results = lucene.search("commit:57c4f26f157*", 1, 10, model.name);
d896e6 138         assertEquals(1, results.size());        
JM 139         
140         // annotated tag test
141         repository = GitBlitSuite.getJGitRepository();
40ca5c 142         model = newRepositoryModel(repository);
d896e6 143         repository.close();
JM 144         
d04009 145         results = lucene.search("I663208919f297836a9c16bf458e4a43ffaca4c12", 1, 10, model.name);
d896e6 146         assertEquals(1, results.size());
JM 147         assertEquals("[v1.3.0.201202151440-r]", results.get(0).tags.toString());        
148         
149         lucene.close();
150     }
151     
152     @Test
153     public void testMultiSearch() throws Exception {
154         LuceneExecutor lucene = newLuceneExecutor();
155         List<String> list = new ArrayList<String>();
156         Repository repository = GitBlitSuite.getHelloworldRepository();
40ca5c 157         list.add(newRepositoryModel(repository).name);
d896e6 158         repository.close();
JM 159
160         repository = GitBlitSuite.getJGitRepository();
40ca5c 161         list.add(newRepositoryModel(repository).name);
d896e6 162         repository.close();
JM 163
d04009 164         List<SearchResult> results = lucene.search("test", 1, 10, list);
d896e6 165         lucene.close();
JM 166         assertEquals(10, results.size());
167     }
87ee94 168     
JM 169     @Test
170     public void testDeleteBlobFromIndex() throws Exception {
171         // start with a fresh reindex of entire repository
874be0 172         LuceneExecutor lucene = newLuceneExecutor();
87ee94 173         Repository repository = GitBlitSuite.getHelloworldRepository();
JM 174         RepositoryModel model = newRepositoryModel(repository);
175         lucene.reindex(model, repository);
176         
177         // now delete a blob
178         assertTrue(lucene.deleteBlob(model.name, "refs/heads/master", "java.java"));
179         assertFalse(lucene.deleteBlob(model.name, "refs/heads/master", "java.java"));
180     }
d896e6 181 }