You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by mb...@apache.org on 2018/02/06 18:04:53 UTC
[2/2] asterixdb git commit: [ASTERIXDB-2261][TEST] Logging Misc Fixes
[ASTERIXDB-2261][TEST] Logging Misc Fixes
- fix ASTERIXDB-2261 by preventing *DB and Hyracks test log config files
from being discoverable on the test classpath
- align test class packages
Change-Id: I9f6145849d87a1ed702b955723bc1dd53e607473
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2317
Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
Reviewed-by: Murtadha Hubail <mh...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/2530e39d
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/2530e39d
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/2530e39d
Branch: refs/heads/master
Commit: 2530e39d7d946a6d57ce33ebc995b9be4e51721d
Parents: 1a93695
Author: Michael Blow <mb...@apache.org>
Authored: Tue Feb 6 01:19:42 2018 -0500
Committer: Michael Blow <mb...@apache.org>
Committed: Tue Feb 6 10:04:06 2018 -0800
----------------------------------------------------------------------
.../test/resources/log4j2-asterixdb-test.xml | 45 ++++
.../src/test/resources/log4j2-test.xml | 45 ----
asterixdb/asterix-common/pom.xml | 2 +-
asterixdb/asterix-server/pom.xml | 1 +
.../server/test/AbstractExecutionIT.java | 163 ------------
.../apache/asterix/server/test/LicensingIT.java | 94 -------
.../server/test/NCServiceExecutionIT.java | 266 -------------------
.../asterix/server/test/NcLifecycleIT.java | 123 ---------
.../apache/asterix/server/test/RecoveryIT.java | 136 ----------
.../asterix/server/test/ReplicationIT.java | 135 ----------
.../server/test/SampleLocalClusterIT.java | 140 ----------
.../asterix/server/test/SqlppExecutionIT.java | 54 ----
.../test/server/AbstractExecutionIT.java | 163 ++++++++++++
.../apache/asterix/test/server/LicensingIT.java | 94 +++++++
.../test/server/NCServiceExecutionIT.java | 266 +++++++++++++++++++
.../asterix/test/server/NcLifecycleIT.java | 119 +++++++++
.../apache/asterix/test/server/RecoveryIT.java | 136 ++++++++++
.../asterix/test/server/ReplicationIT.java | 135 ++++++++++
.../test/server/SampleLocalClusterIT.java | 140 ++++++++++
.../asterix/test/server/SqlppExecutionIT.java | 54 ++++
asterixdb/pom.xml | 8 +-
.../hyracks/hyracks-server/pom.xml | 11 +
.../server/process/HyracksCCProcess.java | 47 ----
.../server/process/HyracksNCServiceProcess.java | 45 ----
.../server/process/HyracksServerProcess.java | 126 ---------
.../server/process/HyracksVirtualCluster.java | 85 ------
.../apache/hyracks/server/test/NCServiceIT.java | 147 ----------
.../apache/hyracks/test/server/NCServiceIT.java | 148 +++++++++++
.../test/server/process/HyracksCCProcess.java | 47 ++++
.../server/process/HyracksNCServiceProcess.java | 45 ++++
.../server/process/HyracksServerProcess.java | 126 +++++++++
.../server/process/HyracksVirtualCluster.java | 85 ++++++
hyracks-fullstack/pom.xml | 2 +-
.../src/test/resources/log4j2-hyracks-test.xml | 41 +++
.../src/test/resources/log4j2-test.xml | 41 ---
35 files changed, 1665 insertions(+), 1650 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-app/src/test/resources/log4j2-asterixdb-test.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/log4j2-asterixdb-test.xml b/asterixdb/asterix-app/src/test/resources/log4j2-asterixdb-test.xml
new file mode 100644
index 0000000..c6ecd7d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/log4j2-asterixdb-test.xml
@@ -0,0 +1,45 @@
+<!--
+ ! 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 complianceo
+ ! 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.
+ !-->
+<Configuration status="WARN">
+ <Appenders>
+ <Console name="Console" target="SYSTEM_OUT">
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+ </Console>
+ <File name="InfoLog" fileName="target/info.log">
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+ </File>
+ <Console name="ConsoleTest" target="SYSTEM_OUT">
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
+ </Console>
+ </Appenders>
+ <Loggers>
+ <Root level="WARN">
+ <AppenderRef ref="InfoLog"/>
+ </Root>
+ <Logger name="org.apache.hyracks.control.nc.service" level="INFO"/>
+ <Logger name="org.apache.hyracks" level="INFO"/>
+ <Logger name="org.apache.asterix" level="INFO"/>
+ <Logger name="org.apache.hyracks.test" level="INFO">
+ <AppenderRef ref="ConsoleTest"/>
+ </Logger>
+ <Logger name="org.apache.asterix.test" level="INFO">
+ <AppenderRef ref="ConsoleTest"/>
+ </Logger>
+ </Loggers>
+</Configuration>
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-app/src/test/resources/log4j2-test.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-app/src/test/resources/log4j2-test.xml b/asterixdb/asterix-app/src/test/resources/log4j2-test.xml
deleted file mode 100644
index c6ecd7d..0000000
--- a/asterixdb/asterix-app/src/test/resources/log4j2-test.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<!--
- ! 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 complianceo
- ! 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.
- !-->
-<Configuration status="WARN">
- <Appenders>
- <Console name="Console" target="SYSTEM_OUT">
- <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
- </Console>
- <File name="InfoLog" fileName="target/info.log">
- <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
- </File>
- <Console name="ConsoleTest" target="SYSTEM_OUT">
- <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
- </Console>
- </Appenders>
- <Loggers>
- <Root level="WARN">
- <AppenderRef ref="InfoLog"/>
- </Root>
- <Logger name="org.apache.hyracks.control.nc.service" level="INFO"/>
- <Logger name="org.apache.hyracks" level="INFO"/>
- <Logger name="org.apache.asterix" level="INFO"/>
- <Logger name="org.apache.hyracks.test" level="INFO">
- <AppenderRef ref="ConsoleTest"/>
- </Logger>
- <Logger name="org.apache.asterix.test" level="INFO">
- <AppenderRef ref="ConsoleTest"/>
- </Logger>
- </Loggers>
-</Configuration>
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-common/pom.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-common/pom.xml b/asterixdb/asterix-common/pom.xml
index 78f75a8..9193a3d 100644
--- a/asterixdb/asterix-common/pom.xml
+++ b/asterixdb/asterix-common/pom.xml
@@ -169,7 +169,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
- <configuration>
+ <configuration combine.children="append">
<ignoredUnusedDeclaredDependencies>
<ignoredUnusedDeclaredDependency>org.apache.hyracks:hyracks-storage-am-lsm-btree:*</ignoredUnusedDeclaredDependency>
<ignoredUnusedDeclaredDependency>org.apache.hyracks:hyracks-storage-am-lsm-rtree:*</ignoredUnusedDeclaredDependency>
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/pom.xml
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/pom.xml b/asterixdb/asterix-server/pom.xml
index 6080d69..80f4197 100644
--- a/asterixdb/asterix-server/pom.xml
+++ b/asterixdb/asterix-server/pom.xml
@@ -514,6 +514,7 @@
<dependency>
<groupId>org.apache.hyracks</groupId>
<artifactId>hyracks-server</artifactId>
+ <type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/AbstractExecutionIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/AbstractExecutionIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/AbstractExecutionIT.java
deleted file mode 100644
index 8890898..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/AbstractExecutionIT.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright 2009-2013 by The Regents of the University of California
- * Licensed 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 from
- *
- * 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.asterix.server.test;
-
-import org.apache.asterix.external.util.ExternalDataConstants;
-import org.apache.asterix.external.util.IdentitiyResolverFactory;
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.asterix.testframework.context.TestFileContext;
-import org.apache.asterix.testframework.xml.TestCase.CompilationUnit;
-import org.apache.asterix.testframework.xml.TestGroup;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.codehaus.plexus.util.FileUtils;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import static org.apache.hyracks.util.file.FileUtil.joinPath;
-
-/**
- * Runs the runtime test cases under 'asterix-app/src/test/resources/runtimets'.
- */
-@RunWith(Parameterized.class)
-public abstract class AbstractExecutionIT {
-
- protected static final Logger LOGGER = LogManager.getLogger();
-
- protected static final String PATH_ACTUAL = joinPath("target", "ittest");
- protected static final String PATH_BASE = joinPath("..", "asterix-app", "src", "test", "resources", "runtimets");
-
- protected static final String HDFS_BASE = "../asterix-app/";
-
- protected static final TestExecutor testExecutor = new TestExecutor();
-
- private static final String EXTERNAL_LIBRARY_TEST_GROUP = "lib";
-
- private static final List<String> badTestCases = new ArrayList<>();
-
- private static String reportPath = new File(joinPath("target", "failsafe-reports")).getAbsolutePath();
-
- @Rule
- public TestRule retainLogs = new RetainLogsRule(NCServiceExecutionIT.LOG_DIR, reportPath, this);
-
- @BeforeClass
- public static void setUp() throws Exception {
- System.out.println("Starting setup");
- if (LOGGER.isInfoEnabled()) {
- LOGGER.info("Starting setup");
- }
- File outdir = new File(PATH_ACTUAL);
- outdir.mkdirs();
-
- File externalTestsJar =
- new File(StringUtils.join(new String[] { "..", "asterix-external-data", "target" }, File.separator))
- .listFiles((dir, name) -> name.matches("asterix-external-data-.*-tests.jar"))[0];
-
- FileUtils.copyFile(externalTestsJar,
- new File(NCServiceExecutionIT.APP_HOME + "/repo", externalTestsJar.getName()));
-
- NCServiceExecutionIT.setUp();
-
- FileUtils.copyDirectoryStructure(new File(joinPath("..", "asterix-app", "data")),
- new File(NCServiceExecutionIT.ASTERIX_APP_DIR + "/clusters/local/working_dir/data"));
-
- FileUtils.copyDirectoryStructure(new File(joinPath("..", "asterix-app", "target", "data")),
- new File(NCServiceExecutionIT.ASTERIX_APP_DIR + "/clusters/local/working_dir/target/data"));
-
- // Set the node resolver to be the identity resolver that expects node names
- // to be node controller ids; a valid assumption in test environment.
- System.setProperty(ExternalDataConstants.NODE_RESOLVER_FACTORY_PROPERTY,
- IdentitiyResolverFactory.class.getName());
-
- reportPath = new File(joinPath("target", "failsafe-reports")).getAbsolutePath();
- }
-
- @AfterClass
- public static void tearDown() throws Exception {
- File outdir = new File(PATH_ACTUAL);
- File[] files = outdir.listFiles();
- if ((files == null) || (files.length == 0)) {
- outdir.delete();
- }
- //AsterixLifecycleIT.tearDown();
- NCServiceExecutionIT.tearDown();
- if (!badTestCases.isEmpty()) {
- System.out.println("The following test cases left some data");
- for (String testCase : badTestCases) {
- System.out.println(testCase);
- }
- }
- }
-
- @Parameters
- public static Collection<Object[]> tests() throws Exception {
- Collection<Object[]> testArgs = new ArrayList<Object[]>();
- TestCaseContext.Builder b = new TestCaseContext.Builder();
- for (TestCaseContext ctx : b.build(new File(PATH_BASE))) {
- testArgs.add(new Object[] { ctx });
- }
- return testArgs;
- }
-
- private TestCaseContext tcCtx;
-
- public AbstractExecutionIT(TestCaseContext tcCtx) {
- this.tcCtx = tcCtx;
- }
-
- @Test
- public void test() throws Exception {
- if (skip()) {
- return;
- }
- testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false);
- testExecutor.cleanup(tcCtx.toString(), badTestCases);
- }
-
- protected boolean skip() {
- // If the test case contains library commands, we skip them
- List<CompilationUnit> cUnits = tcCtx.getTestCase().getCompilationUnit();
- for (CompilationUnit cUnit : cUnits) {
- List<TestFileContext> testFileCtxs = tcCtx.getTestFiles(cUnit);
- for (TestFileContext ctx : testFileCtxs) {
- if (ctx.getType().equals(EXTERNAL_LIBRARY_TEST_GROUP)) {
- return true;
- }
- }
- }
- // For now we skip api tests.
- for (TestGroup group : tcCtx.getTestGroups()) {
- if (group != null && "api".equals(group.getName())) {
- LOGGER.info("Skipping test: " + tcCtx.toString());
- return true;
- }
- }
- return false;
- }
-}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/LicensingIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/LicensingIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/LicensingIT.java
deleted file mode 100644
index 6d4af8c..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/LicensingIT.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * 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.asterix.server.test;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.hyracks.util.file.FileUtil;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runners.MethodSorters;
-
-@FixMethodOrder(MethodSorters.JVM)
-public class LicensingIT {
-
- protected String installerDir;
-
- @Before
- public void setup() {
- final String pattern = getInstallerDirPattern();
- final String targetDir = getTargetDir();
- final String[] list = new File(targetDir).list((dir, name) -> name.matches(pattern));
- Assert.assertNotNull("installerDir", list);
- Assert.assertFalse("Ambiguous install dir (" + pattern + "): " + Arrays.toString(list), list.length > 1);
- Assert.assertEquals("Can't find install dir (" + pattern + ")", 1, list.length);
- installerDir = FileUtil.joinPath(targetDir, list[0]);
- }
-
- protected String getTargetDir() {
- return FileUtil.joinPath("target");
- }
-
- protected String getInstallerDirPattern() {
- return "asterix-server.*-binary-assembly";
- }
-
- protected String pathToLicensingFiles() {
- return "";
- }
-
- @Test
- public void testLicenseNoticeFilesPresent() throws IOException {
- for (String name : getRequiredArtifactNames()) {
- final String fileName = FileUtil.joinPath(installerDir, pathToLicensingFiles(), name);
- Assert.assertTrue(fileName + " missing", new File(fileName).exists());
- }
- }
-
- protected String[] getRequiredArtifactNames() {
- return org.apache.commons.lang3.ArrayUtils.add(getLicenseArtifactNames(), "NOTICE");
- }
-
- @Test
- public void ensureNoMissingLicenses() throws IOException {
- for (String licenseArtifactName : getLicenseArtifactNames()) {
- final File licenseFile =
- new File(FileUtil.joinPath(installerDir, pathToLicensingFiles(), licenseArtifactName));
- List<String> badLines = new ArrayList<>();
- for (String line : FileUtils.readLines(licenseFile, StandardCharsets.UTF_8)) {
- if (line.matches("^\\s*MISSING:.*")) {
- badLines.add(line.trim());
- }
- }
- Assert.assertEquals("Missing licenses in " + licenseFile + ": " + badLines, 0, badLines.size());
- }
- }
-
- protected String[] getLicenseArtifactNames() {
- return new String[] { "LICENSE" };
- }
-}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NCServiceExecutionIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NCServiceExecutionIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NCServiceExecutionIT.java
deleted file mode 100644
index d7eea9a..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NCServiceExecutionIT.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * 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.asterix.server.test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.test.runtime.HDFSCluster;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.asterix.testframework.xml.TestGroup;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.hyracks.server.process.HyracksCCProcess;
-import org.apache.hyracks.server.process.HyracksNCServiceProcess;
-import org.apache.hyracks.server.process.HyracksVirtualCluster;
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.MethodSorters;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-@RunWith(Parameterized.class)
-public class NCServiceExecutionIT {
-
- // Important paths and files for this test.
-
- // The "target" subdirectory of asterix-server. All outputs go here.
- public static final String TARGET_DIR =
- StringUtils.join(new String[] { "../asterix-server/target" }, File.separator);
-
- // Directory where the NCs create and store all data, as configured by
- // src/test/resources/NCServiceExecutionIT/cc.conf.
- public static final String INSTANCE_DIR = StringUtils.join(new String[] { TARGET_DIR, "tmp" }, File.separator);
-
- // The log directory, where all CC, NCService, and NC logs are written. CC and
- // NCService logs are configured on the HyracksVirtualCluster below. NC logs
- // are configured in src/test/resources/NCServiceExecutionIT/ncservice*.conf.
- public static final String LOG_DIR =
- StringUtils.join(new String[] { TARGET_DIR, "failsafe-reports" }, File.separator);
-
- // Directory where *.conf files are located.
- public static final String CONF_DIR =
- StringUtils.join(new String[] { TARGET_DIR, "test-classes", "NCServiceExecutionIT" }, File.separator);
-
- // The app.home specified for HyracksVirtualCluster. The NCService expects
- // to find the NC startup script in ${app.home}/bin.
- public static final String APP_HOME = StringUtils.join(new String[] { TARGET_DIR, "appassembler" }, File.separator);
-
- // Path to the asterix-app directory. This is used as the current working
- // directory for the CC and NCService processes, which allows relative file
- // paths in "load" statements in test queries to find the right data. It is
- // also used for HDFSCluster.
- public static final String ASTERIX_APP_DIR = StringUtils.join(new String[] { "..", "asterix-app" }, File.separator);
-
- // Path to the actual AQL test files, which we borrow from asterix-app. This is
- // passed to TestExecutor.
- protected static final String TESTS_DIR =
- StringUtils.join(new String[] { ASTERIX_APP_DIR, "src", "test", "resources", "runtimets" }, File.separator);
-
- // Path that actual results are written to. We create and clean this directory
- // here, and also pass it to TestExecutor which writes the test output there.
- public static final String ACTUAL_RESULTS_DIR =
- StringUtils.join(new String[] { TARGET_DIR, "ittest" }, File.separator);
-
- private static final Logger LOGGER = LogManager.getLogger();
-
- enum KillCommand {
- CC,
- NC1,
- NC2;
-
- @Override
- public String toString() {
- return "<kill " + name().toLowerCase() + ">";
- }
- }
-
- private static HyracksCCProcess cc;
- private static HyracksNCServiceProcess nc1;
- private static HyracksNCServiceProcess nc2;
-
- private final TestCaseContext tcCtx;
- private static final TestExecutor testExecutor = new TestExecutor();
-
- private static final List<String> badTestCases = new ArrayList<>();
- private static HyracksVirtualCluster cluster;
- private final KillCommand killType;
- private static boolean clusterActive = false;
-
- @BeforeClass
- public static void setUp() throws Exception {
- // Create actual-results output directory.
- File outDir = new File(ACTUAL_RESULTS_DIR);
- outDir.mkdirs();
-
- // Remove any instance data from previous runs.
- File instanceDir = new File(INSTANCE_DIR);
- if (instanceDir.isDirectory()) {
- FileUtils.deleteDirectory(instanceDir);
- }
-
- // HDFSCluster requires the input directory to end with a file separator.
- HDFSCluster.getInstance().setup(ASTERIX_APP_DIR + File.separator);
-
- cluster = new HyracksVirtualCluster(new File(APP_HOME), new File(ASTERIX_APP_DIR));
- nc1 = cluster.addNCService(new File(CONF_DIR, "ncservice1.conf"), new File(LOG_DIR, "ncservice1.log"));
-
- nc2 = cluster.addNCService(new File(CONF_DIR, "ncservice2.conf"), new File(LOG_DIR, "ncservice2.log"));
-
- // Start CC
- cc = cluster.start(new File(CONF_DIR, "cc.conf"), new File(LOG_DIR, "cc.log"));
-
- testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
- clusterActive = true;
- }
-
- @AfterClass
- public static void tearDown() throws Exception {
- File outdir = new File(ACTUAL_RESULTS_DIR);
- File[] files = outdir.listFiles();
- if (files == null || files.length == 0) {
- outdir.delete();
- }
- cluster.stop();
- HDFSCluster.getInstance().cleanup();
- if (!badTestCases.isEmpty()) {
- System.out.println("The following test cases left some data");
- for (String testCase : badTestCases) {
- System.out.println(testCase);
- }
- }
- }
-
- @Parameters(name = "NCServiceExecutionTest {index}: {0}")
- public static Collection<Object[]> tests() throws Exception {
- Collection<Object[]> testArgs = new ArrayList<>();
- Random random = getRandom();
- TestCaseContext.Builder b = new TestCaseContext.Builder();
- for (TestCaseContext ctx : b.build(new File(TESTS_DIR))) {
- if (!skip(ctx)) {
- testArgs.add(new Object[] { ctx, ctx, null });
- }
- // let's kill something every 50 tests
- if (testArgs.size() % 50 == 0) {
- final KillCommand killCommand = KillCommand.values()[random.nextInt(KillCommand.values().length)];
- testArgs.add(new Object[] { killCommand, null, killCommand });
- }
- }
- return testArgs;
- }
-
- private static Random getRandom() {
- Random random;
- if (System.getProperty("random.seed") == null) {
- random = new Random() {
- @Override
- public synchronized void setSeed(long seed) {
- super.setSeed(seed);
- System.err.println("using generated seed: " + seed + "; use -Drandom.seed to use specific seed");
- }
- };
- } else {
- final long seed = Long.getLong("random.seed");
- System.err.println("using provided seed (-Drandom.seed): " + seed);
- random = new Random(seed);
- }
- return random;
- }
-
- private static boolean skip(TestCaseContext tcCtx) {
- // For now we skip feeds tests, external-library, and api tests.
- for (TestGroup group : tcCtx.getTestGroups()) {
- if (group.getName().startsWith("external-") || group.getName().equals("feeds")
- || group.getName().equals("api")) {
- LOGGER.info("Skipping test: " + tcCtx.toString());
- return true;
- }
- }
- return false;
- }
-
- public NCServiceExecutionIT(Object description, TestCaseContext tcCtx, KillCommand killType) {
- this.tcCtx = tcCtx;
- this.killType = killType;
- }
-
- @Before
- public void before() {
- if (!clusterActive) {
- Assert.fail("Skipping test since cluster is not ACTIVE");
- }
- }
-
- @Test
- public void test() throws Exception {
- if (tcCtx != null) {
- testExecutor.executeTest(ACTUAL_RESULTS_DIR, tcCtx, null, false);
- testExecutor.cleanup(tcCtx.toString(), badTestCases);
- } else {
- switch (killType) {
- case CC:
- LOGGER.info("Killing CC...");
- cc.stop(true);
- cc.start();
- break;
-
- case NC1:
- LOGGER.info("Killing NC1...");
- nc1.stop(); // we can't kill due to ASTERIXDB-1941
- testExecutor.waitForClusterState("UNUSABLE", 60, TimeUnit.SECONDS); // wait for missed heartbeats...
- nc1.start(); // this restarts the NC service
- testExecutor.startNC("asterix_nc1");
- break;
-
- case NC2:
- LOGGER.info("Killing NC2...");
- nc2.stop(); // we can't kill due to ASTERIXDB-1941
- testExecutor.waitForClusterState("UNUSABLE", 60, TimeUnit.SECONDS); // wait for missed heartbeats...
- nc2.start(); // this restarts the NC service
- testExecutor.startNC("asterix_nc2");
- break;
-
- default:
- Assert.fail("killType: " + killType);
- }
- try {
- testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
- } catch (Exception e) {
- // stop executing the rest of the tests since the cluster is not ACTIVE
- LOGGER.log(Level.ERROR, "Cannot continue since cluster is not ACTIVE", e);
- clusterActive = false;
- Assert.fail("Cluster is not ACTIVE");
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NcLifecycleIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NcLifecycleIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NcLifecycleIT.java
deleted file mode 100644
index 9e3a029..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NcLifecycleIT.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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.asterix.server.test;
-
-import static org.apache.asterix.server.test.NCServiceExecutionIT.APP_HOME;
-import static org.apache.asterix.server.test.NCServiceExecutionIT.ASTERIX_APP_DIR;
-import static org.apache.asterix.server.test.NCServiceExecutionIT.INSTANCE_DIR;
-import static org.apache.asterix.server.test.NCServiceExecutionIT.LOG_DIR;
-import static org.apache.asterix.server.test.NCServiceExecutionIT.TARGET_DIR;
-
-import java.io.File;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.hyracks.server.process.HyracksVirtualCluster;
-import org.apache.hyracks.util.file.FileUtil;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class NcLifecycleIT {
-
- private static final String PATH_BASE =
- FileUtil.joinPath("src", "test", "resources", "integrationts", "NcLifecycle");
- private static final String CONF_DIR =
- StringUtils.join(new String[] { TARGET_DIR, "test-classes", "NcLifecycleIT" }, File.separator);
- private static final String PATH_ACTUAL = FileUtil.joinPath("target", "ittest");
- private static final Logger LOGGER = LogManager.getLogger();
- private static String reportPath = new File(FileUtil.joinPath("target", "failsafe-reports")).getAbsolutePath();
- private static final TestExecutor testExecutor = new TestExecutor();
- private static HyracksVirtualCluster cluster;
-
- private TestCaseContext tcCtx;
-
- public NcLifecycleIT(TestCaseContext tcCtx) {
- this.tcCtx = tcCtx;
- }
-
- @Rule
- public TestRule retainLogs = new RetainLogsRule(NCServiceExecutionIT.ASTERIX_APP_DIR, reportPath, this);
-
- @Before
- public void before() throws Exception {
- LOGGER.info("Creating new instance...");
- File instanceDir = new File(INSTANCE_DIR);
- if (instanceDir.isDirectory()) {
- FileUtils.deleteDirectory(instanceDir);
- }
-
- cluster = new HyracksVirtualCluster(new File(APP_HOME), new File(ASTERIX_APP_DIR));
- cluster.addNCService(new File(CONF_DIR, "ncservice1.conf"), new File(LOG_DIR, "ncservice1.log"));
- cluster.addNCService(new File(CONF_DIR, "ncservice2.conf"), new File(LOG_DIR, "ncservice2.log"));
-
- // Start CC
- cluster.start(new File(CONF_DIR, "cc.conf"), new File(LOG_DIR, "cc.log"));
- LOGGER.info("Instance created.");
- testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
- LOGGER.info("Instance is in ACTIVE state.");
- }
-
- @After
- public void after() {
- LOGGER.info("Destroying instance...");
- cluster.stop();
- LOGGER.info("Instance destroyed.");
- }
-
- @Test
- public void test() throws Exception {
- testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false);
- }
-
- @Parameterized.Parameters(name = "NcLifecycleIT {index}: {0}")
- public static Collection<Object[]> tests() throws Exception {
- Collection<Object[]> testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
- if (testArgs.size() == 0) {
- testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
- }
- return testArgs;
- }
-
- private static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
- Collection<Object[]> testArgs = new ArrayList<>();
- TestCaseContext.Builder b = new TestCaseContext.Builder();
- for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
- testArgs.add(new Object[] { ctx });
- }
- return testArgs;
- }
-}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/RecoveryIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/RecoveryIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/RecoveryIT.java
deleted file mode 100644
index 163e279..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/RecoveryIT.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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.asterix.server.test;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.test.runtime.HDFSCluster;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class RecoveryIT {
-
- private static final Logger LOGGER = LogManager.getLogger();
- private static final String PATH_ACTUAL = "target" + File.separator + "rttest" + File.separator;
- private static final String PATH_BASE = "src/test/resources/transactionts/";
- private static final String HDFS_BASE = "../asterix-app/";
- private TestCaseContext tcCtx;
- private static File asterixInstallerPath;
- private static File installerTargetPath;
- private static String ncServiceHomeDirName;
- private static String ncServiceHomePath;
- private static String scriptHomePath;
- private static String reportPath;
- private static ProcessBuilder pb;
- private static Map<String, String> env;
- private final TestExecutor testExecutor = new TestExecutor();
-
- @Rule
- public TestRule retainLogs = new RetainLogsRule(ncServiceHomePath, reportPath, this);
-
- @BeforeClass
- public static void setUp() throws Exception {
- File outdir = new File(PATH_ACTUAL);
- outdir.mkdirs();
-
- File externalTestsJar =
- new File(StringUtils.join(new String[] { "..", "asterix-external-data", "target" }, File.separator))
- .listFiles((dir, name) -> name.matches("asterix-external-data-.*-tests.jar"))[0];
-
- asterixInstallerPath = new File(System.getProperty("user.dir"));
- installerTargetPath = new File(new File(asterixInstallerPath.getParentFile(), "asterix-server"), "target");
- reportPath = new File(installerTargetPath, "failsafe-reports").getAbsolutePath();
- ncServiceHomeDirName = installerTargetPath.list(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return new File(dir, name).isDirectory() && name.startsWith("asterix-server")
- && name.endsWith("binary-assembly");
- }
- })[0];
- ncServiceHomePath = new File(installerTargetPath, ncServiceHomeDirName).getAbsolutePath();
-
- LOGGER.info("NCSERVICE_HOME=" + ncServiceHomePath);
-
- FileUtils.copyFile(externalTestsJar, new File(ncServiceHomePath + "/repo", externalTestsJar.getName()));
-
- pb = new ProcessBuilder();
- env = pb.environment();
- env.put("NCSERVICE_HOME", ncServiceHomePath);
- env.put("JAVA_HOME", System.getProperty("java.home"));
- scriptHomePath = asterixInstallerPath + File.separator + "src" + File.separator + "test" + File.separator
- + "resources" + File.separator + "transactionts" + File.separator + "scripts";
- env.put("SCRIPT_HOME", scriptHomePath);
-
- TestExecutor.executeScript(pb,
- scriptHomePath + File.separator + "setup_teardown" + File.separator + "configure_and_validate.sh");
- TestExecutor.executeScript(pb,
- scriptHomePath + File.separator + "setup_teardown" + File.separator + "stop_and_delete.sh");
- HDFSCluster.getInstance().setup(HDFS_BASE);
- }
-
- @AfterClass
- public static void tearDown() throws Exception {
- File outdir = new File(PATH_ACTUAL);
- FileUtils.deleteDirectory(outdir);
- File dataCopyDir =
- new File(ncServiceHomePath + File.separator + ".." + File.separator + ".." + File.separator + "data");
- FileUtils.deleteDirectory(dataCopyDir);
- TestExecutor.executeScript(pb,
- scriptHomePath + File.separator + "setup_teardown" + File.separator + "stop_and_delete.sh");
- HDFSCluster.getInstance().cleanup();
- }
-
- @Parameters(name = "RecoveryIT {index}: {0}")
- public static Collection<Object[]> tests() throws Exception {
- Collection<Object[]> testArgs = new ArrayList<Object[]>();
- TestCaseContext.Builder b = new TestCaseContext.Builder();
- for (TestCaseContext ctx : b.build(new File(PATH_BASE))) {
- testArgs.add(new Object[] { ctx });
- }
- return testArgs;
- }
-
- public RecoveryIT(TestCaseContext tcCtx) {
- this.tcCtx = tcCtx;
- }
-
- @Test
- public void test() throws Exception {
- testExecutor.executeTest(PATH_ACTUAL, tcCtx, pb, false);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/ReplicationIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/ReplicationIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/ReplicationIT.java
deleted file mode 100644
index ad1078d..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/ReplicationIT.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * 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.asterix.server.test;
-
-import static org.apache.asterix.server.test.NCServiceExecutionIT.APP_HOME;
-import static org.apache.asterix.server.test.NCServiceExecutionIT.ASTERIX_APP_DIR;
-import static org.apache.asterix.server.test.NCServiceExecutionIT.INSTANCE_DIR;
-import static org.apache.asterix.server.test.NCServiceExecutionIT.LOG_DIR;
-import static org.apache.asterix.server.test.NCServiceExecutionIT.TARGET_DIR;
-
-import java.io.File;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.hyracks.server.process.HyracksVirtualCluster;
-import org.apache.hyracks.util.file.FileUtil;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class ReplicationIT {
-
- private static final String PATH_BASE =
- FileUtil.joinPath("src", "test", "resources", "integrationts", "replication");
- private static final String CONF_DIR =
- StringUtils.join(new String[] { TARGET_DIR, "test-classes", "ReplicationIT" }, File.separator);
- private static final String PATH_ACTUAL = FileUtil.joinPath("target", "ittest");
- private static final Logger LOGGER = LogManager.getLogger();
- private static String reportPath = new File(FileUtil.joinPath("target", "failsafe-reports")).getAbsolutePath();
- private static final TestExecutor testExecutor = new TestExecutor();
- private static HyracksVirtualCluster cluster;
-
- static {
- final Map<String, InetSocketAddress> ncEndPoints = new HashMap<>();
- final Map<String, InetSocketAddress> replicationAddress = new HashMap<>();
- final String ip = InetAddress.getLoopbackAddress().getHostAddress();
- ncEndPoints.put("asterix_nc1", InetSocketAddress.createUnresolved(ip, 19004));
- ncEndPoints.put("asterix_nc2", InetSocketAddress.createUnresolved(ip, 19005));
- replicationAddress.put("asterix_nc1", InetSocketAddress.createUnresolved(ip, 2001));
- replicationAddress.put("asterix_nc2", InetSocketAddress.createUnresolved(ip, 2002));
- testExecutor.setNcEndPoints(ncEndPoints);
- testExecutor.setNcReplicationAddress(replicationAddress);
- }
-
- private TestCaseContext tcCtx;
-
- public ReplicationIT(TestCaseContext tcCtx) {
- this.tcCtx = tcCtx;
- }
-
- @Rule
- public TestRule retainLogs = new RetainLogsRule(NCServiceExecutionIT.ASTERIX_APP_DIR, reportPath, this);
-
- @Before
- public void before() throws Exception {
- LOGGER.info("Creating new instance...");
- File instanceDir = new File(INSTANCE_DIR);
- if (instanceDir.isDirectory()) {
- FileUtils.deleteDirectory(instanceDir);
- }
-
- cluster = new HyracksVirtualCluster(new File(APP_HOME), new File(ASTERIX_APP_DIR));
- cluster.addNCService(new File(CONF_DIR, "ncservice1.conf"), new File(LOG_DIR, "ncservice1.log"));
- cluster.addNCService(new File(CONF_DIR, "ncservice2.conf"), new File(LOG_DIR, "ncservice2.log"));
-
- // Start CC
- cluster.start(new File(CONF_DIR, "cc.conf"), new File(LOG_DIR, "cc.log"));
- LOGGER.info("Instance created.");
- testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
- LOGGER.info("Instance is in ACTIVE state.");
- }
-
- @After
- public void after() {
- LOGGER.info("Destroying instance...");
- cluster.stop();
- LOGGER.info("Instance destroyed.");
- }
-
- @Test
- public void test() throws Exception {
- testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false);
- }
-
- @Parameterized.Parameters(name = "ReplicationIT {index}: {0}")
- public static Collection<Object[]> tests() throws Exception {
- Collection<Object[]> testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
- if (testArgs.size() == 0) {
- testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
- }
- return testArgs;
- }
-
- private static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
- Collection<Object[]> testArgs = new ArrayList<>();
- TestCaseContext.Builder b = new TestCaseContext.Builder();
- for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
- testArgs.add(new Object[] { ctx });
- }
- return testArgs;
- }
-}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java
deleted file mode 100644
index 190cead..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.asterix.server.test;
-
-import static org.apache.hyracks.util.file.FileUtil.joinPath;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.asterix.common.utils.Servlets;
-import org.apache.asterix.test.base.TestMethodTracer;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.test.common.TestHelper;
-import org.apache.asterix.testframework.context.TestCaseContext.OutputFormat;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.FixMethodOrder;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runners.MethodSorters;
-
-@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-public class SampleLocalClusterIT {
-
- // Important paths and files for this test.
-
- // The "target" subdirectory of asterix-server. All outputs go here.
- private static final String TARGET_DIR = joinPath("target");
-
- // Directory where the NCs create and store all data, as configured by
- // src/test/resources/NCServiceExecutionIT/cc.conf.
- private static final String OUTPUT_DIR = joinPath(TARGET_DIR, "sample local cluster");
-
- private static final String LOCAL_SAMPLES_DIR = joinPath(OUTPUT_DIR, "opt", "local");
-
- @Rule
- public TestRule watcher = new TestMethodTracer();
-
- @BeforeClass
- public static void setUp() throws Exception {
- // Create actual-results output directory.
- File outDir = new File(OUTPUT_DIR);
-
- // Remove any instance data from previous runs.
- if (outDir.isDirectory()) {
- FileUtils.deleteDirectory(outDir);
- }
- outDir.mkdirs();
-
- String[] pathElements = new String[] { TARGET_DIR,
- new File(TARGET_DIR).list((dir, name) -> name.matches("asterix-server.*-binary-assembly.zip"))[0] };
- String installerZip = joinPath(pathElements);
-
- TestHelper.unzip(installerZip, OUTPUT_DIR);
-
- }
-
- private static List<File> findLogFiles(File directory, List<File> fileList) {
- File[] match = directory.listFiles(pathname -> pathname.isDirectory() || pathname.toString().endsWith(".log"));
- if (match != null) {
- for (File file : match) {
- if (file.isDirectory()) {
- findLogFiles(file, fileList);
- } else {
- fileList.add(file);
- }
- }
- }
- return fileList;
- }
-
- @AfterClass
- public static void teardown() throws Exception {
-
- File destDir = new File(TARGET_DIR, joinPath("failsafe-reports", SampleLocalClusterIT.class.getSimpleName()));
-
- for (File f : findLogFiles(new File(OUTPUT_DIR), new ArrayList<>())) {
- FileUtils.copyFileToDirectory(f, destDir);
- }
- }
-
- @Test
- public void test0_startCluster() throws Exception {
- Process process =
- new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/stop-sample-cluster.sh"), "-f").inheritIO().start();
- Assert.assertEquals(0, process.waitFor());
- process = new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/start-sample-cluster.sh")).inheritIO().start();
- Assert.assertEquals(0, process.waitFor());
- }
-
- @Test
- public void test1_sanityQuery() throws Exception {
- TestExecutor testExecutor = new TestExecutor();
- InputStream resultStream = testExecutor.executeQuery("1+1", OutputFormat.ADM,
- new URI("http", null, "127.0.0.1", 19002, Servlets.AQL_QUERY, null, null), Collections.emptyList());
- StringWriter sw = new StringWriter();
- IOUtils.copy(resultStream, sw);
- Assert.assertEquals("2", sw.toString().trim());
- }
-
- @Test
- public void test2_stopCluster() throws Exception {
- Process process =
- new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/stop-sample-cluster.sh")).inheritIO().start();
- Assert.assertEquals(0, process.waitFor());
- try {
- new URL("http://127.0.0.1:19002").openConnection().connect();
- Assert.assertTrue("Expected connection to be refused.", false);
- } catch (IOException e) {
- // expected
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SqlppExecutionIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SqlppExecutionIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SqlppExecutionIT.java
deleted file mode 100644
index 066ddd9..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SqlppExecutionIT.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2009-2013 by The Regents of the University of California
- * Licensed 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 from
- *
- * 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.asterix.server.test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Runs the runtime test cases under 'asterix-app/src/test/resources/runtimets'.
- */
-@RunWith(Parameterized.class)
-public class SqlppExecutionIT extends AbstractExecutionIT {
-
- @Parameters(name = "SqlppExecutionIT {index}: {0}")
- public static Collection<Object[]> tests() throws Exception {
- Collection<Object[]> testArgs = buildTestsInXml("only_sqlpp.xml");
- if (testArgs.size() == 0) {
- testArgs = buildTestsInXml("testsuite_sqlpp.xml");
- }
- return testArgs;
- }
-
- protected static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
- Collection<Object[]> testArgs = new ArrayList<Object[]>();
- TestCaseContext.Builder b = new TestCaseContext.Builder();
- for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
- testArgs.add(new Object[] { ctx });
- }
- return testArgs;
-
- }
-
- public SqlppExecutionIT(TestCaseContext tcCtx) {
- super(tcCtx);
- }
-}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/AbstractExecutionIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/AbstractExecutionIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/AbstractExecutionIT.java
new file mode 100644
index 0000000..1a2f9ba
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/AbstractExecutionIT.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2009-2013 by The Regents of the University of California
+ * Licensed 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 from
+ *
+ * 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.asterix.test.server;
+
+import static org.apache.hyracks.util.file.FileUtil.joinPath;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.asterix.external.util.ExternalDataConstants;
+import org.apache.asterix.external.util.IdentitiyResolverFactory;
+import org.apache.asterix.test.base.RetainLogsRule;
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.asterix.testframework.context.TestFileContext;
+import org.apache.asterix.testframework.xml.TestCase.CompilationUnit;
+import org.apache.asterix.testframework.xml.TestGroup;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.codehaus.plexus.util.FileUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * Runs the runtime test cases under 'asterix-app/src/test/resources/runtimets'.
+ */
+@RunWith(Parameterized.class)
+public abstract class AbstractExecutionIT {
+
+ protected static final Logger LOGGER = LogManager.getLogger();
+
+ protected static final String PATH_ACTUAL = joinPath("target", "ittest");
+ protected static final String PATH_BASE = joinPath("..", "asterix-app", "src", "test", "resources", "runtimets");
+
+ protected static final String HDFS_BASE = "../asterix-app/";
+
+ protected static final TestExecutor testExecutor = new TestExecutor();
+
+ private static final String EXTERNAL_LIBRARY_TEST_GROUP = "lib";
+
+ private static final List<String> badTestCases = new ArrayList<>();
+
+ private static String reportPath = new File(joinPath("target", "failsafe-reports")).getAbsolutePath();
+
+ @Rule
+ public TestRule retainLogs = new RetainLogsRule(NCServiceExecutionIT.LOG_DIR, reportPath, this);
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ System.out.println("Starting setup");
+ if (LOGGER.isInfoEnabled()) {
+ LOGGER.info("Starting setup");
+ }
+ File outdir = new File(PATH_ACTUAL);
+ outdir.mkdirs();
+
+ File externalTestsJar =
+ new File(StringUtils.join(new String[] { "..", "asterix-external-data", "target" }, File.separator))
+ .listFiles((dir, name) -> name.matches("asterix-external-data-.*-tests.jar"))[0];
+
+ FileUtils.copyFile(externalTestsJar,
+ new File(NCServiceExecutionIT.APP_HOME + "/repo", externalTestsJar.getName()));
+
+ NCServiceExecutionIT.setUp();
+
+ FileUtils.copyDirectoryStructure(new File(joinPath("..", "asterix-app", "data")),
+ new File(NCServiceExecutionIT.ASTERIX_APP_DIR + "/clusters/local/working_dir/data"));
+
+ FileUtils.copyDirectoryStructure(new File(joinPath("..", "asterix-app", "target", "data")),
+ new File(NCServiceExecutionIT.ASTERIX_APP_DIR + "/clusters/local/working_dir/target/data"));
+
+ // Set the node resolver to be the identity resolver that expects node names
+ // to be node controller ids; a valid assumption in test environment.
+ System.setProperty(ExternalDataConstants.NODE_RESOLVER_FACTORY_PROPERTY,
+ IdentitiyResolverFactory.class.getName());
+
+ reportPath = new File(joinPath("target", "failsafe-reports")).getAbsolutePath();
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ File outdir = new File(PATH_ACTUAL);
+ File[] files = outdir.listFiles();
+ if ((files == null) || (files.length == 0)) {
+ outdir.delete();
+ }
+ //AsterixLifecycleIT.tearDown();
+ NCServiceExecutionIT.tearDown();
+ if (!badTestCases.isEmpty()) {
+ System.out.println("The following test cases left some data");
+ for (String testCase : badTestCases) {
+ System.out.println(testCase);
+ }
+ }
+ }
+
+ @Parameters
+ public static Collection<Object[]> tests() throws Exception {
+ Collection<Object[]> testArgs = new ArrayList<Object[]>();
+ TestCaseContext.Builder b = new TestCaseContext.Builder();
+ for (TestCaseContext ctx : b.build(new File(PATH_BASE))) {
+ testArgs.add(new Object[] { ctx });
+ }
+ return testArgs;
+ }
+
+ private TestCaseContext tcCtx;
+
+ public AbstractExecutionIT(TestCaseContext tcCtx) {
+ this.tcCtx = tcCtx;
+ }
+
+ @Test
+ public void test() throws Exception {
+ if (skip()) {
+ return;
+ }
+ testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false);
+ testExecutor.cleanup(tcCtx.toString(), badTestCases);
+ }
+
+ protected boolean skip() {
+ // If the test case contains library commands, we skip them
+ List<CompilationUnit> cUnits = tcCtx.getTestCase().getCompilationUnit();
+ for (CompilationUnit cUnit : cUnits) {
+ List<TestFileContext> testFileCtxs = tcCtx.getTestFiles(cUnit);
+ for (TestFileContext ctx : testFileCtxs) {
+ if (ctx.getType().equals(EXTERNAL_LIBRARY_TEST_GROUP)) {
+ return true;
+ }
+ }
+ }
+ // For now we skip api tests.
+ for (TestGroup group : tcCtx.getTestGroups()) {
+ if (group != null && "api".equals(group.getName())) {
+ LOGGER.info("Skipping test: " + tcCtx.toString());
+ return true;
+ }
+ }
+ return false;
+ }
+}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java
new file mode 100644
index 0000000..4ac3abb
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java
@@ -0,0 +1,94 @@
+/*
+ * 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.asterix.test.server;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.hyracks.util.file.FileUtil;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.JVM)
+public class LicensingIT {
+
+ protected String installerDir;
+
+ @Before
+ public void setup() {
+ final String pattern = getInstallerDirPattern();
+ final String targetDir = getTargetDir();
+ final String[] list = new File(targetDir).list((dir, name) -> name.matches(pattern));
+ Assert.assertNotNull("installerDir", list);
+ Assert.assertFalse("Ambiguous install dir (" + pattern + "): " + Arrays.toString(list), list.length > 1);
+ Assert.assertEquals("Can't find install dir (" + pattern + ")", 1, list.length);
+ installerDir = FileUtil.joinPath(targetDir, list[0]);
+ }
+
+ protected String getTargetDir() {
+ return FileUtil.joinPath("target");
+ }
+
+ protected String getInstallerDirPattern() {
+ return "asterix-server.*-binary-assembly";
+ }
+
+ protected String pathToLicensingFiles() {
+ return "";
+ }
+
+ @Test
+ public void testLicenseNoticeFilesPresent() throws IOException {
+ for (String name : getRequiredArtifactNames()) {
+ final String fileName = FileUtil.joinPath(installerDir, pathToLicensingFiles(), name);
+ Assert.assertTrue(fileName + " missing", new File(fileName).exists());
+ }
+ }
+
+ protected String[] getRequiredArtifactNames() {
+ return org.apache.commons.lang3.ArrayUtils.add(getLicenseArtifactNames(), "NOTICE");
+ }
+
+ @Test
+ public void ensureNoMissingLicenses() throws IOException {
+ for (String licenseArtifactName : getLicenseArtifactNames()) {
+ final File licenseFile =
+ new File(FileUtil.joinPath(installerDir, pathToLicensingFiles(), licenseArtifactName));
+ List<String> badLines = new ArrayList<>();
+ for (String line : FileUtils.readLines(licenseFile, StandardCharsets.UTF_8)) {
+ if (line.matches("^\\s*MISSING:.*")) {
+ badLines.add(line.trim());
+ }
+ }
+ Assert.assertEquals("Missing licenses in " + licenseFile + ": " + badLines, 0, badLines.size());
+ }
+ }
+
+ protected String[] getLicenseArtifactNames() {
+ return new String[] { "LICENSE" };
+ }
+}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NCServiceExecutionIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NCServiceExecutionIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NCServiceExecutionIT.java
new file mode 100644
index 0000000..3c46be6
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NCServiceExecutionIT.java
@@ -0,0 +1,266 @@
+/*
+ * 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.asterix.test.server;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.test.runtime.HDFSCluster;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.asterix.testframework.xml.TestGroup;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.hyracks.test.server.process.HyracksCCProcess;
+import org.apache.hyracks.test.server.process.HyracksNCServiceProcess;
+import org.apache.hyracks.test.server.process.HyracksVirtualCluster;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@RunWith(Parameterized.class)
+public class NCServiceExecutionIT {
+
+ // Important paths and files for this test.
+
+ // The "target" subdirectory of asterix-server. All outputs go here.
+ public static final String TARGET_DIR =
+ StringUtils.join(new String[] { "../asterix-server/target" }, File.separator);
+
+ // Directory where the NCs create and store all data, as configured by
+ // src/test/resources/NCServiceExecutionIT/cc.conf.
+ public static final String INSTANCE_DIR = StringUtils.join(new String[] { TARGET_DIR, "tmp" }, File.separator);
+
+ // The log directory, where all CC, NCService, and NC logs are written. CC and
+ // NCService logs are configured on the HyracksVirtualCluster below. NC logs
+ // are configured in src/test/resources/NCServiceExecutionIT/ncservice*.conf.
+ public static final String LOG_DIR =
+ StringUtils.join(new String[] { TARGET_DIR, "failsafe-reports" }, File.separator);
+
+ // Directory where *.conf files are located.
+ public static final String CONF_DIR =
+ StringUtils.join(new String[] { TARGET_DIR, "test-classes", "NCServiceExecutionIT" }, File.separator);
+
+ // The app.home specified for HyracksVirtualCluster. The NCService expects
+ // to find the NC startup script in ${app.home}/bin.
+ public static final String APP_HOME = StringUtils.join(new String[] { TARGET_DIR, "appassembler" }, File.separator);
+
+ // Path to the asterix-app directory. This is used as the current working
+ // directory for the CC and NCService processes, which allows relative file
+ // paths in "load" statements in test queries to find the right data. It is
+ // also used for HDFSCluster.
+ public static final String ASTERIX_APP_DIR = StringUtils.join(new String[] { "..", "asterix-app" }, File.separator);
+
+ // Path to the actual AQL test files, which we borrow from asterix-app. This is
+ // passed to TestExecutor.
+ protected static final String TESTS_DIR =
+ StringUtils.join(new String[] { ASTERIX_APP_DIR, "src", "test", "resources", "runtimets" }, File.separator);
+
+ // Path that actual results are written to. We create and clean this directory
+ // here, and also pass it to TestExecutor which writes the test output there.
+ public static final String ACTUAL_RESULTS_DIR =
+ StringUtils.join(new String[] { TARGET_DIR, "ittest" }, File.separator);
+
+ private static final Logger LOGGER = LogManager.getLogger();
+
+ enum KillCommand {
+ CC,
+ NC1,
+ NC2;
+
+ @Override
+ public String toString() {
+ return "<kill " + name().toLowerCase() + ">";
+ }
+ }
+
+ private static HyracksCCProcess cc;
+ private static HyracksNCServiceProcess nc1;
+ private static HyracksNCServiceProcess nc2;
+
+ private final TestCaseContext tcCtx;
+ private static final TestExecutor testExecutor = new TestExecutor();
+
+ private static final List<String> badTestCases = new ArrayList<>();
+ private static HyracksVirtualCluster cluster;
+ private final KillCommand killType;
+ private static boolean clusterActive = false;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ // Create actual-results output directory.
+ File outDir = new File(ACTUAL_RESULTS_DIR);
+ outDir.mkdirs();
+
+ // Remove any instance data from previous runs.
+ File instanceDir = new File(INSTANCE_DIR);
+ if (instanceDir.isDirectory()) {
+ FileUtils.deleteDirectory(instanceDir);
+ }
+
+ // HDFSCluster requires the input directory to end with a file separator.
+ HDFSCluster.getInstance().setup(ASTERIX_APP_DIR + File.separator);
+
+ cluster = new HyracksVirtualCluster(new File(APP_HOME), new File(ASTERIX_APP_DIR));
+ nc1 = cluster.addNCService(new File(CONF_DIR, "ncservice1.conf"), new File(LOG_DIR, "ncservice1.log"));
+
+ nc2 = cluster.addNCService(new File(CONF_DIR, "ncservice2.conf"), new File(LOG_DIR, "ncservice2.log"));
+
+ // Start CC
+ cc = cluster.start(new File(CONF_DIR, "cc.conf"), new File(LOG_DIR, "cc.log"));
+
+ testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
+ clusterActive = true;
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ File outdir = new File(ACTUAL_RESULTS_DIR);
+ File[] files = outdir.listFiles();
+ if (files == null || files.length == 0) {
+ outdir.delete();
+ }
+ cluster.stop();
+ HDFSCluster.getInstance().cleanup();
+ if (!badTestCases.isEmpty()) {
+ System.out.println("The following test cases left some data");
+ for (String testCase : badTestCases) {
+ System.out.println(testCase);
+ }
+ }
+ }
+
+ @Parameters(name = "NCServiceExecutionTest {index}: {0}")
+ public static Collection<Object[]> tests() throws Exception {
+ Collection<Object[]> testArgs = new ArrayList<>();
+ Random random = getRandom();
+ TestCaseContext.Builder b = new TestCaseContext.Builder();
+ for (TestCaseContext ctx : b.build(new File(TESTS_DIR))) {
+ if (!skip(ctx)) {
+ testArgs.add(new Object[] { ctx, ctx, null });
+ }
+ // let's kill something every 50 tests
+ if (testArgs.size() % 50 == 0) {
+ final KillCommand killCommand = KillCommand.values()[random.nextInt(KillCommand.values().length)];
+ testArgs.add(new Object[] { killCommand, null, killCommand });
+ }
+ }
+ return testArgs;
+ }
+
+ private static Random getRandom() {
+ Random random;
+ if (System.getProperty("random.seed") == null) {
+ random = new Random() {
+ @Override
+ public synchronized void setSeed(long seed) {
+ super.setSeed(seed);
+ System.err.println("using generated seed: " + seed + "; use -Drandom.seed to use specific seed");
+ }
+ };
+ } else {
+ final long seed = Long.getLong("random.seed");
+ System.err.println("using provided seed (-Drandom.seed): " + seed);
+ random = new Random(seed);
+ }
+ return random;
+ }
+
+ private static boolean skip(TestCaseContext tcCtx) {
+ // For now we skip feeds tests, external-library, and api tests.
+ for (TestGroup group : tcCtx.getTestGroups()) {
+ if (group.getName().startsWith("external-") || group.getName().equals("feeds")
+ || group.getName().equals("api")) {
+ LOGGER.info("Skipping test: " + tcCtx.toString());
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public NCServiceExecutionIT(Object description, TestCaseContext tcCtx, KillCommand killType) {
+ this.tcCtx = tcCtx;
+ this.killType = killType;
+ }
+
+ @Before
+ public void before() {
+ if (!clusterActive) {
+ Assert.fail("Skipping test since cluster is not ACTIVE");
+ }
+ }
+
+ @Test
+ public void test() throws Exception {
+ if (tcCtx != null) {
+ testExecutor.executeTest(ACTUAL_RESULTS_DIR, tcCtx, null, false);
+ testExecutor.cleanup(tcCtx.toString(), badTestCases);
+ } else {
+ switch (killType) {
+ case CC:
+ LOGGER.info("Killing CC...");
+ cc.stop(true);
+ cc.start();
+ break;
+
+ case NC1:
+ LOGGER.info("Killing NC1...");
+ nc1.stop(); // we can't kill due to ASTERIXDB-1941
+ testExecutor.waitForClusterState("UNUSABLE", 60, TimeUnit.SECONDS); // wait for missed heartbeats...
+ nc1.start(); // this restarts the NC service
+ testExecutor.startNC("asterix_nc1");
+ break;
+
+ case NC2:
+ LOGGER.info("Killing NC2...");
+ nc2.stop(); // we can't kill due to ASTERIXDB-1941
+ testExecutor.waitForClusterState("UNUSABLE", 60, TimeUnit.SECONDS); // wait for missed heartbeats...
+ nc2.start(); // this restarts the NC service
+ testExecutor.startNC("asterix_nc2");
+ break;
+
+ default:
+ Assert.fail("killType: " + killType);
+ }
+ try {
+ testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
+ } catch (Exception e) {
+ // stop executing the rest of the tests since the cluster is not ACTIVE
+ LOGGER.log(Level.ERROR, "Cannot continue since cluster is not ACTIVE", e);
+ clusterActive = false;
+ Assert.fail("Cluster is not ACTIVE");
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/asterixdb/blob/2530e39d/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NcLifecycleIT.java
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NcLifecycleIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NcLifecycleIT.java
new file mode 100644
index 0000000..4ae9d96
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NcLifecycleIT.java
@@ -0,0 +1,119 @@
+/*
+ * 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.asterix.test.server;
+
+import static org.apache.asterix.test.server.NCServiceExecutionIT.APP_HOME;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.ASTERIX_APP_DIR;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.INSTANCE_DIR;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.LOG_DIR;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.TARGET_DIR;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.asterix.test.base.RetainLogsRule;
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.hyracks.test.server.process.HyracksVirtualCluster;
+import org.apache.hyracks.util.file.FileUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class NcLifecycleIT {
+
+ private static final String PATH_BASE =
+ FileUtil.joinPath("src", "test", "resources", "integrationts", "NcLifecycle");
+ private static final String CONF_DIR =
+ StringUtils.join(new String[] { TARGET_DIR, "test-classes", "NcLifecycleIT" }, File.separator);
+ private static final String PATH_ACTUAL = FileUtil.joinPath("target", "ittest");
+ private static final Logger LOGGER = LogManager.getLogger();
+ private static String reportPath = new File(FileUtil.joinPath("target", "failsafe-reports")).getAbsolutePath();
+ private static final TestExecutor testExecutor = new TestExecutor();
+ private static HyracksVirtualCluster cluster;
+
+ private TestCaseContext tcCtx;
+
+ public NcLifecycleIT(TestCaseContext tcCtx) {
+ this.tcCtx = tcCtx;
+ }
+
+ @Rule
+ public TestRule retainLogs = new RetainLogsRule(NCServiceExecutionIT.ASTERIX_APP_DIR, reportPath, this);
+
+ @Before
+ public void before() throws Exception {
+ LOGGER.info("Creating new instance...");
+ File instanceDir = new File(INSTANCE_DIR);
+ if (instanceDir.isDirectory()) {
+ FileUtils.deleteDirectory(instanceDir);
+ }
+
+ cluster = new HyracksVirtualCluster(new File(APP_HOME), new File(ASTERIX_APP_DIR));
+ cluster.addNCService(new File(CONF_DIR, "ncservice1.conf"), new File(LOG_DIR, "ncservice1.log"));
+ cluster.addNCService(new File(CONF_DIR, "ncservice2.conf"), new File(LOG_DIR, "ncservice2.log"));
+
+ // Start CC
+ cluster.start(new File(CONF_DIR, "cc.conf"), new File(LOG_DIR, "cc.log"));
+ LOGGER.info("Instance created.");
+ testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
+ LOGGER.info("Instance is in ACTIVE state.");
+ }
+
+ @After
+ public void after() {
+ LOGGER.info("Destroying instance...");
+ cluster.stop();
+ LOGGER.info("Instance destroyed.");
+ }
+
+ @Test
+ public void test() throws Exception {
+ testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false);
+ }
+
+ @Parameterized.Parameters(name = "NcLifecycleIT {index}: {0}")
+ public static Collection<Object[]> tests() throws Exception {
+ Collection<Object[]> testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
+ if (testArgs.size() == 0) {
+ testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
+ }
+ return testArgs;
+ }
+
+ private static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
+ Collection<Object[]> testArgs = new ArrayList<>();
+ TestCaseContext.Builder b = new TestCaseContext.Builder();
+ for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
+ testArgs.add(new Object[] { ctx });
+ }
+ return testArgs;
+ }
+}