From 04be611be6ab6bcfa7617365ab824ca2b1dc2f9b Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 25 Oct 2018 01:10:17 +0200 Subject: =?UTF-8?q?sid:=20implement=20decoder=20for=20=E2=80=9Cpacket=20re?= =?UTF-8?q?presentation=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sid_test.ml | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 113 insertions(+), 4 deletions(-) (limited to 'sid_test.ml') diff --git a/sid_test.ml b/sid_test.ml index 137575e..aaee961 100644 --- a/sid_test.ml +++ b/sid_test.ml @@ -1,5 +1,9 @@ open OUnit +(* +let () = Printexc.record_backtrace true ;; + *) + (* S-1-1-0-1-2-3-4-5-6-7-8-9-10-11-12-13-14 *) let max_sid = Stdint.( Sid.create_unsafe @@ -82,7 +86,7 @@ let sf_parse_too_long_ok () = let pr_encode_null_ok () = let x = Sid.WellKnown.null - |> Sid.PacketRep.encode + |> Sid.PacketRep.encode |> Xxd.xxd_of_bytes ~blocklen:2 in let expect = "0101 0000 0000 0000 0000 0000" in @@ -94,7 +98,7 @@ let pr_encode_null_ok () = let pr_encode_all_ok () = let x = Sid.WellKnown.everyone - |> Sid.PacketRep.encode + |> Sid.PacketRep.encode |> Xxd.xxd_of_bytes ~blocklen:2 in let expect = "0101 0000 0000 0001 0000 0000" in @@ -103,6 +107,105 @@ let pr_encode_all_ok () = ~msg:(Printf.sprintf "[%s] ≠ [%s]" x expect) x expect +let pr_decode_all_ok () = + let s = + match + Xxd.bytes_of_xxd "0101 0000 0000 0001 0000 0000" + (* vvcc iiii iiii iiii ssss ssss *) + |> Sid.PacketRep.decode + with + | Ok s -> s + | Error e -> + assert_failure + (Printf.sprintf "error decoding SID: %s" e) + in + let w = Sid.WellKnown.world in + assert_bool + (Printf.sprintf "[%s] ≠ [%s]" + (Sid.to_string s) (Sid.to_string w)) + (Sid.equal s w) + +let pr_decode_version_fail () = + let b = Xxd.bytes_of_xxd "0201 0000 0000 0001 0000 0000" in + (* vvcc iiii iiii iiii ssss ssss *) + match Sid.PacketRep.decode b with + | Error e -> + let expect = "input malformed: expected SID version=0x01, got 0x02" in + assert_equal + ~msg:(Printf.sprintf "[%s] ≠ [%s]" e expect) + e expect + | Ok s -> + assert_failure + (Printf.sprintf "malformed SID decoded unexpectedly: %s" + (Sid.to_string s)) + +let pr_decode_sacount_fail () = + let b = Xxd.bytes_of_xxd "0110 0000 0000 0001 0000 0000" in + (* vvcc iiii iiii iiii ssss ssss *) + match Sid.PacketRep.decode b with + | Error e -> + let expect = "input malformed: up to 15 subAuthority elements \ + permitted, 16 specified" in + assert_equal + ~msg:(Printf.sprintf "[%s] ≠ [%s]" e expect) + e expect + | Ok s -> + assert_failure + (Printf.sprintf "malformed SID decoded unexpectedly: %s" + (Sid.to_string s)) + +let pr_decode_short_fail () = + let b = Xxd.bytes_of_xxd "0105 0000 0000 00" in + (* vvcc iiii iiii ii…… *) + match Sid.PacketRep.decode b with + | Error e -> + let expect = "bad input size: expected 8–68 B, got 7 B" in + assert_equal + ~msg:(Printf.sprintf "[%s] ≠ [%s]" e expect) + e expect + | Ok s -> + assert_failure + (Printf.sprintf "malformed SID decoded unexpectedly: %s" + (Sid.to_string s)) + +let pr_decode_long_fail () = + let r = + "010e 0000 0000 0000 0100 0000 0200 0000 \ + 0300 0000 0400 0000 0500 0000 0600 0000 \ + 0700 0000 0800 0000 0900 0000 0a00 0000 \ + 0b00 0000 0c00 0000 0d00 0000 0e00 0000 \ + 0f00 0000 1000 0000" + in + let b = Xxd.bytes_of_xxd r in + match Sid.PacketRep.decode b with + | Error e -> + let expect = "bad input size: expected 8–68 B, got 72 B" in + assert_equal + ~msg:(Printf.sprintf "[%s] ≠ [%s]" e expect) + e expect + | Ok s -> + assert_failure + (Printf.sprintf "malformed SID decoded unexpectedly: %s" + (Sid.to_string s)) + +let pr_decode_odd_fail () = + match + Xxd.bytes_of_xxd "0101 0000 0000 0000 0100 0000 0200" + (* vvcc iiii iiii iiii ssss ssss ssss … + upper half word missing *) + |> Sid.PacketRep.decode + with + | Error e -> + let expect = "bad input size: not divisible by word length (4)" in + assert_equal + ~msg:(Printf.sprintf "[%s] ≠ [%s]" e expect) + e expect + | Ok s -> + assert_failure + (Printf.sprintf "malformed SID decoded unexpectedly: %s" + (Sid.to_string s)) + + let string_format_test = "string-format-syntax" >::: [ "parse-ok" >:: sf_parse_ok ; "parse-empty-fail" >:: sf_parse_empty_fail @@ -117,8 +220,14 @@ let string_format_test = "string-format-syntax" >::: let packet_rep_test = "packet-rep" >::: - [ "encode-null-ok" >:: pr_encode_null_ok - ; "encode-all-ok" >:: pr_encode_all_ok + [ "encode-null-ok" >:: pr_encode_null_ok + ; "encode-all-ok" >:: pr_encode_all_ok + ; "decode-all-ok" >:: pr_decode_all_ok + ; "decode-version-fail" >:: pr_decode_version_fail + ; "decode-sacount-fail" >:: pr_decode_sacount_fail + ; "decode-short-fail" >:: pr_decode_short_fail + ; "decode-long-fail" >:: pr_decode_long_fail + ; "decode-odd-fail" >:: pr_decode_odd_fail ] let () = -- cgit v1.2.3