diff --git a/.circleci/config.yml b/.circleci/config.yml index 395b291ed04..86e5b50759a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -826,7 +826,7 @@ jobs: command: | # To save memory, run in two batches golangci-lint run -v -j 4 --config scripts/go/configs/ci/.golangci.toml -E deadcode -E depguard -E dogsled \ - -E errcheck -E goconst -E golint -E gosec -E gosimple -E govet ./pkg/... + -E errcheck -E goconst -E golint -E gosec -E gosimple -E govet -E scopelint ./pkg/... golangci-lint run -v -j 4 --config scripts/go/configs/ci/.golangci.toml -E ineffassign \ -E rowserrcheck -E staticcheck -E structcheck -E typecheck -E unconvert -E unused -E varcheck ./pkg/... ./scripts/go/bin/revive -formatter stylish -config ./scripts/go/configs/revive.toml ./pkg/... diff --git a/pkg/api/dashboard_test.go b/pkg/api/dashboard_test.go index b58cf217d3a..318678ac31c 100644 --- a/pkg/api/dashboard_test.go +++ b/pkg/api/dashboard_test.go @@ -42,6 +42,7 @@ func TestGetHomeDashboard(t *testing.T) { } for _, tc := range tests { + tc := tc t.Run(tc.name, func(t *testing.T) { dash := dtos.DashboardFullWithMeta{} dash.Meta.IsHome = true @@ -801,6 +802,7 @@ func TestDashboardApiEndpoint(t *testing.T) { } for _, tc := range testCases { + tc := tc mock := &dashboards.FakeDashboardService{ SaveDashboardError: tc.SaveError, } diff --git a/pkg/api/folder_test.go b/pkg/api/folder_test.go index af1dd8f94e6..046b4674fad 100644 --- a/pkg/api/folder_test.go +++ b/pkg/api/folder_test.go @@ -62,6 +62,7 @@ func TestFoldersApiEndpoint(t *testing.T) { } for _, tc := range testCases { + tc := tc mock := &fakeFolderService{ CreateFolderError: tc.Error, } @@ -119,6 +120,7 @@ func TestFoldersApiEndpoint(t *testing.T) { } for _, tc := range testCases { + tc := tc mock := &fakeFolderService{ UpdateFolderError: tc.Error, } diff --git a/pkg/api/login_test.go b/pkg/api/login_test.go index bf76921eeb3..f87a5b7dca1 100644 --- a/pkg/api/login_test.go +++ b/pkg/api/login_test.go @@ -252,6 +252,7 @@ func TestLoginViewRedirect(t *testing.T) { } for _, c := range redirectCases { + c := c hs.Cfg.AppUrl = c.appURL hs.Cfg.AppSubUrl = c.appSubURL t.Run(c.desc, func(t *testing.T) { @@ -420,6 +421,7 @@ func TestLoginPostRedirect(t *testing.T) { } for _, c := range redirectCases { + c := c hs.Cfg.AppUrl = c.appURL hs.Cfg.AppSubUrl = c.appSubURL t.Run(c.desc, func(t *testing.T) { diff --git a/pkg/api/pluginproxy/access_token_provider_test.go b/pkg/api/pluginproxy/access_token_provider_test.go index 220f2570d43..aee616eccda 100644 --- a/pkg/api/pluginproxy/access_token_provider_test.go +++ b/pkg/api/pluginproxy/access_token_provider_test.go @@ -189,6 +189,7 @@ func TestAccessToken(t *testing.T) { }, } for _, testCase := range testCases { + testCase := testCase Convey(testCase.desc, func() { clearTokenCache() // reset the httphandler counter diff --git a/pkg/api/pluginproxy/ds_proxy_test.go b/pkg/api/pluginproxy/ds_proxy_test.go index da415b5752e..4909d2428f6 100644 --- a/pkg/api/pluginproxy/ds_proxy_test.go +++ b/pkg/api/pluginproxy/ds_proxy_test.go @@ -617,6 +617,7 @@ func TestNewDataSourceProxy_MSSQL(t *testing.T) { }, } for _, tc := range tcs { + tc := tc t.Run(tc.description, func(t *testing.T) { cfg := setting.Cfg{} plugin := plugins.DataSourcePlugin{} diff --git a/pkg/cmd/grafana-cli/commands/upgrade_all_command_test.go b/pkg/cmd/grafana-cli/commands/upgrade_all_command_test.go index 57ea8c15dbc..c2024d2ed1a 100644 --- a/pkg/cmd/grafana-cli/commands/upgrade_all_command_test.go +++ b/pkg/cmd/grafana-cli/commands/upgrade_all_command_test.go @@ -21,9 +21,10 @@ func TestVersionComparison(t *testing.T) { } for k, v := range upgradeablePlugins { + key := k val := v t.Run(fmt.Sprintf("for %s should be true", k), func(t *testing.T) { - assert.True(t, shouldUpgrade(k, &val)) + assert.True(t, shouldUpgrade(key, &val)) }) } }) @@ -40,9 +41,10 @@ func TestVersionComparison(t *testing.T) { } for k, v := range shouldNotUpgrade { + key := k val := v t.Run(fmt.Sprintf("for %s should be false", k), func(t *testing.T) { - assert.False(t, shouldUpgrade(k, &val)) + assert.False(t, shouldUpgrade(key, &val)) }) } }) diff --git a/pkg/cmd/grafana-server/diagnostics_test.go b/pkg/cmd/grafana-server/diagnostics_test.go index f7e7b9874aa..0f73fff3ba7 100644 --- a/pkg/cmd/grafana-server/diagnostics_test.go +++ b/pkg/cmd/grafana-server/diagnostics_test.go @@ -23,6 +23,7 @@ func TestProfilingDiagnostics(t *testing.T) { } for i, tc := range tcs { + tc := tc t.Run(fmt.Sprintf("testcase %d", i), func(t *testing.T) { os.Clearenv() if tc.enabledEnv != "" { @@ -55,6 +56,7 @@ func TestTracingDiagnostics(t *testing.T) { } for i, tc := range tcs { + tc := tc t.Run(fmt.Sprintf("testcase %d", i), func(t *testing.T) { os.Clearenv() if tc.enabledEnv != "" { diff --git a/pkg/components/gtime/gtime_test.go b/pkg/components/gtime/gtime_test.go index 4dab30fbf6a..460afda022f 100644 --- a/pkg/components/gtime/gtime_test.go +++ b/pkg/components/gtime/gtime_test.go @@ -26,6 +26,7 @@ func TestParseInterval(t *testing.T) { } for i, tc := range tcs { + tc := tc t.Run(fmt.Sprintf("testcase %d", i), func(t *testing.T) { res, err := ParseInterval(tc.interval) if tc.err == "" { diff --git a/pkg/login/social/azuread_oauth_test.go b/pkg/login/social/azuread_oauth_test.go index 7fc04a9b733..b110d775aa7 100644 --- a/pkg/login/social/azuread_oauth_test.go +++ b/pkg/login/social/azuread_oauth_test.go @@ -221,6 +221,7 @@ func TestSocialAzureAD_UserInfo(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { s := &SocialAzureAD{ SocialBase: tt.fields.SocialBase, diff --git a/pkg/login/social/generic_oauth_test.go b/pkg/login/social/generic_oauth_test.go index dfed846b0fd..69ee26ccf02 100644 --- a/pkg/login/social/generic_oauth_test.go +++ b/pkg/login/social/generic_oauth_test.go @@ -89,6 +89,7 @@ func TestSearchJSONForEmail(t *testing.T) { } for _, test := range tests { + test := test provider.emailAttributePath = test.EmailAttributePath t.Run(test.Name, func(t *testing.T) { actualResult, err := provider.searchJSONForAttr(test.EmailAttributePath, test.UserInfoJSONResponse) @@ -152,6 +153,7 @@ func TestSearchJSONForRole(t *testing.T) { } for _, test := range tests { + test := test provider.roleAttributePath = test.RoleAttributePath t.Run(test.Name, func(t *testing.T) { actualResult, err := provider.searchJSONForAttr(test.RoleAttributePath, test.UserInfoJSONResponse) @@ -304,6 +306,7 @@ func TestUserInfoSearchesForEmailAndRole(t *testing.T) { } for _, test := range tests { + test := test provider.roleAttributePath = test.RoleAttributePath t.Run(test.Name, func(t *testing.T) { response, err := json.Marshal(test.APIURLResponse) diff --git a/pkg/plugins/backendplugin/grpcplugin/log_wrapper_test.go b/pkg/plugins/backendplugin/grpcplugin/log_wrapper_test.go index e1ffc650faf..de28aea1b6a 100644 --- a/pkg/plugins/backendplugin/grpcplugin/log_wrapper_test.go +++ b/pkg/plugins/backendplugin/grpcplugin/log_wrapper_test.go @@ -21,6 +21,7 @@ func TestLogWrapper(t *testing.T) { } for i, tc := range tcs { + tc := tc t.Run(fmt.Sprintf("formatArgs testcase %d", i), func(t *testing.T) { res := formatArgs(tc.args...) assert.Exactly(t, tc.expectedResult, res) diff --git a/pkg/plugins/plugins_test.go b/pkg/plugins/plugins_test.go index 94a4d1fd4ea..a8e98ba8923 100644 --- a/pkg/plugins/plugins_test.go +++ b/pkg/plugins/plugins_test.go @@ -177,6 +177,7 @@ func TestPluginManager_IsBackendOnlyPlugin(t *testing.T) { {name: "renderer", isBackendOnly: true}, {name: "app", isBackendOnly: false}, } { + c := c t.Run(fmt.Sprintf("Plugin %s", c.name), func(t *testing.T) { result := pluginScanner.IsBackendOnlyPlugin(c.name) diff --git a/pkg/services/alerting/alerting_usage_test.go b/pkg/services/alerting/alerting_usage_test.go index 5816d1aa3ec..b60fc5626f2 100644 --- a/pkg/services/alerting/alerting_usage_test.go +++ b/pkg/services/alerting/alerting_usage_test.go @@ -107,6 +107,7 @@ func TestParsingAlertRuleSettings(t *testing.T) { require.NoError(t, err, "Init should not return an error") for _, tc := range tcs { + tc := tc t.Run(tc.name, func(t *testing.T) { content, err := ioutil.ReadFile(tc.file) require.NoError(t, err, "expected to be able to read file") diff --git a/pkg/services/guardian/guardian_test.go b/pkg/services/guardian/guardian_test.go index 24f44d4497e..9b67d0a26d6 100644 --- a/pkg/services/guardian/guardian_test.go +++ b/pkg/services/guardian/guardian_test.go @@ -372,6 +372,7 @@ func (sc *scenarioContext) verifyUpdateDashboardPermissionsShouldBeAllowed(pt pe } for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} { + p := p tc := fmt.Sprintf("When updating dashboard permissions with %s permissions should be allowed", p.String()) Convey(tc, func() { @@ -420,6 +421,7 @@ func (sc *scenarioContext) verifyUpdateDashboardPermissionsShouldNotBeAllowed(pt } for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} { + p := p tc := fmt.Sprintf("When updating dashboard permissions with %s permissions should NOT be allowed", p.String()) Convey(tc, func() { @@ -460,6 +462,7 @@ func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsShouldBeAllowed( } for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} { + p := p tc := fmt.Sprintf("When updating child dashboard permissions with %s permissions should be allowed", p.String()) Convey(tc, func() { @@ -523,6 +526,7 @@ func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsShouldNotBeAllow } for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} { + p := p tc := fmt.Sprintf("When updating child dashboard permissions with %s permissions should NOT be allowed", p.String()) Convey(tc, func() { @@ -586,6 +590,7 @@ func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsWithOverrideShou } for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} { + p := p // permission to update is higher than parent folder permission if p > parentFolderPermission { continue @@ -631,6 +636,7 @@ func (sc *scenarioContext) verifyUpdateChildDashboardPermissionsWithOverrideShou } for _, p := range []models.PermissionType{models.PERMISSION_ADMIN, models.PERMISSION_EDIT, models.PERMISSION_VIEW} { + p := p // permission to update is lower than or equal to parent folder permission if p <= parentFolderPermission { continue diff --git a/pkg/services/notifications/mailer.go b/pkg/services/notifications/mailer.go index f3ff047de25..37df519a7fa 100644 --- a/pkg/services/notifications/mailer.go +++ b/pkg/services/notifications/mailer.go @@ -78,6 +78,7 @@ func (ns *NotificationService) setFiles( } for _, file := range msg.AttachedFiles { + file := file m.Attach(file.Name, gomail.SetCopyFunc(func(writer io.Writer) error { _, err := writer.Write(file.Content) return err diff --git a/pkg/services/sqlstore/migrations/migrations_test.go b/pkg/services/sqlstore/migrations/migrations_test.go index 9172912d963..c4d12a57f23 100644 --- a/pkg/services/sqlstore/migrations/migrations_test.go +++ b/pkg/services/sqlstore/migrations/migrations_test.go @@ -16,6 +16,7 @@ func TestMigrations(t *testing.T) { } for _, testDB := range testDBs { + testDB := testDB sql := `select count(*) as count from migration_log` r := struct { Count int64 diff --git a/pkg/services/sqlstore/migrator/migrator.go b/pkg/services/sqlstore/migrator/migrator.go index 671c379991e..189769f97e2 100644 --- a/pkg/services/sqlstore/migrator/migrator.go +++ b/pkg/services/sqlstore/migrator/migrator.go @@ -81,6 +81,7 @@ func (mg *Migrator) Start() error { } for _, m := range mg.migrations { + m := m _, exists := logMap[m.Id()] if exists { mg.Logger.Debug("Skipping migration: Already executed", "id", m.Id()) diff --git a/pkg/services/sqlstore/sqlstore_test.go b/pkg/services/sqlstore/sqlstore_test.go index 99896ca4e9d..f87a865c4cf 100644 --- a/pkg/services/sqlstore/sqlstore_test.go +++ b/pkg/services/sqlstore/sqlstore_test.go @@ -71,6 +71,7 @@ func TestSqlConnectionString(t *testing.T) { t.Helper() for _, testCase := range sqlStoreTestCases { + testCase := testCase Convey(testCase.name, func() { sqlstore := &SqlStore{} sqlstore.Cfg = makeSqlStoreTestConfig(testCase.dbType, testCase.dbHost) diff --git a/pkg/tsdb/azuremonitor/applicationinsights-datasource_test.go b/pkg/tsdb/azuremonitor/applicationinsights-datasource_test.go index 4ccb832e6d1..13a196b0802 100644 --- a/pkg/tsdb/azuremonitor/applicationinsights-datasource_test.go +++ b/pkg/tsdb/azuremonitor/applicationinsights-datasource_test.go @@ -275,6 +275,7 @@ func TestAppInsightsPluginRoutes(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { route, routeName, err := datasource.getPluginRoute(plugin, tt.cloudName) tt.Err(t, err) diff --git a/pkg/tsdb/azuremonitor/azure-log-analytics-datasource_test.go b/pkg/tsdb/azuremonitor/azure-log-analytics-datasource_test.go index 879a80c0d8a..62ba45aebb7 100644 --- a/pkg/tsdb/azuremonitor/azure-log-analytics-datasource_test.go +++ b/pkg/tsdb/azuremonitor/azure-log-analytics-datasource_test.go @@ -69,6 +69,7 @@ func TestBuildingAzureLogAnalyticsQueries(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { queries, err := datasource.buildQueries(tt.queryModel, tt.timeRange) tt.Err(t, err) @@ -141,6 +142,7 @@ func TestPluginRoutes(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { route, proxypass, err := datasource.getPluginRoute(plugin, tt.cloudName) tt.Err(t, err) diff --git a/pkg/tsdb/azuremonitor/azure-log-analytics-table-frame_test.go b/pkg/tsdb/azuremonitor/azure-log-analytics-table-frame_test.go index 3aa9958b7c0..885b99db30a 100644 --- a/pkg/tsdb/azuremonitor/azure-log-analytics-table-frame_test.go +++ b/pkg/tsdb/azuremonitor/azure-log-analytics-table-frame_test.go @@ -122,6 +122,7 @@ func TestLogTableToFrame(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { res, err := loadLogAnalyticsTestFileWithNumber(tt.testFile) require.NoError(t, err) diff --git a/pkg/tsdb/azuremonitor/azuremonitor-datasource_test.go b/pkg/tsdb/azuremonitor/azuremonitor-datasource_test.go index 89aaa24049e..df2641135b4 100644 --- a/pkg/tsdb/azuremonitor/azuremonitor-datasource_test.go +++ b/pkg/tsdb/azuremonitor/azuremonitor-datasource_test.go @@ -98,6 +98,7 @@ func TestAzureMonitorBuildQueries(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { for k, v := range commonAzureModelProps { tt.azureMonitorVariedProperties[k] = v @@ -363,6 +364,7 @@ func TestAzureMonitorParseResponse(t *testing.T) { datasource := &AzureMonitorDatasource{} for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { azData, err := loadTestFile("azuremonitor/" + tt.responseFile) require.NoError(t, err) @@ -420,6 +422,7 @@ func TestFindClosestAllowIntervalMS(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { interval := findClosestAllowedIntervalMS(tt.inputInterval, tt.allowedTimeGrains) require.Equal(t, tt.expectedInterval, interval) diff --git a/pkg/tsdb/azuremonitor/macros_test.go b/pkg/tsdb/azuremonitor/macros_test.go index 98554832a06..00ff3446180 100644 --- a/pkg/tsdb/azuremonitor/macros_test.go +++ b/pkg/tsdb/azuremonitor/macros_test.go @@ -139,6 +139,7 @@ func TestAzureLogAnalyticsMacros(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { defaultTimeField := "TimeGenerated" rawQuery, err := KqlInterpolate(tt.query, timeRange, tt.kql, defaultTimeField) diff --git a/pkg/tsdb/elasticsearch/time_series_query.go b/pkg/tsdb/elasticsearch/time_series_query.go index 2d9ec205b15..87aea5305be 100644 --- a/pkg/tsdb/elasticsearch/time_series_query.go +++ b/pkg/tsdb/elasticsearch/time_series_query.go @@ -89,6 +89,7 @@ func (e *timeSeriesQuery) execute() (*tsdb.Response, error) { } for _, m := range q.Metrics { + m := m if m.Type == countType { continue } diff --git a/pkg/tsdb/frame_util_test.go b/pkg/tsdb/frame_util_test.go index d4a35192bf4..f84d06b3d6a 100644 --- a/pkg/tsdb/frame_util_test.go +++ b/pkg/tsdb/frame_util_test.go @@ -128,6 +128,7 @@ func TestFrameToSeriesSlice(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { seriesSlice, err := FrameToSeriesSlice(tt.frame) tt.Err(t, err) diff --git a/pkg/tsdb/influxdb/flux/macros_test.go b/pkg/tsdb/influxdb/flux/macros_test.go index 3a939bbc827..75521d0bf03 100644 --- a/pkg/tsdb/influxdb/flux/macros_test.go +++ b/pkg/tsdb/influxdb/flux/macros_test.go @@ -35,6 +35,7 @@ func TestInterpolate(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { query := QueryModel{ diff --git a/scripts/go/configs/.golangci.toml b/scripts/go/configs/.golangci.toml index 36ec974eb93..8b1019a46ec 100644 --- a/scripts/go/configs/.golangci.toml +++ b/scripts/go/configs/.golangci.toml @@ -29,7 +29,7 @@ enable = [ # "interfacer", # "misspell", "rowserrcheck", - # "scopelint", + "scopelint", "staticcheck", "structcheck", # "stylecheck",