(*--------------------------------------------------------------------------- Copyright (c) 2025 Thomas Gazagnaire. All rights reserved. SPDX-License-Identifier: MIT ---------------------------------------------------------------------------*) (* TLV encoding tests *) let test_tlv_empty () = let encoded = Hap.Tlv.encode Hap.Tlv.empty in Alcotest.(check string) "empty TLV" "" encoded let test_tlv_single () = let tlv = Hap.Tlv.(add 0x01 "hello" empty) in let encoded = Hap.Tlv.encode tlv in (* Type 0x01, Length 5, "hello" *) let expected = "\x01\x05hello" in Alcotest.(check string) "single TLV" expected encoded let test_tlv_roundtrip () = let tlv = Hap.Tlv.(add 0x01 "hello" (add 0x02 "world" empty)) in let encoded = Hap.Tlv.encode tlv in let decoded = Hap.Tlv.decode encoded in Alcotest.(check (option string)) "get type 1" (Some "hello") (Hap.Tlv.get 0x01 decoded); Alcotest.(check (option string)) "get type 2" (Some "world") (Hap.Tlv.get 0x02 decoded) let test_tlv_long_value () = (* TLV8 fragments values longer than 255 bytes *) let long_value = String.make 300 'x' in let tlv = Hap.Tlv.(add 0x03 long_value empty) in let encoded = Hap.Tlv.encode tlv in let decoded = Hap.Tlv.decode encoded in Alcotest.(check (option string)) "long value roundtrip" (Some long_value) (Hap.Tlv.get 0x03 decoded) (* Category name tests *) let test_category_names () = Alcotest.(check string) "category 1" "Other" (Hap.category_name 1); Alcotest.(check string) "category 2" "Bridge" (Hap.category_name 2); Alcotest.(check string) "category 4" "Garage Door Opener" (Hap.category_name 4); Alcotest.(check string) "category 5" "Lightbulb" (Hap.category_name 5); Alcotest.(check string) "category 7" "Outlet" (Hap.category_name 7); Alcotest.(check string) "category 8" "Switch" (Hap.category_name 8); Alcotest.(check string) "category 10" "Sensor" (Hap.category_name 10); Alcotest.(check string) "category 999" "Unknown" (Hap.category_name 999) (* TLV type constants tests *) let test_tlv_type_constants () = Alcotest.(check int) "method" 0x00 Hap.Tlv_type.method_; Alcotest.(check int) "identifier" 0x01 Hap.Tlv_type.identifier; Alcotest.(check int) "salt" 0x02 Hap.Tlv_type.salt; Alcotest.(check int) "public_key" 0x03 Hap.Tlv_type.public_key; Alcotest.(check int) "proof" 0x04 Hap.Tlv_type.proof; Alcotest.(check int) "encrypted_data" 0x05 Hap.Tlv_type.encrypted_data; Alcotest.(check int) "state" 0x06 Hap.Tlv_type.state; Alcotest.(check int) "error" 0x07 Hap.Tlv_type.error; Alcotest.(check int) "signature" 0x0a Hap.Tlv_type.signature (* HAP error constants tests *) let test_hap_error_constants () = Alcotest.(check int) "unknown" 0x01 Hap.Hap_error.unknown; Alcotest.(check int) "authentication" 0x02 Hap.Hap_error.authentication; Alcotest.(check int) "backoff" 0x03 Hap.Hap_error.backoff; Alcotest.(check int) "max_peers" 0x04 Hap.Hap_error.max_peers; Alcotest.(check int) "max_tries" 0x05 Hap.Hap_error.max_tries; Alcotest.(check int) "unavailable" 0x06 Hap.Hap_error.unavailable; Alcotest.(check int) "busy" 0x07 Hap.Hap_error.busy let suite = ( "hap", [ Alcotest.test_case "TLV empty" `Quick test_tlv_empty; Alcotest.test_case "TLV single" `Quick test_tlv_single; Alcotest.test_case "TLV roundtrip" `Quick test_tlv_roundtrip; Alcotest.test_case "TLV long value" `Quick test_tlv_long_value; Alcotest.test_case "category names" `Quick test_category_names; Alcotest.test_case "Tlv_type constants" `Quick test_tlv_type_constants; Alcotest.test_case "Hap_error constants" `Quick test_hap_error_constants; ] )