diff --git a/api/src/main/java/io/druid/data/input/impl/ParseSpec.java b/api/src/main/java/io/druid/data/input/impl/ParseSpec.java index 860bf30971b..be16548c5da 100644 --- a/api/src/main/java/io/druid/data/input/impl/ParseSpec.java +++ b/api/src/main/java/io/druid/data/input/impl/ParseSpec.java @@ -22,6 +22,7 @@ package io.druid.data.input.impl; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.google.common.base.Preconditions; import io.druid.guice.annotations.ExtensionPoint; import io.druid.guice.annotations.PublicApi; import io.druid.java.util.common.parsers.Parser; @@ -47,8 +48,8 @@ public abstract class ParseSpec protected ParseSpec(TimestampSpec timestampSpec, DimensionsSpec dimensionsSpec) { - this.timestampSpec = timestampSpec; - this.dimensionsSpec = dimensionsSpec; + this.timestampSpec = Preconditions.checkNotNull(timestampSpec, "parseSpec requires timestampSpec"); + this.dimensionsSpec = Preconditions.checkNotNull(dimensionsSpec, "parseSpec requires dimensionSpec"); } @JsonProperty diff --git a/api/src/test/java/io/druid/data/input/impl/ParseSpecTest.java b/api/src/test/java/io/druid/data/input/impl/ParseSpecTest.java index ffb07dc80e9..0cb23da3196 100644 --- a/api/src/test/java/io/druid/data/input/impl/ParseSpecTest.java +++ b/api/src/test/java/io/druid/data/input/impl/ParseSpecTest.java @@ -21,13 +21,18 @@ package io.druid.data.input.impl; import com.google.common.collect.Lists; import io.druid.java.util.common.parsers.ParseException; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import java.util.Arrays; import java.util.Collections; public class ParseSpecTest { + @Rule + public ExpectedException expectedException = ExpectedException.none(); + @Test(expected = ParseException.class) public void testDuplicateNames() throws Exception { @@ -96,4 +101,46 @@ public class ParseSpecTest 0 ); } + + @Test + public void testDefaultTimestampSpec() throws Exception + { + expectedException.expect(NullPointerException.class); + expectedException.expectMessage("parseSpec requires timestampSpec"); + @SuppressWarnings("unused") // expected exception + final ParseSpec spec = new DelimitedParseSpec( + null, + new DimensionsSpec( + DimensionsSpec.getDefaultSchemas(Collections.singletonList("a")), + Lists.newArrayList("B", "B"), + Lists.newArrayList() + ), + ",", + null, + Arrays.asList("a", "B"), + false, + 0 + ); + } + + @Test + public void testDimensionSpecRequired() throws Exception + { + expectedException.expect(NullPointerException.class); + expectedException.expectMessage("parseSpec requires dimensionSpec"); + @SuppressWarnings("unused") // expected exception + final ParseSpec spec = new DelimitedParseSpec( + new TimestampSpec( + "timestamp", + "auto", + null + ), + null, + ",", + null, + Arrays.asList("a", "B"), + false, + 0 + ); + } }