xref: /OpenGrok/opengrok-indexer/src/test/java/org/opengrok/indexer/search/SearchEngineTest.java (revision 9a303f1948b99409943e5b2e00a139a726dbc8d4)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * See LICENSE.txt included in this distribution for the specific
9  * language governing permissions and limitations under the License.
10  *
11  * When distributing Covered Code, include this CDDL HEADER in each
12  * file and include the License file at LICENSE.txt.
13  * If applicable, add the following below this CDDL HEADER, with the
14  * fields enclosed by brackets "[]" replaced with your own identifying
15  * information: Portions Copyright [yyyy] [name of copyright owner]
16  *
17  * CDDL HEADER END
18  */
19 
20 /*
21  * Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights reserved.
22  * Portions Copyright (c) 2018, 2019, Chris Fraire <cfraire@me.com>.
23  */
24 package org.opengrok.indexer.search;
25 
26 import java.io.File;
27 import java.util.Collections;
28 import java.util.TreeSet;
29 
30 import org.junit.jupiter.api.AfterAll;
31 import org.junit.jupiter.api.BeforeAll;
32 import org.junit.jupiter.api.Test;
33 import org.opengrok.indexer.configuration.RuntimeEnvironment;
34 import org.opengrok.indexer.history.HistoryGuru;
35 import org.opengrok.indexer.index.Indexer;
36 import org.opengrok.indexer.util.TestRepository;
37 
38 import org.opengrok.indexer.history.RepositoryFactory;
39 
40 import static org.junit.jupiter.api.Assertions.assertEquals;
41 import static org.junit.jupiter.api.Assertions.assertFalse;
42 import static org.junit.jupiter.api.Assertions.assertNull;
43 import static org.junit.jupiter.api.Assertions.assertTrue;
44 
45 /**
46  * Do basic testing of the SearchEngine.
47  *
48  * @author Trond Norbye
49  */
50 public class SearchEngineTest {
51 
52     static TestRepository repository;
53     static File configFile;
54 
55     @BeforeAll
setUpClass()56     public static void setUpClass() throws Exception {
57         repository = new TestRepository();
58         repository.create(HistoryGuru.class.getResource("/repositories"));
59 
60         RuntimeEnvironment env = RuntimeEnvironment.getInstance();
61         env.setSourceRoot(repository.getSourceRoot());
62         env.setDataRoot(repository.getDataRoot());
63         RepositoryFactory.initializeIgnoredNames(env);
64 
65         env.setSourceRoot(repository.getSourceRoot());
66         env.setDataRoot(repository.getDataRoot());
67         env.setHistoryEnabled(false);
68 
69         Indexer.getInstance().prepareIndexer(env, true, true,
70                 false, null, null);
71         env.setDefaultProjectsFromNames(new TreeSet<>(Collections.singletonList("/c")));
72         Indexer.getInstance().doIndexerExecution(true, null, null);
73 
74         configFile = File.createTempFile("configuration", ".xml");
75         env.writeConfiguration(configFile);
76         RuntimeEnvironment.getInstance().readConfiguration(new File(configFile.getAbsolutePath()));
77     }
78 
79     @AfterAll
tearDownClass()80     public static void tearDownClass() throws Exception {
81         repository.destroy();
82         configFile.delete();
83     }
84 
85     @Test
testIsValidQuery()86     public void testIsValidQuery() {
87         SearchEngine instance = new SearchEngine();
88         assertFalse(instance.isValidQuery());
89         instance.setFile("foo");
90         assertTrue(instance.isValidQuery());
91     }
92 
93     @Test
testDefinition()94     public void testDefinition() {
95         SearchEngine instance = new SearchEngine();
96         assertNull(instance.getDefinition());
97         String defs = "This is a definition";
98         instance.setDefinition(defs);
99         assertEquals(defs, instance.getDefinition());
100     }
101 
102     @Test
testFile()103     public void testFile() {
104         SearchEngine instance = new SearchEngine();
105         assertNull(instance.getFile());
106         String file = "This is a File";
107         instance.setFile(file);
108         assertEquals(file, instance.getFile());
109     }
110 
111     @Test
testFreetext()112     public void testFreetext() {
113         SearchEngine instance = new SearchEngine();
114         assertNull(instance.getFreetext());
115         String freetext = "This is just a piece of text";
116         instance.setFreetext(freetext);
117         assertEquals(freetext, instance.getFreetext());
118     }
119 
120     @Test
testHistory()121     public void testHistory() {
122         SearchEngine instance = new SearchEngine();
123         assertNull(instance.getHistory());
124         String hist = "This is a piece of history";
125         instance.setHistory(hist);
126         assertEquals(hist, instance.getHistory());
127     }
128 
129     @Test
testSymbol()130     public void testSymbol() {
131         SearchEngine instance = new SearchEngine();
132         assertNull(instance.getSymbol());
133         String sym = "This is a symbol";
134         instance.setSymbol(sym);
135         assertEquals(sym, instance.getSymbol());
136     }
137 
138     @Test
testGetQuery()139     public void testGetQuery() throws Exception {
140         SearchEngine instance = new SearchEngine();
141         instance.setHistory("Once upon a time");
142         instance.setFile("Makefile");
143         instance.setDefinition("\"std::string\"");
144         instance.setSymbol("toString");
145         instance.setFreetext("OpenGrok");
146         assertTrue(instance.isValidQuery());
147         assertEquals("+defs:\"std string\" +full:opengrok +hist:once +hist:upon +hist:time +path:makefile +refs:toString",
148                 instance.getQuery());
149     }
150 
151     /* see https://github.com/oracle/opengrok/issues/2030
152     @Test
153     public void testSearch() {
154         List<Hit> hits = new ArrayList<>();
155 
156         SearchEngine instance = new SearchEngine();
157         instance.setHistory("\"Add lint make target and fix lint warnings\"");
158         int noHits =  instance.search();
159         if (noHits > 0) {
160             instance.results(0, noHits, hits);
161             assertEquals(noHits, hits.size());
162         }
163         instance.destroy();
164 
165         instance = new SearchEngine();
166         instance.setSymbol("printf");
167         instance.setFile("main.c");
168         noHits = instance.search();
169         assertEquals(8, noHits);
170         hits.clear();
171         instance.results(0, noHits, hits);
172         for (Hit hit : hits) {
173             assertEquals("main.c", hit.getFilename());
174             assertEquals(1, 1);
175         }
176         instance.setFile("main.c OR Makefile");
177         noHits = instance.search();
178         assertEquals(8, noHits);
179         instance.destroy();
180 
181         instance = new SearchEngine();
182         instance.setFreetext("arguments");
183         instance.setFile("main.c");
184         noHits = instance.search();
185         hits.clear();
186         instance.results(0, noHits, hits);
187         for (Hit hit : hits) {
188             assertEquals("main.c", hit.getFilename());
189             if (!hit.getLine().contains("arguments")) {
190                fail("got an incorrect match: " + hit.getLine());
191             }
192         }
193         assertEquals(8, noHits);
194         instance.destroy();
195 
196         instance = new SearchEngine();
197         instance.setDefinition("main");
198         instance.setFile("main.c");
199         noHits = instance.search();
200         hits.clear();
201         instance.results(0, noHits, hits);
202         for (Hit hit : hits) {
203             assertEquals("main.c", hit.getFilename());
204             if (!hit.getLine().contains("main")) {
205                fail("got an incorrect match: " + hit.getLine());
206             }
207         }
208         assertEquals(8, noHits);
209         instance.destroy();
210 
211         // negative symbol test (comments should be ignored)
212         instance = new SearchEngine();
213         instance.setSymbol("Ordinary");
214         instance.setFile("\"Main.java\"");
215         instance.search();
216         assertEquals("+path:\"main . java\" +refs:Ordinary",
217                      instance.getQuery());
218         assertEquals(0, instance.search());
219         instance.destroy();
220 
221         // wildcards and case sensitivity of definition search
222         instance = new SearchEngine();
223         instance.setDefinition("Mai*"); // definition is case sensitive
224         instance.setFile("\"Main.java\" OR \"main.c\"");
225         instance.search();
226         assertEquals("+defs:Mai* +(path:\"main . java\" path:\"main . c\")",
227                      instance.getQuery());
228         assertEquals(2, instance.search());
229         instance.setDefinition("MaI*"); // should not match Main
230         instance.search();
231         assertEquals(0, instance.search());
232         instance.destroy();
233 
234         // wildcards and case sensitivity of symbol search
235         instance = new SearchEngine();
236         instance.setSymbol("Mai*"); // symbol is case sensitive
237         instance.setFile("\"Main.java\" OR \"main.c\"");
238         instance.search();
239         assertEquals(2, instance.search());
240         instance.setSymbol("MaI*"); // should not match Main
241         instance.search();
242         assertEquals(0, instance.search());
243         instance.destroy();
244 
245         // wildcards and case insensitivity of freetext search
246         instance = new SearchEngine();
247         instance.setFreetext("MaI*"); // should match both Main and main
248         instance.setFile("\"Main.java\" OR \"main.c\"");
249         assertEquals(10, instance.search());
250         instance.destroy();
251 
252         // file name search is case insensitive
253         instance = new SearchEngine();
254         instance.setFile("JaVa"); // should match java
255         int count=instance.search();
256         if (count > 0) {
257         instance.results(0, count, hits);
258         }
259         assertEquals(8, count); // path is now case sensitive ... but only in SearchEngine !
260         instance.destroy();
261 
262         //test eol and eof
263         instance = new SearchEngine();
264         instance.setFreetext("makeW");
265         assertEquals(1, instance.search());
266         instance.destroy();
267 
268         instance = new SearchEngine();
269         instance.setFreetext("WeirdEOL");
270         assertEquals(1, instance.search());
271         instance.destroy();
272 
273         //test bcel jar parser
274         instance = new SearchEngine();
275         instance.setFreetext("InstConstraintVisitor");
276         assertEquals(1, instance.search());
277         instance.destroy();
278     }
279     */
280 }
281