blob: 66910d4ac9edfa95d77942a5803cceb0869f3014 [file] [log] [blame]
package service
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
anomalygroup_mocks "go.skia.org/infra/perf/go/anomalygroup/mocks"
a_pb "go.skia.org/infra/perf/go/anomalygroup/proto/v1"
"go.skia.org/infra/perf/go/config"
culprit_mocks "go.skia.org/infra/perf/go/culprit/mocks"
notify_mocks "go.skia.org/infra/perf/go/culprit/notify/mocks"
pb "go.skia.org/infra/perf/go/culprit/proto/v1"
subscription_mocks "go.skia.org/infra/perf/go/subscription/mocks"
sub_pb "go.skia.org/infra/perf/go/subscription/proto/v1"
)
func setUp(_ *testing.T, testConfig *config.InstanceConfig) (*culpritService, *anomalygroup_mocks.Store, *culprit_mocks.Store, *subscription_mocks.Store, *notify_mocks.CulpritNotifier) {
anomalygroupStore := new(anomalygroup_mocks.Store)
culpritStore := new(culprit_mocks.Store)
subscriptionStore := new(subscription_mocks.Store)
notifier := new(notify_mocks.CulpritNotifier)
service := New(anomalygroupStore, culpritStore, subscriptionStore, notifier, testConfig)
return service, anomalygroupStore, culpritStore, subscriptionStore, notifier
}
func TestGetCulprit_ValidInput_ShouldInvokeStoreGet(t *testing.T) {
c, _, culpritStore, _, _ := setUp(t, nil)
ctx := context.Background()
req := &pb.GetCulpritRequest{
CulpritIds: []string{"cid"},
}
culpritStore.On("Get", mock.Anything, []string{"cid"}).Return(nil, nil)
_, err := c.GetCulprit(ctx, req)
// assert that the expectations were met
culpritStore.AssertExpectations(t)
assert.Nil(t, err)
}
func TestPersistCulprit_ValidInput_ShouldInvokeStoreUpsert(t *testing.T) {
c, anomalygroupStore, culpritStore, _, _ := setUp(t, nil)
ctx := context.Background()
commits := []*pb.Commit{{
Host: "chromium.googlesource.com",
Project: "chromium/src",
Ref: "refs/head/main",
Revision: "123",
},
{
Host: "chromium.googlesource.com",
Project: "chromium/src",
Ref: "refs/head/main1",
Revision: "456",
},
}
req := &pb.PersistCulpritRequest{
Commits: commits, AnomalyGroupId: "111",
}
mockCulpritIds := []string{"cid1", "cid2"}
culpritStore.On("Upsert", mock.Anything, "111", commits).Return(mockCulpritIds, nil)
anomalygroupStore.On("AddCulpritIDs", mock.Anything, "111", mockCulpritIds).Return(nil, nil)
_, err := c.PersistCulprit(ctx, req)
// assert that the expectations were met
culpritStore.AssertExpectations(t)
assert.Nil(t, err)
}
func TestNotifyUserOfCulprit_ValidInput_ShouldInvokeNotifier(t *testing.T) {
c, anomalygroup, culpritStore, subscriptionStore, notifier := setUp(t, nil)
ctx := context.Background()
cids := []string{"culprit_id1"}
stored_culprits := []*pb.Culprit{{
Commit: &pb.Commit{
Host: "chromium.googlesource.com",
Project: "chromium/src",
Ref: "refs/head/main",
Revision: "123",
},
AnomalyGroupIds: []string{"aid1"},
IssueIds: []string{"issue_id1"},
Id: "culprit_id1",
}}
culpritStore.On("Get", mock.Anything, cids).Return(stored_culprits, nil)
subscriptionName := "s_name"
subscriptionRevision := "s_version"
anomalygroup.On("LoadById", mock.Anything, "aid1").Return(
&a_pb.AnomalyGroup{SubsciptionName: subscriptionName, SubscriptionRevision: subscriptionRevision}, nil)
subscription := &sub_pb.Subscription{BugComponent: "123"}
subscriptionStore.On("GetSubscription", mock.Anything,
subscriptionName, subscriptionRevision).Return(subscription, nil)
issueId := "issue_id1"
notifier.On("NotifyCulpritFound", mock.Anything,
stored_culprits[0], subscription).Return(issueId, nil)
culpritStore.On("AddIssueId", mock.Anything, stored_culprits[0].Id, issueId, "aid1").Return(nil)
req := &pb.NotifyUserOfCulpritRequest{
CulpritIds: cids,
AnomalyGroupId: "aid1",
}
resp, err := c.NotifyUserOfCulprit(ctx, req)
assert.Nil(t, err)
assert.Equal(t, resp, &pb.NotifyUserOfCulpritResponse{IssueIds: []string{"issue_id1"}})
}
func TestNotifyUserOfAnomaly_ValidInput_ShouldInvokeNotifier(t *testing.T) {
c, anomalygroup, _, subscriptionStore, notifier := setUp(t, nil)
ctx := context.Background()
subscriptionName := "s_name"
subscriptionRevision := "s_version"
group := &a_pb.AnomalyGroup{SubsciptionName: subscriptionName, SubscriptionRevision: subscriptionRevision}
anomalygroup.On("LoadById", mock.Anything, "aid1").Return(group, nil)
subscription := &sub_pb.Subscription{BugComponent: "123"}
subscriptionStore.On("GetSubscription", mock.Anything,
subscriptionName, subscriptionRevision).Return(subscription, nil)
issueId := "issue_id1"
anomalies := []*pb.Anomaly{
{
StartCommit: 123,
EndCommit: 678,
Paramset: map[string]string{
"benchmark": "b",
},
},
}
notifier.On("NotifyAnomaliesFound", mock.Anything,
group, subscription, anomalies).Return(issueId, nil)
req := &pb.NotifyUserOfAnomalyRequest{
AnomalyGroupId: "aid1",
Anomaly: anomalies,
}
resp, err := c.NotifyUserOfAnomaly(ctx, req)
assert.Nil(t, err)
assert.Equal(t, resp, &pb.NotifyUserOfAnomalyResponse{IssueId: "issue_id1"})
}
func TestNotifyUserOfAnomaly_WithConfig_ValidInput_NotifyByConfig(t *testing.T) {
cfg := &config.InstanceConfig{
SheriffConfigsToNotify: []string{"s_name"},
}
c, anomalygroup, _, subscriptionStore, notifier := setUp(t, cfg)
ctx := context.Background()
subscriptionName := "s_name"
subscriptionRevision := "s_version"
group := &a_pb.AnomalyGroup{SubsciptionName: subscriptionName, SubscriptionRevision: subscriptionRevision}
anomalygroup.On("LoadById", mock.Anything, "aid1").Return(group, nil)
subscription := &sub_pb.Subscription{BugComponent: "123"}
subscriptionStore.On("GetSubscription", mock.Anything,
subscriptionName, subscriptionRevision).Return(subscription, nil)
issueId := "issue_id1"
anomalies := []*pb.Anomaly{
{
StartCommit: 123,
EndCommit: 678,
Paramset: map[string]string{
"benchmark": "b",
},
},
}
notifier.On("NotifyAnomaliesFound", mock.Anything,
group, subscription, anomalies).Return(issueId, nil)
req := &pb.NotifyUserOfAnomalyRequest{
AnomalyGroupId: "aid1",
Anomaly: anomalies,
}
resp, err := c.NotifyUserOfAnomaly(ctx, req)
assert.Nil(t, err)
assert.Equal(t, resp, &pb.NotifyUserOfAnomalyResponse{IssueId: "issue_id1"})
}
func TestNotifyUserOfAnomaly_WithConfig_NoSub_NotNotify(t *testing.T) {
cfg := &config.InstanceConfig{
SheriffConfigsToNotify: []string{"s_name"},
}
c, anomalygroup, _, subscriptionStore, notifier := setUp(t, cfg)
ctx := context.Background()
subscriptionName := "s_name"
subscriptionRevision := "s_version"
group := &a_pb.AnomalyGroup{SubsciptionName: subscriptionName, SubscriptionRevision: subscriptionRevision}
anomalygroup.On("LoadById", mock.Anything, "aid1").Return(group, nil)
fakeSubscription := &sub_pb.Subscription{
Name: "Mocked Sub For Anomaly - Report",
Revision: "Mocked Revision - Report",
BugLabels: []string{"Mocked Sub Label"},
Hotlists: []string{"5141966"},
BugComponent: "1325852",
BugPriority: 2,
BugSeverity: 3,
BugCcEmails: []string{"wenbinzhang@google.com"},
ContactEmail: "wenbinzhang@google.com",
}
subscriptionStore.On("GetSubscription", mock.Anything,
subscriptionName, subscriptionRevision).Return(nil, nil)
issueId := "issue_id1"
anomalies := []*pb.Anomaly{
{
StartCommit: 123,
EndCommit: 678,
Paramset: map[string]string{
"benchmark": "b",
},
},
}
notifier.On("NotifyAnomaliesFound", mock.Anything,
group, fakeSubscription, anomalies).Return(issueId, nil)
req := &pb.NotifyUserOfAnomalyRequest{
AnomalyGroupId: "aid1",
Anomaly: anomalies,
}
resp, err := c.NotifyUserOfAnomaly(ctx, req)
assert.Nil(t, err)
assert.Equal(t, resp, &pb.NotifyUserOfAnomalyResponse{IssueId: "issue_id1"})
}
func TestNotifyUserOfAnomaly_WithConfig_NotAllowedSub_NotNotify(t *testing.T) {
cfg := &config.InstanceConfig{
SheriffConfigsToNotify: []string{"s_name_x"},
}
c, anomalygroup, _, subscriptionStore, notifier := setUp(t, cfg)
ctx := context.Background()
subscriptionName := "s_name"
subscriptionRevision := "s_version"
group := &a_pb.AnomalyGroup{SubsciptionName: subscriptionName, SubscriptionRevision: subscriptionRevision}
anomalygroup.On("LoadById", mock.Anything, "aid1").Return(group, nil)
subscription := &sub_pb.Subscription{
Name: "Original Sub For Anomaly - Report", // Used
Revision: "Original Revision - Report", //Used
BugComponent: "123", //Not used
}
fakeSubscription := &sub_pb.Subscription{
Name: "Original Sub For Anomaly - Report",
Revision: "Original Revision - Report",
BugLabels: []string{"Mocked Sub Label - overwrite"},
Hotlists: []string{"5141966"},
BugComponent: "1325852",
BugCcEmails: []string{"wenbinzhang@google.com"},
ContactEmail: "wenbinzhang@google.com",
}
subscriptionStore.On("GetSubscription", mock.Anything,
subscriptionName, subscriptionRevision).Return(subscription, nil)
issueId := "issue_id1"
anomalies := []*pb.Anomaly{
{
StartCommit: 123,
EndCommit: 678,
Paramset: map[string]string{
"benchmark": "b",
},
},
}
notifier.On("NotifyAnomaliesFound", mock.Anything,
group, fakeSubscription, anomalies).Return(issueId, nil)
req := &pb.NotifyUserOfAnomalyRequest{
AnomalyGroupId: "aid1",
Anomaly: anomalies,
}
resp, err := c.NotifyUserOfAnomaly(ctx, req)
assert.Nil(t, err)
assert.Equal(t, resp, &pb.NotifyUserOfAnomalyResponse{IssueId: "issue_id1"})
}