Logging: Unify logging fakes (#48822)

pull/48828/head
Emil Tullstedt 3 years ago committed by GitHub
parent 3ffe447c80
commit 51ff2b8c58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 23
      pkg/api/login_test.go
  2. 34
      pkg/api/plugins_test.go
  3. 33
      pkg/api/team_test.go
  4. 50
      pkg/infra/log/logtest/fake.go
  5. 20
      pkg/plugins/manager/loader/initializer/initializer_test.go
  6. 32
      pkg/plugins/manager/loader/loader_test.go
  7. 19
      pkg/plugins/manager/manager_test.go
  8. 10
      pkg/services/updatechecker/plugins_test.go
  9. 25
      pkg/setting/setting_session_test.go

@ -13,6 +13,9 @@ import (
"strings" "strings"
"testing" "testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/api/dtos"
"github.com/grafana/grafana/pkg/api/response" "github.com/grafana/grafana/pkg/api/response"
"github.com/grafana/grafana/pkg/api/routing" "github.com/grafana/grafana/pkg/api/routing"
@ -28,8 +31,6 @@ import (
"github.com/grafana/grafana/pkg/services/secrets/fakes" "github.com/grafana/grafana/pkg/services/secrets/fakes"
secretsManager "github.com/grafana/grafana/pkg/services/secrets/manager" secretsManager "github.com/grafana/grafana/pkg/services/secrets/manager"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
func fakeSetIndexViewData(t *testing.T) { func fakeSetIndexViewData(t *testing.T) {
@ -65,22 +66,6 @@ func getBody(resp *httptest.ResponseRecorder) (string, error) {
return string(responseData), nil return string(responseData), nil
} }
type FakeLogger struct {
log.Logger
}
func (fl *FakeLogger) Debug(testMessage string, ctx ...interface{}) {
}
func (fl *FakeLogger) Info(testMessage string, ctx ...interface{}) {
}
func (fl *FakeLogger) Warn(testMessage string, ctx ...interface{}) {
}
func (fl *FakeLogger) Error(testMessage string, ctx ...interface{}) {
}
type redirectCase struct { type redirectCase struct {
desc string desc string
url string url string
@ -332,7 +317,7 @@ func TestLoginPostRedirect(t *testing.T) {
fakeViewIndex(t) fakeViewIndex(t)
sc := setupScenarioContext(t, "/login") sc := setupScenarioContext(t, "/login")
hs := &HTTPServer{ hs := &HTTPServer{
log: &FakeLogger{}, log: log.NewNopLogger(),
Cfg: setting.NewCfg(), Cfg: setting.NewCfg(),
HooksService: &hooks.HooksService{}, HooksService: &hooks.HooksService{},
License: &licensing.OSSLicensingService{}, License: &licensing.OSSLicensingService{},

@ -11,6 +11,8 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/grafana/grafana/pkg/infra/log/logtest"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -55,7 +57,7 @@ func Test_GetPluginAssets(t *testing.T) {
pluginID: p, pluginID: p,
}, },
} }
l := &logger{} l := &logtest.Fake{}
url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, requestedFile) url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, requestedFile)
pluginAssetScenario(t, "When calling GET on", url, "/public/plugins/:pluginId/*", service, l, pluginAssetScenario(t, "When calling GET on", url, "/public/plugins/:pluginId/*", service, l,
@ -64,7 +66,7 @@ func Test_GetPluginAssets(t *testing.T) {
require.Equal(t, 200, sc.resp.Code) require.Equal(t, 200, sc.resp.Code)
assert.Equal(t, expectedBody, sc.resp.Body.String()) assert.Equal(t, expectedBody, sc.resp.Body.String())
assert.Empty(t, l.warnings) assert.Zero(t, l.WarnLogs.Calls)
}) })
}) })
@ -80,7 +82,7 @@ func Test_GetPluginAssets(t *testing.T) {
pluginID: p, pluginID: p,
}, },
} }
l := &logger{} l := &logtest.Fake{}
url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, tmpFileInParentDir.Name()) url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, tmpFileInParentDir.Name())
pluginAssetScenario(t, "When calling GET on", url, "/public/plugins/:pluginId/*", service, l, pluginAssetScenario(t, "When calling GET on", url, "/public/plugins/:pluginId/*", service, l,
@ -103,7 +105,7 @@ func Test_GetPluginAssets(t *testing.T) {
pluginID: p, pluginID: p,
}, },
} }
l := &logger{} l := &logtest.Fake{}
url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, requestedFile) url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, requestedFile)
pluginAssetScenario(t, "When calling GET on", url, "/public/plugins/:pluginId/*", service, l, pluginAssetScenario(t, "When calling GET on", url, "/public/plugins/:pluginId/*", service, l,
@ -112,7 +114,7 @@ func Test_GetPluginAssets(t *testing.T) {
require.Equal(t, 200, sc.resp.Code) require.Equal(t, 200, sc.resp.Code)
assert.Equal(t, expectedBody, sc.resp.Body.String()) assert.Equal(t, expectedBody, sc.resp.Body.String())
assert.Empty(t, l.warnings) assert.Zero(t, l.WarnLogs.Calls)
}) })
}) })
@ -128,7 +130,7 @@ func Test_GetPluginAssets(t *testing.T) {
pluginID: p, pluginID: p,
}, },
} }
l := &logger{} l := &logtest.Fake{}
requestedFile := "nonExistent" requestedFile := "nonExistent"
url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, requestedFile) url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, requestedFile)
@ -141,7 +143,7 @@ func Test_GetPluginAssets(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, 404, sc.resp.Code) require.Equal(t, 404, sc.resp.Code)
assert.Equal(t, "Plugin file not found", respJson["message"]) assert.Equal(t, "Plugin file not found", respJson["message"])
assert.Empty(t, l.warnings) assert.Zero(t, l.WarnLogs.Calls)
}) })
}) })
@ -149,7 +151,7 @@ func Test_GetPluginAssets(t *testing.T) {
service := &fakePluginStore{ service := &fakePluginStore{
plugins: map[string]plugins.PluginDTO{}, plugins: map[string]plugins.PluginDTO{},
} }
l := &logger{} l := &logtest.Fake{}
requestedFile := "nonExistent" requestedFile := "nonExistent"
url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, requestedFile) url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, requestedFile)
@ -162,7 +164,7 @@ func Test_GetPluginAssets(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 404, sc.resp.Code) assert.Equal(t, 404, sc.resp.Code)
assert.Equal(t, "Plugin not found", respJson["message"]) assert.Equal(t, "Plugin not found", respJson["message"])
assert.Empty(t, l.warnings) assert.Zero(t, l.WarnLogs.Calls)
}) })
}) })
@ -174,7 +176,7 @@ func Test_GetPluginAssets(t *testing.T) {
}, },
}, },
} }
l := &logger{} l := &logtest.Fake{}
url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, requestedFile) url := fmt.Sprintf("/public/plugins/%s/%s", pluginID, requestedFile)
pluginAssetScenario(t, "When calling GET on", url, "/public/plugins/:pluginId/*", service, l, pluginAssetScenario(t, "When calling GET on", url, "/public/plugins/:pluginId/*", service, l,
@ -183,7 +185,7 @@ func Test_GetPluginAssets(t *testing.T) {
require.Equal(t, 200, sc.resp.Code) require.Equal(t, 200, sc.resp.Code)
assert.Equal(t, expectedBody, sc.resp.Body.String()) assert.Equal(t, expectedBody, sc.resp.Body.String())
assert.Empty(t, l.warnings) assert.Zero(t, l.WarnLogs.Calls)
}) })
}) })
} }
@ -235,16 +237,6 @@ func pluginAssetScenario(t *testing.T, desc string, url string, urlPattern strin
}) })
} }
type logger struct {
log.Logger
warnings []string
}
func (l *logger) Warn(msg string, ctx ...interface{}) {
l.warnings = append(l.warnings, msg)
}
type fakePluginClient struct { type fakePluginClient struct {
plugins.Client plugins.Client

@ -8,7 +8,11 @@ import (
"strings" "strings"
"testing" "testing"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log/logtest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/accesscontrol"
pref "github.com/grafana/grafana/pkg/services/preference" pref "github.com/grafana/grafana/pkg/services/preference"
@ -17,21 +21,8 @@ import (
"github.com/grafana/grafana/pkg/services/sqlstore/mockstore" "github.com/grafana/grafana/pkg/services/sqlstore/mockstore"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/web" "github.com/grafana/grafana/pkg/web"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
type testLogger struct {
log.Logger
warnCalled bool
warnMessage string
}
func (stub *testLogger) Warn(testMessage string, ctx ...interface{}) {
stub.warnCalled = true
stub.warnMessage = testMessage
}
func TestTeamAPIEndpoint(t *testing.T) { func TestTeamAPIEndpoint(t *testing.T) {
t.Run("Given two teams", func(t *testing.T) { t.Run("Given two teams", func(t *testing.T) {
hs := setupSimpleHTTPServer(nil) hs := setupSimpleHTTPServer(nil)
@ -123,11 +114,11 @@ func TestTeamAPIEndpoint(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
t.Run("with no real signed in user", func(t *testing.T) { t.Run("with no real signed in user", func(t *testing.T) {
stub := &testLogger{} logger := &logtest.Fake{}
c := &models.ReqContext{ c := &models.ReqContext{
Context: &web.Context{Req: req}, Context: &web.Context{Req: req},
SignedInUser: &models.SignedInUser{}, SignedInUser: &models.SignedInUser{},
Logger: stub, Logger: logger,
} }
c.OrgRole = models.ROLE_EDITOR c.OrgRole = models.ROLE_EDITOR
c.Req.Body = mockRequestBody(models.CreateTeamCommand{Name: teamName}) c.Req.Body = mockRequestBody(models.CreateTeamCommand{Name: teamName})
@ -135,23 +126,23 @@ func TestTeamAPIEndpoint(t *testing.T) {
r := hs.CreateTeam(c) r := hs.CreateTeam(c)
assert.Equal(t, 200, r.Status()) assert.Equal(t, 200, r.Status())
assert.True(t, stub.warnCalled) assert.NotZero(t, logger.WarnLogs.Calls)
assert.Equal(t, stub.warnMessage, "Could not add creator to team because is not a real user") assert.Equal(t, "Could not add creator to team because is not a real user", logger.WarnLogs.Message)
}) })
t.Run("with real signed in user", func(t *testing.T) { t.Run("with real signed in user", func(t *testing.T) {
stub := &testLogger{} logger := &logtest.Fake{}
c := &models.ReqContext{ c := &models.ReqContext{
Context: &web.Context{Req: req}, Context: &web.Context{Req: req},
SignedInUser: &models.SignedInUser{UserId: 42}, SignedInUser: &models.SignedInUser{UserId: 42},
Logger: stub, Logger: logger,
} }
c.OrgRole = models.ROLE_EDITOR c.OrgRole = models.ROLE_EDITOR
c.Req.Body = mockRequestBody(models.CreateTeamCommand{Name: teamName}) c.Req.Body = mockRequestBody(models.CreateTeamCommand{Name: teamName})
c.Req.Header.Add("Content-Type", "application/json") c.Req.Header.Add("Content-Type", "application/json")
r := hs.CreateTeam(c) r := hs.CreateTeam(c)
assert.Equal(t, 200, r.Status()) assert.Equal(t, 200, r.Status())
assert.False(t, stub.warnCalled) assert.Zero(t, logger.WarnLogs.Calls)
}) })
}) })
} }

@ -0,0 +1,50 @@
package logtest
import (
"github.com/grafana/grafana/pkg/infra/log"
)
type Fake struct {
DebugLogs Logs
InfoLogs Logs
WarnLogs Logs
ErrorLogs Logs
}
type Logs struct {
Calls int
Message string
Ctx []interface{}
}
func (f *Fake) New(ctx ...interface{}) *log.ConcreteLogger {
return log.NewNopLogger()
}
func (f *Fake) Log(keyvals ...interface{}) error {
return nil
}
func (f *Fake) Debug(msg string, ctx ...interface{}) {
f.DebugLogs.Calls++
f.DebugLogs.Message = msg
f.DebugLogs.Ctx = ctx
}
func (f *Fake) Info(msg string, ctx ...interface{}) {
f.InfoLogs.Calls++
f.InfoLogs.Message = msg
f.InfoLogs.Ctx = ctx
}
func (f *Fake) Warn(msg string, ctx ...interface{}) {
f.WarnLogs.Calls++
f.WarnLogs.Message = msg
f.WarnLogs.Ctx = ctx
}
func (f *Fake) Error(msg string, ctx ...interface{}) {
f.ErrorLogs.Calls++
f.ErrorLogs.Message = msg
f.ErrorLogs.Ctx = ctx
}

@ -35,7 +35,7 @@ func TestInitializer_Initialize(t *testing.T) {
i := &Initializer{ i := &Initializer{
cfg: plugins.NewCfg(), cfg: plugins.NewCfg(),
log: &fakeLogger{}, log: log.NewNopLogger(),
backendProvider: &fakeBackendProvider{ backendProvider: &fakeBackendProvider{
plugin: p, plugin: p,
}, },
@ -65,7 +65,7 @@ func TestInitializer_Initialize(t *testing.T) {
i := &Initializer{ i := &Initializer{
cfg: plugins.NewCfg(), cfg: plugins.NewCfg(),
log: fakeLogger{}, log: log.NewNopLogger(),
backendProvider: &fakeBackendProvider{ backendProvider: &fakeBackendProvider{
plugin: p, plugin: p,
}, },
@ -88,7 +88,7 @@ func TestInitializer_Initialize(t *testing.T) {
i := &Initializer{ i := &Initializer{
cfg: &plugins.Cfg{}, cfg: &plugins.Cfg{},
log: fakeLogger{}, log: log.NewNopLogger(),
backendProvider: &fakeBackendProvider{ backendProvider: &fakeBackendProvider{
plugin: p, plugin: p,
}, },
@ -126,7 +126,7 @@ func TestInitializer_envVars(t *testing.T) {
}, },
}, },
license: licensing, license: licensing,
log: fakeLogger{}, log: log.NewNopLogger(),
backendProvider: &fakeBackendProvider{ backendProvider: &fakeBackendProvider{
plugin: p, plugin: p,
}, },
@ -211,18 +211,6 @@ func (*testLicensingService) FeatureEnabled(feature string) bool {
return false return false
} }
type fakeLogger struct {
*log.ConcreteLogger
}
func (f fakeLogger) New(_ ...interface{}) *log.ConcreteLogger {
return &log.ConcreteLogger{}
}
func (f fakeLogger) Warn(_ string, _ ...interface{}) {
}
type fakeBackendProvider struct { type fakeBackendProvider struct {
plugins.BackendFactoryProvider plugins.BackendFactoryProvider

@ -7,12 +7,13 @@ import (
"sort" "sort"
"testing" "testing"
"github.com/grafana/grafana/pkg/infra/log/logtest"
"github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts" "github.com/google/go-cmp/cmp/cmpopts"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/plugins" "github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin" "github.com/grafana/grafana/pkg/plugins/backendplugin"
@ -422,13 +423,14 @@ func TestLoader_setDefaultNavURL(t *testing.T) {
}, },
}}, }},
} }
logger := &fakeLogger{loggedLines: []string{}} logger := &logtest.Fake{}
pluginWithDashboard.SetLogger(logger) pluginWithDashboard.SetLogger(logger)
t.Run("Default nav URL is not set if dashboard UID field not is set", func(t *testing.T) { t.Run("Default nav URL is not set if dashboard UID field not is set", func(t *testing.T) {
setDefaultNavURL(pluginWithDashboard) setDefaultNavURL(pluginWithDashboard)
require.Equal(t, "", pluginWithDashboard.DefaultNavURL) require.Equal(t, "", pluginWithDashboard.DefaultNavURL)
require.Equal(t, []string{"Included dashboard is missing a UID field"}, logger.loggedLines) require.NotZero(t, logger.WarnLogs.Calls)
require.Equal(t, "Included dashboard is missing a UID field", logger.WarnLogs.Message)
}) })
t.Run("Default nav URL is set if dashboard UID field is set", func(t *testing.T) { t.Run("Default nav URL is set if dashboard UID field is set", func(t *testing.T) {
@ -1137,7 +1139,7 @@ func newLoader(cfg *plugins.Cfg) *Loader {
pluginInitializer: initializer.New(cfg, provider.ProvideService(coreplugin.NewRegistry(make(map[string]backendplugin.PluginFactoryFunc))), &fakeLicensingService{}), pluginInitializer: initializer.New(cfg, provider.ProvideService(coreplugin.NewRegistry(make(map[string]backendplugin.PluginFactoryFunc))), &fakeLicensingService{}),
signatureValidator: signature.NewValidator(signature.NewUnsignedAuthorizer(cfg)), signatureValidator: signature.NewValidator(signature.NewUnsignedAuthorizer(cfg)),
errs: make(map[string]*plugins.SignatureError), errs: make(map[string]*plugins.SignatureError),
log: &fakeLogger{}, log: &logtest.Fake{},
} }
} }
@ -1177,25 +1179,3 @@ func (*fakeLicensingService) EnabledFeatures() map[string]bool {
func (*fakeLicensingService) FeatureEnabled(feature string) bool { func (*fakeLicensingService) FeatureEnabled(feature string) bool {
return false return false
} }
type fakeLogger struct {
log.Logger
loggedLines []string
}
func (fl *fakeLogger) New(_ ...interface{}) *log.ConcreteLogger {
return &log.ConcreteLogger{}
}
func (fl *fakeLogger) Info(l string, _ ...interface{}) {
fl.loggedLines = append(fl.loggedLines, l)
}
func (fl *fakeLogger) Debug(l string, _ ...interface{}) {
fl.loggedLines = append(fl.loggedLines, l)
}
func (fl *fakeLogger) Warn(l string, _ ...interface{}) {
fl.loggedLines = append(fl.loggedLines, l)
}

@ -10,11 +10,12 @@ import (
"github.com/grafana/grafana-azure-sdk-go/azsettings" "github.com/grafana/grafana-azure-sdk-go/azsettings"
"github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/plugins" "github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin" "github.com/grafana/grafana/pkg/plugins/backendplugin"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
const ( const (
@ -544,7 +545,7 @@ func createPlugin(t *testing.T, pluginID, version string, class plugins.Class, m
}, },
} }
logger := fakeLogger{} logger := log.NewNopLogger()
p.SetLogger(logger) p.SetLogger(logger)
@ -757,18 +758,6 @@ func (pc *fakePluginClient) RunStream(_ context.Context, _ *backend.RunStreamReq
return backendplugin.ErrMethodNotImplemented return backendplugin.ErrMethodNotImplemented
} }
type fakeLogger struct {
log.Logger
}
func (l fakeLogger) Info(_ string, _ ...interface{}) {
}
func (l fakeLogger) Debug(_ string, _ ...interface{}) {
}
type fakeSender struct { type fakeSender struct {
resp *backend.CallResourceResponse resp *backend.CallResourceResponse
} }

@ -154,7 +154,7 @@ func TestPluginUpdateChecker_checkForUpdates(t *testing.T) {
httpClient: &fakeHTTPClient{ httpClient: &fakeHTTPClient{
fakeResp: jsonResp, fakeResp: jsonResp,
}, },
log: &fakeLogger{}, log: log.NewNopLogger(),
} }
svc.checkForUpdates(context.Background()) svc.checkForUpdates(context.Background())
@ -215,11 +215,3 @@ func (pr fakePluginStore) Plugins(_ context.Context, _ ...plugins.Type) []plugin
} }
return result return result
} }
type fakeLogger struct {
log.Logger
}
func (l *fakeLogger) Debug(_ string, _ ...interface{}) {}
func (l *fakeLogger) Warn(_ string, _ ...interface{}) {}

@ -4,26 +4,11 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log/logtest"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
type testLogger struct {
log.Logger
warnCalled bool
warnMessage string
}
func (stub *testLogger) Warn(testMessage string, ctx ...interface{}) {
stub.warnCalled = true
stub.warnMessage = testMessage
}
func (stub *testLogger) Info(testMessage string, ctx ...interface{}) {
}
func TestSessionSettings(t *testing.T) { func TestSessionSettings(t *testing.T) {
skipStaticRootValidation = true skipStaticRootValidation = true
@ -31,8 +16,8 @@ func TestSessionSettings(t *testing.T) {
cfg := NewCfg() cfg := NewCfg()
homePath := "../../" homePath := "../../"
stub := &testLogger{} logger := &logtest.Fake{}
cfg.Logger = stub cfg.Logger = logger
err := cfg.Load(CommandLineArgs{ err := cfg.Load(CommandLineArgs{
HomePath: homePath, HomePath: homePath,
@ -40,7 +25,7 @@ func TestSessionSettings(t *testing.T) {
}) })
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, true, stub.warnCalled) require.Equal(t, 1, logger.WarnLogs.Calls)
require.Greater(t, len(stub.warnMessage), 0) require.Greater(t, len(logger.WarnLogs.Message), 0)
}) })
} }

Loading…
Cancel
Save