From a6113066ff97e8a83bdbfdf01d5891b05aee02a7 Mon Sep 17 00:00:00 2001
From: Juan Font Alonso <juanfontalonso@gmail.com>
Date: Fri, 5 Aug 2022 17:35:28 +0200
Subject: [PATCH 01/10] Improved logs in integration tests

---
 integration_cli_test.go           |  9 +++++----
 integration_embedded_derp_test.go | 11 ++++++-----
 integration_test.go               | 13 +++++++------
 3 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/integration_cli_test.go b/integration_cli_test.go
index 2f58e71..2149cbf 100644
--- a/integration_cli_test.go
+++ b/integration_cli_test.go
@@ -73,21 +73,22 @@ func (s *IntegrationCLITestSuite) SetupTest() {
 		s.FailNow(fmt.Sprintf("Could not remove existing container before building test: %s", err), "")
 	}
 
-	fmt.Println("Creating headscale container")
+	fmt.Println("Creating headscale container for CLI tests")
 	if pheadscale, err := s.pool.BuildAndRunWithBuildOptions(headscaleBuildOptions, headscaleOptions, DockerRestartPolicy); err == nil {
 		s.headscale = *pheadscale
 	} else {
 		s.FailNow(fmt.Sprintf("Could not start headscale container: %s", err), "")
 	}
-	fmt.Println("Created headscale container")
+	fmt.Println("Created headscale container for CLI tests")
 
