changeset 2603:02f866dff054

Test fixes for in-container build. - Some container builds might have THERMOSTAT_HOME/USER_THERMOSTAT_HOME set, which causes some tests to fail. - Other tests assume the environment USER is always defined. It's not the case for a container build. - Don't assume the system is UTF-8 for tests. - Don't assume any specific order of issuers returned from keystore files. Reviewed-by: neugens Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2017-March/022307.html
author Severin Gehwolf <sgehwolf@redhat.com>
date Mon, 27 Feb 2017 14:52:50 +0100
parents 4d7312c27c6c
children 1fcf53b27d26
files common/core/src/test/java/com/redhat/thermostat/common/internal/CustomX509TrustManagerTest.java common/portability/src/test/java/com/redhat/thermostat/common/portability/internal/linux/LinuxProcessEnvironmentBuilderImplTest.java config/src/test/java/com/redhat/thermostat/shared/config/internal/CommonPathsImplTest.java dev/perflog-analyzer/src/main/java/com/redhat/thermostat/dev/perf/logs/internal/LogAnalyzerImpl.java dev/perflog-analyzer/src/test/java/com/redhat/thermostat/dev/perf/logs/internal/StatementStatsTest.java dev/perflog-analyzer/src/test/java/com/redhat/thermostat/dev/perf/logs/internal/StatsParserBuilderTest.java web/server/src/test/java/com/redhat/thermostat/web/server/PropertySettingServletContextListenerTest.java web/server/src/test/java/com/redhat/thermostat/web/server/WebStorageEndPointUnitTest.java web/server/src/test/java/com/redhat/thermostat/web/server/auth/spi/PropertiesUserValidatorTest.java web/server/src/test/java/com/redhat/thermostat/web/server/auth/spi/RolesAmenderTest.java
diffstat 10 files changed, 86 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/common/core/src/test/java/com/redhat/thermostat/common/internal/CustomX509TrustManagerTest.java	Thu Mar 02 10:52:18 2017 -0500
+++ b/common/core/src/test/java/com/redhat/thermostat/common/internal/CustomX509TrustManagerTest.java	Mon Feb 27 14:52:50 2017 +0100
@@ -38,6 +38,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
 
@@ -47,12 +48,13 @@
 import java.net.URLDecoder;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
+import java.util.HashSet;
+import java.util.Set;
 
 import javax.net.ssl.X509TrustManager;
 
 import org.junit.Test;
 
