fakeDesiredLRPDB.DesiredLRPByProcessGuidReturns(desiredLRP, nil) fakeActualLRPDB.CrashActualLRPReturns(&models.ActualLRPGroup{Instance: &actualLRP}, &models.ActualLRPGroup{Instance: &afterActualLRP}, true, nil) }) It("response with no error", func() { Expect(responseRecorder.Code).To(Equal(http.StatusOK)) response := &models.ActualLRPLifecycleResponse{} err := response.Unmarshal(responseRecorder.Body.Bytes()) Expect(err).NotTo(HaveOccurred()) Expect(response.Error).To(BeNil()) }) It("crashes the actual lrp by process guid and index", func() { Expect(fakeActualLRPDB.CrashActualLRPCallCount()).To(Equal(1)) _, actualKey, actualInstanceKey, actualErrorMessage := fakeActualLRPDB.CrashActualLRPArgsForCall(0) Expect(*actualKey).To(Equal(key)) Expect(*actualInstanceKey).To(Equal(instanceKey)) Expect(actualErrorMessage).To(Equal(errorMessage)) }) It("emits a crash and change event to the hub", func() { Eventually(actualHub.EmitCallCount).Should(Equal(2)) event1 := actualHub.EmitArgsForCall(0) event2 := actualHub.EmitArgsForCall(1) crashEvent, ok := event1.(*models.ActualLRPCrashedEvent) if !ok { crashEvent, ok = event2.(*models.ActualLRPCrashedEvent) } Expect(ok).To(BeTrue())
_, key, instanceKey := fakeEvacuationDB.RemoveEvacuatingActualLRPArgsForCall(0) Expect(*key).To(Equal(actual.ActualLRPKey)) Expect(*instanceKey).To(Equal(actual.ActualLRPInstanceKey)) }) It("emits events to the hub", func() { Eventually(actualHub.EmitCallCount).Should(Equal(1)) event := actualHub.EmitArgsForCall(0) removeEvent, ok := event.(*models.ActualLRPRemovedEvent) Expect(ok).To(BeTrue()) Expect(removeEvent.ActualLrpGroup).To(Equal(&models.ActualLRPGroup{Evacuating: actual})) }) It("crashes the actual lrp instance", func() { Expect(fakeActualLRPDB.CrashActualLRPCallCount()).To(Equal(1)) _, key, instanceKey, errorMessage := fakeActualLRPDB.CrashActualLRPArgsForCall(0) Expect(*key).To(Equal(actual.ActualLRPKey)) Expect(*instanceKey).To(Equal(actual.ActualLRPInstanceKey)) Expect(errorMessage).To(Equal("i failed")) }) Context("when the DB returns an unrecoverable error", func() { BeforeEach(func() { fakeEvacuationDB.RemoveEvacuatingActualLRPReturns(models.NewUnrecoverableError(nil)) }) It("logs and writes to the exit channel", func() { Eventually(logger).Should(gbytes.Say("unrecoverable-error")) Eventually(exitCh).Should(Receive()) }) })