diff --git a/tests/default.nix b/tests/default.nix index 12a7244d6e1..081a4773084 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -10,6 +10,7 @@ with import ../lib/testing.nix { inherit nixpkgs services system; }; bittorrent = makeTest (import ./bittorrent.nix); firefox = makeTest (import ./firefox.nix); installer = makeTests (import ./installer.nix); + ipv6 = makeTest (import ./ipv6.nix); kde4 = makeTest (import ./kde4.nix); login = makeTest (import ./login.nix); nat = makeTest (import ./nat.nix); diff --git a/tests/ipv6.nix b/tests/ipv6.nix new file mode 100644 index 00000000000..76958ab445d --- /dev/null +++ b/tests/ipv6.nix @@ -0,0 +1,76 @@ +# Test of IPv6 functionality in NixOS, including whether router +# solicication/advertisement using radvd works. + +{ pkgs, ... }: + +{ + + nodes = + { client = { config, pkgs, ... }: { }; + + server = + { config, pkgs, ... }: + { services.httpd.enable = true; + services.httpd.adminAddr = "foo@example.org"; + }; + + router = + { config, pkgs, ... }: + { services.radvd.enable = true; + services.radvd.config = + '' + interface eth1 { + AdvSendAdvert on; + # ULA prefix (RFC 4193). + prefix fd60:cc69:b537:1::/64 { }; + }; + ''; + }; + }; + + testScript = + '' + # Start the router first so that it respond to router solicitations. + $router->waitForJob("radvd"); + + startAll; + + $client->waitForJob("network-interfaces"); + $server->waitForJob("network-interfaces"); + + # Wait until the given interface has a non-tentative address of + # the desired scope (i.e. has completed Duplicate Address + # Detection). + sub waitForAddress { + my ($machine, $iface, $scope) = @_; + $machine->waitUntilSucceeds("[ `ip -o -6 addr show dev $iface scope $scope | grep -v tentative | wc -l` -eq 1 ]"); + my $ip = (split /[ \/]+/, $machine->succeed("ip -o -6 addr show dev $iface scope $scope"))[3]; + $machine->log("$scope address on $iface is $ip"); + return $ip; + } + + subtest "loopback address", sub { + $client->succeed("ping6 -c 1 ::1 >&2"); + $client->fail("ping6 -c 1 ::2 >&2"); + }; + + subtest "local link addressing", sub { + my $clientIp = waitForAddress $client, "eth1", "link"; + my $serverIp = waitForAddress $server, "eth1", "link"; + $client->succeed("ping6 -c 1 -I eth1 $clientIp >&2"); + $client->succeed("ping6 -c 1 -I eth1 $serverIp >&2"); + }; + + subtest "global addressing", sub { + my $clientIp = waitForAddress $client, "eth1", "global"; + my $serverIp = waitForAddress $server, "eth1", "global"; + $client->succeed("ping6 -c 1 $clientIp >&2"); + $client->succeed("ping6 -c 1 $serverIp >&2"); + $client->succeed("curl --fail -g http://[$serverIp]"); + $client->fail("curl --fail -g http://[$clientIp]"); + }; + + # TODO: test reachability of a machine on another network. + ''; + +}