blob: b287c6a18a81ad552140a808dd3315d6c54c166a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.artemis.tests.smoke.upgradeTest;
import java.io.File;
import java.lang.invoke.MethodHandles;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.stream.Stream;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** This test will compare expected values at the upgraded servers. */
public class CompareUpgradeTest {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
public static final String basedir = System.getProperty("basedir");
@Test
public void testCompareWindowsFreshInstance() throws Exception {
String windows = basedir + "/target/classes/servers/windowsUpgrade";
String windowsBin = windows + "/bin";
String windowsETC = basedir + "/target/classes/servers/windowsUpgradeETC";
String windowsExpected = basedir + "/target/classes/servers/windowsUpgradeExpected";
String windowsExpectedBin = windowsExpected + "/bin";
String windowsExpectedETC = basedir + "/target/classes/servers/windowsUpgradeETCExpected";
compareDirectories(windowsExpectedBin, windowsBin);
compareDirectories(windowsExpectedETC, windowsETC, "broker.xml", "artemis-users.properties");
}
@Test
public void testCompareLinuxFreshInstance() throws Exception {
String linux = basedir + "/target/classes/servers/linuxUpgrade";
String linuxBin = linux + "/bin";
String linuxETC = basedir + "/target/classes/servers/linuxUpgradeETC";
String linuxExpected = basedir + "/target/classes/servers/linuxUpgradeExpected";
String linuxExpectedBin = linuxExpected + "/bin";
String linuxExpectedETC = basedir + "/target/classes/servers/linuxUpgradeETCExpected";
compareDirectories(linuxExpectedBin, linuxBin);
compareDirectories(linuxExpectedETC, linuxETC, "broker.xml", "artemis-users.properties");
}
private void compareDirectories(String expectedFolder, String upgradeFolder, String... ignoredFiles) throws Exception {
File expectedFolderFile = new File(expectedFolder);
File[] foundFiles = expectedFolderFile.listFiles(pathname -> {
for (String i :ignoredFiles) {
if (pathname.getName().contains(i)) {
return false;
}
}
return true;
});
File upgradeFolderFile = new File(upgradeFolder);
for (File f : foundFiles) {
File upgradeFile = new File(upgradeFolderFile, f.getName());
if (!upgradeFile.exists()) {
Assert.fail(upgradeFile.getAbsolutePath() + " not does exist");
}
if (f.getName().endsWith(".exe")) {
Assert.assertArrayEquals(f.getName() + " is different after upgrade", Files.readAllBytes(f.toPath()), Files.readAllBytes(upgradeFile.toPath()));
} else {
try (Stream<String> expectedStream = Files.lines(f.toPath()); Stream<String> upgradeStream = Files.lines(upgradeFile.toPath())) {
Iterator<String> expectedIterator = expectedStream.iterator();
Iterator<String> upgradeIterator = upgradeStream.iterator();
int line = 1;
while (expectedIterator.hasNext()) {
Assert.assertTrue(upgradeIterator.hasNext());
String expectedString = expectedIterator.next().replace("Expected", "").trim();
String upgradeString = upgradeIterator.next().trim();
Assert.assertEquals("error on line " + line + " at " + upgradeFile, expectedString, upgradeString);
line++;
}
Assert.assertFalse(upgradeIterator.hasNext());
}
}
}
}
@Test
public void testWindows() throws Exception {
String windows = basedir + "/target/classes/servers/windowsUpgrade";
String windowsBin = windows + "/bin";
String windowsETC = basedir + "/target/classes/servers/windowsUpgradeETC";
checkExpectedValues(windowsBin + "/artemis.cmd", "set ARTEMIS_INSTANCE_ETC=", "\"" + windowsETC + "\"");
Map<String, String> result = checkExpectedValues(windowsBin + "/artemis-service.xml",
"<env name=\"ARTEMIS_HOME\" value=", null, // no expected value for this, we will check on the output
"<env name=\"ARTEMIS_INSTANCE\" value=", "\"" + windows + "\"/>",
"<env name=\"ARTEMIS_INSTANCE_ETC\" value=", "\"" + windowsETC + "\"/>",
"<env name=\"ARTEMIS_INSTANCE_URI\" value=", "\"file:" + windows + "/\"/>",
"<env name=\"ARTEMIS_DATA_DIR\" value=", "\"" + windows + "/data\"/>"
);
String home = result.get("<env name=\"ARTEMIS_HOME\" value=");
Assert.assertNotNull(home);
Assert.assertFalse("home value must be changed during upgrade", home.contains("must-change"));
result = checkExpectedValues(windowsETC + "/artemis.profile.cmd",
"set ARTEMIS_HOME=", null, // no expected value for this, we will check on the output
"set ARTEMIS_INSTANCE=", "\"" + windows + "\"",
"set ARTEMIS_DATA_DIR=","\"" + windows + "/data\"",
"set ARTEMIS_ETC_DIR=", "\"" + windowsETC + "\"",
"set ARTEMIS_OOME_DUMP=", "\"" + windows + "/log/oom_dump.hprof\"",
"set ARTEMIS_INSTANCE_URI=", "\"file:" + windows + "/\"",
"set ARTEMIS_INSTANCE_ETC_URI=", "\"file:" + windowsETC + "/\"");
home = result.get("set ARTEMIS_HOME=");
Assert.assertNotNull(home);
Assert.assertFalse("home value must be changed during upgrade", home.contains("must-change"));
checkExpectedValues(windowsETC + "/bootstrap.xml",
"<server configuration=", "\"file:" + windowsETC + "//broker.xml\"/>");
File oldLogging = new File(windowsETC + "/logging.properties");
File newLogging = new File(windowsETC + "/log4j2.properties");
Assert.assertFalse("Old logging must be removed by upgrade", oldLogging.exists());
Assert.assertTrue("New Logging must be installed by upgrade", newLogging.exists());
}
@Test
public void testLinux() throws Exception {
String instanceDir = basedir + "/target/classes/servers/linuxUpgrade";
String bin = instanceDir + "/bin";
String etc = basedir + "/target/classes/servers/linuxUpgradeETC";
checkExpectedValues(bin + "/artemis", "ARTEMIS_INSTANCE_ETC=", "'" + etc + "'");
Map<String, String> result = checkExpectedValues(etc + "/artemis.profile",
"ARTEMIS_HOME=", null, // no expected value, will check on result
"ARTEMIS_INSTANCE=", "'" + instanceDir + "'",
"ARTEMIS_DATA_DIR=", "'" + instanceDir + "/data'",
"ARTEMIS_ETC_DIR=", "'" + etc + "'",
"ARTEMIS_OOME_DUMP=", "'" + instanceDir + "/log/oom_dump.hprof'",
"ARTEMIS_INSTANCE_URI=", "'file:" + instanceDir + "/'",
"ARTEMIS_INSTANCE_ETC_URI=", "'file:" + etc + "/'");
String home = result.get("ARTEMIS_HOME=");
Assert.assertNotNull(home);
Assert.assertNotEquals("'must-change'", home);
File oldLogging = new File(etc + "/logging.properties");
File newLogging = new File(etc + "/log4j2.properties");
Assert.assertFalse("Old logging must be removed by upgrade", oldLogging.exists());
Assert.assertTrue("New Logging must be installed by upgrade", newLogging.exists());
}
private Map<String, String> checkExpectedValues(String fileName, String... expectedPairs) throws Exception {
Assert.assertTrue("You must pass a pair of expected values", expectedPairs.length > 0 && expectedPairs.length % 2 == 0);
HashMap<String, String> expectedValues = new HashMap<>();
HashMap<String, String> matchingValues = new HashMap<>();
for (int i = 0; i < expectedPairs.length; i += 2) {
Assert.assertFalse("Value duplicated on pairs ::" + expectedPairs[i], expectedValues.containsKey(expectedPairs[i]));
expectedValues.put(expectedPairs[i], expectedPairs[i + 1]);
}
File file = new File(fileName);
try (Stream<String> lines = Files.lines(file.toPath())) {
lines.forEach(line -> {
String trimmedLine = line.trim();
expectedValues.forEach((key, value) -> {
if (trimmedLine.startsWith(key)) {
String actualValue = trimmedLine.substring(key.length());
logger.debug("match = {}", line);
matchingValues.put(key, actualValue);
if (value == null) {
logger.debug("no expected value was defined for {}, we will just fill out the matchingValues for further evaluation", key);
} else {
if (logger.isDebugEnabled()) {
logger.debug("prefix={}, expecting={}, actualValue={}", key, value, actualValue);
}
Assert.assertEquals(key + " did not match", value, actualValue);
}
}
});
});
}
Assert.assertEquals("Some elements were not found in the output of " + fileName, matchingValues.size(), expectedValues.size());
return matchingValues;
}
}