Skip to content

Commit f09e53d

Browse files
committed
test: add SKIP_DOCKER_HUB_TESTS env var to skip rate-limited tests
When SKIP_DOCKER_HUB_TESTS=1 is set, tests that require pulling images from Docker Hub are skipped. This allows CI to run without being blocked by Docker Hub rate limiting. Affected tests: - lib/images: TestCreateImage*, TestListImages, TestDeleteImage, TestLayerCaching - lib/instances: TestBasicEndToEnd, TestStandbyAndRestore, TestExecConcurrent, TestCreateInstanceWithNetwork, TestQEMU*, TestVolume*, TestOverlayDisk*, TestAggregateLimits_EnforcedAtRuntime - lib/system: TestEnsureSystemFiles - cmd/api/api: TestCreateImage*, TestCreateInstance*, TestInstanceLifecycle, TestRegistry*, TestCp*, TestExec* - integration: TestSystemdMode
1 parent 6456b2b commit f09e53d

14 files changed

Lines changed: 77 additions & 0 deletions

cmd/api/api/cp_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
)
1818

1919
func TestCpToAndFromInstance(t *testing.T) {
20+
skipIfNoDockerHub(t)
2021
// Require KVM access for VM creation
2122
if _, err := os.Stat("/dev/kvm"); os.IsNotExist(err) {
2223
t.Fatal("/dev/kvm not available - ensure KVM is enabled and user is in 'kvm' group (sudo usermod -aG kvm $USER)")
@@ -156,6 +157,7 @@ func TestCpToAndFromInstance(t *testing.T) {
156157
}
157158

158159
func TestCpDirectoryToInstance(t *testing.T) {
160+
skipIfNoDockerHub(t)
159161
// Require KVM access for VM creation
160162
if _, err := os.Stat("/dev/kvm"); os.IsNotExist(err) {
161163
t.Fatal("/dev/kvm not available - ensure KVM is enabled and user is in 'kvm' group (sudo usermod -aG kvm $USER)")

cmd/api/api/exec_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
)
1919

2020
func TestExecInstanceNonTTY(t *testing.T) {
21+
skipIfNoDockerHub(t)
2122
// Require KVM access for VM creation
2223
if _, err := os.Stat("/dev/kvm"); os.IsNotExist(err) {
2324
t.Fatal("/dev/kvm not available - ensure KVM is enabled and user is in 'kvm' group (sudo usermod -aG kvm $USER)")
@@ -158,6 +159,7 @@ func TestExecInstanceNonTTY(t *testing.T) {
158159
// 2. guest-agent must keep running even after the main app exits
159160
// 3. The VM must not kernel panic when the entrypoint exits
160161
func TestExecWithDebianMinimal(t *testing.T) {
162+
skipIfNoDockerHub(t)
161163
// Require KVM access for VM creation
162164
if _, err := os.Stat("/dev/kvm"); os.IsNotExist(err) {
163165
t.Fatal("/dev/kvm not available - ensure KVM is enabled and user is in 'kvm' group (sudo usermod -aG kvm $USER)")

cmd/api/api/images_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ func TestGetImage_NotFound(t *testing.T) {
3333
}
3434

3535
func TestCreateImage_Async(t *testing.T) {
36+
skipIfNoDockerHub(t)
3637
svc := newTestService(t)
3738
ctx := ctx()
3839

@@ -125,6 +126,7 @@ func TestCreateImage_Async(t *testing.T) {
125126
}
126127

127128
func TestCreateImage_InvalidTag(t *testing.T) {
129+
skipIfNoDockerHub(t)
128130
svc := newTestService(t)
129131
ctx := ctx()
130132

@@ -171,6 +173,7 @@ func TestCreateImage_InvalidName(t *testing.T) {
171173
}
172174

173175
func TestCreateImage_Idempotent(t *testing.T) {
176+
skipIfNoDockerHub(t)
174177
svc := newTestService(t)
175178
ctx := ctx()
176179

cmd/api/api/instances_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ func TestGetInstance_NotFound(t *testing.T) {
3333
}
3434

3535
func TestCreateInstance_ParsesHumanReadableSizes(t *testing.T) {
36+
skipIfNoDockerHub(t)
3637
// Require KVM access for VM creation
3738
if _, err := os.Stat("/dev/kvm"); os.IsNotExist(err) {
3839
t.Fatal("/dev/kvm not available - ensure KVM is enabled and user is in 'kvm' group (sudo usermod -aG kvm $USER)")
@@ -129,6 +130,7 @@ func TestCreateInstance_InvalidSizeFormat(t *testing.T) {
129130
}
130131

131132
func TestInstanceLifecycle_StopStart(t *testing.T) {
133+
skipIfNoDockerHub(t)
132134
// Require KVM access for VM creation
133135
if _, err := os.Stat("/dev/kvm"); os.IsNotExist(err) {
134136
t.Skip("/dev/kvm not available - skipping lifecycle test")

cmd/api/api/registry_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ import (
2525
"github.com/stretchr/testify/require"
2626
)
2727

28+
// skipIfNoDockerHub skips the test if SKIP_DOCKER_HUB_TESTS is set.
29+
// This is used to skip tests that require pulling from Docker Hub in CI
30+
// environments where rate limiting may be an issue.
31+
func skipIfNoDockerHub(t *testing.T) {
32+
t.Helper()
33+
if os.Getenv("SKIP_DOCKER_HUB_TESTS") != "" {
34+
t.Skip("Skipping test that requires Docker Hub (SKIP_DOCKER_HUB_TESTS is set)")
35+
}
36+
}
37+
2838
// setupRegistryTest creates a test service with a mounted OCI registry server.
2939
// Returns the service (for API calls) and the server host (for building push URLs).
3040
func setupRegistryTest(t *testing.T) (*ApiService, string) {
@@ -47,6 +57,7 @@ func setupRegistryTest(t *testing.T) (*ApiService, string) {
4757
}
4858

4959
func TestRegistryPushAndConvert(t *testing.T) {
60+
skipIfNoDockerHub(t)
5061
svc, serverHost := setupRegistryTest(t)
5162

5263
// Pull a small image from Docker Hub to push to our registry
@@ -92,6 +103,7 @@ func TestRegistryVersionCheck(t *testing.T) {
92103
}
93104

94105
func TestRegistryPushAndCreateInstance(t *testing.T) {
106+
skipIfNoDockerHub(t)
95107
// This is a full e2e test that requires KVM access
96108
if _, err := os.Stat("/dev/kvm"); os.IsNotExist(err) {
97109
t.Skip("/dev/kvm not available - skipping VM creation test")
@@ -174,6 +186,7 @@ func TestRegistryPushAndCreateInstance(t *testing.T) {
174186
// TestRegistryLayerCaching verifies that pushing the same image twice
175187
// reuses cached layers and doesn't re-upload them.
176188
func TestRegistryLayerCaching(t *testing.T) {
189+
skipIfNoDockerHub(t)
177190
_, serverHost := setupRegistryTest(t)
178191

179192
// Pull alpine image from Docker Hub
@@ -257,6 +270,7 @@ func TestRegistryLayerCaching(t *testing.T) {
257270
// TestRegistrySharedLayerCaching verifies that pushing different images
258271
// that share layers reuses the cached shared layers.
259272
func TestRegistrySharedLayerCaching(t *testing.T) {
273+
skipIfNoDockerHub(t)
260274
_, serverHost := setupRegistryTest(t)
261275

262276
// Pull alpine image (this will be our base)
@@ -338,6 +352,7 @@ func TestRegistrySharedLayerCaching(t *testing.T) {
338352
// TestRegistryTagPush verifies that pushing with a tag reference (not digest)
339353
// correctly triggers conversion. The server computes the digest from the manifest.
340354
func TestRegistryTagPush(t *testing.T) {
355+
skipIfNoDockerHub(t)
341356
svc, serverHost := setupRegistryTest(t)
342357

343358
// Pull alpine image from Docker Hub
@@ -391,6 +406,7 @@ func TestRegistryTagPush(t *testing.T) {
391406
// Docker v2 manifest (as returned by local Docker daemon) is correctly converted
392407
// to OCI format and the image conversion succeeds.
393408
func TestRegistryDockerV2ManifestConversion(t *testing.T) {
409+
skipIfNoDockerHub(t)
394410
svc, serverHost := setupRegistryTest(t)
395411

396412
// Pull alpine image from Docker Hub (OCI format)

integration/systemd_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ import (
2222
"github.com/stretchr/testify/require"
2323
)
2424

25+
// skipIfNoDockerHub skips the test if SKIP_DOCKER_HUB_TESTS is set.
26+
func skipIfNoDockerHub(t *testing.T) {
27+
t.Helper()
28+
if os.Getenv("SKIP_DOCKER_HUB_TESTS") != "" {
29+
t.Skip("Skipping test that requires Docker Hub (SKIP_DOCKER_HUB_TESTS is set)")
30+
}
31+
}
32+
2533
// TestSystemdMode verifies that hypeman correctly detects and runs
2634
// systemd-based images with systemd as PID 1.
2735
//
@@ -31,6 +39,7 @@ import (
3139
// - Starts systemd as PID 1
3240
// - Injects and starts the hypeman-agent.service
3341
func TestSystemdMode(t *testing.T) {
42+
skipIfNoDockerHub(t)
3443
if testing.Short() {
3544
t.Skip("skipping integration test in short mode")
3645
}

lib/images/manager_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,16 @@ import (
1212
"github.com/stretchr/testify/require"
1313
)
1414

15+
// skipIfNoDockerHub skips the test if SKIP_DOCKER_HUB_TESTS is set.
16+
func skipIfNoDockerHub(t *testing.T) {
17+
t.Helper()
18+
if os.Getenv("SKIP_DOCKER_HUB_TESTS") != "" {
19+
t.Skip("Skipping test that requires Docker Hub (SKIP_DOCKER_HUB_TESTS is set)")
20+
}
21+
}
22+
1523
func TestCreateImage(t *testing.T) {
24+
skipIfNoDockerHub(t)
1625
dataDir := t.TempDir()
1726
mgr, err := NewManager(paths.New(dataDir), 1, nil)
1827
require.NoError(t, err)
@@ -83,6 +92,7 @@ func TestCreateImage(t *testing.T) {
8392
}
8493

8594
func TestCreateImageDifferentTag(t *testing.T) {
95+
skipIfNoDockerHub(t)
8696
dataDir := t.TempDir()
8797
mgr, err := NewManager(paths.New(dataDir), 1, nil)
8898
require.NoError(t, err)
@@ -105,6 +115,7 @@ func TestCreateImageDifferentTag(t *testing.T) {
105115
}
106116

107117
func TestCreateImageDuplicate(t *testing.T) {
118+
skipIfNoDockerHub(t)
108119
dataDir := t.TempDir()
109120
mgr, err := NewManager(paths.New(dataDir), 1, nil)
110121
require.NoError(t, err)
@@ -134,6 +145,7 @@ func TestCreateImageDuplicate(t *testing.T) {
134145
}
135146

136147
func TestListImages(t *testing.T) {
148+
skipIfNoDockerHub(t)
137149
dataDir := t.TempDir()
138150
mgr, err := NewManager(paths.New(dataDir), 1, nil)
139151
require.NoError(t, err)
@@ -163,6 +175,7 @@ func TestListImages(t *testing.T) {
163175
}
164176

165177
func TestGetImage(t *testing.T) {
178+
skipIfNoDockerHub(t)
166179
dataDir := t.TempDir()
167180
mgr, err := NewManager(paths.New(dataDir), 1, nil)
168181
require.NoError(t, err)
@@ -198,6 +211,7 @@ func TestGetImageNotFound(t *testing.T) {
198211
}
199212

200213
func TestDeleteImage(t *testing.T) {
214+
skipIfNoDockerHub(t)
201215
dataDir := t.TempDir()
202216
mgr, err := NewManager(paths.New(dataDir), 1, nil)
203217
require.NoError(t, err)
@@ -270,6 +284,7 @@ func TestNormalizedRefParsing(t *testing.T) {
270284
}
271285

272286
func TestLayerCaching(t *testing.T) {
287+
skipIfNoDockerHub(t)
273288
dataDir := t.TempDir()
274289
mgr, err := NewManager(paths.New(dataDir), 1, nil)
275290
require.NoError(t, err)

lib/instances/exec_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func waitForExecAgent(ctx context.Context, mgr *manager, instanceID string, time
3535
// TestExecConcurrent tests concurrent exec commands from multiple goroutines.
3636
// This validates that the exec infrastructure handles concurrent access correctly.
3737
func TestExecConcurrent(t *testing.T) {
38+
skipIfNoDockerHub(t)
3839
if _, err := os.Stat("/dev/kvm"); os.IsNotExist(err) {
3940
t.Fatal("/dev/kvm not available")
4041
}

lib/instances/manager_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ import (
3131
"github.com/stretchr/testify/require"
3232
)
3333

34+
// skipIfNoDockerHub skips the test if SKIP_DOCKER_HUB_TESTS is set.
35+
func skipIfNoDockerHub(t *testing.T) {
36+
t.Helper()
37+
if os.Getenv("SKIP_DOCKER_HUB_TESTS") != "" {
38+
t.Skip("Skipping test that requires Docker Hub (SKIP_DOCKER_HUB_TESTS is set)")
39+
}
40+
}
41+
3442
// setupTestManager creates a manager and registers cleanup for any orphaned processes
3543
func setupTestManager(t *testing.T) (*manager, string) {
3644
tmpDir := t.TempDir()
@@ -174,6 +182,7 @@ func cleanupOrphanedProcesses(t *testing.T, mgr *manager) {
174182
}
175183

176184
func TestBasicEndToEnd(t *testing.T) {
185+
skipIfNoDockerHub(t)
177186
// Require KVM access (don't skip, fail informatively)
178187
if _, err := os.Stat("/dev/kvm"); os.IsNotExist(err) {
179188
t.Fatal("/dev/kvm not available - ensure KVM is enabled and user is in 'kvm' group (sudo usermod -aG kvm $USER)")
@@ -825,6 +834,7 @@ func TestStorageOperations(t *testing.T) {
825834
}
826835

827836
func TestStandbyAndRestore(t *testing.T) {
837+
skipIfNoDockerHub(t)
828838
// Require KVM access (don't skip, fail informatively)
829839
if _, err := os.Stat("/dev/kvm"); os.IsNotExist(err) {
830840
t.Fatal("/dev/kvm not available - ensure KVM is enabled and user is in 'kvm' group (sudo usermod -aG kvm $USER)")

lib/instances/network_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
// TestCreateInstanceWithNetwork tests instance creation with network allocation
2020
// and verifies network connectivity persists after standby/restore
2121
func TestCreateInstanceWithNetwork(t *testing.T) {
22+
skipIfNoDockerHub(t)
2223
// Require KVM access
2324
requireKVMAccess(t)
2425

0 commit comments

Comments
 (0)