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