blob: d6d32cba7ef39c0db7745a8ab0e965532734c0a4 [file] [log] [blame]
package backend
import (
"fmt"
"testing"
"cloud.google.com/go/storage"
"github.com/stretchr/testify/mock"
assert "github.com/stretchr/testify/require"
"go.skia.org/infra/fuzzer/go/common"
"go.skia.org/infra/fuzzer/go/tests"
"go.skia.org/infra/go/gcs"
"go.skia.org/infra/go/testutils"
)
var ctx = mock.AnythingOfType("*context.emptyCtx")
var callback = mock.AnythingOfType("func(*storage.ObjectAttrs)")
func TestReportWorkDone(t *testing.T) {
testutils.SmallTest(t)
mg := tests.NewMockGCSClient()
mc := tests.NewMockCommonImpl()
defer mc.AssertExpectations(t)
defer mg.AssertExpectations(t)
mc.On("Hostname").Return("skia-fuzzer-be-3").Once()
common.SetMockCommon(mc)
// The nil arguments shouldn't be needed in reportWorkDone
v := NewVersionUpdater(mg, nil, nil)
mg.On("DeleteFile", ctx, "skia_version/pending/working_skia-fuzzer-be-3").Return(nil).Once()
mg.On("AllFilesInDirectory", ctx, "skia_version/pending/working_", callback).Run(func(args mock.Arguments) {
callbackFn := args.Get(2).(func(*storage.ObjectAttrs))
// Pretend there are still two files, that is, there are still two backends working
callbackFn(&storage.ObjectAttrs{Name: "working_skia-fuzzer-be-1"})
callbackFn(&storage.ObjectAttrs{Name: "working_skia-fuzzer-be-2"})
}).Return(nil).Once()
assert.NoError(t, v.reportWorkDone("oldRevision", "newRevision"))
}
func TestReportWorkDoneLastStanding(t *testing.T) {
testutils.SmallTest(t)
mg := tests.NewMockGCSClient()
mc := tests.NewMockCommonImpl()
defer mc.AssertExpectations(t)
defer mg.AssertExpectations(t)
mc.On("Hostname").Return("skia-fuzzer-be-3").Once()
common.SetMockCommon(mc)
// The nil arguments shouldn't be needed in reportWorkDone
v := NewVersionUpdater(mg, nil, nil)
mg.On("DeleteFile", ctx, "skia_version/pending/working_skia-fuzzer-be-3").Return(nil).Once()
// Suppose there are no other backend workers left (and thus no files)
mg.On("AllFilesInDirectory", ctx, "skia_version/pending/working_", callback).Return(nil).Once()
mg.On("DeleteAllFilesInFolder", "skia_version/pending/", 1).Return(nil).Once()
mg.On("DeleteAllFilesInFolder", "skia_version/current/", 1).Return(nil).Once()
mg.On("SetFileContents", ctx, "skia_version/current/newRevision", gcs.FILE_WRITE_OPTS_TEXT, []byte("newRevision")).Return(nil).Once()
mg.On("SetFileContents", ctx, "skia_version/old/oldRevision", gcs.FILE_WRITE_OPTS_TEXT, []byte("oldRevision")).Return(nil).Once()
assert.NoError(t, v.reportWorkDone("oldRevision", "newRevision"))
}
func TestReportWorkDone404(t *testing.T) {
testutils.SmallTest(t)
mg := tests.NewMockGCSClient()
mc := tests.NewMockCommonImpl()
defer mc.AssertExpectations(t)
defer mg.AssertExpectations(t)
mc.On("Hostname").Return("skia-fuzzer-be-3").Once()
common.SetMockCommon(mc)
// The nil arguments shouldn't be needed in reportWorkDone
v := NewVersionUpdater(mg, nil, nil)
err := fmt.Errorf("Got non server error statuscode 404")
mg.On("DeleteFile", ctx, "skia_version/pending/working_skia-fuzzer-be-3").Return(err).Once()
mg.On("AllFilesInDirectory", ctx, "skia_version/pending/working_", callback).Run(func(args mock.Arguments) {
callbackFn := args.Get(2).(func(*storage.ObjectAttrs))
// Pretend there are still two files, that is, there are still two backends working
callbackFn(&storage.ObjectAttrs{Name: "working_skia-fuzzer-be-1"})
callbackFn(&storage.ObjectAttrs{Name: "working_skia-fuzzer-be-2"})
}).Return(nil).Once()
assert.NoError(t, v.reportWorkDone("oldRevision", "newRevision"))
}