1#!/usr/bin/env bash
2
3# Tests lib/network.nix
4# Run:
5# [nixpkgs]$ lib/tests/network.sh
6# or:
7# [nixpkgs]$ nix-build lib/tests/release.nix
8
9set -euo pipefail
10shopt -s inherit_errexit
11
12if [[ -n "${TEST_LIB:-}" ]]; then
13 NIX_PATH=nixpkgs="$(dirname "$TEST_LIB")"
14else
15 NIX_PATH=nixpkgs="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.."; pwd)"
16fi
17export NIX_PATH
18
19die() {
20 echo >&2 "test case failed: " "$@"
21 exit 1
22}
23
24tmp="$(mktemp -d)"
25clean_up() {
26 rm -rf "$tmp"
27}
28trap clean_up EXIT SIGINT SIGTERM
29work="$tmp/work"
30mkdir "$work"
31cd "$work"
32
33prefixExpression='
34 let
35 lib = import <nixpkgs/lib>;
36 internal = import <nixpkgs/lib/network/internal.nix> {
37 inherit lib;
38 };
39 in
40 with lib;
41 with lib.network;
42'
43
44expectSuccess() {
45 local expr=$1
46 local expectedResult=$2
47 if ! result=$(nix-instantiate --eval --strict --json --show-trace \
48 --expr "$prefixExpression ($expr)"); then
49 die "$expr failed to evaluate, but it was expected to succeed"
50 fi
51 if [[ ! "$result" == "$expectedResult" ]]; then
52 die "$expr == $result, but $expectedResult was expected"
53 fi
54}
55
56expectSuccessRegex() {
57 local expr=$1
58 local expectedResultRegex=$2
59 if ! result=$(nix-instantiate --eval --strict --json --show-trace \
60 --expr "$prefixExpression ($expr)"); then
61 die "$expr failed to evaluate, but it was expected to succeed"
62 fi
63 if [[ ! "$result" =~ $expectedResultRegex ]]; then
64 die "$expr == $result, but $expectedResultRegex was expected"
65 fi
66}
67
68expectFailure() {
69 local expr=$1
70 local expectedErrorRegex=$2
71 if result=$(nix-instantiate --eval --strict --json --show-trace 2>"$work/stderr" \
72 --expr "$prefixExpression ($expr)"); then
73 die "$expr evaluated successfully to $result, but it was expected to fail"
74 fi
75 if [[ ! "$(<"$work/stderr")" =~ $expectedErrorRegex ]]; then
76 die "Error was $(<"$work/stderr"), but $expectedErrorRegex was expected"
77 fi
78}
79
80# Internal functions
81expectSuccess '(internal._ipv6.split "0:0:0:0:0:0:0:0").address' '[0,0,0,0,0,0,0,0]'
82expectSuccess '(internal._ipv6.split "000a:000b:000c:000d:000e:000f:ffff:aaaa").address' '[10,11,12,13,14,15,65535,43690]'
83expectSuccess '(internal._ipv6.split "::").address' '[0,0,0,0,0,0,0,0]'
84expectSuccess '(internal._ipv6.split "::0000").address' '[0,0,0,0,0,0,0,0]'
85expectSuccess '(internal._ipv6.split "::1").address' '[0,0,0,0,0,0,0,1]'
86expectSuccess '(internal._ipv6.split "::ffff").address' '[0,0,0,0,0,0,0,65535]'
87expectSuccess '(internal._ipv6.split "::000f").address' '[0,0,0,0,0,0,0,15]'
88expectSuccess '(internal._ipv6.split "::1:1:1:1:1:1:1").address' '[0,1,1,1,1,1,1,1]'
89expectSuccess '(internal._ipv6.split "1::").address' '[1,0,0,0,0,0,0,0]'
90expectSuccess '(internal._ipv6.split "1:1:1:1:1:1:1::").address' '[1,1,1,1,1,1,1,0]'
91expectSuccess '(internal._ipv6.split "1:1:1:1::1:1:1").address' '[1,1,1,1,0,1,1,1]'
92expectSuccess '(internal._ipv6.split "1::1").address' '[1,0,0,0,0,0,0,1]'
93
94expectFailure 'internal._ipv6.split "0:0:0:0:0:0:0:-1"' "contains malformed characters for IPv6 address"
95expectFailure 'internal._ipv6.split "::0:"' "is not a valid IPv6 address"
96expectFailure 'internal._ipv6.split ":0::"' "is not a valid IPv6 address"
97expectFailure 'internal._ipv6.split "0::0:"' "is not a valid IPv6 address"
98expectFailure 'internal._ipv6.split "0:0:"' "is not a valid IPv6 address"
99expectFailure 'internal._ipv6.split "0:0:0:0:0:0:0:0:0"' "is not a valid IPv6 address"
100expectFailure 'internal._ipv6.split "0:0:0:0:0:0:0:0:"' "is not a valid IPv6 address"
101expectFailure 'internal._ipv6.split "::0:0:0:0:0:0:0:0"' "is not a valid IPv6 address"
102expectFailure 'internal._ipv6.split "0::0:0:0:0:0:0:0"' "is not a valid IPv6 address"
103expectFailure 'internal._ipv6.split "::10000"' "0x10000 is not a valid u16 integer"
104
105expectSuccess '(internal._ipv6.split "::").prefixLength' '128'
106expectSuccess '(internal._ipv6.split "::/1").prefixLength' '1'
107expectSuccess '(internal._ipv6.split "::/128").prefixLength' '128'
108
109expectFailure '(internal._ipv6.split "::/0").prefixLength' "IPv6 subnet should be in range \[1;128\], got 0"
110expectFailure '(internal._ipv6.split "::/129").prefixLength' "IPv6 subnet should be in range \[1;128\], got 129"
111expectFailure '(internal._ipv6.split "/::/").prefixLength' "is not a valid IPv6 address in CIDR notation"
112
113# Library API
114expectSuccess 'lib.network.ipv6.fromString "2001:DB8::ffff/64"' '{"address":"2001:db8:0:0:0:0:0:ffff","prefixLength":64}'
115expectSuccess 'lib.network.ipv6.fromString "1234:5678:90ab:cdef:fedc:ba09:8765:4321/44"' '{"address":"1234:5678:90ab:cdef:fedc:ba09:8765:4321","prefixLength":44}'
116
117expectSuccess 'mkEUI64Suffix "00:11:22:AA:BB:CC"' '"211:22ff:feaa:bbcc"'
118expectSuccess 'mkEUI64Suffix "00-11-22-AA-BB-CC"' '"211:22ff:feaa:bbcc"'
119expectSuccess 'mkEUI64Suffix "00.11.22.AA.BB.CC"' '"211:22ff:feaa:bbcc"'
120expectSuccess 'mkEUI64Suffix "00:11:22:aa:bb:cc"' '"211:22ff:feaa:bbcc"'
121expectSuccess 'mkEUI64Suffix "00-11-22-aa-bb-cc"' '"211:22ff:feaa:bbcc"'
122expectSuccess 'mkEUI64Suffix "00.11.22.aa.bb.cc"' '"211:22ff:feaa:bbcc"'
123
124expectSuccess 'mkEUI64Suffix "12:34:56:78:9A:bc"' '"1034:56ff:fe78:9abc"'
125expectSuccess 'mkEUI64Suffix "123456789ABC"' '"1034:56ff:fe78:9abc"'
126
127expectSuccess 'mkEUI64Suffix "001122AABBCC"' '"211:22ff:feaa:bbcc"'
128expectSuccess 'mkEUI64Suffix "001122aabbcc"' '"211:22ff:feaa:bbcc"'
129
130expectSuccess 'mkEUI64Suffix "ff-ff-ff-ff-ff-ff"' '"fdff:ffff:feff:ffff"'
131expectSuccess 'mkEUI64Suffix "ffffffffffff"' '"fdff:ffff:feff:ffff"'
132expectSuccess 'mkEUI64Suffix "00.00.00.00.00.00"' '"200:00ff:fe00:0000"'
133expectSuccess 'mkEUI64Suffix "000000000000"' '"200:00ff:fe00:0000"'
134
135expectFailure 'mkEUI64Suffix "123456789AB"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
136expectFailure 'mkEUI64Suffix "123456789A"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
137expectFailure 'mkEUI64Suffix "123456789"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
138expectFailure 'mkEUI64Suffix "12345678"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
139expectFailure 'mkEUI64Suffix "1234567"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
140expectFailure 'mkEUI64Suffix "123456"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
141expectFailure 'mkEUI64Suffix "12345"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
142expectFailure 'mkEUI64Suffix "1234"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
143expectFailure 'mkEUI64Suffix "123"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
144expectFailure 'mkEUI64Suffix "12"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
145expectFailure 'mkEUI64Suffix "1"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
146expectFailure 'mkEUI64Suffix ""' "is not a valid MAC address \(expected 6 octets of hex digits\)"
147expectFailure 'mkEUI64Suffix "------------"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
148expectFailure 'mkEUI64Suffix "............"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
149expectFailure 'mkEUI64Suffix "::::::::::::"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
150expectFailure 'mkEUI64Suffix "1:2:3:4:5:6"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
151expectFailure 'mkEUI64Suffix "0.0.0.0.0.0"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
152expectFailure 'mkEUI64Suffix "00:11:-2:AA:BB:CC"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
153expectFailure 'mkEUI64Suffix "00:-11:22:AA:BB:CC"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
154expectFailure 'mkEUI64Suffix "ab:cd:ef:g0:12:34"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
155expectFailure 'mkEUI64Suffix "AB:CD:EF:G0:12:34"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
156expectFailure 'mkEUI64Suffix "ab:cd:ef:gh:jk:lm"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
157expectFailure 'mkEUI64Suffix "AB:CD:EF:GH:JK:LM"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
158expectFailure 'mkEUI64Suffix "01:23:3a:bc:de:fg"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
159expectFailure 'mkEUI64Suffix "01:23:3A:BC:DE:FG"' "is not a valid MAC address \(expected 6 octets of hex digits\)"
160
161echo >&2 tests ok