| package modes |
| |
| import ( |
| "context" |
| "testing" |
| |
| "github.com/stretchr/testify/require" |
| "go.skia.org/infra/go/ds" |
| "go.skia.org/infra/go/ds/testutil" |
| "go.skia.org/infra/go/testutils/unittest" |
| ) |
| |
| // TestModeHistory verifies that we correctly track mode history. |
| func TestModeHistory(t *testing.T) { |
| unittest.LargeTest(t) |
| ctx := context.Background() |
| testutil.InitDatastore(t, ds.KIND_AUTOROLL_MODE) |
| |
| // Create the ModeHistory. |
| rollerName := "test-roller" |
| mh, err := NewModeHistory(ctx, rollerName) |
| require.NoError(t, err) |
| |
| // Use this function for checking expectations. |
| check := func(e, a *ModeChange) { |
| require.Equal(t, e.Mode, a.Mode) |
| require.Equal(t, e.Message, a.Message) |
| require.Equal(t, e.Roller, a.Roller) |
| require.Equal(t, e.User, a.User) |
| } |
| checkSlice := func(expect, actual []*ModeChange) { |
| require.Equal(t, len(expect), len(actual)) |
| for i, e := range expect { |
| check(e, actual[i]) |
| } |
| } |
| |
| // Should be empty initially. |
| require.Nil(t, mh.CurrentMode()) |
| |
| // Set the initial mode. |
| expect := map[string][]*ModeChange{} |
| setModeAndCheck := func(mc *ModeChange) { |
| require.NoError(t, mh.Add(ctx, mc.Mode, mc.User, mc.Message)) |
| require.Equal(t, mc.Mode, mh.CurrentMode().Mode) |
| expect[mc.Roller] = append([]*ModeChange{mc}, expect[mc.Roller]...) |
| checkSlice(expect[mc.Roller], mh.GetHistory()) |
| } |
| mc0 := &ModeChange{ |
| Message: "Setting initial mode.", |
| Mode: MODE_RUNNING, |
| Roller: rollerName, |
| User: "AutoRoll Bot", |
| } |
| setModeAndCheck(mc0) |
| |
| // Change the mode. |
| setModeAndCheck(&ModeChange{ |
| Message: "Stop the presses!", |
| Mode: MODE_STOPPED, |
| Roller: rollerName, |
| User: "test@google.com", |
| }) |
| |
| // Change a few times. |
| setModeAndCheck(&ModeChange{ |
| Message: "Resume!", |
| Mode: MODE_RUNNING, |
| Roller: rollerName, |
| User: "test@google.com", |
| }) |
| |
| // Create a new ModeHistory for a different roller. Ensure that we don't |
| // get the two mixed up. |
| rollerName2 := "test-roller-2" |
| mh2, err := NewModeHistory(ctx, rollerName2) |
| require.NoError(t, err) |
| |
| mc0_2 := &ModeChange{ |
| Message: "Setting initial mode.", |
| Mode: MODE_RUNNING, |
| Roller: rollerName2, |
| User: "AutoRoll Bot", |
| } |
| require.Nil(t, mh2.CurrentMode()) |
| require.NoError(t, mh2.Add(ctx, mc0_2.Mode, mc0_2.User, mc0_2.Message)) |
| check(mc0_2, mh2.CurrentMode()) |
| expect[rollerName2] = []*ModeChange{mc0_2} |
| checkSlice(expect[rollerName2], mh2.GetHistory()) |
| |
| require.NoError(t, mh.Update(ctx)) |
| require.NoError(t, mh2.Update(ctx)) |
| |
| checkSlice(expect[rollerName], mh.GetHistory()) |
| checkSlice(expect[rollerName2], mh2.GetHistory()) |
| } |