summaryrefslogtreecommitdiff
path: root/src/ctrace/test/ctrace_dsl_test.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ctrace/test/ctrace_dsl_test.erl')
-rw-r--r--src/ctrace/test/ctrace_dsl_test.erl123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/ctrace/test/ctrace_dsl_test.erl b/src/ctrace/test/ctrace_dsl_test.erl
new file mode 100644
index 000000000..601e6cd17
--- /dev/null
+++ b/src/ctrace/test/ctrace_dsl_test.erl
@@ -0,0 +1,123 @@
+% Licensed under the Apache License, Version 2.0 (the "License"); you may not
+% use this file except in compliance with the License. You may obtain a copy of
+% the License at
+%
+% http://www.apache.org/licenses/LICENSE-2.0
+%
+% Unless required by applicable law or agreed to in writing, software
+% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+% License for the specific language governing permissions and limitations under
+% the License.
+
+-module(ctrace_dsl_test).
+
+
+-include_lib("eunit/include/eunit.hrl").
+
+
+simple_parse_and_compile_test() ->
+ Filter = "(#{'http.method' := Method}) when Method == get -> 1.0",
+ ctrace_dsl:compile("foo", Filter),
+ ?assertEqual(1.0, run_filter("foo", #{'http.method' => get})),
+ ?assertEqual(false, run_filter("foo", #{'httpd.method' => put})).
+
+
+empty_map_test() ->
+ Filter = "(#{}) -> true",
+ ctrace_dsl:compile("foo", Filter),
+ ?assertEqual(true, run_filter("foo", #{})),
+ ?assertEqual(true, run_filter("foo", #{foo => bar})),
+ ?assertEqual(false, run_filter("foo", nil)).
+
+
+return_false_test() ->
+ Filter = "(#{}) -> false",
+ ctrace_dsl:compile("foo", Filter),
+ ?assertEqual(false, run_filter("foo", #{})),
+ ?assertEqual(false, run_filter("foo", nil)).
+
+
+return_float_test() ->
+ Filter = "(#{}) -> 0.2",
+ ctrace_dsl:compile("foo", Filter),
+ ?assertEqual(0.2, run_filter("foo", #{})),
+ ?assertEqual(false, run_filter("foo", nil)).
+
+
+bad_filter_body_is_list_test() ->
+ Filter = "(#{}) -> []",
+ Error = "Unsupported return value '[]'",
+ ?assertThrow({error, Error}, ctrace_dsl:compile("foo", Filter)).
+
+
+bad_filter_body_has_calls_test() ->
+ Filter = "(#{}) -> [module:function()]",
+ Error = "Unsupported return value '[module:function()]'",
+ ?assertThrow({error, Error}, ctrace_dsl:compile("foo", Filter)).
+
+
+bad_arg_list_too_few_test() ->
+ Filter = "() -> true",
+ Error = "The arity of the filter function should be 1",
+ ?assertThrow({error, Error}, ctrace_dsl:compile("foo", Filter)).
+
+
+bad_arg_list_too_many_test() ->
+ Filter = "(#{}, foo) -> true",
+ Error = "The arity of the filter function should be 1",
+ ?assertThrow({error, Error}, ctrace_dsl:compile("foo", Filter)).
+
+
+bad_arg_type_test() ->
+ Filters = [
+ "(atom) -> true",
+ "([atom]) -> true",
+ "(1) -> true",
+ "(1.0) -> true"
+ ],
+ Error = "The only argument of the filter should be map",
+ lists:foreach(fun(Filter) ->
+ ?assertThrow({error, Error}, ctrace_dsl:compile("foo", Filter))
+ end, Filters).
+
+
+bad_map_association_test() ->
+ Filter = "(#{foo => Var}) -> true",
+ Error = "Only #{field := Var} syntax is supported in the header",
+ ?assertThrow({error, Error}, ctrace_dsl:compile("foo", Filter)).
+
+
+bad_field_variable_test() ->
+ Filter = "(#{Var := Val}) -> false",
+ Error = "Only atoms are supported as field names in the header",
+ ?assertThrow({error, Error}, ctrace_dsl:compile("foo", Filter)).
+
+
+bad_field_match_test() ->
+ Filter = "(#{foo := 2}) -> true",
+ Error = "Only capitalized names are supported"
+ " as matching variables in the header",
+ ?assertThrow({error, Error}, ctrace_dsl:compile("foo", Filter)).
+
+
+repeated_variable_test() ->
+ Filter = "(#{foo := Val, bar := Val}) -> true",
+ Error = "'Val' variable is already in use",
+ ?assertThrow({error, Error}, ctrace_dsl:compile("foo", Filter)).
+
+
+code_coverage1_test() ->
+ Filter = "foo(#{}) -> bar",
+ Error = "Unknown shape of a filter function",
+ ?assertThrow({error, Error}, ctrace_dsl:compile("foo", Filter)).
+
+
+code_coverage2_test() ->
+ Filter = "(#{}) -> true",
+ ?assertMatch([_ | _], ctrace_dsl:source("foo", Filter)).
+
+
+run_filter(OperationId, Value) ->
+ ModName = ctrace_config:filter_module_name(OperationId),
+ ModName:match(Value).