-import com.redhat.thermostat.common.internal.CustomX509TrustManager;
 import com.redhat.thermostat.common.ssl.SslInitException;
 
 /**
@@ -133,12 +135,13 @@
         X509TrustManager tm = new CustomX509TrustManager((X509TrustManager)null, ourKeyStore, "testpassword");
         // keystore contains private key of itself + imported CA cert
         assertEquals(2, tm.getAcceptedIssuers().length);
-        String issuerNameCustomCA = "1.2.840.113549.1.9.1=#16126a6572626f6161407265646861742e636f6d,CN=test.example.com,O=Red Hat Inc.,L=Saalfelden,ST=Salzburg,C=AT";
-        String issuerNameKeystoreCA = "CN=Unknown,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown";
-        assertEquals(issuerNameCustomCA, tm.getAcceptedIssuers()[0]
-                .getIssuerX500Principal().getName());
-        assertEquals(issuerNameKeystoreCA, tm.getAcceptedIssuers()[1]
-                .getIssuerX500Principal().getName());
+        Set<String> trustedIssuers = new HashSet<>();
+        trustedIssuers.add("1.2.840.113549.1.9.1=#16126a6572626f6161407265646861742e636f6d,CN=test.example.com,O=Red Hat Inc.,L=Saalfelden,ST=Salzburg,C=AT");
+        trustedIssuers.add("CN=Unknown,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown");
+        // Don't assume a specific order in which issuers are returned
+        for (X509Certificate issuer: tm.getAcceptedIssuers()) {
+            assertTrue(trustedIssuers.contains(issuer.getIssuerX500Principal().getName()));
+        }
     }
 
     private static String decodeFilePath(URL url) {
--- a/common/portability/src/test/java/com/redhat/thermostat/common/portability/internal/linux/LinuxProcessEnvironmentBuilderImplTest.java	Thu Mar 02 10:52:18 2017 -0500
+++ b/common/portability/src/test/java/com/redhat/thermostat/common/portability/internal/linux/LinuxProcessEnvironmentBuilderImplTest.java	Mon Feb 27 14:52:50 2017 +0100
@@ -41,9 +41,13 @@
 import org.mockito.Mockito;
 
 import java.io.ByteArrayInputStream;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.util.List;
 import java.util.Map;
 import java.util.Random;
 
@@ -61,16 +65,22 @@
 
 public class LinuxProcessEnvironmentBuilderImplTest {
 
+    private static final String ROOT_CGROUP_SCOPE = "/";
+    private static final String PID_1_PROC_CGROUP = "/proc/1/cgroup";
     private final Random r = new Random();
 
     @Test
     public void testBasicBuild() {
         Assume.assumeTrue(OS.IS_LINUX);
         ProcDataSource dataSource = new ProcDataSource();
-        Map<String, String> result = new LinuxProcessEnvironmentBuilderImpl(dataSource).build(TestUtils.getProcessId());
+        int pid = TestUtils.getProcessId();
+        Map<String, String> result = new LinuxProcessEnvironmentBuilderImpl(dataSource).build(pid);
         assertNotNull(result);
         assertFalse(result.isEmpty());
-        assertTrue(result.containsKey("USER"));
+        // assert this only for the non-container case.
+        if (!isContainer()) {
+            assertTrue(result.containsKey("USER"));
+        }
     }
 
     @Test
@@ -133,5 +143,25 @@
         }
         return result;
     }
+    
+    /*
+     * Heuristic: /proc/1/cgroup => A:B:C where C == '/' outside a container.
+     *                                    where C == '/system.slice/docker-<SHA256>.scope in a container
+     */
+    private boolean isContainer() {
+        try {
+            List<String> lines = Files.readAllLines(new File(PID_1_PROC_CGROUP).toPath(), Charset.forName("UTF-8"));
+            String[] tokens = lines.get(0).split(":");
+            if (tokens.length == 3) {
+                return !(tokens[2].equals(ROOT_CGROUP_SCOPE));
+            } else {
+                // unknown format?
+                return false;
+            }
+        } catch (Throwable e) {
+            // Default to false
+            return false;
+        }
+    }
 }
 
--- a/config/src/test/java/com/redhat/thermostat/shared/config/internal/CommonPathsImplTest.java	Thu Mar 02 10:52:18 2017 -0500
+++ b/config/src/test/java/com/redhat/thermostat/shared/config/internal/CommonPathsImplTest.java	Mon Feb 27 14:52:50 2017 +0100
@@ -145,7 +145,7 @@
         try {
             thermostatHome = setupTempDir("CommonPathsImplTest.testUserLocations",
                     THERMOSTAT_HOME_PROPERTY);
-            String userHome = System.getProperty("user.home") + s + ".thermostat";
+            String userHome = getUserHome();
             CommonPaths config = new CommonPathsImpl();
 
             Assert.assertEquals(concatPath(userHome, "etc", "agent.properties"),
@@ -170,11 +170,32 @@
             }
         }
     }
