xref: /OpenGrok/opengrok-indexer/src/test/java/org/opengrok/indexer/web/SearchHelperTest.java (revision ae1c323b96a1818e667a3d6125085890ae078949)
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