package org.radargun.config; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.testng.PowerMockTestCase; import org.radargun.Directories; import org.radargun.LaunchMaster; import org.radargun.logging.Log; import org.radargun.logging.LogFactory; import org.radargun.stages.control.RepeatBeginStage; import org.radargun.stages.control.RepeatContinueStage; import org.radargun.stages.control.RepeatEndStage; import org.radargun.utils.Utils; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.*; import java.util.*; import static org.testng.Assert.*; /** * Tests parsing of benchmark configuration file * * @author Roman Macor <rmacor@redhat.com> */ @PowerMockIgnore({"javax.management.*"}) @PrepareForTest(Utils.class) @SuppressStaticInitializationFor({"org.radargun.Directories"}) public class AbstractConfigurationTest extends PowerMockTestCase { protected static Log log = LogFactory.getLog(AbstractConfigurationTest.class); protected MasterConfig masterConfig; protected List<String> resources = new ArrayList<>(); protected String getBenchmark() { return null; } /** * Copies resources to the testing directory (such as benchmark file or scenario file) * Parses benchmark file and mocks classes that are irrelevant to the tests * * @throws Exception */ @BeforeClass public void setUpClass() throws Exception { String cwd = System.getProperty("user.dir"); String radargunCoreFile = Paths.get(cwd, "target", "radargun-core-3.0.0-SNAPSHOT.jar").toString(); PowerMockito.mockStatic(Utils.class, Mockito.CALLS_REAL_METHODS); PowerMockito.doReturn(radargunCoreFile).when(Utils.class, "getCodePath", Mockito.any(Class.class)); PowerMockito.field(Directories.class, "REPORTERS_DIR").set(null, tempDir("reporters")); PowerMockito.field(Directories.class, "PLUGINS_DIR").set(null, tempDir("plugins")); PowerMockito.field(Directories.class, "LIB_DIR").set(null, new File(cwd, "target")); DomConfigParser configParser = new DomConfigParser();//Mockito.mock(DomConfigParser.class, CALLS_REAL_METHODS); resources.add(getBenchmark()); copyResources(); String[] masterArgs = {"--config", getBenchmark()}; String config = LaunchMaster.getConfigOrExit(masterArgs); log.info("Configuration file is: " + config); log.info("Current directory is " + cwd); masterConfig = configParser.parseConfig(config); } private File tempDir(String prefix) throws IOException { File reportersDir = Files.createTempDirectory(prefix).toFile(); reportersDir.deleteOnExit(); return reportersDir; } /** * Removes resource files that were copied to the testing directory in setUpClass method */ @AfterClass public void cleanUp() { for (String file : resources) { File benchmarkFile = new File(System.getProperty("user.dir") + File.separator + file); benchmarkFile.delete(); } } /** * Tests correct parsing of configuration */ public void testConfiguration() { List<Configuration> configurations = masterConfig.getConfigurations(); assertEquals(configurations.size(), 2); Configuration infinispan52 = configurations.get(0); assertEquals(infinispan52.name, "Infinispan 5.2 - distributed"); Configuration infinispan60 = configurations.get(1); assertEquals(infinispan60.name, "Infinispan 6.0 - distributed"); assertConfiguration(infinispan52, "infinispan52"); assertConfiguration(infinispan60, "infinispan60"); } /** * Helper method to tests correct parsing of configuration * * @param configuration benchmark configuration * @param expectedPluginName plugin name */ private void assertConfiguration(Configuration configuration, String expectedPluginName) { assertEquals(configuration.getSetups().size(), 1); Configuration.Setup setup = configuration.getSetups().get(0); assertEquals(setup.plugin.toString(), expectedPluginName); assertEquals(setup.service.toString(), "embedded"); assertEquals(setup.getProperties().size(), 1); assertEquals(setup.getVmArgs().size(), 1); assertTrue(setup.getProperties().containsKey("file")); assertEquals(setup.getProperties().get("file").toString(), "dist-sync.xml"); assertTrue(setup.getVmArgs().containsKey("memory")); assertEquals(setup.getVmArgs().get("memory").toString(), "max=4G"); } /** * Tests correct parsing of configuration */ public void testHost() { String host = masterConfig.getHost(); int port = masterConfig.getPort(); assertEquals(host, "127.0.0.1"); assertEquals(port, 2103); } /** * Tests correct parsing of plugins configuration */ public void testPlugins() { Set<String> plugins = masterConfig.getPlugins(); assertEquals(plugins.size(), 2); assertTrue(plugins.contains("infinispan52")); assertTrue(plugins.contains("infinispan60")); } /** * Tests correct parsing of clusters configuration */ public void testClusters() { List<Cluster> clusters = masterConfig.getClusters(); assertEquals(clusters.size(), 2); assertEquals(clusters.get(0).toString(), "Cluster[default=2]"); assertEquals(clusters.get(1).toString(), "Cluster[default=3]"); assertEquals(masterConfig.getMaxClusterSize(), 3); } /** * Tests correct parsing of scenario configuration */ public void testScenario() { Scenario scenario = masterConfig.getScenario(); assertEquals(scenario.getStageCount(), 10); List<Scenario.StageDescription> stages = scenario.getStages(); Map<String, Definition> basicOperationTestProperties = stages.get(4).properties; assertEquals(basicOperationTestProperties.size(), 2); assertTrue(basicOperationTestProperties.containsKey("var")); assertTrue(basicOperationTestProperties.containsKey("value")); for (Scenario.StageDescription stage : stages) { Map<String, Definition> properties = stage.properties; if (stage.stageClass.equals(RepeatBeginStage.class) || stage.stageClass.equals(RepeatContinueStage.class) || stage.stageClass.equals(RepeatEndStage.class)) assertRepeatProperties(properties); } } /** * Tests correct parsing of repeat properties * * @param properties repeat stage properties */ private void assertRepeatProperties(Map<String, Definition> properties) { assertEquals(properties.size(), 3); assertTrue(properties.containsKey("from")); assertTrue(properties.containsKey("to")); assertTrue(properties.containsKey("inc")); assertFalse(properties.containsKey("madeUp")); assertEquals(properties.get("from").toString(), "10"); assertEquals(properties.get("to").toString(), "30"); assertEquals(properties.get("inc").toString(), "10"); } /** * Tests correct parsing of report configuration */ public void testReport() { List<ReporterConfiguration> reporters = masterConfig.getReporters(); assertEquals(reporters.size(), 3); assertEquals(reporters.get(0).type, "csv"); assertEquals(reporters.get(1).type, "html"); assertEquals(reporters.get(2).type, "serialized"); } /** * Copies resources to the current directory * * @throws IOException if file can not be copied */ protected void copyResources() { ClassLoader classLoader = getClass().getClassLoader(); for (String file : resources) { try (InputStream source = classLoader.getResourceAsStream(file)) { File destination = new File(System.getProperty("user.dir") + File.separator + file); Files.copy(source, destination.toPath(), StandardCopyOption.REPLACE_EXISTING); destination.deleteOnExit(); } catch (Exception e) { log.error("Exception while copying resources", e); } } } }