blob: 12f3b4acbdca593c9159ad51498f40eab82ccde2 [file] [log] [blame]
package recent_rolls
import (
"io/ioutil"
"os"
"path"
"testing"
"time"
assert "github.com/stretchr/testify/require"
"go.skia.org/infra/go/autoroll"
"go.skia.org/infra/go/testutils"
)
// testDB is a struct used for testing database operations.
type testDB struct {
db *db
dir string
}
// newTestDB returns a testDB instance. The caller should call cleanup() on it
// when finished.
func newTestDB(t *testing.T) *testDB {
tmpDir, err := ioutil.TempDir("", "test_autoroll_db_")
assert.NoError(t, err)
dbFile := path.Join(tmpDir, "test.db")
d, err := openDB(dbFile)
assert.NoError(t, err)
return &testDB{
db: d,
dir: tmpDir,
}
}
// cleanup closes the database and removes the underlying temporary directory.
func (d *testDB) cleanup(t *testing.T) {
assert.NoError(t, d.db.Close())
assert.NoError(t, os.RemoveAll(d.dir))
}
// Test that we insert, update, delete, and retrieve rolls as expected.
func TestRolls(t *testing.T) {
testutils.MediumTest(t)
testutils.SkipIfShort(t)
d := newTestDB(t)
defer d.cleanup(t)
now := time.Now().UTC()
roll1 := &autoroll.AutoRollIssue{
Closed: false,
Committed: false,
CommitQueue: true,
Created: now,
Issue: 101101101,
Modified: now,
Patchsets: []int64{1},
Result: autoroll.ROLL_RESULT_IN_PROGRESS,
Subject: "Roll asdfdasf",
TryResults: []*autoroll.TryResult{},
}
// Insert.
assert.NoError(t, d.db.InsertRoll(roll1))
test1, err := d.db.GetRoll(roll1.Issue)
assert.NoError(t, err)
testutils.AssertDeepEqual(t, roll1, test1)
recent, err := d.db.GetRecentRolls(10)
assert.NoError(t, err)
assert.Equal(t, 1, len(recent))
testutils.AssertDeepEqual(t, roll1, recent[0])
// Update.
roll1.Closed = true
roll1.Committed = true
roll1.Result = autoroll.ROLL_RESULT_SUCCESS
assert.NoError(t, d.db.UpdateRoll(roll1))
test1, err = d.db.GetRoll(roll1.Issue)
assert.NoError(t, err)
testutils.AssertDeepEqual(t, roll1, test1)
recent, err = d.db.GetRecentRolls(10)
assert.NoError(t, err)
assert.Equal(t, 1, len(recent))
testutils.AssertDeepEqual(t, roll1, recent[0])
// Delete.
assert.NoError(t, d.db.DeleteRoll(roll1))
test1, err = d.db.GetRoll(roll1.Issue)
assert.NoError(t, err)
assert.Nil(t, test1)
recent, err = d.db.GetRecentRolls(10)
assert.NoError(t, err)
assert.Equal(t, 0, len(recent))
// Multiple rolls.
now = time.Now().UTC().Add(time.Minute)
roll2 := &autoroll.AutoRollIssue{
Closed: false,
Committed: false,
CommitQueue: true,
Created: now,
Issue: 101101102,
Modified: now,
Patchsets: []int64{1},
Result: autoroll.ROLL_RESULT_IN_PROGRESS,
Subject: "Roll #2",
TryResults: []*autoroll.TryResult{},
}
now = time.Now().UTC().Add(30 * time.Minute)
roll3 := &autoroll.AutoRollIssue{
Closed: false,
Committed: false,
CommitQueue: true,
Created: now,
Issue: 101101103,
Modified: now,
Patchsets: []int64{1},
Result: autoroll.ROLL_RESULT_IN_PROGRESS,
Subject: "Roll #3",
TryResults: []*autoroll.TryResult{},
}
now = time.Now().UTC().Add(10 * time.Minute)
roll4 := &autoroll.AutoRollIssue{
Closed: false,
Committed: false,
CommitQueue: true,
Created: now,
Issue: 1001101, // Lower issue number, verify that we order correctly by date.
Modified: now,
Patchsets: []int64{1},
Result: autoroll.ROLL_RESULT_IN_PROGRESS,
Subject: "Roll #4",
TryResults: []*autoroll.TryResult{},
}
for _, roll := range []*autoroll.AutoRollIssue{roll1, roll2, roll3, roll4} {
assert.NoError(t, d.db.InsertRoll(roll))
}
// Ensure that we get the rolls back most recent first.
expect := []*autoroll.AutoRollIssue{roll3, roll4, roll2, roll1}
recent, err = d.db.GetRecentRolls(10)
assert.NoError(t, err)
testutils.AssertDeepEqual(t, recent, expect)
// Ensure that we get a maximum of the number of rolls we requested.
recent, err = d.db.GetRecentRolls(3)
assert.NoError(t, err)
testutils.AssertDeepEqual(t, recent, expect[:3])
}