-	fmt.Println("Waiting for headscale to be ready")
+	fmt.Println("Waiting for headscale to be ready for CLI tests")
 	hostEndpoint := fmt.Sprintf("localhost:%s", s.headscale.GetPort("8080/tcp"))
 
 	if err := s.pool.Retry(func() error {
 		url := fmt.Sprintf("http://%s/health", hostEndpoint)
 		resp, err := http.Get(url)
 		if err != nil {
+			fmt.Printf("headscale for CLI test is not ready: %s\n", err)
 			return err
 		}
 		if resp.StatusCode != http.StatusOK {
@@ -102,7 +103,7 @@ func (s *IntegrationCLITestSuite) SetupTest() {
 		// https://github.com/stretchr/testify/issues/849
 		return // fmt.Errorf("Could not connect to headscale: %s", err)
 	}
-	fmt.Println("headscale container is ready")
+	fmt.Println("headscale container is ready for CLI tests")
 }
 
 func (s *IntegrationCLITestSuite) TearDownTest() {
diff --git a/integration_embedded_derp_test.go b/integration_embedded_derp_test.go
index ecca8ba..3f69443 100644
--- a/integration_embedded_derp_test.go
+++ b/integration_embedded_derp_test.go
@@ -134,15 +134,15 @@ func (s *IntegrationDERPTestSuite) SetupSuite() {
 		s.FailNow(fmt.Sprintf("Could not remove existing container before building test: %s", err), "")
 	}
 
-	log.Println("Creating headscale container")
+	log.Println("Creating headscale container for DERP integration tests")
 	if pheadscale, err := s.pool.BuildAndRunWithBuildOptions(headscaleBuildOptions, headscaleOptions, DockerRestartPolicy); err == nil {
 		s.headscale = *pheadscale
 	} else {
 		s.FailNow(fmt.Sprintf("Could not start headscale container: %s", err), "")
 	}
-	log.Println("Created headscale container to test DERP")
+	log.Println("Created headscale container for embedded DERP tests")
 
-	log.Println("Creating tailscale containers")
+	log.Println("Creating tailscale containers for embedded DERP tests")
 
 	for i := 0; i < totalContainers; i++ {
 		version := tailscaleVersions[i%len(tailscaleVersions)]
@@ -154,7 +154,7 @@ func (s *IntegrationDERPTestSuite) SetupSuite() {
 		s.tailscales[hostname] = *container
 	}
 
-	log.Println("Waiting for headscale to be ready")
+	log.Println("Waiting for headscale to be ready for embedded DERP tests")
 	hostEndpoint := fmt.Sprintf("localhost:%s", s.headscale.GetPort("8443/tcp"))
 
 	if err := s.pool.Retry(func() error {
@@ -164,6 +164,7 @@ func (s *IntegrationDERPTestSuite) SetupSuite() {
 		client := &http.Client{Transport: insecureTransport}
 		resp, err := client.Get(url)
 		if err != nil {
+			fmt.Printf("headscale for embedded DERP tests is not ready: %s\n", err)
 			return err
 		}
 
@@ -179,7 +180,7 @@ func (s *IntegrationDERPTestSuite) SetupSuite() {
 		// https://github.com/stretchr/testify/issues/849
 		return // fmt.Errorf("Could not connect to headscale: %s", err)
 	}
-	log.Println("headscale container is ready")
+	log.Println("headscale container is ready for embedded DERP tests")
 
 	log.Printf("Creating headscale namespace: %s\n", namespaceName)
 	result, err := ExecuteCommand(
diff --git a/integration_test.go b/integration_test.go
index 2214b89..54f61e1 100644
--- a/integration_test.go
+++ b/integration_test.go
@@ -251,15 +251,15 @@ func (s *IntegrationTestSuite) SetupSuite() {
 		s.FailNow(fmt.Sprintf("Could not remove existing container before building test: %s", err), "")
 	}
 
-	log.Println("Creating headscale container")
+	log.Println("Creating headscale container for core integration tests")
 	if pheadscale, err := s.pool.BuildAndRunWithBuildOptions(headscaleBuildOptions, headscaleOptions, DockerRestartPolicy); err == nil {
 		s.headscale = *pheadscale
 	} else {
-		s.FailNow(fmt.Sprintf("Could not start headscale container: %s", err), "")
+		s.FailNow(fmt.Sprintf("Could not start headscale container for core integration tests: %s", err), "")
 	}
-	log.Println("Created headscale container")
+	log.Println("Created headscale container for core integration tests")
 
-	log.Println("Creating tailscale containers")
+	log.Println("Creating tailscale containers for core integration tests")
 	for namespace, scales := range s.namespaces {
 		for i := 0; i < scales.count; i++ {
 			version := tailscaleVersions[i%len(tailscaleVersions)]
@@ -273,7 +273,7 @@ func (s *IntegrationTestSuite) SetupSuite() {
 		}
 	}
 
-	log.Println("Waiting for headscale to be ready")
+	log.Println("Waiting for headscale to be ready for core integration tests")
 	hostEndpoint := fmt.Sprintf("localhost:%s", s.headscale.GetPort("8080/tcp"))
 
 	if err := s.pool.Retry(func() error {
@@ -281,6 +281,7 @@ func (s *IntegrationTestSuite) SetupSuite() {
 
 		resp, err := http.Get(url)
 		if err != nil {
+			fmt.Printf("headscale for core integration test is not ready: %s\n", err)
 			return err
 		}
 
@@ -296,7 +297,7 @@ func (s *IntegrationTestSuite) SetupSuite() {
 		// https://github.com/stretchr/testify/issues/849
 		return // fmt.Errorf("Could not connect to headscale: %s", err)
 	}
-	log.Println("headscale container is ready")
+	log.Println("headscale container is ready for core integration tests")
 
 	for namespace, scales := range s.namespaces {
 		log.Printf("Creating headscale namespace: %s\n", namespace)

From 21ae31e77d8ab24adc4bd9521bbc113d23cee9f7 Mon Sep 17 00:00:00 2001
From: Juan Font Alonso <juanfontalonso@gmail.com>
Date: Fri, 5 Aug 2022 18:57:08 +0200
Subject: [PATCH 02/10] Reduce number of containers in integration tests (for
 testing)

---
 integration_test.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/integration_test.go b/integration_test.go
index 54f61e1..dca015d 100644
--- a/integration_test.go
+++ b/integration_test.go
@@ -53,7 +53,7 @@ func TestIntegrationTestSuite(t *testing.T) {
 
 	s.namespaces = map[string]TestNamespace{
 		"thisspace": {
-			count:      10,
+			count:      5,
 			tailscales: make(map[string]dockertest.Resource),
 		},
 		"otherspace": {

From 0a29492fc5834b515ef876b0f5e0cc43e09357c8 Mon Sep 17 00:00:00 2001
From: Juan Font Alonso <juanfontalonso@gmail.com>
Date: Mon, 8 Aug 2022 23:20:29 +0200
Subject: [PATCH 03/10] Increase swap size in integration tests

---
 .github/workflows/test-integration.yml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml
index 70b36b1..5ffe390 100644
--- a/.github/workflows/test-integration.yml
+++ b/.github/workflows/test-integration.yml
@@ -11,6 +11,11 @@ jobs:
         with:
           fetch-depth: 2
 
+      - name: Set Swap Space
+        uses: pierotofy/set-swap-space@master
+        with:
+          swap-size-gb: 10
+
       - name: Get changed files
         id: changed-files
         uses: tj-actions/changed-files@v14.1

From e7148b8080060d7bee020e829194f54a7ec84a8d Mon Sep 17 00:00:00 2001
From: Juan Font Alonso <juanfontalonso@gmail.com>
Date: Tue, 9 Aug 2022 09:58:45 +0200
Subject: [PATCH 04/10] Temporarily disable unstable branch

---
 integration_common_test.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/integration_common_test.go b/integration_common_test.go
index 4ee2d3b..db2aa17 100644
--- a/integration_common_test.go
+++ b/integration_common_test.go
@@ -31,7 +31,7 @@ var (
 
 	tailscaleVersions = []string{
 		"head",
-		"unstable",
+		// "unstable",
 		"1.26.0",
 		"1.24.2",
 		"1.22.2",

From f8986132d4bb24b716a3c673ce9b1a25da0cfaeb Mon Sep 17 00:00:00 2001
From: Juan Font Alonso <juanfontalonso@gmail.com>
Date: Tue, 9 Aug 2022 12:26:12 +0200
Subject: [PATCH 05/10] Use tags to split the integration tests

---
 integration_cli_test.go                            | 3 +--
 integration_common_test.go                         | 2 +-
 integration_embedded_derp_test.go                  | 7 +++----
 integration_test.go => integration_general_test.go | 3 +--
 4 files changed, 6 insertions(+), 9 deletions(-)
 rename integration_test.go => integration_general_test.go (99%)

diff --git a/integration_cli_test.go b/integration_cli_test.go
index 2149cbf..bc7d1c1 100644
--- a/integration_cli_test.go
+++ b/integration_cli_test.go
@@ -1,5 +1,4 @@
-//go:build integration
-// +build integration
+//go:build integration_cli
 
 package headscale
 
diff --git a/integration_common_test.go b/integration_common_test.go
index db2aa17..1435961 100644
--- a/integration_common_test.go
+++ b/integration_common_test.go
@@ -1,5 +1,4 @@
 //go:build integration
-// +build integration
 
 package headscale
 
@@ -20,6 +19,7 @@ import (
 )
 
 const (
+	headscaleHostname      = "headscale-derp"
 	DOCKER_EXECUTE_TIMEOUT = 10 * time.Second
 )
 
diff --git a/integration_embedded_derp_test.go b/integration_embedded_derp_test.go
index 3f69443..da323d8 100644
--- a/integration_embedded_derp_test.go
+++ b/integration_embedded_derp_test.go
@@ -1,4 +1,4 @@
-//go:build integration
+//go:build integration_derp
 
 package headscale
 
@@ -28,9 +28,8 @@ import (
 )
 
 const (
-	headscaleHostname = "headscale-derp"
-	namespaceName     = "derpnamespace"
-	totalContainers   = 3
+	namespaceName   = "derpnamespace"
+	totalContainers = 3
 )
 
 type IntegrationDERPTestSuite struct {
diff --git a/integration_test.go b/integration_general_test.go
similarity index 99%
rename from integration_test.go
rename to integration_general_test.go
index dca015d..864b223 100644
--- a/integration_test.go
+++ b/integration_general_test.go
@@ -1,5 +1,4 @@
-//go:build integration
-// +build integration
+//go:build integration_general
 
 package headscale
 

From d548f5de3f9e059bce8e0d2ab88d846b63c75d15 Mon Sep 17 00:00:00 2001
From: Juan Font Alonso <juanfontalonso@gmail.com>
Date: Tue, 9 Aug 2022 12:26:29 +0200
Subject: [PATCH 06/10] Splitted integration tests in Makefile

---
 Makefile | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/Makefile b/Makefile
index 404c3c0..651ff5c 100644
--- a/Makefile
+++ b/Makefile
@@ -24,14 +24,16 @@ dev: lint test build
 test:
 	@go test -coverprofile=coverage.out ./...
 
-test_integration:
-	go test -failfast -tags integration -timeout 30m -count=1 ./...
+test_integration: test_integration_cli test_integration_derp test_integration_general
 
 test_integration_cli:
-	go test -tags integration -v integration_cli_test.go integration_common_test.go
+	go test -failfast -tags integration_cli,integration -timeout 30m -count=1 ./...
 
 test_integration_derp:
-	go test -tags integration -v integration_embedded_derp_test.go integration_common_test.go
+	go test -failfast -tags integration_derp,integration -timeout 30m -count=1 ./...
+
+test_integration_general:
+	go test -failfast -tags integration_general,integration -timeout 30m -count=1 ./...
 
 coverprofile_func:
 	go tool cover -func=coverage.out

From b01d392f9e92ecae868391bb71f0fc9bc546d6a3 Mon Sep 17 00:00:00 2001
From: Juan Font Alonso <juanfontalonso@gmail.com>
Date: Tue, 9 Aug 2022 12:26:58 +0200
Subject: [PATCH 07/10] Run integrtation tests in different steps in Github
 Actions

---
 .github/workflows/test-integration.yml | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml
index 5ffe390..de896cb 100644
--- a/.github/workflows/test-integration.yml
+++ b/.github/workflows/test-integration.yml
@@ -30,11 +30,29 @@ jobs:
       - uses: cachix/install-nix-action@v16
         if: steps.changed-files.outputs.any_changed == 'true'
 
-      - name: Run Integration tests
+      - name: Run CLI integration tests
         if: steps.changed-files.outputs.any_changed == 'true'
         uses: nick-fields/retry@v2
         with:
           timeout_minutes: 240
           max_attempts: 5
           retry_on: error
-          command: nix develop --command -- make test_integration
+          command: nix develop --command -- make test_integration_cli
+
+      - name: Run Embedded DERP server integration tests
+        if: steps.changed-files.outputs.any_changed == 'true'
+        uses: nick-fields/retry@v2
+        with:
+          timeout_minutes: 240
+          max_attempts: 5
+          retry_on: error
+          command: nix develop --command -- make test_integration_derp
+
+      - name: Run general integration tests
+        if: steps.changed-files.outputs.any_changed == 'true'
+        uses: nick-fields/retry@v2
+        with:
+          timeout_minutes: 240
+          max_attempts: 5
+          retry_on: error
+          command: nix develop --command -- make test_integration_general

From 27855880b25b336f05c4c4112a7952bbcb22593f Mon Sep 17 00:00:00 2001
From: Juan Font Alonso <juanfontalonso@gmail.com>
Date: Tue, 9 Aug 2022 13:53:02 +0200
Subject: [PATCH 08/10] Updated versions for taiscale

---
 integration_common_test.go | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/integration_common_test.go b/integration_common_test.go
index 1435961..b0c3dbb 100644
--- a/integration_common_test.go
+++ b/integration_common_test.go
@@ -30,9 +30,10 @@ var (
 	IpPrefix6 = netaddr.MustParseIPPrefix("fd7a:115c:a1e0::/48")
 
 	tailscaleVersions = []string{
-		"head",
+		// "head",
 		// "unstable",
-		"1.26.0",
+		"1.28.0",
+		"1.26.2",
 		"1.24.2",
 		"1.22.2",
 		"1.20.4",

From 577eedef117438dacb6999665c0396fd4f558c87 Mon Sep 17 00:00:00 2001
From: Juan Font Alonso <juanfontalonso@gmail.com>
Date: Tue, 9 Aug 2022 13:53:25 +0200
Subject: [PATCH 09/10] Restore the number of containers

---
 integration_general_test.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/integration_general_test.go b/integration_general_test.go
index 864b223..4bbdf27 100644
--- a/integration_general_test.go
+++ b/integration_general_test.go
@@ -52,7 +52,7 @@ func TestIntegrationTestSuite(t *testing.T) {
 
 	s.namespaces = map[string]TestNamespace{
 		"thisspace": {
-			count:      5,
+			count:      10,
 			tailscales: make(map[string]dockertest.Resource),
 		},
 		"otherspace": {

From d6fa5c96aeecd03556537474c59f6643a3d741cb Mon Sep 17 00:00:00 2001
From: Juan Font Alonso <juanfontalonso@gmail.com>
Date: Tue, 9 Aug 2022 14:21:45 +0200
Subject: [PATCH 10/10] Update setup action for proto lint

---
 .github/workflows/lint.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 5f925a2..17a9dcb 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -70,7 +70,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v2
-      - uses: bufbuild/buf-setup-action@v0.7.0
+      - uses: bufbuild/buf-setup-action@v1.7.0
       - uses: bufbuild/buf-lint-action@v1
         with:
           input: "proto"