Skip to content

Commit 45e1ce7

Browse files
authored
fix(pubsub/pstest): make invalid filter return error instead of panic (#11087)
1 parent 3b06513 commit 45e1ce7

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

pubsub/pstest/fake.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,14 @@ func (s *GServer) CreateSubscription(_ context.Context, ps *pb.Subscription) (*p
551551
}
552552

553553
sub := newSubscription(top, &s.mu, s.now, deadLetterTopic, ps)
554+
if ps.Filter != "" {
555+
filter, err := parseFilter(ps.Filter)
556+
if err != nil {
557+
return nil, status.Errorf(codes.InvalidArgument, "bad filter: %v", err)
558+
}
559+
sub.filter = &filter
560+
}
561+
554562
top.subs[ps.Name] = sub
555563
s.subs[ps.Name] = sub
556564
sub.start(&s.wg)
@@ -905,13 +913,6 @@ func newSubscription(t *topic, mu *sync.Mutex, timeNowFunc func() time.Time, dea
905913
done: make(chan struct{}),
906914
timeNowFunc: timeNowFunc,
907915
}
908-
if ps.Filter != "" {
909-
filter, err := parseFilter(ps.Filter)
910-
if err != nil {
911-
panic(fmt.Sprintf("pstest: bad filter: %v", err))
912-
}
913-
sub.filter = &filter
914-
}
915916
return sub
916917
}
917918

pubsub/pstest/fake_test.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1115,12 +1115,28 @@ func TestUpdateRetryPolicy(t *testing.T) {
11151115
}
11161116
}
11171117

1118-
func TestUpdateFilter(t *testing.T) {
1118+
func TestSubscriptionFilter(t *testing.T) {
11191119
ctx := context.Background()
11201120
pclient, sclient, _, cleanup := newFake(ctx, t)
11211121
defer cleanup()
11221122

11231123
top := mustCreateTopic(ctx, t, pclient, &pb.Topic{Name: "projects/P/topics/T"})
1124+
1125+
// Creating a subscription with invalid filter should return an error.
1126+
_, err := sclient.CreateSubscription(ctx, &pb.Subscription{
1127+
Name: "projects/p/subscriptions/s",
1128+
Topic: top.Name,
1129+
AckDeadlineSeconds: 30,
1130+
EnableMessageOrdering: true,
1131+
Filter: "bad filter",
1132+
})
1133+
if err == nil {
1134+
t.Fatal("expected bad filter error, got nil")
1135+
}
1136+
if st := status.Convert(err); st.Code() != codes.InvalidArgument {
1137+
t.Fatalf("got err status: %v, want: %v", st.Code(), codes.InvalidArgument)
1138+
}
1139+
11241140
sub := mustCreateSubscription(ctx, t, sclient, &pb.Subscription{
11251141
AckDeadlineSeconds: minAckDeadlineSecs,
11261142
Name: "projects/P/subscriptions/S",
@@ -1143,6 +1159,19 @@ func TestUpdateFilter(t *testing.T) {
11431159
if got, want := updated.Filter, update.Filter; got != want {
11441160
t.Fatalf("got %v, want %v", got, want)
11451161
}
1162+
1163+
// Updating a subscription with bad filter should return an error.
1164+
update.Filter = "bad filter"
1165+
updated, err = sclient.UpdateSubscription(ctx, &pb.UpdateSubscriptionRequest{
1166+
Subscription: update,
1167+
UpdateMask: &field_mask.FieldMask{Paths: []string{"filter"}},
1168+
})
1169+
if err == nil {
1170+
t.Fatal("expected bad filter error, got nil")
1171+
}
1172+
if st := status.Convert(err); st.Code() != codes.InvalidArgument {
1173+
t.Fatalf("got err status: %v, want: %v", st.Code(), codes.InvalidArgument)
1174+
}
11461175
}
11471176

11481177
func TestUpdateEnableExactlyOnceDelivery(t *testing.T) {

0 commit comments

Comments
 (0)