blob: 02fc6627375317b2340186127627f9c48066d71f [file] [log] [blame]
package regression
import (
"testing"
"github.com/stretchr/testify/assert"
"go.skia.org/infra/go/testutils"
"go.skia.org/infra/perf/go/cid"
"go.skia.org/infra/perf/go/clustering2"
"go.skia.org/infra/perf/go/dataframe"
"go.skia.org/infra/perf/go/db"
"gopkg.in/DATA-DOG/go-sqlmock.v1"
)
// TestSetLowWithMissing test storing a low cluster to the sql database.
func TestSetLowWithMissing(t *testing.T) {
testutils.SmallTest(t)
// Set up mock db.
mdb, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
r := New()
c := &cid.CommitDetail{
CommitID: cid.CommitID{
Source: "master",
Offset: 1,
},
Timestamp: 1479235651,
}
df := &dataframe.FrameResponse{}
cl := &clustering2.ClusterSummary{}
r.SetLow("source_type=skp", df, cl)
// body is what our expected body should look like after adding the low cluster.
body, err := r.JSON()
assert.NoError(t, err)
// We don't add any row data, so the query returns empty, forcing SetLow to
// create a new Regressions.
rows := sqlmock.NewRows([]string{"cid", "body"})
// Set expectations.
mock.ExpectBegin()
mock.ExpectQuery("SELECT cid, body FROM regression").WillReturnRows(rows)
mock.ExpectExec("INSERT INTO regression").WithArgs(c.ID(), c.Timestamp, r.Triaged(), body, c.ID(), c.Timestamp, r.Triaged(), body).WillReturnResult(sqlmock.NewResult(1, 1))
mock.ExpectCommit()
// Put mock db into place.
db.DB = mdb
// Execute our method.
st := NewStore()
err = st.SetLow(c, "source_type=skp", df, cl)
assert.NoError(t, err)
// Make sure that all expectations were met.
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expections: %s", err)
}
}
// TestTriageWithExisting test successfully triaging a low cluster in the sql database.
func TestTriageWithExisting(t *testing.T) {
testutils.SmallTest(t)
// Set up mock db.
mdb, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
r := New()
c := &cid.CommitDetail{
CommitID: cid.CommitID{
Source: "master",
Offset: 1,
},
Timestamp: 1479235651,
}
df := &dataframe.FrameResponse{}
cl := &clustering2.ClusterSummary{}
r.SetLow("source_type=skp", df, cl)
body, err := r.JSON()
assert.NoError(t, err)
rows := sqlmock.NewRows([]string{"cid", "body"}).AddRow(c.ID(), body)
// Now determine what the serialized Regressions would look like
// after a successful triaging.
tr := TriageStatus{
Status: POSITIVE,
Message: "SKP Update",
}
err = r.TriageLow("source_type=skp", tr)
assert.NoError(t, err)
body, err = r.JSON()
assert.NoError(t, err)
// Set expectations.
mock.ExpectBegin()
mock.ExpectQuery("SELECT cid, body FROM regression").WillReturnRows(rows)
mock.ExpectExec("INSERT INTO regression").WithArgs(c.ID(), c.Timestamp, r.Triaged(), body, c.ID(), c.Timestamp, r.Triaged(), body).WillReturnResult(sqlmock.NewResult(1, 1))
mock.ExpectCommit()
// Put mock db into place.
db.DB = mdb
// Execute our method.
st := NewStore()
err = st.TriageLow(c, "source_type=skp", tr)
assert.NoError(t, err)
// Make sure that all expectations were met.
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expections: %s", err)
}
}
// TestTriageWithMissing tries to triage a cluster that doesn't exist, which
// should fail and result in a rollback.
func TestTriageWithMissing(t *testing.T) {
testutils.SmallTest(t)
// Set up mock db.
mdb, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
c := &cid.CommitDetail{
CommitID: cid.CommitID{
Source: "master",
Offset: 1,
},
Timestamp: 1479235651,
}
// Note no rows are added, so trying to triage a missing cluster should fail.
rows := sqlmock.NewRows([]string{"cid", "body"})
// Set expectations.
mock.ExpectBegin()
mock.ExpectQuery("SELECT cid, body FROM regression").WillReturnRows(rows)
mock.ExpectRollback()
// Put mock db into place.
db.DB = mdb
// Execute our method.
st := NewStore()
tr := TriageStatus{
Status: POSITIVE,
Message: "SKP Update",
}
err = st.TriageLow(c, "source_type=skp", tr)
assert.Error(t, err)
// Make sure that all expectations were met.
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expections: %s", err)
}
}
func TestRange(t *testing.T) {
testutils.SmallTest(t)
// Set up mock db.
mdb, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
r1 := New()
c1 := cid.CommitID{
Source: "master",
Offset: 1,
}
r2 := New()
c2 := cid.CommitID{
Source: "master",
Offset: 2,
}
df := &dataframe.FrameResponse{}
cl := &clustering2.ClusterSummary{}
r2.SetLow("source_type=skp", df, cl)
body1, err := r1.JSON()
assert.NoError(t, err)
body2, err := r2.JSON()
assert.NoError(t, err)
// Set expectations.
rows := sqlmock.NewRows([]string{"cid", "timestamp", "body"}).
AddRow("master-000001", 1479235651, body1).
AddRow("master-000002", 1479235789, body2)
mock.ExpectQuery("SELECT cid, timestamp, body FROM regression WHERE timestamp >= (.+) AND timestamp < (.+) ORDER BY timestamp").WillReturnRows(rows)
// Put mock db into place.
db.DB = mdb
// Execute our method.
st := NewStore()
reg, err := st.Range(1479235651, 1479235999, ALL_SUBSET)
assert.NoError(t, err)
assert.Equal(t, 2, len(reg))
assert.True(t, reg[c1.ID()].Triaged())
assert.False(t, reg[c2.ID()].Triaged())
assert.Equal(t, 1, len(reg[c2.ID()].ByQuery))
// Make sure that all expectations were met.
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expections: %s", err)
}
}
func TestUntriaged(t *testing.T) {
testutils.SmallTest(t)
// Set up mock db.
mdb, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
// Set expectations.
rows := sqlmock.NewRows([]string{"count"}).
AddRow(7)
mock.ExpectQuery("SELECT count(.+) FROM regression WHERE triaged=false").WillReturnRows(rows)
// Put mock db into place.
db.DB = mdb
// Execute our method.
st := NewStore()
count, err := st.Untriaged()
assert.NoError(t, err)
assert.Equal(t, 7, count)
// Make sure that all expectations were met.
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expections: %s", err)
}
}