ACCUMULO-3871 added a small m/r job that can read tests from a file, and execute them
Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/93cc4a1d Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/93cc4a1d Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/93cc4a1d Branch: refs/heads/master Commit: 93cc4a1dff255ed196efc8ed100f327e77226221 Parents: e97709a Author: Eric C. Newton <eric.new...@gmail.com> Authored: Fri May 29 17:19:50 2015 -0400 Committer: Eric C. Newton <eric.new...@gmail.com> Committed: Fri May 29 17:19:50 2015 -0400 ---------------------------------------------------------------------- assemble/pom.xml | 11 ++ test/pom.xml | 24 ++++ .../accumulo/test/IntegrationTestMapReduce.java | 113 +++++++++++++++++++ .../test/functional/ConfigurableMacIT.java | 4 +- 4 files changed, 151 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/accumulo/blob/93cc4a1d/assemble/pom.xml ---------------------------------------------------------------------- diff --git a/assemble/pom.xml b/assemble/pom.xml index b965fe6..525b443 100644 --- a/assemble/pom.xml +++ b/assemble/pom.xml @@ -223,6 +223,17 @@ </build> <profiles> <profile> + <id>test-jar</id> + <dependencies> + <dependency> + <groupId>org.apache.accumulo</groupId> + <artifactId>accumulo-test</artifactId> + <version>${project.version}</version> + <classifier>tests</classifier> + </dependency> + </dependencies> + </profile> + <profile> <id>apache-release</id> <build> <plugins> http://git-wip-us.apache.org/repos/asf/accumulo/blob/93cc4a1d/test/pom.xml ---------------------------------------------------------------------- diff --git a/test/pom.xml b/test/pom.xml index f943eed..516461b 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -183,6 +183,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>org.easymock</groupId> + <artifactId>easymock</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <scope>test</scope> @@ -235,6 +240,25 @@ </build> <profiles> <profile> + <id>test-jar</id> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <executions> + <execution> + <id>make-test-jar</id> + <goals> + <goal>test-jar</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + <profile> <id>shared-mini-for-it</id> <!-- <activation> http://git-wip-us.apache.org/repos/asf/accumulo/blob/93cc4a1d/test/src/test/java/org/apache/accumulo/test/IntegrationTestMapReduce.java ---------------------------------------------------------------------- diff --git a/test/src/test/java/org/apache/accumulo/test/IntegrationTestMapReduce.java b/test/src/test/java/org/apache/accumulo/test/IntegrationTestMapReduce.java new file mode 100644 index 0000000..6b9e82e --- /dev/null +++ b/test/src/test/java/org/apache/accumulo/test/IntegrationTestMapReduce.java @@ -0,0 +1,113 @@ +/* + * 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.accumulo.test; + +import java.io.IOException; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.conf.Configured; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.LongWritable; +import org.apache.hadoop.io.Text; +import org.apache.hadoop.mapreduce.Job; +import org.apache.hadoop.mapreduce.Mapper; +import org.apache.hadoop.mapreduce.Reducer; +import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; +import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat; +import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; +import org.apache.hadoop.util.Tool; +import org.apache.hadoop.util.ToolRunner; +import org.junit.runner.JUnitCore; +import org.junit.runner.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IntegrationTestMapReduce extends Configured implements Tool { + + private static final Logger log = LoggerFactory.getLogger(IntegrationTestMapReduce.class); + + public static class TestMapper extends Mapper<LongWritable,Text,IntWritable,Text> { + + @Override + protected void map(LongWritable key, Text value, Mapper<LongWritable,Text,IntWritable,Text>.Context context) throws IOException, InterruptedException { + String className = value.toString(); + Class<? extends Object> test = null; + try { + test = Class.forName(className); + } catch (ClassNotFoundException e) { + log.debug("Error finding class {}", className, e); + context.write(new IntWritable(-1), new Text(e.toString())); + } + JUnitCore core = new JUnitCore(); + log.info("Running test {}", className); + Result result = core.run(test); + if (result.wasSuccessful()) { + log.info("{} was successful", className); + context.write(new IntWritable(0), value); + } else { + log.info("{} failed", className); + context.write(new IntWritable(1), value); + } + } + } + + public static class TestReducer extends Reducer<IntWritable,Text,IntWritable,Text> { + + @Override + protected void reduce(IntWritable code, Iterable<Text> tests, Reducer<IntWritable,Text,IntWritable,Text>.Context context) throws IOException, + InterruptedException { + StringBuffer result = new StringBuffer(); + for (Text test : tests) { + result.append(test); + result.append("\n"); + } + context.write(code, new Text(result.toString())); + } + } + + @Override + public int run(String[] args) throws Exception { + // read a list of tests from the input, and print out the results + if (args.length != 2) { + System.err.println("Wrong number of args: <input> <output>"); + } + Configuration conf = getConf(); + Job job = Job.getInstance(conf, "accumulo integration test runner"); + // read one line at a time + job.setInputFormatClass(NLineInputFormat.class); + conf.setInt(NLineInputFormat.LINES_PER_MAP, 1); + + // run the test + job.setJarByClass(IntegrationTestMapReduce.class); + job.setMapperClass(TestMapper.class); + + // group test by result code + job.setReducerClass(TestReducer.class); + job.setOutputKeyClass(IntWritable.class); + job.setOutputValueClass(Text.class); + + FileInputFormat.addInputPath(job, new Path(args[0])); + FileOutputFormat.setOutputPath(job, new Path(args[1])); + return job.waitForCompletion(true) ? 0 : 1; + } + + public static void main(String[] args) throws Exception { + System.exit(ToolRunner.run(new IntegrationTestMapReduce(), args)); + } + +} http://git-wip-us.apache.org/repos/asf/accumulo/blob/93cc4a1d/test/src/test/java/org/apache/accumulo/test/functional/ConfigurableMacIT.java ---------------------------------------------------------------------- diff --git a/test/src/test/java/org/apache/accumulo/test/functional/ConfigurableMacIT.java b/test/src/test/java/org/apache/accumulo/test/functional/ConfigurableMacIT.java index 53eb8e4..a738d1f 100644 --- a/test/src/test/java/org/apache/accumulo/test/functional/ConfigurableMacIT.java +++ b/test/src/test/java/org/apache/accumulo/test/functional/ConfigurableMacIT.java @@ -127,7 +127,9 @@ public class ConfigurableMacIT extends AccumuloIT { // createTestDir will give us a empty directory, we don't need to clean it up ourselves File baseDir = createTestDir(this.getClass().getName() + "_" + this.testName.getMethodName()); MiniAccumuloConfigImpl cfg = new MiniAccumuloConfigImpl(baseDir, ROOT_PASSWORD); - cfg.setNativeLibPaths(NativeMapIT.nativeMapLocation().getAbsolutePath()); + String nativePathInDevTree = NativeMapIT.nativeMapLocation().getAbsolutePath(); + String nativePathInMapReduce = new File(System.getProperty("user.dir")).toString(); + cfg.setNativeLibPaths(nativePathInDevTree, nativePathInMapReduce); cfg.setProperty(Property.GC_FILE_ARCHIVE, Boolean.TRUE.toString()); Configuration coreSite = new Configuration(false); configure(cfg, coreSite);