Skip to content

Commit

Permalink
If a token is deleted send deleteToken bool in feedback metadata.
Browse files Browse the repository at this point in the history
  • Loading branch information
cscatolini committed Jan 24, 2017
1 parent be89f24 commit 3bcfea0
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 7 deletions.
3 changes: 3 additions & 0 deletions extensions/apns_message_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,9 @@ func (a *APNSMessageHandler) handleAPNSResponse(res push.Response) error {
"category": "TokenError",
log.ErrorKey: res.Err,
}).Debug("received an error")
if responseWithMetadata.Metadata != nil {
responseWithMetadata.Metadata["deleteToken"] = true
}
handleInvalidToken(a.InvalidTokenHandlers, res.DeviceToken)
case push.ErrBadCertificate, push.ErrBadCertificateEnvironment, push.ErrForbidden:
l.WithFields(log.Fields{
Expand Down
27 changes: 26 additions & 1 deletion extensions/apns_message_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,7 @@ var _ = Describe("APNS Message Handler", func() {
Expect(fromKafka.Metadata["some"]).To(BeNil())
})

It("should send feedback if error and metadata is present", func() {
It("should send feedback if error and metadata is present and token should be deleted", func() {
metadata := map[string]interface{}{
"some": "metadata",
}
Expand All @@ -512,9 +512,34 @@ var _ = Describe("APNS Message Handler", func() {
Expect(fromKafka.DeviceToken).To(Equal(res.DeviceToken))
Expect(fromKafka.ID).To(Equal(res.ID))
Expect(fromKafka.Metadata["some"]).To(Equal(metadata["some"]))
Expect(fromKafka.Metadata["deleteToken"]).To(BeTrue())
Expect(string(msg.Value)).To(ContainSubstring("bad device token"))
})

It("should send feedback if error and metadata is present and token should not be deleted", func() {
metadata := map[string]interface{}{
"some": "metadata",
}
handler.InflightMessagesMetadata["testToken1"] = metadata
res := push.Response{
DeviceToken: "testToken1",
ID: "idTest1",
Err: &push.Error{
Reason: push.ErrBadMessageID,
},
}
go handler.handleAPNSResponse(res)

fromKafka := &ResponseWithMetadata{}
msg := <-mockKafkaProducerClient.ProduceChannel()
json.Unmarshal(msg.Value, fromKafka)
Expect(fromKafka.DeviceToken).To(Equal(res.DeviceToken))
Expect(fromKafka.ID).To(Equal(res.ID))
Expect(fromKafka.Metadata["some"]).To(Equal(metadata["some"]))
Expect(fromKafka.Metadata["deleteToken"]).To(BeNil())
Expect(string(msg.Value)).To(ContainSubstring("ID header value is bad"))
})

It("should send feedback if error and metadata is not present", func() {
res := push.Response{
DeviceToken: "testToken1",
Expand Down
17 changes: 12 additions & 5 deletions extensions/gcm_message_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,10 +203,6 @@ func (g *GCMMessageHandler) handleGCMResponse(cm gcm.CCSMessage) error {
}
inflightMessagesMetadataLock.Unlock()

err = sendToFeedbackReporters(g.feedbackReporters, ccsMessageWithMetadata)
if err != nil {
l.WithError(err).Error("error sending feedback to reporter")
}
if cm.Error != "" {
gcmResMutex.Lock()
g.failuresReceived++
Expand All @@ -222,6 +218,9 @@ func (g *GCMMessageHandler) handleGCMResponse(cm gcm.CCSMessage) error {
"category": "TokenError",
log.ErrorKey: fmt.Errorf("%s (Description: %s)", cm.Error, cm.ErrorDescription),
}).Debug("received an error")
if ccsMessageWithMetadata.Metadata != nil {
ccsMessageWithMetadata.Metadata["deleteToken"] = true
}
handleInvalidToken(g.InvalidTokenHandlers, cm.From)
case "INVALID_JSON":
l.WithFields(log.Fields{
Expand All @@ -244,10 +243,18 @@ func (g *GCMMessageHandler) handleGCMResponse(cm gcm.CCSMessage) error {
log.ErrorKey: cm.Error,
}).Debug("received an error")
}

sendFeedbackErr := sendToFeedbackReporters(g.feedbackReporters, ccsMessageWithMetadata)
if sendFeedbackErr != nil {
l.WithError(sendFeedbackErr).Error("error sending feedback to reporter")
}
return err
}

sendFeedbackErr := sendToFeedbackReporters(g.feedbackReporters, ccsMessageWithMetadata)
if sendFeedbackErr != nil {
l.WithError(sendFeedbackErr).Error("error sending feedback to reporter")
}

gcmResMutex.Lock()
g.successesReceived++
gcmResMutex.Unlock()
Expand Down
29 changes: 28 additions & 1 deletion extensions/gcm_message_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ var _ = Describe("GCM Message Handler", func() {
Expect(fromKafka.Metadata).To(BeNil())
})

It("should send feedback if error and metadata is present", func() {
It("should send feedback if error and metadata is present and token should be deleted", func() {
metadata := map[string]interface{}{
"some": "metadata",
}
Expand All @@ -454,6 +454,33 @@ var _ = Describe("GCM Message Handler", func() {
Expect(fromKafka.Category).To(Equal(res.Category))
Expect(fromKafka.Error).To(Equal(res.Error))
Expect(fromKafka.Metadata["some"]).To(Equal(metadata["some"]))
Expect(fromKafka.Metadata["deleteToken"]).To(BeTrue())
})

It("should send feedback if error and metadata is present and token should not be deleted", func() {
metadata := map[string]interface{}{
"some": "metadata",
}
handler.InflightMessagesMetadata["idTest1"] = metadata
res := gcm.CCSMessage{
From: "testToken1",
MessageID: "idTest1",
MessageType: "nack",
Category: "testCategory",
Error: "INVALID_JSON",
}
go handler.handleGCMResponse(res)

fromKafka := &CCSMessageWithMetadata{}
msg := <-mockKafkaProducerClient.ProduceChannel()
json.Unmarshal(msg.Value, fromKafka)
Expect(fromKafka.From).To(Equal(res.From))
Expect(fromKafka.MessageID).To(Equal(res.MessageID))
Expect(fromKafka.MessageType).To(Equal(res.MessageType))
Expect(fromKafka.Category).To(Equal(res.Category))
Expect(fromKafka.Error).To(Equal(res.Error))
Expect(fromKafka.Metadata["some"]).To(Equal(metadata["some"]))
Expect(fromKafka.Metadata["deleteToken"]).To(BeNil())
})

It("should send feedback if error and metadata is not present", func() {
Expand Down

0 comments on commit 3bcfea0

Please sign in to comment.