#!/bin/sh
: ${uuid=./uuid}

exp='encode: STR:     f50c5fcc-6b66-11ef-bafc-efdff7d5f2f6
        SIV:     325725109554302597798550804656796594934
decode: variant: DCE 1.1, ISO/IEC 11578:1996
        version: 1 (time and node based)
        content: time:  2024-09-05 09:12:21.383982.0 UTC
                 clock: 15100 (usually random)
                 node:  ef:df:f7:d5:f2:f6 (local multicast)'
[ "$($uuid -d f50c5fcc-6b66-11ef-bafc-efdff7d5f2f6   )" = "$exp" ] || { echo "uuid: -d      f50c5fcc-6b66-11ef-bafc-efdff7d5f2f6 wrong" >&2; exit 1; }
[ "$($uuid -dF SIV 325725109554302597798550804656796594934)" = "$exp" ] || { echo "uuid: -dF SIV 325725109554302597798550804656796594934 wrong" >&2; exit 1; }
[ "$(printf '\365\014\137\314\153\146\021\357\272\374\357\337\367\325\362\366' | $uuid -dF BIN -)" = "$exp" ] || { echo "uuid: -dF BIN ... wrong" >&2; exit 1; }


# https://bugs.debian.org/1041542
timemin='encode: STR:     00000000-0000-1100-a000-000000000000
        SIV:     80291759423830037102592
decode: variant: DCE 1.1, ISO/IEC 11578:1996
        version: 1 (time and node based)
        content: time:  1811-02-16 23:50:03.792793.6 UTC
                 clock: 8192 (usually random)
                 node:  00:00:00:00:00:00 (global unicast)'
[ "$($uuid -d 00000000-0000-1100-a000-000000000000)" = "$timemin" ] || {
	echo "uuid: -d 00000000-0000-1100-a000-000000000000 wrong" >&2
	[ "$($uuid -d 00000000-0000-1100-a000-000000000000)" = "$(printf '%s\n' "$timemin" | sed 's/1811-02-16 23:50:03.792793.6/1947-03-26 06:18:19.792793.6/')" ] &&	\
		echo "	32-bit time_t!" >&2 || exit 1
}
timemax='encode: STR:     ffffffff-ffff-1fff-bfc1-efc8990bbfa4
        SIV:     340282366920937405648653289334120365988
decode: variant: DCE 1.1, ISO/IEC 11578:1996
        version: 1 (time and node based)
        content: time:  5236-03-31 21:21:00.684697.5 UTC
                 clock: 16321 (usually random)
                 node:  ef:c8:99:0b:bf:a4 (local multicast)'
[ "$($uuid -d FFFFFFFF-FFFF-1FFF-bfc1-efc8990bbfa4)" = "$timemax" ] || {
	echo "uuid: -d FFFFFFFF-FFFF-1FFF-bfc1-efc8990bbfa4 wrong" >&2
	[ "$($uuid -d FFFFFFFF-FFFF-1FFF-bfc1-efc8990bbfa4)" = "$(printf '%s\n' "$timemax" | sed 's/5236-03-31 21:21:00.684697.5/1969-10-19 10:02:36.684697.5/')" ] &&	\
		echo "	32-bit time_t!" >&2 || exit 1
}


# https://bugs.debian.org/864530
# TODO: joey@darkstar:~>perl -le 'use OSSP::uuid; my $uuid = OSSP::uuid->new; $uuid->import("str", "4eb841ca-ce98-4590-8ea2-c4643bfa537bad"); print $uuid->export("str")'
$uuid -d 4eb841ca-ce98-4590-8ea2-c4643bfa537bad >&2 2>/dev/null && { echo "uuid: -d 4eb841ca-ce98-4590-8ea2-c4643bfa537bad was accepted (\"bad\" trailer)" >&2; exit 1; }


variant() {
	[ "$($uuid -d "00000000-0000-0000-${1}00-000000000001" | sed -n '/variant/s/.*: //p')" = "$2" ] || { echo "uuid: -d 00000000-0000-0000-${1}00-000000000001 variant != $2" >&2; exit 1; }
}
variant 00 "reserved (NCS backward compatible)" # 0
variant 80 "DCE 1.1, ISO/IEC 11578:1996"        # 1
variant C0 "reserved (Microsoft GUID)"          # 2
variant E0 "reserved (future use)"              # 3
variant F0 "unknown"                            # 4
variant F8 "unknown"                            # 5
variant FC "unknown"                            # 6
variant FE "unknown"                            # 7
variant FF "unknown"                            # 8


version() {
	[ "$($uuid -d "00000000-0000-${1}000-0000-000000000001" | sed -n '/   version/s/.*: //p')" = "$2" ] || { echo "uuid: -d 00000000-0000-${1}000-0000-000000000001 version != $2" >&2; exit 1; }
}
version 0 "0 (unknown)"
version 1 "1 (time and node based)"
version 2 "2 (unknown)"
version 3 "3 (name based, MD5)"
version 4 "4 (random data based)"
version 5 "5 (name based, SHA-1)"
version 6 "6 (time and node based (time in reverse order))"
version 7 "7 (UNIX time + random data)"
for i in "8 8" "9 9" "a 10" "b 11" "c 12" "d 13" "e 14" "f 15"; do
	version ${i% *} "${i#* } (unknown)"
done


