func deleteSubscription(t *testing.T, fcmConn connector.ResponsiveConnector, userID, gcmID, topic string) { a := assert.New(t) u := fmt.Sprintf("http://localhost/fcm/%s/%s/%s", gcmID, userID, topic) req, err := http.NewRequest(http.MethodDelete, u, nil) a.NoError(err) w := httptest.NewRecorder() fcmConn.ServeHTTP(w, req) a.Equal(fmt.Sprintf(`{"unsubscribed":"/%s"}`, topic), string(w.Body.Bytes())) }
func (params *benchParams) throughputFCM() { defer testutil.ResetDefaultRegistryHealthCheck() a := assert.New(params) dir, errTempDir := ioutil.TempDir("", "guble_benchmarking_fcm_test") a.NoError(errTempDir) *Config.HttpListen = "localhost:0" *Config.KVS = "memory" *Config.MS = "file" *Config.StoragePath = dir *Config.FCM.Enabled = true *Config.FCM.APIKey = "WILL BE OVERWRITTEN" *Config.FCM.Workers = params.workers params.service = StartService() var fcmConn connector.ResponsiveConnector var ok bool for _, iface := range params.service.ModulesSortedByStartOrder() { fcmConn, ok = iface.(connector.ResponsiveConnector) if ok { break } } if fcmConn == nil { a.FailNow("There should be a module of type: FCM Connector") } params.receiveC = make(chan bool) sender, err := fcm.CreateFcmSender(fcm.SuccessFCMResponse, params.receiveC, params.timeout) a.NoError(err) fcmConn.SetSender(sender) urlFormat := fmt.Sprintf("http://%s/fcm/%%d/gcmId%%d/subscribe/%%s", params.service.WebServer().GetAddr()) for i := 1; i <= params.subscriptions; i++ { // create FCM subscription response, errPost := http.Post( fmt.Sprintf(urlFormat, i, i, strings.TrimPrefix(testTopic, "/")), "text/plain", bytes.NewBufferString(""), ) a.NoError(errPost) a.Equal(response.StatusCode, 200) body, errReadAll := ioutil.ReadAll(response.Body) a.NoError(errReadAll) a.Equal("{\"subscribed\":\"/topic\"}", string(body)) } clients := params.createClients() // Report allocations also params.ReportAllocs() expectedMessagesNumber := params.N * params.clients * params.subscriptions logger.WithFields(log.Fields{ "expectedMessagesNumber": expectedMessagesNumber, "N": params.N, }).Info("Expecting messages") params.wg.Add(expectedMessagesNumber) // start the receive loop (a select on receiveC and doneC) params.doneC = make(chan struct{}) params.receiveLoop() params.ResetTimer() // send all messages, or fail on any error for _, cl := range clients { go func(cl client.Client) { for i := 0; i < params.N; i++ { err := params.sender(cl) if err != nil { a.FailNow("Message could not be sent") } params.sent++ } }(cl) } // wait to receive all messages params.wg.Wait() // stop timer after the actual test params.StopTimer() close(params.doneC) a.NoError(params.service.Stop()) params.service = nil close(params.receiveC) errRemove := os.RemoveAll(dir) if errRemove != nil { logger.WithError(errRemove).WithField("module", "testing").Error("Could not remove directory") } }
// Test that restarting the service continues to fetch messages from store for a subscription from lastID func TestFCMRestart(t *testing.T) { // defer testutil.EnableDebugForMethod()() defer testutil.ResetDefaultRegistryHealthCheck() a := assert.New(t) receiveC := make(chan bool) s, cleanup := serviceSetUp(t) defer cleanup() assertMetrics(a, s, expectedValues{true, 0, 0, 0}) var fcmConn connector.ResponsiveConnector var ok bool for _, iface := range s.ModulesSortedByStartOrder() { fcmConn, ok = iface.(connector.ResponsiveConnector) if ok { break } } a.True(ok, "There should be a module of type FCMConnector") // add a high timeout so the messages are processed slow sender, err := fcm.CreateFcmSender(fcm.SuccessFCMResponse, receiveC, 10*time.Millisecond) a.NoError(err) fcmConn.SetSender(sender) // create subscription on topic subscriptionSetUp(t, s) assertMetrics(a, s, expectedValues{true, 0, 1, 1}) c := clientSetUp(t, s) // send 3 messages in the router but read only one and close the service for i := 0; i < 3; i++ { c.Send(testTopic, "dummy body", "{dummy: value}") } // receive one message only from FCM select { case <-receiveC: case <-time.After(timeoutForOneMessage): a.Fail("Initial FCM message not received") } assertMetrics(a, s, expectedValues{false, 1, 1, 1}) close(receiveC) // restart the service a.NoError(s.Stop()) // remake the sender receiveC = make(chan bool) sender, err = fcm.CreateFcmSender(fcm.SuccessFCMResponse, receiveC, 10*time.Millisecond) a.NoError(err) fcmConn.SetSender(sender) time.Sleep(50 * time.Millisecond) testutil.ResetDefaultRegistryHealthCheck() a.NoError(s.Start()) //TODO Cosmin Bogdan add 2 calls to assertMetrics before and after the next block // read the other 2 messages for i := 0; i < 1; i++ { select { case <-receiveC: case <-time.After(2 * timeoutForOneMessage): a.Fail("FCM message not received") } } }