From 65ccd4afb20b6bec40b8561e0eb0865372371b17 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 21 Aug 2017 11:48:07 -0500 Subject: make hooks optional, short circuit if unimplemented (#7263) --- plugin/rpcplugin/hooks_test.go | 57 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 6 deletions(-) (limited to 'plugin/rpcplugin/hooks_test.go') diff --git a/plugin/rpcplugin/hooks_test.go b/plugin/rpcplugin/hooks_test.go index fbbbbedeb..6cd7ff547 100644 --- a/plugin/rpcplugin/hooks_test.go +++ b/plugin/rpcplugin/hooks_test.go @@ -11,7 +11,7 @@ import ( "github.com/mattermost/platform/plugin/plugintest" ) -func testHooksRPC(hooks plugin.Hooks, f func(plugin.Hooks)) { +func testHooksRPC(hooks interface{}, f func(*RemoteHooks)) error { r1, w1 := io.Pipe() r2, w2 := io.Pipe() @@ -24,10 +24,14 @@ func testHooksRPC(hooks plugin.Hooks, f func(plugin.Hooks)) { id, server := c1.Serve() go ServeHooks(hooks, server, c1) - remote := ConnectHooks(c2.Connect(id), c2) + remote, err := ConnectHooks(c2.Connect(id), c2) + if err != nil { + return err + } defer remote.Close() f(remote) + return nil } func TestHooks(t *testing.T) { @@ -35,24 +39,65 @@ func TestHooks(t *testing.T) { var hooks plugintest.Hooks defer hooks.AssertExpectations(t) - testHooksRPC(&hooks, func(remote plugin.Hooks) { + assert.NoError(t, testHooksRPC(&hooks, func(remote *RemoteHooks) { hooks.On("OnActivate", mock.AnythingOfType("*rpcplugin.RemoteAPI")).Return(nil) assert.NoError(t, remote.OnActivate(&api)) hooks.On("OnDeactivate").Return(nil) assert.NoError(t, remote.OnDeactivate()) - }) + })) +} + +type testHooks struct { + mock.Mock +} + +func (h *testHooks) OnActivate(api plugin.API) error { + return h.Called(api).Error(0) +} + +func TestHooks_PartiallyImplemented(t *testing.T) { + var api plugintest.API + var hooks testHooks + defer hooks.AssertExpectations(t) + + assert.NoError(t, testHooksRPC(&hooks, func(remote *RemoteHooks) { + implemented, err := remote.Implemented() + assert.NoError(t, err) + assert.Equal(t, []string{"OnActivate"}, implemented) + + hooks.On("OnActivate", mock.AnythingOfType("*rpcplugin.RemoteAPI")).Return(nil) + assert.NoError(t, remote.OnActivate(&api)) + + assert.NoError(t, remote.OnDeactivate()) + })) } func BenchmarkOnDeactivate(b *testing.B) { var hooks plugintest.Hooks hooks.On("OnDeactivate").Return(nil) - testHooksRPC(&hooks, func(remote plugin.Hooks) { + if err := testHooksRPC(&hooks, func(remote *RemoteHooks) { + b.ResetTimer() + for n := 0; n < b.N; n++ { + remote.OnDeactivate() + } + b.StopTimer() + }); err != nil { + b.Fatal(err.Error()) + } +} + +func BenchmarkOnDeactivate_Unimplemented(b *testing.B) { + var hooks testHooks + + if err := testHooksRPC(&hooks, func(remote *RemoteHooks) { b.ResetTimer() for n := 0; n < b.N; n++ { remote.OnDeactivate() } b.StopTimer() - }) + }); err != nil { + b.Fatal(err.Error()) + } } -- cgit v1.2.3-1-g7c22