@Test public void testConvertersWithMultipleFields() throws Exception { final Converter converter = new TestConverter.Builder() .multiple(true) .callback( new Function<Object, Object>() { @Nullable @Override public Object apply(Object input) { return ImmutableMap.builder() .put("one", 1) .put("two", "2") .put( "message", "message should not be overwritten") // Try to overwrite reserved field. .build(); } }) .build(); final TestExtractor extractor = new TestExtractor.Builder() .converters(Lists.newArrayList(converter)) .callback( new Callable<Result[]>() { @Override public Result[] call() throws Exception { return new Result[] {new Result("1", -1, -1)}; } }) .build(); final Message msg = createMessage("the message"); extractor.runExtractor(msg); // With a "multiple fields" converter the target field is not touched, only the additional // fields are added. assertThat(msg.getField("target")).isEqualTo("1"); assertThat(msg.getField("one")).isEqualTo(1); assertThat(msg.getField("two")).isEqualTo("2"); // Reserved fields are not overwritten! assertThat(msg.getField("message")).isEqualTo("the message"); // Attempts to overwrite a reserved field are recorded as converter exception. assertThat(extractor.getConverterExceptionCount()).isEqualTo(1); }
@Test public void testConvertersWithExceptions() throws Exception { final Converter converter1 = new TestConverter.Builder() .callback( new Function<Object, Object>() { @Nullable @Override public Object apply(Object input) { throw new NullPointerException("EEK"); } }) .build(); final Converter converter2 = new TestConverter.Builder() .callback( new Function<Object, Object>() { @Nullable @Override public Object apply(Object input) { return input + "2"; } }) .build(); final Converter converter3 = new TestConverter.Builder() .callback( new Function<Object, Object>() { @Nullable @Override public Object apply(Object input) { throw new NullPointerException("EEK"); } }) .build(); final TestExtractor extractor = new TestExtractor.Builder() .converters(Lists.newArrayList(converter1, converter2, converter3)) .callback( new Callable<Result[]>() { @Override public Result[] call() throws Exception { return new Result[] {new Result("converter", -1, -1)}; } }) .build(); final Message msg = createMessage("message"); extractor.runExtractor(msg); // The two exceptions should have been recorded. assertThat(extractor.getConverterExceptionCount()).isEqualTo(2); // It ignores all converters which throw an exception but executes the ones that don't. // TODO: Is this really the expected behaviour? The converters are executed in order and // basically depend on the output of the previous. This might not work for all converters. assertThat(msg.getField("target")).isEqualTo("converter2"); }