/**
*
*/
package tap;
import java.util.HashMap;
import java.util.List;
import junit.framework.Assert;
import org.apache.avro.Schema;
import org.apache.avro.Schema.Type;
import org.junit.Test;
import tap.CommandOptions;
import tap.formats.Formats;
import tap.util.ReflectUtils;
public class PhaseTests {
public String word;
public int count;
@Test
public void constructor() {
Phase phase = new Phase();
Assert.assertNotNull(phase);
}
@Test
public void schema() {
Pipe<String> input = new Pipe("input path.txt");
Pipe<PhaseTests> output = new Pipe<PhaseTests>("outputpath.json");
Phase phase = new Phase("my phase");
phase.reads(input);
phase.writes(output);
Schema schema = ReflectUtils.getSchema(this);
Assert.assertNotNull(schema);
Assert.assertEquals("tap.PhaseTests", schema.getFullName());
Assert.assertEquals(Type.RECORD, schema.getType());
Assert.assertEquals(Formats.JSON_FORMAT, phase.getOutputs().get(0)
.getFormat());
Assert.assertEquals(Formats.STRING_FORMAT, phase.getInputs().get(0)
.getFormat());
}
@Test
public void setNameTest() {
String[] args = {"Phase.setTest", "-i", "share/decameron.txt", "-o", "/tmp/out", "--force"};
CommandOptions o = new CommandOptions(args);
/* Set up a basic pipeline of map reduce */
Tap tap = new Tap(o);
Phase phase = tap.createPhase();
Assert.assertNotNull(phase.getName());
phase.setName("my phase");
Assert.assertNotNull(phase.getName());
}
@Test
public void temporaryFileTest1() {
String[] args = {"Phase.setTest", "-i", "share/decameron.txt", "-o", "/tmp/out", "--force"};
CommandOptions o = new CommandOptions(args);
/* Set up a basic pipeline of map reduce */
Tap tap = new Tap(o);
Phase phase = tap
.createPhase()
.reads(o.input)
.map(SetMapper.class)
.reduce(SetReducer.class)
//.combine(Test2Reducer.class)
.groupBy("word")
.writes(o.output);
Assert.assertNotNull(phase.getTmpOutputName());
System.out.println(phase.getTmpOutputName());
}
@Test
public void temporaryFileTest2() {
String[] args = {"Phase.setTest", "-i", "share/decameron.txt", "-o", "/tmp/out", "--force"};
CommandOptions o = new CommandOptions(args);
/* Set up a basic pipeline of map reduce */
String tempFile = null;
for(int i=0; i< 2; i++) {
Tap t = new Tap(o);
Phase p = t.createPhase();
if (i==0) {
tempFile = p.getTmpOutputName();
} else {
Assert.assertEquals(tempFile, p.getTmpOutputName());
}
}
}
@Test
public void mapperSignatureTest() {
String[] args = {"mapperTest", "-i", "share/wordcount.out.avro", "-o", "/tmp/out", "--force"};
CommandOptions o = new CommandOptions(args);
/* Set up a basic pipeline of map reduce */
Tap tap = new Tap(o).named(o.program);
Pipe<CountRec> p1 = new Pipe<CountRec>(o.input);
p1.setPrototype(new CountRec());
Pipe<OutputLog> p2 = new Pipe<OutputLog>(o.output);
p2.setPrototype(new OutputLog());
tap.produces(p2);
Phase phase = new Phase();
phase.reads(p1).writes(p2).map(Test2Mapper.class).groupBy("word")
.reduce(Test2Reducer.class);
phase.plan(tap);
System.out.println(phase.getSummary());
List<PhaseError> errors = phase.plan(tap);
Assert.assertEquals(0, errors.size());
Assert.assertNotNull("inputs missing", phase.getInputs().get(0));
Assert.assertNotNull("outputs missing", phase.getOutputs().get(0));
Assert.assertEquals("MAP IN CLASS", "tap.CountRec", phase
.getConf().get(Phase.MAP_IN_CLASS));
Assert.assertEquals("MAP OUT CLASS", "tap.CountRec", phase
.getConf().get(Phase.MAP_OUT_CLASS));
}
@Test
public void mapperSignatureTest2() {
String[] args = {"mapperTest", "-i", "share/wordcount.out.avro", "-o", "/tmp/out"};
CommandOptions o = new CommandOptions(args);
/* Set up a basic pipeline of map reduce */
Tap assembly = new Tap(o).named("mapperTest");
Pipe<CountRec> p1 = new Pipe("share/decameron.txt");
Pipe<OutputLog> p2 = new Pipe("/tmp/out");
assembly.produces(p2);
Phase phase = new Phase();
phase.reads(p1).writes(p2).map(Test3Mapper.class).groupBy("word")
.reduce(Test2Reducer.class);
System.out.println(phase.getSummary());
List<PhaseError> errors = phase.plan(assembly);
Assert.assertEquals(0, errors.size());
Assert.assertNotNull("inputs missing", phase.getInputs().get(0));
Assert.assertNotNull("outputs missing", phase.getOutputs().get(0));
Assert.assertEquals("MAP IN CLASS", String.class.getName(), phase
.getConf().get(Phase.MAP_IN_CLASS));
Assert.assertEquals("MAP OUT CLASS", "tap.CountRec", phase
.getConf().get(Phase.MAP_OUT_CLASS));
}
@Test
public void mapperSignatureTest3() {
String[] args = {"mapperTest", "-i", "share/wordcount.out.avro", "-o", "/tmp/out"};
CommandOptions o = new CommandOptions(args);
/* Set up a basic pipeline of map reduce */
Tap assembly = new Tap(o).named("mapperTest");
Pipe<String> p1 = new Pipe("share/decameron.txt");
p1.setPrototype("prototype");
Pipe<OutputLog> p2 = new Pipe<OutputLog>("/tmp/out");
p2.setPrototype(new OutputLog());
assembly.produces(p2);
Phase phase = new Phase();
phase.reads(p1).writes(p2).map(Test3Mapper.class).groupBy("count")
.reduce(Test3Reducer.class);
System.out.println(phase.getSummary());
List<PhaseError> errors = phase.plan(assembly);
for (PhaseError e : errors) {
System.out.printf("%s : %s \n", e.getMessage(), (null == e.getException() ? "" : e.getException()
.toString()));
}
Assert.assertEquals(0, errors.size());
Assert.assertNotNull("inputs missing", phase.getInputs().get(0));
Assert.assertNotNull("outputs missing", phase.getOutputs().get(0));
Assert.assertEquals("MAP IN class", String.class.getName(), phase
.getConf().get(Phase.MAP_IN_CLASS));
Assert.assertEquals("MAP OUT class", CountRec.class.getName(), phase
.getConf().get(Phase.MAP_OUT_CLASS));
Assert.assertEquals("REDUCER OUT class", OutputLog.class.getName(),
phase.getConf().get(Phase.REDUCE_OUT_CLASS));
Assert.assertEquals("Reducer", Test3Reducer.class.getName(), phase
.getConf().get(Phase.REDUCER));
assembly.dryRun();
}
@Test
public void setTest() {
String[] args = {"Phase.setTest", "-i", "share/decameron.txt", "-o", "/tmp/out", "--force"};
CommandOptions o = new CommandOptions(args);
/* Set up a basic pipeline of map reduce */
Tap tap = new Tap(o);
HashMap<String, String> hash = new HashMap<String,String>();
hash.put("bob", "One");
hash.put("fruit", "apple");
hash.put("fruit", "Orange");
hash.put("animal", "dog");
tap
.createPhase()
.reads(o.input)
.map(SetMapper.class)
.reduce(SetReducer.class)
//.combine(Test2Reducer.class)
.groupBy("word")
.writes(o.output)
.set("mykey", hash);
int rc = tap.named(args[0]).make();
Assert.assertEquals(0, rc);
}
public static class SetMapper extends TapMapper<String, CountRec> {
private HashMap<String,String> myMapParam = null;
@Override
public void init(String Path) {
Assert.assertNotNull(Path);
Assert.assertEquals(true, Path.contains("decameron.txt"));
if (null == myMapParam) {
myMapParam = (HashMap<String, String>) this.getMapperParameter("mykey");
}
Assert.assertNotNull(myMapParam);
System.out.println("SetMapper.init called");
}
private HashMap<String,String> getMyMap() {
return myMapParam;
}
private CountRec outrec = new CountRec();
@Override
public void map(String in, Pipe<CountRec> out) {
Assert.assertNotNull(getMyMap());
Assert.assertEquals(3, getMyMap().size());
Assert.assertEquals("dog", getMyMap().get("animal"));
Assert.assertEquals("One", getMyMap().get("bob"));
Assert.assertEquals("Orange", getMyMap().get("fruit"));
outrec.word = in;
outrec.count = 1;
out.put(outrec);
}
@Override
public void finish() {
System.out.println("SetMapper.finish called");
}
}
public static class SetReducer extends TapReducer<CountRec, OutputLog> {
@Override
public void init(String path) {
System.out.println("SetReducer.init("+path+") called");
}
@Override
public void reduce(Pipe<CountRec> in, Pipe<OutputLog> out) {
}
@Override
public void finish() {
System.out.println("SetReducer.finish called");
}
}
public class Test3Mapper extends TapMapper<String, CountRec> {
@Override
public void map(String in, Pipe<CountRec> out) {
//TODO: Need a body here
}
}
public class Test3Reducer extends TapReducer<CountRec, OutputLog> {
@Override
public void reduce(Pipe<CountRec> in, Pipe<OutputLog> out) {
}
}
public class Test2Mapper extends TapMapper<CountRec, CountRec> {
@Override
public void map(CountRec in, Pipe<CountRec> out) {
// preferred
}
public void map(Pipe<CountRec> in, Pipe<CountRec> out) {
// not supported
}
public void map(double latitude, double longitude) {
// not applicable
}
}
public static class Test2Reducer extends TapReducer<CountRec, OutputLog> {
@Override
public void reduce(Pipe<CountRec> in, Pipe<OutputLog> out) {
}
}
}