| 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() |
| isNew, err := st.SetLow(c, "source_type=skp", df, cl) |
| assert.True(t, isNew) |
| 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()].ByAlertID)) |
| |
| // 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) |
| } |
| } |