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