From f82fb7179108e6914e21f97deead35487e1c5f67 Mon Sep 17 00:00:00 2001 From: William Hiver Date: Tue, 6 Mar 2018 23:46:53 +0100 Subject: [PATCH] Add tests for encoding/decoding with a precompiled schema at proc level Also add a test to ensure a correct behaviour when switching between raw and precompiled schema. --- .../nifi/processor/ProtobufDecoderTest.java | 28 ++++++++++ .../nifi/processor/ProtobufEncoderTest.java | 56 +++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/src/test/java/com/github/whiver/nifi/processor/ProtobufDecoderTest.java b/src/test/java/com/github/whiver/nifi/processor/ProtobufDecoderTest.java index 3862062..94e4148 100644 --- a/src/test/java/com/github/whiver/nifi/processor/ProtobufDecoderTest.java +++ b/src/test/java/com/github/whiver/nifi/processor/ProtobufDecoderTest.java @@ -87,6 +87,34 @@ public void onTriggerDecodeValidFiles() throws IOException { } } + /** + * Test encoding valid files given an already compiled schema specified at processor level + * @throws Exception + */ + @Test + public void onTriggerDecodeValidFilesWithSchemaAtProcessorLevel() throws Exception { + TestRunner runner = TestRunners.newTestRunner(new ProtobufDecoder()); + runner.setProperty(ProtobufProcessor.COMPILE_SCHEMA, "false"); + runner.setProperty(ProtobufProcessor.PROTOBUF_SCHEMA, ProtobufDecoderTest.class.getResource("/schemas/Person.desc").getPath()); + + InputStream dataFile = ProtobufDecoderTest.class.getResourceAsStream("/data/Person.data"); + HashMap personProperties = new HashMap<>(); + personProperties.put("protobuf.messageType", "Person"); + runner.enqueue(dataFile, personProperties); + + runner.assertValid(); + runner.run(1); + runner.assertQueueEmpty(); + + runner.assertAllFlowFilesTransferred(ProtobufDecoder.SUCCESS); + MockFlowFile result = runner.getFlowFilesForRelationship(ProtobufDecoder.SUCCESS).get(0); + + ObjectMapper mapper = new ObjectMapper(); + JsonNode expected = mapper.readTree(this.getClass().getResourceAsStream("/data/Person.json")); + JsonNode given = mapper.readTree(runner.getContentAsByteArray(result)); + Assert.assertEquals("The parsing result of Person.data is not as expected", expected, given); + } + /** * Test decoding valid files given an uncompiled .proto schema specified at flowfile level * @throws Exception diff --git a/src/test/java/com/github/whiver/nifi/processor/ProtobufEncoderTest.java b/src/test/java/com/github/whiver/nifi/processor/ProtobufEncoderTest.java index c3d2b81..a4c67af 100644 --- a/src/test/java/com/github/whiver/nifi/processor/ProtobufEncoderTest.java +++ b/src/test/java/com/github/whiver/nifi/processor/ProtobufEncoderTest.java @@ -87,6 +87,31 @@ public void onTriggerEncodeValidFiles() throws IOException { } } + /** + * Test encoding valid files given an already compiled schema specified at processor level + * @throws Exception + */ + @Test + public void onTriggerEncodeValidFilesWithSchemaAtProcessorLevel() throws Exception { + TestRunner runner = TestRunners.newTestRunner(new ProtobufEncoder()); + runner.setProperty(ProtobufProcessor.COMPILE_SCHEMA, "false"); + runner.setProperty(ProtobufProcessor.PROTOBUF_SCHEMA, ProtobufEncoderTest.class.getResource("/schemas/Person.desc").getPath()); + + InputStream jsonFile = ProtobufEncoderTest.class.getResourceAsStream("/data/Person.json"); + HashMap personProperties = new HashMap<>(); + personProperties.put("protobuf.messageType", "Person"); + runner.enqueue(jsonFile, personProperties); + + runner.assertValid(); + runner.run(1); + runner.assertQueueEmpty(); + + runner.assertAllFlowFilesTransferred(ProtobufEncoder.SUCCESS); + List results = runner.getFlowFilesForRelationship(ProtobufEncoder.SUCCESS); + Assert.assertEquals("The Person flowfile should be returned to success", 1, results.size()); + results.get(0).assertContentEquals(ProtobufEncoderTest.class.getResourceAsStream("/data/Person.data")); + } + /** * Test encoding valid files given an uncompiled .proto schema specified at flowfile level * @throws Exception @@ -233,4 +258,35 @@ public void onPropertyModified() throws Exception { result.assertContentEquals(ProtobufEncoderTest.class.getResourceAsStream("/data/AddressBook_basic.data")); } + + /** + * Ensure we can still encode properly when switching between a raw or precompiled schema at processor level + */ + @Test + public void onPropertyModifiedEncodeFileUsingSchemaAtProcessorLevel() { + TestRunner runner = TestRunners.newTestRunner(new ProtobufEncoder()); + runner.setProperty(ProtobufProcessor.COMPILE_SCHEMA, "true"); + runner.setProperty(ProtobufProcessor.PROTOBUF_SCHEMA, ProtobufEncoderTest.class.getResource("/schemas/Person.proto").getPath()); + + HashMap personProperties = new HashMap<>(); + personProperties.put("protobuf.messageType", "Person"); + runner.enqueue(ProtobufEncoderTest.class.getResourceAsStream("/data/Person.json"), personProperties); + + runner.assertValid(); + runner.run(1); + runner.assertQueueEmpty(); + + runner.setProperty(ProtobufProcessor.COMPILE_SCHEMA, "false"); + runner.setProperty(ProtobufProcessor.PROTOBUF_SCHEMA, ProtobufEncoderTest.class.getResource("/schemas/Person.desc").getPath()); + + runner.enqueue(ProtobufEncoderTest.class.getResourceAsStream("/data/Person.json"), personProperties); + + runner.assertValid(); + runner.run(1); + runner.assertQueueEmpty(); + + runner.assertAllFlowFilesTransferred(ProtobufEncoder.SUCCESS); + List results = runner.getFlowFilesForRelationship(ProtobufEncoder.SUCCESS); + Assert.assertEquals("The 2 flowfiles should be returned to success", 2, results.size()); + } } \ No newline at end of file