package com.mongodb.hadoop.streaming.io; import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DBObject; import com.mongodb.hadoop.io.BSONWritable; import com.mongodb.hadoop.io.MongoUpdateWritable; import org.apache.hadoop.streaming.PipeMapRed; import org.bson.BSONObject; import org.bson.BasicBSONObject; import org.junit.Test; import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class MongoUpdateOutputReaderTest { private BSONWritable bsonWritable = new BSONWritable(); private DataInput inputFromBSONObject(final BSONObject object) throws IOException { PipedOutputStream outputStream = new PipedOutputStream(); PipedInputStream inputStream = new PipedInputStream(outputStream); bsonWritable.setDoc(object); bsonWritable.write(new DataOutputStream(outputStream)); return new DataInputStream(inputStream); } @Test public void testNoUpdate() throws IOException { // Test document, does not describe an update. DBObject notAnUpdate = new BasicDBObject("_id", 42); PipeMapRed pipeMapRed = mock(PipeMapRed.class); when(pipeMapRed.getClientInput()).thenReturn( inputFromBSONObject(notAnUpdate)); MongoUpdateOutputReader reader = new MongoUpdateOutputReader(); reader.initialize(pipeMapRed); assertTrue(reader.readKeyValue()); assertEquals(notAnUpdate, reader.getCurrentValue().getQuery()); } @Test public void testUpdate() throws IOException { BasicBSONObject query = new BasicDBObject("i", 42); BasicBSONObject modifiers = new BasicDBObject("$set", new BasicDBObject("a", "b")); DBObject update = new BasicDBObjectBuilder() .add("_id", query) .add("modifiers", modifiers) .push("options").add("multi", true).add("upsert", false).pop().get(); MongoUpdateWritable muw = new MongoUpdateWritable( query, modifiers, false, true, false); PipeMapRed pipeMapRed = mock(PipeMapRed.class); when(pipeMapRed.getClientInput()).thenReturn( inputFromBSONObject(update)); MongoUpdateOutputReader reader = new MongoUpdateOutputReader(); reader.initialize(pipeMapRed); assertTrue(reader.readKeyValue()); assertEquals(muw, reader.getCurrentValue()); } }