pubsub: allow clearing of dead letter policies in subscriptions

Fixes #1822

Change-Id: Icd6346ea1e8cf9fb9dd4ffb03750a7b68811a584
Reviewed-on: https://code-review.googlesource.com/c/gocloud/+/53170
Reviewed-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Mahesh Gattani <maheshgattani@google.com>
Reviewed-by: Cody Oss <codyoss@google.com>
diff --git a/pubsub/integration_test.go b/pubsub/integration_test.go
index 2962dfd..68c67b7 100644
--- a/pubsub/integration_test.go
+++ b/pubsub/integration_test.go
@@ -1219,3 +1219,55 @@
 		t.Fatalf("Streaming pull error: %v\n", err)
 	}
 }
+
+func TestIntegration_DeadLetterPolicy_ClearDeadLetter(t *testing.T) {
+	t.Parallel()
+	ctx := context.Background()
+	client := integrationTestClient(ctx, t)
+	defer client.Close()
+
+	topic, err := client.CreateTopic(ctx, topicIDs.New())
+	if err != nil {
+		t.Fatalf("CreateTopic error: %v", err)
+	}
+	defer topic.Delete(ctx)
+	defer topic.Stop()
+
+	deadLetterTopic, err := client.CreateTopic(ctx, topicIDs.New())
+	if err != nil {
+		t.Fatalf("CreateTopic error: %v", err)
+	}
+	defer deadLetterTopic.Delete(ctx)
+	defer deadLetterTopic.Stop()
+
+	cfg := SubscriptionConfig{
+		Topic: topic,
+		DeadLetterPolicy: &DeadLetterPolicy{
+			DeadLetterTopic: deadLetterTopic.String(),
+		},
+	}
+	var sub *Subscription
+	if sub, err = client.CreateSubscription(ctx, subIDs.New(), cfg); err != nil {
+		t.Fatalf("CreateSub error: %v", err)
+	}
+	defer sub.Delete(ctx)
+
+	sub.Update(ctx, SubscriptionConfigToUpdate{
+		DeadLetterPolicy: &DeadLetterPolicy{},
+	})
+
+	got, err := sub.Config(ctx)
+	if err != nil {
+		t.Fatal(err)
+	}
+	want := SubscriptionConfig{
+		Topic:               topic,
+		AckDeadline:         10 * time.Second,
+		RetainAckedMessages: false,
+		RetentionDuration:   defaultRetentionDuration,
+		ExpirationPolicy:    defaultExpirationPolicy,
+	}
+	if diff := testutil.Diff(got, want); diff != "" {
+		t.Fatalf("SubsciptionConfig; got: - want: +\n%s", diff)
+	}
+}
diff --git a/pubsub/subscription.go b/pubsub/subscription.go
index 2d36577..045ddef 100644
--- a/pubsub/subscription.go
+++ b/pubsub/subscription.go
@@ -320,7 +320,7 @@
 }
 
 func (dlp *DeadLetterPolicy) toProto() *pb.DeadLetterPolicy {
-	if dlp == nil {
+	if dlp == nil || dlp.DeadLetterTopic == "" {
 		return nil
 	}
 	return &pb.DeadLetterPolicy{
@@ -472,7 +472,8 @@
 	// If non-zero, Expiration is changed.
 	ExpirationPolicy optional.Duration
 
-	// If non-nil, DeadLetterPolicy is changed.
+	// If non-nil, DeadLetterPolicy is changed. To remove dead lettering from
+	// a subscription, use the zero value for this struct.
 	//
 	// It is EXPERIMENTAL and a part of a closed alpha that may not be
 	// accessible to all users.