/** * When user specified protobuffer class in configuration, It should replace class specified in * header. */ @Test public void testCustomProtoClass() throws Exception { FirstCustomClassMessage.Builder inputMessage; inputMessage = FirstCustomClassMessage.newBuilder(); inputMessage.setString("writtenString"); Path outputPath = new WriteUsingMR().write(new Message[] {inputMessage.build()}); ReadUsingMR readUsingMR = new ReadUsingMR(); String customClass = SecondCustomClassMessage.class.getName(); ProtoReadSupport.setProtobufClass(readUsingMR.getConfiguration(), customClass); List<Message> result = readUsingMR.read(outputPath); assertEquals(1, result.size()); Message msg = result.get(0); assertFalse("Class from header returned.", msg instanceof FirstCustomClassMessage); assertTrue("Custom class was not used", msg instanceof SecondCustomClassMessage); String stringValue; stringValue = ((SecondCustomClassMessage) msg).getString(); assertEquals("writtenString", stringValue); }
/** * Writes data to file then reads them again with projection. Only requested data should be read. */ @Test public void testProjection() throws Exception { TestProtobuf.Document.Builder writtenDocument = TestProtobuf.Document.newBuilder(); writtenDocument.setDocId(12345); writtenDocument.addNameBuilder().setUrl("http://goout.cz/"); Path outputPath = new WriteUsingMR().write(writtenDocument.build()); // lets prepare reading with schema ReadUsingMR reader = new ReadUsingMR(); String projection = "message Document {required int64 DocId; }"; reader.setRequestedProjection(projection); List<Message> output = reader.read(outputPath); TestProtobuf.Document readDocument = (TestProtobuf.Document) output.get(0); // test that only requested fields were deserialized assertTrue(readDocument.hasDocId()); assertTrue("Found data outside projection.", readDocument.getNameCount() == 0); }