1b5840353SAdam Hornáček /* 2b5840353SAdam Hornáček * CDDL HEADER START 3b5840353SAdam Hornáček * 4b5840353SAdam Hornáček * The contents of this file are subject to the terms of the 5b5840353SAdam Hornáček * Common Development and Distribution License (the "License"). 6b5840353SAdam Hornáček * You may not use this file except in compliance with the License. 7b5840353SAdam Hornáček * 8b5840353SAdam Hornáček * See LICENSE.txt included in this distribution for the specific 9b5840353SAdam Hornáček * language governing permissions and limitations under the License. 10b5840353SAdam Hornáček * 11b5840353SAdam Hornáček * When distributing Covered Code, include this CDDL HEADER in each 12b5840353SAdam Hornáček * file and include the License file at LICENSE.txt. 13b5840353SAdam Hornáček * If applicable, add the following below this CDDL HEADER, with the 14b5840353SAdam Hornáček * fields enclosed by brackets "[]" replaced with your own identifying 15b5840353SAdam Hornáček * information: Portions Copyright [yyyy] [name of copyright owner] 16b5840353SAdam Hornáček * 17b5840353SAdam Hornáček * CDDL HEADER END 18b5840353SAdam Hornáček */ 19b5840353SAdam Hornáček 20b5840353SAdam Hornáček /* 21c6f0939bSAdam Hornacek * Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved. 225d9f3aa0SAdam Hornáček * Portions Copyright (c) 2018, 2020, Chris Fraire <cfraire@me.com>. 23b5840353SAdam Hornáček */ 249805b761SAdam Hornáček package org.opengrok.indexer.web; 25b5840353SAdam Hornáček 26b5840353SAdam Hornáček import java.util.Collections; 27b5840353SAdam Hornáček import java.util.SortedSet; 28b5840353SAdam Hornáček import java.util.TreeSet; 2952d10766SAdam Hornacek 3052d10766SAdam Hornacek import org.junit.jupiter.api.AfterEach; 3152d10766SAdam Hornacek import org.junit.jupiter.api.BeforeEach; 3252d10766SAdam Hornacek import org.junit.jupiter.api.Test; 339805b761SAdam Hornáček import org.opengrok.indexer.configuration.Project; 349805b761SAdam Hornáček import org.opengrok.indexer.configuration.RuntimeEnvironment; 359805b761SAdam Hornáček import org.opengrok.indexer.index.Indexer; 369805b761SAdam Hornáček import org.opengrok.indexer.index.IndexerTest; 379805b761SAdam Hornáček import org.opengrok.indexer.search.QueryBuilder; 389805b761SAdam Hornáček import org.opengrok.indexer.util.TestRepository; 39b5840353SAdam Hornáček 4052d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertEquals; 4152d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertFalse; 4252d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertNotNull; 4352d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertNotSame; 4452d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertNull; 4552d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertTrue; 4652d10766SAdam Hornacek 47b5840353SAdam Hornáček /** 48b5840353SAdam Hornáček * Unit tests for the {@code SearchHelper} class. 49b5840353SAdam Hornáček */ 502bcacabbSAdam Hornacek class SearchHelperTest { 51b5840353SAdam Hornáček 52b5840353SAdam Hornáček TestRepository repository; 53b5840353SAdam Hornáček RuntimeEnvironment env; 54b5840353SAdam Hornáček 5552d10766SAdam Hornacek @BeforeEach setUp()562bcacabbSAdam Hornacek public void setUp() throws Exception { 57b5840353SAdam Hornáček repository = new TestRepository(); 582bcacabbSAdam Hornacek repository.create(IndexerTest.class.getClassLoader().getResource("sources")); 59b5840353SAdam Hornáček 60b5840353SAdam Hornáček env = RuntimeEnvironment.getInstance(); 61b5840353SAdam Hornáček env.setSourceRoot(repository.getSourceRoot()); 62b5840353SAdam Hornáček env.setDataRoot(repository.getDataRoot()); 63b5840353SAdam Hornáček env.setHistoryEnabled(false); 64b5840353SAdam Hornáček } 65b5840353SAdam Hornáček 6652d10766SAdam Hornacek @AfterEach tearDown()67b5840353SAdam Hornáček public void tearDown() { 68b5840353SAdam Hornáček repository.destroy(); 69b5840353SAdam Hornáček } 70b5840353SAdam Hornáček reindex()71b5840353SAdam Hornáček private void reindex() throws Exception { 72b5840353SAdam Hornáček System.out.println("Generating index by using the class methods"); 73b5840353SAdam Hornáček 74b5840353SAdam Hornáček Indexer.getInstance().prepareIndexer(env, true, true, 757516a8e8SVladimir Kotal false, null, null); 76369f83fbSVladimir Kotal env.setDefaultProjectsFromNames(new TreeSet<>(Collections.singletonList("/c"))); 77b5840353SAdam Hornáček Indexer.getInstance().doIndexerExecution(true, null, null); 78b5840353SAdam Hornáček } 79b5840353SAdam Hornáček getSearchHelper(String searchTerm)80b5840353SAdam Hornáček private SearchHelper getSearchHelper(String searchTerm) { 81*ae1c323bSVladimir Kotal SearchHelper sh = new SearchHelper(0, SortOrder.RELEVANCY, 82*ae1c323bSVladimir Kotal env.getDataRootFile(), env.getSourceRootFile(), 83*ae1c323bSVladimir Kotal env.getHitsPerPage(), null, 84*ae1c323bSVladimir Kotal new QueryBuilder().setFreetext(searchTerm), false, 85*ae1c323bSVladimir Kotal env.getUrlPrefix(), false, false); 86b5840353SAdam Hornáček 87*ae1c323bSVladimir Kotal assertNotSame(0, sh.getBuilder().getSize()); 88b5840353SAdam Hornáček return sh; 89b5840353SAdam Hornáček } 90b5840353SAdam Hornáček getSearchHelperPath(String searchTerm)91b5840353SAdam Hornáček private SearchHelper getSearchHelperPath(String searchTerm) { 92*ae1c323bSVladimir Kotal SearchHelper sh = new SearchHelper(0, SortOrder.RELEVANCY, 93*ae1c323bSVladimir Kotal env.getDataRootFile(), env.getSourceRootFile(), 94*ae1c323bSVladimir Kotal env.getHitsPerPage(), null, 95*ae1c323bSVladimir Kotal new QueryBuilder().setPath(searchTerm), false, 96*ae1c323bSVladimir Kotal env.getUrlPrefix(), false, false); 97b5840353SAdam Hornáček 98*ae1c323bSVladimir Kotal assertNotSame(0, sh.getBuilder().getSize()); 99b5840353SAdam Hornáček return sh; 100b5840353SAdam Hornáček } 101b5840353SAdam Hornáček 102b5840353SAdam Hornáček @Test testSearchAfterReindex()1032bcacabbSAdam Hornacek void testSearchAfterReindex() throws Exception { 104b5840353SAdam Hornáček SortedSet<String> projectNames = new TreeSet<>(); 105b5840353SAdam Hornáček 106b5840353SAdam Hornáček env.setProjectsEnabled(true); 107b5840353SAdam Hornáček 108b5840353SAdam Hornáček reindex(); 109b5840353SAdam Hornáček 110b5840353SAdam Hornáček // Search for existing term in single project. 111b5840353SAdam Hornáček projectNames.add("c"); 112b5840353SAdam Hornáček SearchHelper searchHelper = this.getSearchHelper("foobar") 113b5840353SAdam Hornáček .prepareExec(projectNames).executeQuery().prepareSummary(); 114*ae1c323bSVladimir Kotal assertNull(searchHelper.getErrorMsg()); 115*ae1c323bSVladimir Kotal System.out.println("single project search returned " + searchHelper.getTotalHits() + " hits"); 116*ae1c323bSVladimir Kotal assertEquals(4, searchHelper.getTotalHits()); 117b5840353SAdam Hornáček searchHelper.destroy(); 118b5840353SAdam Hornáček 119b5840353SAdam Hornáček // Search for existing term in multiple projects. 120b5840353SAdam Hornáček projectNames.add("document"); 121b5840353SAdam Hornáček searchHelper = this.getSearchHelper("foobar") 122b5840353SAdam Hornáček .prepareExec(projectNames).executeQuery().prepareSummary(); 123*ae1c323bSVladimir Kotal assertNull(searchHelper.getErrorMsg()); 124*ae1c323bSVladimir Kotal System.out.println("multi-project search returned " + searchHelper.getTotalHits() + " hits"); 125*ae1c323bSVladimir Kotal assertEquals(5, searchHelper.getTotalHits()); 126b5840353SAdam Hornáček searchHelper.destroy(); 127b5840353SAdam Hornáček 128b5840353SAdam Hornáček // Search for non-existing term. 129b5840353SAdam Hornáček searchHelper = this.getSearchHelper("CannotExistAnywhereForSure") 130b5840353SAdam Hornáček .prepareExec(projectNames).executeQuery().prepareSummary(); 131*ae1c323bSVladimir Kotal assertNull(searchHelper.getErrorMsg()); 132*ae1c323bSVladimir Kotal long totalHits = searchHelper.getTotalHits(); 133*ae1c323bSVladimir Kotal System.out.println("multi-project search for non-existing term returned " + totalHits + " hits"); 134*ae1c323bSVladimir Kotal assertEquals(0, totalHits); 135b5840353SAdam Hornáček searchHelper.destroy(); 136b5840353SAdam Hornáček 137b5840353SAdam Hornáček // Add a change to the repository, reindex, try to reopen the indexes 138b5840353SAdam Hornáček // and repeat the search. 139b5840353SAdam Hornáček repository.addDummyFile("c", "foobar"); 14052d10766SAdam Hornacek 141b5840353SAdam Hornáček reindex(); 14252d10766SAdam Hornacek 143b5840353SAdam Hornáček env.maybeRefreshIndexSearchers(); 144b5840353SAdam Hornáček searchHelper = this.getSearchHelper("foobar") 145b5840353SAdam Hornáček .prepareExec(projectNames).executeQuery().prepareSummary(); 146*ae1c323bSVladimir Kotal assertNull(searchHelper.getErrorMsg()); 147*ae1c323bSVladimir Kotal totalHits = searchHelper.getTotalHits(); 148*ae1c323bSVladimir Kotal System.out.println("multi-project search after reindex returned " + totalHits + " hits"); 149*ae1c323bSVladimir Kotal assertEquals(6, totalHits); 150b5840353SAdam Hornáček searchHelper.destroy(); 151b5840353SAdam Hornáček repository.removeDummyFile("c"); 152b5840353SAdam Hornáček 153b5840353SAdam Hornáček // Search for case insensitive path. 154b5840353SAdam Hornáček projectNames.add("java"); 155b5840353SAdam Hornáček searchHelper = this.getSearchHelperPath("JaVa") 156b5840353SAdam Hornáček .prepareExec(projectNames).executeQuery().prepareSummary(); 157*ae1c323bSVladimir Kotal assertNull(searchHelper.getErrorMsg()); 158*ae1c323bSVladimir Kotal totalHits = searchHelper.getTotalHits(); 159*ae1c323bSVladimir Kotal System.out.println("multi-project search for non-existing term returned " + totalHits + " hits"); 160*ae1c323bSVladimir Kotal assertEquals(5, totalHits); 161b5840353SAdam Hornáček searchHelper.destroy(); 162b5840353SAdam Hornáček } 163b5840353SAdam Hornáček 164b5840353SAdam Hornáček @Test testPrepareExecInvalidInput()1652bcacabbSAdam Hornacek void testPrepareExecInvalidInput() { 166b5840353SAdam Hornáček SortedSet<String> projectNames = new TreeSet<>(); 167b5840353SAdam Hornáček SearchHelper searchHelper; 168b5840353SAdam Hornáček 169b5840353SAdam Hornáček env.setProjectsEnabled(true); 170b5840353SAdam Hornáček 171b5840353SAdam Hornáček // Fake project addition to avoid reindex. 172b5840353SAdam Hornáček Project project = new Project("c", "/c"); 173b5840353SAdam Hornáček env.getProjects().put("c", project); 174b5840353SAdam Hornáček project = new Project("java", "/java"); 175b5840353SAdam Hornáček project.setIndexed(true); 176b5840353SAdam Hornáček env.getProjects().put("java", project); 177b5840353SAdam Hornáček 178b5840353SAdam Hornáček // Try to prepare search for project that is not yet indexed. 179b5840353SAdam Hornáček projectNames.add("c"); 180b5840353SAdam Hornáček projectNames.add("java"); 181b5840353SAdam Hornáček searchHelper = this.getSearchHelper("foobar") 182b5840353SAdam Hornáček .prepareExec(projectNames); 183*ae1c323bSVladimir Kotal assertNotNull(searchHelper.getErrorMsg()); 184*ae1c323bSVladimir Kotal assertTrue(searchHelper.getErrorMsg().contains("not indexed")); 185*ae1c323bSVladimir Kotal assertFalse(searchHelper.getErrorMsg().contains("java")); 186b5840353SAdam Hornáček 187b5840353SAdam Hornáček // Try to prepare search for list that contains non-existing project. 188b5840353SAdam Hornáček projectNames.add("totally_nonexistent_project"); 189b5840353SAdam Hornáček searchHelper = this.getSearchHelper("foobar") 190b5840353SAdam Hornáček .prepareExec(projectNames); 191*ae1c323bSVladimir Kotal assertNotNull(searchHelper.getErrorMsg()); 192*ae1c323bSVladimir Kotal assertTrue(searchHelper.getErrorMsg().contains("invalid projects")); 193b5840353SAdam Hornáček } 194b5840353SAdam Hornáček } 195