# https://datatracker.ietf.org/doc/html/rfc9562#appendix-A.1
$uuid -d  C232AB00-9414-11EC-B3C8-9F6BDECED846 | grep -qF '2022-02-22 19:22:22.000000.0' || { echo "uuid: v1 vector C232AB00-9414-11EC-B3C8-9F6BDECED846 wrong" >&2; exit 1; }
[ "$($uuid -v3 6ba7b810-9dad-11d1-80b4-00c04fd430c8 www.example.com)" = "5df41881-3aed-3515-88a7-2f4a814cf09e" ] || { echo "uuid: v3 vector 6ba7b810-9dad-11d1-80b4-00c04fd430c8 www.example.com wrong" >&2; exit 1; }
[ "$($uuid -v5 6ba7b810-9dad-11d1-80b4-00c04fd430c8 www.example.com)" = "2ed6657d-e927-568b-95e1-2665a8aea6a2" ] || { echo "uuid: v5 vector 6ba7b810-9dad-11d1-80b4-00c04fd430c8 www.example.com wrong" >&2; exit 1; }
$uuid -d  1EC9414C-232A-6B00-B3C8-9F6BDECED846 | grep -qF '2022-02-22 19:22:22.000000.0' || { echo "uuid: v6 vector 1EC9414C-232A-6B00-B3C8-9F6BDECED846 wrong" >&2; exit 1; }
$uuid -d  017F22E2-79B0-7CC3-98C4-DC0C0C07398F | grep -qF '2022-02-22 19:22:22.000'      || { echo "uuid: v7 vector 017F22E2-79B0-7CC3-98C4-DC0C0C07398F wrong" >&2; exit 1; }


[ "$($uuid -v3 ns:URL https://hinfo.network/)" = c7f3eb3b-e7c8-3b6f-9b26-5a627478c57c ] || { echo "uuid: -v3 ns:URL https://hinfo.network/ != c7f3eb3b-e7c8-3b6f-9b26-5a627478c57c" >&2; exit 1; }
[ "$($uuid -v3 nil    https://hinfo.network/)" = 22f64d2e-f513-3e3b-bb47-aff88457bfff ] || { echo "uuid: -v3 nil    https://hinfo.network/ != 22f64d2e-f513-3e3b-bb47-aff88457bfff" >&2; exit 1; }
[ "$($uuid -v5 ns:URL https://hinfo.network/)" = a09c8ed6-09ed-5e3e-92b4-50352f02076f ] || { echo "uuid: -v5 ns:URL https://hinfo.network/ != a09c8ed6-09ed-5e3e-92b4-50352f02076f" >&2; exit 1; }
[ "$($uuid -v5 nil    https://hinfo.network/)" = 40b5012d-2428-5f89-925c-fe1a8d2a7a6c ] || { echo "uuid: -v5 nil    https://hinfo.network/ != 40b5012d-2428-5f89-925c-fe1a8d2a7a6c" >&2; exit 1; }


[ "$($uuid -d 0191c41a-9de1-7f96-b8cb-88e4348ee74c)" = \
'encode: STR:     0191c41a-9de1-7f96-b8cb-88e4348ee74c
        SIV:     2086088501348764349551890213853128524
decode: variant: DCE 1.1, ISO/IEC 11578:1996
        version: 7 (UNIX time + random data)
        content: time:   2024-09-05 21:32:44.385 UTC
                 random: 0F:96:38:CB:88:E4:34:8E:E7:4C' ] || { echo "uuid: -d 0191c41a-9de1-7f96-b8cb-88e4348ee74c wrong" >&2; exit 1; }
timemax='encode: STR:     ffffffff-ffff-7fff-bfff-ffffffffffff
        SIV:     340282366920937858995853114098753470463
decode: variant: DCE 1.1, ISO/IEC 11578:1996
        version: 7 (UNIX time + random data)
        content: time:   10889-08-02 05:31:50.655 UTC
                 random: 0F:FF:3F:FF:FF:FF:FF:FF:FF:FF'
[ "$($uuid -d ffffffff-ffff-7fff-bfff-ffffffffffff)" = "$timemax" ] || {
	echo "uuid: -d ffffffff-ffff-7fff-bfff-ffffffffffff wrong" >&2
	[ "$($uuid -d ffffffff-ffff-7fff-bfff-ffffffffffff)" = "$(printf '%s\n' "$timemax" | sed 's/10889-08-02 05:31:50.655/1906-11-07 10:26:14.655/')" ] &&	\
		echo "	32-bit time_t!" >&2 || exit 1
}


[ "$($uuid -dFSIV 0)" = \
'encode: STR:     00000000-0000-0000-0000-000000000000
        SIV:     0
decode: variant: n.a.
        version: 0 (n.a.)
        content: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
                 (special case: DCE 1.1 Nil UUID)' ] || { echo "uuid: -d 00000000-0000-0000-0000-000000000000 wrong" >&2; exit 1; }
[ "$($uuid -d ffffffff-ffff-ffff-ffff-ffffffffffff)" = \
'encode: STR:     ffffffff-ffff-ffff-ffff-ffffffffffff
        SIV:     340282366920938463463374607431768211455
decode: variant: n.a.
        version: 15 (n.a.)
        content: FF:FF:FF:FF:FF:FF:0F:FF:3F:FF:FF:FF:FF:FF:FF:FF
                 (special case: RFC 9562 Max UUID)' ] || { echo "uuid: -d ffffffff-ffff-ffff-ffff-ffffffffffff wrong" >&2; exit 1; }
