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