diff --git a/integration/general_test.go b/integration/general_test.go index 7292c459..5edd0efc 100644 --- a/integration/general_test.go +++ b/integration/general_test.go @@ -2,6 +2,7 @@ package integration import ( "fmt" + "strings" "testing" "time" @@ -255,3 +256,85 @@ func TestTaildrop(t *testing.T) { t.Errorf("failed to tear down scenario: %s", err) } } + +func TestResolveMagicDNS(t *testing.T) { + IntegrationSkip(t) + + scenario, err := NewScenario() + if err != nil { + t.Errorf("failed to create scenario: %s", err) + } + + spec := map[string]int{ + // Omit 1.16.2 (-1) because it does not have the FQDN field + "magicdns1": len(TailscaleVersions) - 1, + "magicdns2": len(TailscaleVersions) - 1, + } + + err = scenario.CreateHeadscaleEnv(spec) + if err != nil { + t.Errorf("failed to create headscale environment: %s", err) + } + + allClients, err := scenario.ListTailscaleClients() + if err != nil { + t.Errorf("failed to get clients: %s", err) + } + + err = scenario.WaitForTailscaleSync() + if err != nil { + t.Errorf("failed wait for tailscale clients to be in sync: %s", err) + } + + // Poor mans cache + _, err = scenario.ListTailscaleClientsFQDNs() + if err != nil { + t.Errorf("failed to get FQDNs: %s", err) + } + + _, err = scenario.ListTailscaleClientsIPs() + if err != nil { + t.Errorf("failed to get IPs: %s", err) + } + + for _, client := range allClients { + for _, peer := range allClients { + // It is safe to ignore this error as we handled it when caching it + peerFQDN, _ := peer.FQDN() + + command := []string{ + "tailscale", + "ip", peerFQDN, + } + result, err := client.Execute(command) + if err != nil { + t.Errorf( + "failed to execute resolve/ip command %s from %s: %s", + peerFQDN, + client.Hostname(), + err, + ) + } + + ips, err := peer.IPs() + if err != nil { + t.Errorf( + "failed to get ips for %s: %s", + peer.Hostname(), + err, + ) + } + + for _, ip := range ips { + if !strings.Contains(result, ip.String()) { + t.Errorf("ip %s is not found in \n%s\n", ip.String(), result) + } + } + } + } + + err = scenario.Shutdown() + if err != nil { + t.Errorf("failed to tear down scenario: %s", err) + } +}