diff --git a/src/tsd/GraphHandler.java b/src/tsd/GraphHandler.java index 8e065bfc81..bbb265cb0d 100644 --- a/src/tsd/GraphHandler.java +++ b/src/tsd/GraphHandler.java @@ -70,8 +70,9 @@ final class GraphHandler implements HttpRpc { private static final boolean IS_WINDOWS = System.getProperty("os.name", "").contains("Windows"); + private static final String RANGE_COMPONENT = "\\\"?-?\\d*\\.?(\\d+)?([eE]-?\\d+)?\\\"?"; private static Pattern RANGE_VALIDATOR = Pattern.compile( - "\\[\\\"?-?\\d+\\.?(\\d+)?([eE]-?\\d+)?\\\"?:\\\"?-?(\\d+\\.?\\d+?)?([eE]-?\\d+)?\\\"?\\]"); + "\\["+RANGE_COMPONENT+":"+RANGE_COMPONENT+"]"); private static Pattern LABEL_VALIDATOR = Pattern.compile("[a-zA-z0-9 \\-_]"); private static Pattern KEY_VALIDATOR = Pattern.compile( "(out|left|top|center|right|horiz|box|bottom)?\\s?"); diff --git a/src/utils/Config.java b/src/utils/Config.java index 723df36c7a..c534900aca 100644 --- a/src/utils/Config.java +++ b/src/utils/Config.java @@ -556,6 +556,7 @@ protected void setDefaults() { default_map.put("tsd.core.storage_exception_handler.enable", "false"); default_map.put("tsd.core.uid.random_metrics", "false"); default_map.put("tsd.core.bulk.allow_out_of_order_timestamps", "false"); + default_map.put("tsd.gnuplot.options.allowlist", ";axis x1y2"); default_map.put("tsd.query.filter.expansion_limit", "4096"); default_map.put("tsd.query.skip_unresolved_tagvs", "false"); default_map.put("tsd.query.allow_simultaneous_duplicates", "true"); diff --git a/test/tsd/TestGraphHandler.java b/test/tsd/TestGraphHandler.java index 71311856fa..011ca631d6 100644 --- a/test/tsd/TestGraphHandler.java +++ b/test/tsd/TestGraphHandler.java @@ -26,6 +26,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; + import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -65,13 +66,94 @@ public final class TestGraphHandler { } @Test - public void setPlotParams() throws Exception { + public void setYRangeParams() throws Exception { Plot plot = mock(Plot.class); HttpQuery query = mock(HttpQuery.class); Map> params = Maps.newHashMap(); when(query.getQueryString()).thenReturn(params); + + params.put("yrange", Lists.newArrayList("[0:1]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:0]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:42]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:-42]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:0.8]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:-0.8]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:42.4]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:-42.4]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:4e4]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:-4e4]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:4e-4]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:-4e-4]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:4.2e4]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[:-4.2e4]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[0:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[5:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[-5:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[0.5:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[-0.5:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[10.5:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[-10.5:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[10e5:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[-10e5:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[10e-5:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[-10e-5:]")); + GraphHandler.setPlotParams(query, plot); + + params.put("yrange", Lists.newArrayList("[10.1e-5:]")); + GraphHandler.setPlotParams(query, plot); - params.put("yrange", Lists.newArrayList("[0:42]")); + params.put("yrange", Lists.newArrayList("[-10.1e-5:]")); GraphHandler.setPlotParams(query, plot); params.put("yrange", Lists.newArrayList("[33:system('touch /tmp/poc.txt')]"));