diff --git a/engine/controller/aggregate/controller.go b/engine/controller/aggregate/controller.go index 2568cf00..03353ea2 100644 --- a/engine/controller/aggregate/controller.go +++ b/engine/controller/aggregate/controller.go @@ -50,6 +50,7 @@ func (c *Controller) Handle( c.Config, "AggregateMessageHandler", "RouteCommandToInstance", + c.Config.Handler(), env.Message, func() { id = c.Config.Handler().RouteCommandToInstance(env.Message) @@ -79,6 +80,7 @@ func (c *Controller) Handle( c.Config, "AggregateRoot", "ApplyEvent", + r, env.Message, func() { r.ApplyEvent(env.Message) @@ -115,6 +117,7 @@ func (c *Controller) Handle( c.Config, "AggregateMessageHandler", "HandleCommand", + c.Config.Handler(), env.Message, func() { c.Config.Handler().HandleCommand(r, s, env.Message) diff --git a/engine/controller/aggregate/scope.go b/engine/controller/aggregate/scope.go index 5d27d630..e42609e5 100644 --- a/engine/controller/aggregate/scope.go +++ b/engine/controller/aggregate/scope.go @@ -76,6 +76,7 @@ func (s *scope) RecordEvent(m dogma.Message) { s.config, "AggregateRoot", "ApplyEvent", + s.root, m, func() { s.root.ApplyEvent(m) diff --git a/engine/controller/integration/controller.go b/engine/controller/integration/controller.go index 7d84c475..cc223134 100644 --- a/engine/controller/integration/controller.go +++ b/engine/controller/integration/controller.go @@ -47,6 +47,7 @@ func (c *Controller) Handle( c.Config, "IntegrationMessageHandler", "TimeoutHint", + c.Config.Handler(), env.Message, func() { t = c.Config.Handler().TimeoutHint(env.Message) @@ -72,6 +73,7 @@ func (c *Controller) Handle( c.Config, "IntegrationMessageHandler", "HandleCommand", + c.Config.Handler(), env.Message, func() { err = c.Config.Handler().HandleCommand(ctx, s, env.Message) diff --git a/engine/controller/process/controller.go b/engine/controller/process/controller.go index e326f284..c929a8a2 100644 --- a/engine/controller/process/controller.go +++ b/engine/controller/process/controller.go @@ -70,6 +70,7 @@ func (c *Controller) Handle( c.Config, "ProcessMessageHandler", "TimeoutHint", + c.Config.Handler(), env.Message, func() { t = c.Config.Handler().TimeoutHint(env.Message) @@ -173,6 +174,7 @@ func (c *Controller) routeEvent( c.Config, "ProcessMessageHandler", "RouteEventToInstance", + handler, env.Message, func() { id, ok, err = handler.RouteEventToInstance(ctx, env.Message) @@ -234,6 +236,7 @@ func (c *Controller) handle(ctx context.Context, s *scope) error { c.Config, "ProcessMessageHandler", method, + c.Config.Handler(), s.env.Message, func() { if s.env.Role == message.EventRole { diff --git a/engine/controller/projection/controller.go b/engine/controller/projection/controller.go index b667b01e..af40b0d3 100644 --- a/engine/controller/projection/controller.go +++ b/engine/controller/projection/controller.go @@ -80,6 +80,7 @@ func (c *Controller) Handle( c.Config, "ProjectionMessageHandler", "TimeoutHint", + handler, env.Message, func() { t = handler.TimeoutHint(env.Message) @@ -149,6 +150,7 @@ func (c *Controller) Handle( c.Config, "ProjectionMessageHandler", "HandleEvent", + handler, env.Message, func() { ok, err = handler.HandleEvent( diff --git a/engine/panicx/unexpectedmessage.go b/engine/panicx/unexpectedmessage.go index e91b60aa..11833d45 100644 --- a/engine/panicx/unexpectedmessage.go +++ b/engine/panicx/unexpectedmessage.go @@ -17,6 +17,9 @@ type UnexpectedMessage struct { // controller called resulting in the panic. Interface string + // Implementation is the value that implements the nominated interface. + Implementation interface{} + // Method is the name of the method that the controller called resulting in // the panic. Method string @@ -30,9 +33,10 @@ type UnexpectedMessage struct { func (x UnexpectedMessage) String() string { return fmt.Sprintf( - "the '%s' %s message handler did not expect %s() to be called with a message of type %T", + "the '%s' %s message handler did not expect %T.%s() to be called with a message of type %T", x.Handler.Identity().Name, x.Handler.HandlerType(), + x.Implementation, x.Method, x.Message, ) @@ -43,7 +47,8 @@ func (x UnexpectedMessage) String() string { // the failure. func EnrichUnexpectedMessage( h configkit.RichHandler, - iface, method string, + iface string, method string, + impl interface{}, m dogma.Message, fn func(), ) { @@ -56,11 +61,12 @@ func EnrichUnexpectedMessage( if v == dogma.UnexpectedMessage { v = UnexpectedMessage{ - Handler: h, - Interface: iface, - Method: method, - Message: m, - PanicLocation: LocationOfPanic(), + Handler: h, + Interface: iface, + Method: method, + Implementation: impl, + Message: m, + PanicLocation: LocationOfPanic(), } } diff --git a/engine/panicx/unexpectedmessage_test.go b/engine/panicx/unexpectedmessage_test.go index ddbd314e..ce24a3ee 100644 --- a/engine/panicx/unexpectedmessage_test.go +++ b/engine/panicx/unexpectedmessage_test.go @@ -28,7 +28,7 @@ var _ = Describe("type UnexpectedMessage", func() { x := r.(UnexpectedMessage) Expect(x.String()).To(Equal( - "the '' projection message handler did not expect () to be called with a message of type fixtures.MessageA", + "the '' projection message handler did not expect *fixtures.ProjectionMessageHandler.() to be called with a message of type fixtures.MessageA", )) }() @@ -36,6 +36,7 @@ var _ = Describe("type UnexpectedMessage", func() { config, "", "", + config.Handler(), MessageA1, func() { panic(dogma.UnexpectedMessage) @@ -62,6 +63,7 @@ var _ = Describe("func EnrichUnexpectedMessage()", func() { config, "", "", + config.Handler(), MessageA1, func() { called = true @@ -77,6 +79,7 @@ var _ = Describe("func EnrichUnexpectedMessage()", func() { config, "", "", + config.Handler(), MessageA1, func() { panic("") @@ -91,23 +94,23 @@ var _ = Describe("func EnrichUnexpectedMessage()", func() { config, "", "", + config.Handler(), MessageA1, - func() { - panic(dogma.UnexpectedMessage) - }, + panicWithUnexpectedMessage, ) }).To(PanicWith( MatchAllFields( Fields{ - "Handler": Equal(config), - "Interface": Equal(""), - "Method": Equal(""), - "Message": Equal(MessageA1), + "Handler": Equal(config), + "Interface": Equal(""), + "Method": Equal(""), + "Implementation": Equal(config.Handler()), + "Message": Equal(MessageA1), "PanicLocation": MatchAllFields( Fields{ - "Func": Not(BeEmpty()), - "File": HaveSuffix("/unexpectedmessage_test.go"), - "Line": Equal(96), + "Func": Equal("github.com/dogmatiq/testkit/engine/panicx_test.panicWithUnexpectedMessage"), + "File": HaveSuffix("/engine/panicx/unexpectedmessage_test.go"), + "Line": Equal(123), }, ), }, @@ -115,3 +118,7 @@ var _ = Describe("func EnrichUnexpectedMessage()", func() { )) }) }) + +func panicWithUnexpectedMessage() { + panic(dogma.UnexpectedMessage) +}