17d004396SChris Fraire /*
27d004396SChris Fraire  * CDDL HEADER START
37d004396SChris Fraire  *
47d004396SChris Fraire  * The contents of this file are subject to the terms of the
57d004396SChris Fraire  * Common Development and Distribution License (the "License").
67d004396SChris Fraire  * You may not use this file except in compliance with the License.
77d004396SChris Fraire  *
87d004396SChris Fraire  * See LICENSE.txt included in this distribution for the specific
97d004396SChris Fraire  * language governing permissions and limitations under the License.
107d004396SChris Fraire  *
117d004396SChris Fraire  * When distributing Covered Code, include this CDDL HEADER in each
127d004396SChris Fraire  * file and include the License file at LICENSE.txt.
137d004396SChris Fraire  * If applicable, add the following below this CDDL HEADER, with the
147d004396SChris Fraire  * fields enclosed by brackets "[]" replaced with your own identifying
157d004396SChris Fraire  * information: Portions Copyright [yyyy] [name of copyright owner]
167d004396SChris Fraire  *
177d004396SChris Fraire  * CDDL HEADER END
187d004396SChris Fraire  */
197d004396SChris Fraire 
207d004396SChris Fraire /*
215d9f3aa0SAdam Hornáček  * Copyright (c) 2018, 2020, Chris Fraire <cfraire@me.com>.
227d004396SChris Fraire  */
237d004396SChris Fraire package org.opengrok.indexer.index;
247d004396SChris Fraire 
257d004396SChris Fraire import java.io.IOException;
26*e779faacSAdam Hornacek import java.io.InvalidClassException;
277d004396SChris Fraire import java.util.HashMap;
287d004396SChris Fraire import java.util.Map;
291161d3e8SAdam Hornacek 
3052d10766SAdam Hornacek import org.junit.jupiter.api.Test;
317d004396SChris Fraire import org.opengrok.indexer.analysis.AnalyzerGuru;
327d004396SChris Fraire 
3352d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertArrayEquals;
3452d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertEquals;
3552d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertNotNull;
36*e779faacSAdam Hornacek import static org.junit.jupiter.api.Assertions.assertThrows;
3752d10766SAdam Hornacek import static org.junit.jupiter.api.Assertions.assertTrue;
3852d10766SAdam Hornacek 
397d004396SChris Fraire /**
407d004396SChris Fraire  * Represents a test container for {@link IndexAnalysisSettingsUpgrader}.
417d004396SChris Fraire  */
427d004396SChris Fraire public class IndexAnalysisSettingsUpgraderTest {
437d004396SChris Fraire 
447d004396SChris Fraire     private static final String PROJECT_NAME = "foo-1-2-3";
457d004396SChris Fraire     private static final long ANALYZER_GURU_VERSION = 3;
467d004396SChris Fraire     private static final int TABSIZE = 17;
477d004396SChris Fraire     private static final Map<String, IndexedSymlink> TEST_MAPPED_SYMLINKS;
487d004396SChris Fraire 
497d004396SChris Fraire     static {
507d004396SChris Fraire         TEST_MAPPED_SYMLINKS = new HashMap<>();
517d004396SChris Fraire         IndexedSymlink entry = new IndexedSymlink("/foo", "/private/foo", false);
entry.getCanonical()527d004396SChris Fraire         TEST_MAPPED_SYMLINKS.put(entry.getCanonical(), entry);
537d004396SChris Fraire         entry = new IndexedSymlink("/foo/bar", "/private/foo/bar", true);
entry.getCanonical()547d004396SChris Fraire         TEST_MAPPED_SYMLINKS.put(entry.getCanonical(), entry);
557d004396SChris Fraire     }
567d004396SChris Fraire 
577d004396SChris Fraire     @Test
shouldHandleLatest()587d004396SChris Fraire     public void shouldHandleLatest() throws IOException,
597d004396SChris Fraire             ClassNotFoundException {
607d004396SChris Fraire         IndexAnalysisSettings3 obj = new IndexAnalysisSettings3();
617d004396SChris Fraire         obj.setAnalyzerGuruVersion(ANALYZER_GURU_VERSION);
627d004396SChris Fraire         Map<String, Long> actAnalyzersVersionNos = AnalyzerGuru.getAnalyzersVersionNos();
637d004396SChris Fraire         obj.setAnalyzersVersions(actAnalyzersVersionNos);
647d004396SChris Fraire         obj.setProjectName(PROJECT_NAME);
657d004396SChris Fraire         obj.setTabSize(TABSIZE);
667d004396SChris Fraire         obj.setIndexedSymlinks(TEST_MAPPED_SYMLINKS);
677d004396SChris Fraire         byte[] bin = obj.serialize();
687d004396SChris Fraire 
697d004396SChris Fraire         IndexAnalysisSettingsUpgrader upgrader = new IndexAnalysisSettingsUpgrader();
707d004396SChris Fraire         IndexAnalysisSettings3 vLatest = upgrader.upgrade(bin, 3);
7152d10766SAdam Hornacek         assertNotNull(vLatest, "should get non-null from upgrader");
7252d10766SAdam Hornacek         assertEquals(PROJECT_NAME, vLatest.getProjectName(), "should have same projectName");
7352d10766SAdam Hornacek         assertEquals(TABSIZE, (int) vLatest.getTabSize(), "should have same tabSize");
7452d10766SAdam Hornacek         assertEquals(ANALYZER_GURU_VERSION, (long) vLatest.getAnalyzerGuruVersion(),
7552d10766SAdam Hornacek                 "should have same analyzerGuruVersion");
7652d10766SAdam Hornacek         assertEquals(vLatest.getAnalyzersVersions().size(), actAnalyzersVersionNos.size(),
7752d10766SAdam Hornacek                 "should have expected analyzer versions");
787d004396SChris Fraire 
792b7010ddSChris Fraire         Object[] expectedVersionKeys = actAnalyzersVersionNos.keySet().stream().sorted().toArray();
8052d10766SAdam Hornacek         assertArrayEquals(expectedVersionKeys,
8152d10766SAdam Hornacek                 vLatest.getAnalyzersVersions().keySet().stream().sorted().toArray(),
8252d10766SAdam Hornacek                 "analyzer versions keysets should be equal");
8352d10766SAdam Hornacek         assertArrayEquals(getMapValues(actAnalyzersVersionNos, expectedVersionKeys),
8452d10766SAdam Hornacek                 getMapValues(vLatest.getAnalyzersVersions(), expectedVersionKeys),
8552d10766SAdam Hornacek                 "analyzer versions values should be equal");
862b7010ddSChris Fraire 
872b7010ddSChris Fraire         Object[] expectedSymlinkKeys = TEST_MAPPED_SYMLINKS.keySet().stream().sorted().toArray();
8852d10766SAdam Hornacek         assertArrayEquals(expectedSymlinkKeys,
8952d10766SAdam Hornacek                 vLatest.getIndexedSymlinks().keySet().stream().sorted().toArray(),
9052d10766SAdam Hornacek                 "index symlinks keysets should be equal");
9152d10766SAdam Hornacek         assertArrayEquals(getMapValues(TEST_MAPPED_SYMLINKS, expectedSymlinkKeys),
9252d10766SAdam Hornacek                 getMapValues(vLatest.getIndexedSymlinks(), expectedSymlinkKeys),
9352d10766SAdam Hornacek                 "index symlinks values should be equal");
947d004396SChris Fraire     }
957d004396SChris Fraire 
967d004396SChris Fraire     @Test
shouldUpgradeV2()977d004396SChris Fraire     public void shouldUpgradeV2() throws IOException, ClassNotFoundException {
987d004396SChris Fraire         IndexAnalysisSettings obj = new IndexAnalysisSettings();
997d004396SChris Fraire         obj.setAnalyzerGuruVersion(ANALYZER_GURU_VERSION);
1007d004396SChris Fraire         Map<String, Long> actAnalyzersVersionNos = AnalyzerGuru.getAnalyzersVersionNos();
1017d004396SChris Fraire         obj.setAnalyzersVersions(actAnalyzersVersionNos);
1027d004396SChris Fraire         obj.setProjectName(PROJECT_NAME);
1037d004396SChris Fraire         obj.setTabSize(TABSIZE);
1047d004396SChris Fraire         obj.setAnalyzersVersions(actAnalyzersVersionNos);
1057d004396SChris Fraire         byte[] bin = obj.serialize();
1067d004396SChris Fraire 
1077d004396SChris Fraire         IndexAnalysisSettingsUpgrader upgrader = new IndexAnalysisSettingsUpgrader();
1087d004396SChris Fraire         IndexAnalysisSettings3 v3 = upgrader.upgrade(bin, 2);
10952d10766SAdam Hornacek         assertNotNull(v3, "should get non-null from upgrader");
11052d10766SAdam Hornacek         assertEquals(PROJECT_NAME, v3.getProjectName(), "should have same projectName");
11152d10766SAdam Hornacek         assertEquals(TABSIZE, (int) v3.getTabSize(), "should have same tabSize");
11252d10766SAdam Hornacek         assertEquals(ANALYZER_GURU_VERSION, (long) v3.getAnalyzerGuruVersion(), "should have same analyzerGuruVersion");
11352d10766SAdam Hornacek         assertEquals(v3.getAnalyzersVersions().size(), actAnalyzersVersionNos.size(),
11452d10766SAdam Hornacek                 "should have expected analyzer versions");
11552d10766SAdam Hornacek         assertTrue(v3.getIndexedSymlinks().isEmpty(), "should have no indexedSymlinks");
1167d004396SChris Fraire     }
1177d004396SChris Fraire 
1187d004396SChris Fraire     @Test
shouldThrowIfVersionIsMisrepresented()1197d004396SChris Fraire     public void shouldThrowIfVersionIsMisrepresented() throws IOException, ClassNotFoundException {
1207d004396SChris Fraire         IndexAnalysisSettings obj = new IndexAnalysisSettings();
1217d004396SChris Fraire         obj.setAnalyzerGuruVersion(ANALYZER_GURU_VERSION);
1227d004396SChris Fraire         obj.setProjectName(PROJECT_NAME);
1237d004396SChris Fraire         obj.setTabSize(TABSIZE);
1247d004396SChris Fraire         byte[] bin = obj.serialize();
1257d004396SChris Fraire 
1267d004396SChris Fraire         IndexAnalysisSettingsUpgrader upgrader = new IndexAnalysisSettingsUpgrader();
127*e779faacSAdam Hornacek         assertThrows(InvalidClassException.class, () -> upgrader.upgrade(bin, 3),
128*e779faacSAdam Hornacek                 "should not have produced an instance");
1297d004396SChris Fraire     }
1307d004396SChris Fraire 
1317d004396SChris Fraire     @Test
shouldThrowIfTooOldVersion()1327d004396SChris Fraire     public void shouldThrowIfTooOldVersion() throws ClassNotFoundException {
1337d004396SChris Fraire         boolean passed = false;
1347d004396SChris Fraire 
1357d004396SChris Fraire         IndexAnalysisSettingsUpgrader upgrader = new IndexAnalysisSettingsUpgrader();
1367d004396SChris Fraire         try {
1377d004396SChris Fraire             upgrader.upgrade(new byte[0], 1);
1387d004396SChris Fraire         } catch (IOException e) {
1397d004396SChris Fraire             // expected
1407d004396SChris Fraire             assertTrue(e.getMessage().startsWith("Too old version"));
1417d004396SChris Fraire             passed = true;
1427d004396SChris Fraire         }
14352d10766SAdam Hornacek         assertTrue(passed, "should have thrown on too-old version");
1447d004396SChris Fraire     }
1452b7010ddSChris Fraire 
getMapValues(Map<K, V> map, Object[] keys)1462b7010ddSChris Fraire     private static <K, V> Object[] getMapValues(Map<K, V> map, Object[] keys) {
1472b7010ddSChris Fraire         Object[] values = new Object[keys.length];
1482b7010ddSChris Fraire         for (int i = 0; i < keys.length; ++i) {
1492b7010ddSChris Fraire             //noinspection SuspiciousMethodCalls
1502b7010ddSChris Fraire             values[i] = map.get(keys[i]);
1512b7010ddSChris Fraire         }
1522b7010ddSChris Fraire         return values;
1532b7010ddSChris Fraire     }
1547d004396SChris Fraire }
155