blob: 692c3a9edeeb0122e8fd8b625e27a1ec573f70d1 [file] [log] [blame]
// 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)
}