github.com/Uptycs/basequery-go@v0.8.0/plugin/logger/logger_test.go (about) 1 package logger 2 3 import ( 4 "context" 5 "errors" 6 "testing" 7 8 "github.com/Uptycs/basequery-go/gen/osquery" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 type mockLoggerPlugin struct { 13 NameFunc func() string 14 LogStringFunc func(context.Context, LogType, string) error 15 } 16 17 func (m *mockLoggerPlugin) Name() string { 18 return m.NameFunc() 19 } 20 21 func (m *mockLoggerPlugin) LogString(ctx context.Context, typ LogType, log string) error { 22 return m.LogStringFunc(ctx, typ, log) 23 } 24 25 func TestLoggerPlugin(t *testing.T) { 26 var calledType LogType 27 var calledLog string 28 plugin := NewPlugin("mock", func(ctx context.Context, typ LogType, log string) error { 29 calledType = typ 30 calledLog = log 31 return nil 32 }) 33 34 StatusOK := osquery.ExtensionStatus{Code: 0, Message: "OK"} 35 // Basic methods 36 assert.Equal(t, "logger", plugin.RegistryName()) 37 assert.Equal(t, "mock", plugin.Name()) 38 assert.Equal(t, StatusOK, plugin.Ping()) 39 assert.Equal(t, osquery.ExtensionPluginResponse{}, plugin.Routes()) 40 41 // Log string 42 resp := plugin.Call(context.Background(), osquery.ExtensionPluginRequest{"string": "logged string"}) 43 assert.Equal(t, &StatusOK, resp.Status) 44 assert.Equal(t, LogTypeString, calledType) 45 assert.Equal(t, "logged string", calledLog) 46 47 // Log snapshot 48 resp = plugin.Call(context.Background(), osquery.ExtensionPluginRequest{"snapshot": "logged snapshot"}) 49 assert.Equal(t, &StatusOK, resp.Status) 50 assert.Equal(t, LogTypeSnapshot, calledType) 51 assert.Equal(t, "logged snapshot", calledLog) 52 53 // Log health 54 resp = plugin.Call(context.Background(), osquery.ExtensionPluginRequest{"health": "logged health"}) 55 assert.Equal(t, &StatusOK, resp.Status) 56 assert.Equal(t, LogTypeHealth, calledType) 57 assert.Equal(t, "logged health", calledLog) 58 59 // Log init 60 resp = plugin.Call(context.Background(), osquery.ExtensionPluginRequest{"init": "logged init"}) 61 assert.Equal(t, &StatusOK, resp.Status) 62 assert.Equal(t, LogTypeInit, calledType) 63 assert.Equal(t, "logged init", calledLog) 64 65 // Log status 66 resp = plugin.Call(context.Background(), osquery.ExtensionPluginRequest{"status": "true", "log": `{"":{"s":"0","f":"events.cpp","i":"828","m":"Event publisher failed setup: kernel: Cannot access \/dev\/osquery"},"":{"s":"0","f":"events.cpp","i":"828","m":"Event publisher failed setup: scnetwork: Publisher not used"},"":{"s":"0","f":"scheduler.cpp","i":"74","m":"Executing scheduled query macos_kextstat: SELECT * FROM time"}}`}) 67 assert.Equal(t, &StatusOK, resp.Status) 68 assert.Equal(t, LogTypeStatus, calledType) 69 assert.Equal(t, `{"s":"0","f":"scheduler.cpp","i":"74","m":"Executing scheduled query macos_kextstat: SELECT * FROM time"}`, calledLog) 70 } 71 72 func TestLogPluginErrors(t *testing.T) { 73 var called bool 74 plugin := NewPlugin("mock", func(ctx context.Context, typ LogType, log string) error { 75 called = true 76 return errors.New("foobar") 77 }) 78 79 // Call with bad actions 80 assert.Equal(t, int32(1), plugin.Call(context.Background(), osquery.ExtensionPluginRequest{}).Status.Code) 81 assert.False(t, called) 82 assert.Equal(t, int32(1), plugin.Call(context.Background(), osquery.ExtensionPluginRequest{"action": "bad"}).Status.Code) 83 assert.False(t, called) 84 85 // Call with empty status 86 assert.Equal(t, int32(1), plugin.Call(context.Background(), osquery.ExtensionPluginRequest{"status": "true", "log": ""}).Status.Code) 87 assert.False(t, called) 88 89 // Call with good action but logging fails 90 resp := plugin.Call(context.Background(), osquery.ExtensionPluginRequest{"string": "logged string"}) 91 assert.True(t, called) 92 assert.Equal(t, int32(1), resp.Status.Code) 93 assert.Equal(t, "error logging: foobar", resp.Status.Message) 94 }