summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2015-04-15 17:57:34 +0600
committerDaniil Baturin <daniil@baturin.org>2015-04-15 17:57:34 +0600
commitf9aad533ee80268a5acac34179098a097968a48d (patch)
tree9bb08fe59b3a53ff45d73992affe55469cb80133
parentb6de92f819638538fb646c0d4096cb2f01a939d3 (diff)
downloadvyconf-f9aad533ee80268a5acac34179098a097968a48d.tar.gz
vyconf-f9aad533ee80268a5acac34179098a097968a48d.zip
Add value validator module.
-rw-r--r--_oasis14
-rw-r--r--src/value_checker.ml18
-rw-r--r--src/value_checker.mli5
-rw-r--r--test/value_checker_test.ml45
4 files changed, 82 insertions, 0 deletions
diff --git a/_oasis b/_oasis
index 580be94..f775dfa 100644
--- a/_oasis
+++ b/_oasis
@@ -48,6 +48,14 @@ Executable "vylist_test"
Install: false
BuildDepends: oUnit, vyconf
+Executable "value_checker_test"
+ Path: test
+ MainIs: value_checker_test.ml
+ Build$: flag(tests)
+ CompiledObject: best
+ Install: false
+ BuildDepends: oUnit, pcre, vyconf
+
Test "vyconf_tree_test"
Run$: flag(tests)
TestTools: vyconf_tree_test
@@ -59,3 +67,9 @@ Test "vylist_test"
TestTools: vylist_test
Command: $vylist_test
WorkingDirectory: test
+
+Test "value_checker_test"
+ Run$: flag(tests)
+ TestTools: value_checker_test
+ Command: $value_checker_test
+ WorkingDirectory: test
diff --git a/src/value_checker.ml b/src/value_checker.ml
new file mode 100644
index 0000000..ed7c5d1
--- /dev/null
+++ b/src/value_checker.ml
@@ -0,0 +1,18 @@
+type value_constraint = Regex of string | External of string * string
+
+exception Bad_validator of string
+
+let validate_value validators value_constraint value =
+ match value_constraint with
+ | Regex s ->
+ (try
+ let _ = Pcre.exec ~pat:s value in true
+ with Not_found -> false)
+ | External (t, c) ->
+ try
+ let validator = Hashtbl.find validators t in
+ let result = Unix.system (Printf.sprintf "%s %s %s" validator c value) in
+ match result with
+ | Unix.WEXITED 0 -> true
+ | _ -> false
+ with Not_found -> raise (Bad_validator t)
diff --git a/src/value_checker.mli b/src/value_checker.mli
new file mode 100644
index 0000000..96d8f3c
--- /dev/null
+++ b/src/value_checker.mli
@@ -0,0 +1,5 @@
+type value_constraint = Regex of string | External of string * string
+
+exception Bad_validator of string
+
+val validate_value : (string, string) Hashtbl.t -> value_constraint -> string -> bool
diff --git a/test/value_checker_test.ml b/test/value_checker_test.ml
new file mode 100644
index 0000000..f7161f2
--- /dev/null
+++ b/test/value_checker_test.ml
@@ -0,0 +1,45 @@
+open OUnit2
+open Value_checker
+
+let validators = Hashtbl.create 256
+let () = Hashtbl.add validators "anything" "true";
+ Hashtbl.add validators "nothing" "false"
+
+let test_check_regex_valid test_ctxt =
+ let c = Regex "[a-z]+" in
+ let v = "fgsfds" in
+ assert_equal (validate_value validators c v) true
+
+let test_check_regex_invalid test_ctxt =
+ let c = Regex "[a-z]+" in
+ let v = "FGSFDS" in
+ assert_equal (validate_value validators c v) false
+
+let test_check_external_valid test_ctxt =
+ let c = External ("anything", "") in
+ let v = "fgsfds" in
+ assert_equal (validate_value validators c v) true
+
+let test_check_external_invalid test_ctxt =
+ let c = External ("nothing", "") in
+ let v = "fgsfds" in
+ assert_equal (validate_value validators c v) false
+
+let test_check_external_bad_validator test_ctxt =
+ let c = External ("invalid", "") in
+ let v = "fgsfds" in
+ assert_raises (Bad_validator "invalid") (fun () -> validate_value validators c v)
+
+
+let suite =
+ "VyConf value checker tests" >::: [
+ "test_check_regex_valid" >:: test_check_regex_valid;
+ "test_check_regex_invalid" >:: test_check_regex_invalid;
+ "test_check_external_valid" >:: test_check_external_valid;
+ "test_check_external_invalid" >:: test_check_external_invalid;
+ "test_check_external_bad_validator" >:: test_check_external_bad_validator;
+ ]
+
+let () =
+ run_test_tt_main suite
+