+    
+    // Duplicated from CommonPathsImpl.UnprivilegedUserDirectories
+    private String getUserHome() {
+        String userHome = System.getProperty(USER_THERMOSTAT_HOME_PROPERTY);
+        if (userHome == null) {
+            userHome = System.getenv(USER_THERMOSTAT_HOME_PROPERTY);
+        }
+        if (userHome == null) {
+            userHome = System.getProperty("user.home") + s + ".thermostat";
+        }
+        return userHome;
+    }
 
     @Test
     public void testPrivilegedUserLocations() throws InvalidConfigurationException, IOException {
         String thermostatHomeAndFakeRoot = null;
         try {
+            // It's not safe to create directories in this setup. It's treated
+            // as a prefix "/tmp/foo" for example in this config. Creating
+            // directories in a random prefix is not a good idea. Not even for
+            // tests. Skip the test in this case
+            String userHomeEnv = System.getenv(USER_THERMOSTAT_HOME_PROPERTY);
+            if (userHomeEnv != null) {
+                System.out.println("USER_TEHMOSTAT_HOME set to: " + userHomeEnv + " skipping test!");
+                return;
+            }
             thermostatHomeAndFakeRoot = setupTempDir("CommonPathsImplTest.testPrivilegedUserLocations",
                     THERMOSTAT_HOME_PROPERTY);
             System.setProperty(THERMOSTAT_SYSTEM_USER_PROPERTY, "");
@@ -243,6 +264,9 @@
 
     @Test
     public void instantiationThrowsExceptionUndefinedThermostatHome() {
+        // This test does not make sense when THERMOSTAT_HOME env var is defined
+        // externally. Ignore in this case.
+        Assume.assumeTrue(System.getenv(THERMOSTAT_HOME_PROPERTY) == null);
         try {
             new CommonPathsImpl();
             // The web archive uses this. See WebStorageEndPoint#init();
--- a/dev/perflog-analyzer/src/main/java/com/redhat/thermostat/dev/perf/logs/internal/LogAnalyzerImpl.java	Thu Mar 02 10:52:18 2017 -0500
+++ b/dev/perflog-analyzer/src/main/java/com/redhat/thermostat/dev/perf/logs/internal/LogAnalyzerImpl.java	Mon Feb 27 14:52:50 2017 +0100
@@ -37,8 +37,10 @@
 package com.redhat.thermostat.dev.perf.logs.internal;
 
 import java.io.FileNotFoundException;
-import java.io.FileReader;
 import java.io.IOException;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
 import java.util.Scanner;
 
 import com.redhat.thermostat.dev.perf.logs.LogAnalyzer;
@@ -102,8 +104,8 @@
     }
 
     private void readFileCollectStats(final StatsParser parser, final LogFileStats stats) throws ReadException {
-        try (FileReader freader = new FileReader(config.getLogFile());
-                Scanner scanner = new Scanner(freader)) {
+        try (Reader freader = Files.newBufferedReader(config.getLogFile().toPath(), Charset.forName("UTF-8"));
+             Scanner scanner = new Scanner(freader)) {
             while (scanner.hasNextLine()) {
                 String line = scanner.nextLine();
                 LineStat stat = parser.parse(line);
--- a/dev/perflog-analyzer/src/test/java/com/redhat/thermostat/dev/perf/logs/internal/StatementStatsTest.java	Thu Mar 02 10:52:18 2017 -0500
+++ b/dev/perflog-analyzer/src/test/java/com/redhat/thermostat/dev/perf/logs/internal/StatementStatsTest.java	Mon Feb 27 14:52:50 2017 +0100
@@ -44,6 +44,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashSet;
@@ -211,14 +212,14 @@
     }
     
     @Test
-    public void verifySummaryPrinting() {
+    public void verifySummaryPrinting() throws UnsupportedEncodingException {
         when(state.getDescriptor(desc1Id)).thenReturn(desc1);
         when(state.getDescriptor(desc2Id)).thenReturn(desc2);
         when(state.getDescriptor(desc3Id)).thenReturn(desc3);
         
         StatsConfig config = new StatsConfig(new File("foo-bar"), SortBy.AVG, Direction.DSC, false);
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        PrintStream pStream = new PrintStream(baos);
+        PrintStream pStream = new PrintStream(baos, false, "UTF-8");
         stats.setConfig(config);
         stats.printSummary(pStream);
         String expected = "Statement statistics (6 records): 3 distinct statements (5 reads, 1 writes)\n" +
@@ -227,7 +228,7 @@
                           "Total #: 2, 300µs (min), 333µs (max), 316.50µs (avg), DESCRIPTOR: QUERY foo-bar WHERE 'x' = ?l\n" +
                           "Total #: 3, 2ms (min), 120ms (max), 44.67ms (avg), DESCRIPTOR: QUERY foo WHERE 'a' = ?s\n" +
                           "Total #: 1, 44ns (min), 44ns (max), 44.00ns (avg), DESCRIPTOR: ADD foo SET 'a' = ?s\n\n";
-        String summary = baos.toString();
+        String summary = baos.toString("UTF-8");
         assertEquals(expected, summary);
     }
     
--- a/dev/perflog-analyzer/src/test/java/com/redhat/thermostat/dev/perf/logs/internal/StatsParserBuilderTest.java	Thu Mar 02 10:52:18 2017 -0500
+++ b/dev/perflog-analyzer/src/test/java/com/redhat/thermostat/dev/perf/logs/internal/StatsParserBuilderTest.java	Mon Feb 27 14:52:50 2017 +0100
@@ -126,7 +126,7 @@
     public void canParseBasicLogFile() throws FileNotFoundException {
         StatsParser parser = StatsParserBuilder.build();
         File perfLogFile = new File(decodeFilePath(this.getClass().getResource("/testPerfLogFile.log")));
-        Scanner scanner = new Scanner(perfLogFile);
+        Scanner scanner = new Scanner(perfLogFile, "UTF-8");
         ArrayList<LineStat> stats = new ArrayList<>();
         while (scanner.hasNextLine()) {
             String line = scanner.nextLine();
@@ -150,7 +150,7 @@
     public void canParseLogFileWithMultipleLogTags() throws FileNotFoundException, IllegalFilterException, ParseException {
         StatsParser parser = StatsParserBuilder.build();
         File perfLogFile = new File(decodeFilePath(this.getClass().getResource("/perflogMultipleLogTags.log")));
-        Scanner scanner = new Scanner(perfLogFile);
+        Scanner scanner = new Scanner(perfLogFile, "UTF-8");
         LogFileStats stats = new LogFileStats(new SharedStatementState(), null);
         // add composite filters for queue stats.
         LineStatsFilter<QueueStat, QueueStats> qFrontFilter = new LogTagStatsFilterDecorator<>(new QueueStatsFilter(), LogTag.STORAGE_FRONT_END);
--- a/web/server/src/test/java/com/redhat/thermostat/web/server/PropertySettingServletContextListenerTest.java	Thu Mar 02 10:52:18 2017 -0500
+++ b/web/server/src/test/java/com/redhat/thermostat/web/server/PropertySettingServletContextListenerTest.java	Mon Feb 27 14:52:50 2017 +0100
@@ -41,6 +41,7 @@
 import javax.servlet.ServletContextEvent;
 
 import org.junit.After;
+import org.junit.Assume;
 import org.junit.Test;
 
 import com.redhat.thermostat.common.Constants;
@@ -63,6 +64,7 @@
     
     @Test
     public void verifySetsProperty() {
+        Assume.assumeTrue(System.getenv("THERMOSTAT_HOME") == null);
         PropertySettingServletContextListener listener = new PropertySettingServletContextListener();
         ServletContextEvent event = mock(ServletContextEvent.class);
         ServletContext mockContext = mock(ServletContext.class);
--- a/web/server/src/test/java/com/redhat/thermostat/web/server/WebStorageEndPointUnitTest.java	Thu Mar 02 10:52:18 2017 -0500
+++ b/web/server/src/test/java/com/redhat/thermostat/web/server/WebStorageEndPointUnitTest.java	Mon Feb 27 14:52:50 2017 +0100
@@ -67,6 +67,7 @@
 import com.redhat.thermostat.common.internal.test.Bug;
 import com.redhat.thermostat.storage.core.Storage;
 import org.junit.After;
+import org.junit.Assume;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
@@ -162,6 +163,7 @@
     
     @Test
     public void initThrowsRuntimeExceptionIfThermostatHomeNotSet() {
+        Assume.assumeTrue(System.getenv("THERMOSTAT_HOME") == null);
         WebStorageEndPoint endpoint = new WebStorageEndPoint();
         ServletConfig config = mock(ServletConfig.class);
         try {
--- a/web/server/src/test/java/com/redhat/thermostat/web/server/auth/spi/PropertiesUserValidatorTest.java	Thu Mar 02 10:52:18 2017 -0500
+++ b/web/server/src/test/java/com/redhat/thermostat/web/server/auth/spi/PropertiesUserValidatorTest.java	Mon Feb 27 14:52:50 2017 +0100
@@ -48,6 +48,7 @@
 import java.util.Set;
 
 import org.junit.After;
+import org.junit.Assume;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -114,6 +115,7 @@
     
     @Test
     public void testInit() {
+        Assume.assumeTrue(System.getenv("THERMOSTAT_HOME") == null);
         try {
             new PropertiesUserValidator();
             fail("THERMOSTAT_HOME not set, should have failed!");
--- a/web/server/src/test/java/com/redhat/thermostat/web/server/auth/spi/RolesAmenderTest.java	Thu Mar 02 10:52:18 2017 -0500
+++ b/web/server/src/test/java/com/redhat/thermostat/web/server/auth/spi/RolesAmenderTest.java	Mon Feb 27 14:52:50 2017 +0100
@@ -54,6 +54,7 @@
 import java.util.Set;
 
 import org.junit.After;
+import org.junit.Assume;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -228,6 +229,7 @@
 
     @Test
     public void testInit() {
+        Assume.assumeTrue(System.getenv("THERMOSTAT_HOME") == null);
         try {
             new RolesAmender(null);
             fail("THERMOSTAT_HOME not set, should have failed!");