SearchEngineTest.java revision 986
715N/A/*
715N/A * CDDL HEADER START
715N/A *
715N/A * The contents of this file are subject to the terms of the
715N/A * Common Development and Distribution License (the "License").
715N/A * You may not use this file except in compliance with the License.
715N/A *
715N/A * See LICENSE.txt included in this distribution for the specific
715N/A * language governing permissions and limitations under the License.
715N/A *
715N/A * When distributing Covered Code, include this CDDL HEADER in each
715N/A * file and include the License file at LICENSE.txt.
715N/A * If applicable, add the following below this CDDL HEADER, with the
715N/A * fields enclosed by brackets "[]" replaced with your own identifying
715N/A * information: Portions Copyright [yyyy] [name of copyright owner]
715N/A *
715N/A * CDDL HEADER END
715N/A */
715N/A
715N/A/*
715N/A * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
715N/A * Use is subject to license terms.
715N/A */
715N/Apackage org.opensolaris.opengrok.search;
715N/A
715N/Aimport java.io.File;
715N/Aimport java.util.ArrayList;
715N/Aimport java.util.List;
715N/Aimport org.junit.After;
726N/Aimport org.junit.AfterClass;
715N/Aimport org.junit.Before;
726N/Aimport org.junit.BeforeClass;
726N/Aimport org.junit.Test;
726N/Aimport org.opensolaris.opengrok.configuration.RuntimeEnvironment;
715N/Aimport org.opensolaris.opengrok.history.HistoryGuru;
715N/Aimport org.opensolaris.opengrok.index.Indexer;
726N/Aimport org.opensolaris.opengrok.util.TestRepository;
715N/Aimport static org.junit.Assert.*;
715N/A
726N/A/**
726N/A * Do basic testing of the SearchEngine
726N/A *
726N/A * @author Trond Norbye
726N/A */
726N/Apublic class SearchEngineTest {
726N/A
760N/A static TestRepository repository;
760N/A static boolean skip = false;
760N/A static File configFile;
726N/A
760N/A @BeforeClass
760N/A public static void setUpClass() throws Exception {
760N/A repository = new TestRepository();
760N/A repository.create(HistoryGuru.class.getResourceAsStream("repositories.zip"));
715N/A
715N/A RuntimeEnvironment env = RuntimeEnvironment.getInstance();
726N/A env.setCtags(System.getProperty("org.opensolaris.opengrok.configuration.ctags", "ctags"));
726N/A env.setSourceRoot(repository.getSourceRoot());
726N/A env.setDataRoot(repository.getDataRoot());
726N/A
726N/A if (env.validateExuberantCtags()) {
726N/A env.setSourceRoot(repository.getSourceRoot());
726N/A env.setDataRoot(repository.getDataRoot());
715N/A env.setVerbose(false);
715N/A Indexer.getInstance().prepareIndexer(env, true, true, "/c", null, false, false, false, null, null);
715N/A Indexer.getInstance().doIndexerExecution(true, 1, null, null);
726N/A } else {
726N/A System.out.println("Skipping test. Could not find a ctags I could use in path.");
726N/A skip = true;
726N/A }
726N/A
726N/A configFile = File.createTempFile("configuration", ".xml");
726N/A env.writeConfiguration(configFile);
726N/A RuntimeEnvironment.getInstance().readConfiguration(new File(configFile.getAbsolutePath()));
726N/A }
726N/A
726N/A @AfterClass
726N/A public static void tearDownClass() throws Exception {
726N/A repository.destroy();
726N/A configFile.delete();
726N/A }
726N/A
726N/A @Before
726N/A public void setUp() {
726N/A }
726N/A
726N/A @After
726N/A public void tearDown() {
726N/A }
726N/A
726N/A @Test
726N/A public void testIsValidQuery() {
726N/A SearchEngine instance = new SearchEngine();
715N/A assertFalse(instance.isValidQuery());
715N/A instance.setFile("foo");
assertTrue(instance.isValidQuery());
}
@Test
public void testDefinition() {
SearchEngine instance = new SearchEngine();
assertNull(instance.getDefinition());
String defs = "This is a definition";
instance.setDefinition(defs);
assertEquals(defs, instance.getDefinition());
}
@Test
public void testFile() {
SearchEngine instance = new SearchEngine();
assertNull(instance.getFile());
String file = "This is a File";
instance.setFile(file);
assertEquals(file, instance.getFile());
}
@Test
public void testFreetext() {
SearchEngine instance = new SearchEngine();
assertNull(instance.getFreetext());
String freetext = "This is just a piece of text";
instance.setFreetext(freetext);
assertEquals(freetext, instance.getFreetext());
}
@Test
public void testHistory() {
SearchEngine instance = new SearchEngine();
assertNull(instance.getHistory());
String hist = "This is a piece of history";
instance.setHistory(hist);
assertEquals(hist, instance.getHistory());
}
@Test
public void testSymbol() {
SearchEngine instance = new SearchEngine();
assertNull(instance.getSymbol());
String sym = "This is a symbol";
instance.setSymbol(sym);
assertEquals(sym, instance.getSymbol());
}
@Test
public void testGetQuery() throws Exception {
SearchEngine instance = new SearchEngine();
instance.setHistory("Once upon a time");
instance.setFile("Makefile");
instance.setDefinition("std::string");
instance.setSymbol("toString");
instance.setFreetext("OpenGrok");
assertTrue(instance.isValidQuery());
assertEquals("+defs:\"std string\" +full:opengrok +hist:once +hist:upon +hist:time +path:makefile +refs:toString",
instance.getQuery());
}
@Test
public void testSearch() {
if (skip) {
return;
}
List<Hit> hits = new ArrayList<Hit>();
SearchEngine instance = new SearchEngine();
instance.setHistory("\"Add lint make target and fix lint warnings\"");
int noHits = instance.search();
if (noHits > 0) {
instance.results(0, noHits, hits);
assertEquals(noHits, hits.size());
}
instance = new SearchEngine();
instance.setSymbol("printf");
instance.setFile("main.c");
noHits = instance.search();
assertEquals(8, noHits);
hits.clear();
instance.results(0, noHits, hits);
for (Hit hit : hits) {
assertEquals("main.c", hit.getFilename());
assertEquals(1, 1);
}
instance.setFile("main.c OR Makefile");
noHits = instance.search();
assertEquals(8, noHits);
instance = new SearchEngine();
instance.setFreetext("arguments");
instance.setFile("main.c");
noHits = instance.search();
hits.clear();
instance.results(0, noHits, hits);
for (Hit hit : hits) {
assertEquals("main.c", hit.getFilename());
if (hit.getLine().indexOf("arguments") == -1) {
fail("got an incorrect match: " + hit.getLine());
}
}
assertEquals(8, noHits);
instance = new SearchEngine();
instance.setDefinition("main");
instance.setFile("main.c");
noHits = instance.search();
hits.clear();
instance.results(0, noHits, hits);
for (Hit hit : hits) {
assertEquals("main.c", hit.getFilename());
if (hit.getLine().indexOf("main") == -1) {
fail("got an incorrect match: " + hit.getLine());
}
}
assertEquals(8, noHits);
// wildcards and case sensitivity of definition search
instance = new SearchEngine();
instance.setDefinition("Mai*"); // definition is case sensitive
instance.setFile("Main.java OR main.c");
instance.search();
assertEquals("+defs:Mai* +(path:\"main . java\" path:\"main . c\")",
instance.getQuery());
assertEquals(2, instance.search());
instance.setDefinition("MaI*"); // should not match Main
instance.search();
assertEquals(0, instance.search());
// wildcards and case sensitivity of symbol search
instance = new SearchEngine();
instance.setSymbol("Mai*"); // symbol is case sensitive
instance.setFile("Main.java OR main.c");
instance.search();
assertEquals(2, instance.search());
instance.setSymbol("MaI*"); // should not match Main
instance.search();
assertEquals(0, instance.search());
// wildcards and case insensitivity of freetext search
instance = new SearchEngine();
instance.setFreetext("MaI*"); // should match both Main and main
instance.setFile("Main.java OR main.c");
assertEquals(10, instance.search());
// file name search is case insensitive
instance = new SearchEngine();
instance.setFile("JaVa"); // should match java
assertEquals(4, instance.search());
}
}