| // Copyright 2023 Google LLC |
| // |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package common |
| |
| import ( |
| "context" |
| "testing" |
| |
| exec_testutils "go.skia.org/infra/go/exec/testutils" |
| |
| "github.com/stretchr/testify/assert" |
| "github.com/stretchr/testify/require" |
| "go.skia.org/infra/go/exec" |
| "go.skia.org/infra/task_driver/go/td" |
| "go.skia.org/skia/infra/bots/task_drivers/testutils" |
| ) |
| |
| func TestBazelCleanIfLowDiskSpace_EnoughDiskSpace_BazelCachePreserved(t *testing.T) { |
| commandCollector := exec.CommandCollector{} |
| res := td.RunTestSteps(t, false, func(ctx context.Context) error { |
| ctx = td.WithExecRunFn(ctx, commandCollector.Run) |
| |
| ctx = context.WithValue(ctx, BazelCleanIfLowDiskSpaceContextKey, BazelCleanIfLowDiskSpaceContextValue{ |
| GetPartitionMountpoints: func() ([]string, error) { |
| // Note that some of these mountpoints are prefixes of the actual mountpoint ("/mnt/pd0"). |
| // This test checks that BazelCleanIfLowDiskSpace correctly identifies the mountpoint. |
| return []string{"/", "/boot", "/mnt", "/mnt/pd0", "/var"}, nil |
| }, |
| FreeBytesOnPartition: func(mountpoint string) (uint64, error) { |
| require.Equal(t, "/mnt/pd0", mountpoint) |
| return uint64(20_000_000_000), nil |
| }, |
| }) |
| |
| err := BazelCleanIfLowDiskSpace(ctx, "/mnt/pd0/bazel_cache", "/path/to/checkout", "/path/to/bazel") |
| |
| assert.NoError(t, err) |
| return err |
| }) |
| |
| require.Empty(t, res.Errors) |
| require.Empty(t, res.Exceptions) |
| testutils.AssertStepNames(t, res, |
| "Clean Bazel cache if disk space is too low", |
| "No need to clear the Bazel cache: free space on partition /mnt/pd0 is 20000000000 bytes, which is above the threshold of 15000000000 bytes", |
| ) |
| |
| assert.Empty(t, commandCollector.Commands()) |
| } |
| |
| func TestBazelCleanIfLowDiskSpace_LowDiskSpace_BazelCacheDeleted(t *testing.T) { |
| commandCollector := exec.CommandCollector{} |
| res := td.RunTestSteps(t, false, func(ctx context.Context) error { |
| ctx = td.WithExecRunFn(ctx, commandCollector.Run) |
| |
| ctx = context.WithValue(ctx, BazelCleanIfLowDiskSpaceContextKey, BazelCleanIfLowDiskSpaceContextValue{ |
| GetPartitionMountpoints: func() ([]string, error) { |
| // Note that some of these mountpoints are prefixes of the actual mountpoint ("/mnt/pd0"). |
| // This test checks that BazelCleanIfLowDiskSpace correctly identifies the mountpoint. |
| return []string{"/", "/boot", "/mnt/pd0", "/var"}, nil |
| }, |
| FreeBytesOnPartition: func(mountpoint string) (uint64, error) { |
| require.Equal(t, "/mnt/pd0", mountpoint) |
| return 0, nil |
| }, |
| }) |
| |
| err := BazelCleanIfLowDiskSpace(ctx, "/mnt/pd0", "/path/to/checkout", "/path/to/bazel") |
| |
| assert.NoError(t, err) |
| return err |
| }) |
| |
| require.Empty(t, res.Errors) |
| require.Empty(t, res.Exceptions) |
| testutils.AssertStepNames(t, res, |
| "Clean Bazel cache if disk space is too low", |
| "Free space on partition /mnt/pd0 is 0 bytes, which is below the threshold of 15000000000 bytes", |
| "/path/to/bazel clean", |
| ) |
| |
| require.Len(t, commandCollector.Commands(), 1) |
| exec_testutils.AssertCommandsMatch(t, [][]string{ |
| { |
| "/path/to/bazel", |
| "clean", |
| }, |
| }, commandCollector.Commands()) |
| assert.Equal(t, "/path/to/checkout", commandCollector.Commands()[0].Dir) |
| } |