Chore: Update test database initialization (#81673)

* streamline initialization of test databases, support on-disk sqlite test db

* clean up test databases

* introduce testsuite helper

* use testsuite everywhere we use a test db

* update documentation

* improve error handling

* disable entity integration test until we can figure out locking error
pull/82175/head^2
Dan Cech 1 year ago committed by GitHub
parent de4acb27ce
commit 790e1feb93
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 29
      contribute/backend/style-guide.md
  2. 11
      pkg/api/api_test.go
  3. 5
      pkg/api/pluginproxy/ds_proxy_test.go
  4. 5
      pkg/cmd/grafana-cli/commands/conflict_user_command_test.go
  5. 5
      pkg/cmd/grafana-cli/commands/datamigrations/encrypt_datasource_passwords_test.go
  6. 10
      pkg/infra/db/db.go
  7. 5
      pkg/infra/filestorage/fs_integration_test.go
  8. 5
      pkg/infra/kvstore/kvstore_test.go
  9. 5
      pkg/infra/remotecache/remotecache_test.go
  10. 5
      pkg/infra/serverlock/serverlock_test.go
  11. 5
      pkg/infra/usagestats/service/usage_stats_test.go
  12. 6
      pkg/infra/usagestats/statscollector/concurrent_users_test.go
  13. 5
      pkg/login/social/socialimpl/service_test.go
  14. 3
      pkg/server/wire.go
  15. 5
      pkg/services/accesscontrol/acimpl/service_test.go
  16. 6
      pkg/services/accesscontrol/database/database_test.go
  17. 5
      pkg/services/accesscontrol/filter_test.go
  18. 5
      pkg/services/accesscontrol/migrator/migrator_test.go
  19. 5
      pkg/services/accesscontrol/resourcepermissions/store_test.go
  20. 5
      pkg/services/alerting/service_test.go
  21. 5
      pkg/services/annotations/accesscontrol/accesscontrol_test.go
  22. 5
      pkg/services/annotations/annotationsimpl/annotations_test.go
  23. 5
      pkg/services/annotations/annotationsimpl/loki/historian_store_test.go
  24. 5
      pkg/services/anonymous/anonimpl/anonstore/database_test.go
  25. 5
      pkg/services/anonymous/anonimpl/impl_test.go
  26. 5
      pkg/services/apikey/apikeyimpl/store_test.go
  27. 5
      pkg/services/auth/authimpl/auth_token_test.go
  28. 5
      pkg/services/auth/jwt/auth_test.go
  29. 6
      pkg/services/dashboards/database/database_test.go
  30. 5
      pkg/services/dashboards/service/dashboard_service_integration_test.go
  31. 5
      pkg/services/dashboardsnapshots/database/database_test.go
  32. 5
      pkg/services/dashboardsnapshots/service/service_test.go
  33. 5
      pkg/services/dashboardversion/dashverimpl/store_test.go
  34. 5
      pkg/services/datasources/service/datasource_test.go
  35. 5
      pkg/services/extsvcauth/oauthserver/store/database_test.go
  36. 6
      pkg/services/folder/folderimpl/dashboard_folder_store_test.go
  37. 5
      pkg/services/libraryelements/libraryelements_test.go
  38. 6
      pkg/services/librarypanels/librarypanels_test.go
  39. 5
      pkg/services/live/database/tests/storage_test.go
  40. 5
      pkg/services/live/live_test.go
  41. 5
      pkg/services/login/authinfoimpl/store_test.go
  42. 5
      pkg/services/loginattempt/loginattemptimpl/store_test.go
  43. 5
      pkg/services/ngalert/api/api_provisioning_test.go
  44. 5
      pkg/services/ngalert/migration/migration_test.go
  45. 5
      pkg/services/ngalert/notifier/alertmanager_test.go
  46. 11
      pkg/services/ngalert/provisioning/provisioning_test.go
  47. 5
      pkg/services/ngalert/state/manager_test.go
  48. 5
      pkg/services/ngalert/store/alertmanager_test.go
  49. 5
      pkg/services/org/orgimpl/store_test.go
  50. 5
      pkg/services/playlist/playlistimpl/store_test.go
  51. 5
      pkg/services/pluginsintegration/plugins_integration_test.go
  52. 5
      pkg/services/pluginsintegration/pluginsettings/service/service_test.go
  53. 5
      pkg/services/preference/prefimpl/store_test.go
  54. 5
      pkg/services/provisioning/notifiers/config_reader_test.go
  55. 5
      pkg/services/publicdashboards/api/common_test.go
  56. 6
      pkg/services/publicdashboards/database/database_test.go
  57. 5
      pkg/services/publicdashboards/service/service_test.go
  58. 5
      pkg/services/query/query_test.go
  59. 5
      pkg/services/queryhistory/queryhistory_test.go
  60. 5
      pkg/services/quota/quotaimpl/store_test.go
  61. 5
      pkg/services/searchV2/service_bench_test.go
  62. 5
      pkg/services/secrets/kvstore/migrations/datasource_mig_test.go
  63. 5
      pkg/services/secrets/kvstore/plugin_test.go
  64. 5
      pkg/services/secrets/manager/manager_test.go
  65. 5
      pkg/services/serviceaccounts/database/store_test.go
  66. 5
      pkg/services/shorturls/shorturlimpl/shorturl_test.go
  67. 5
      pkg/services/signingkeys/signingkeystore/store_test.go
  68. 45
      pkg/services/sqlstore/migrations/accesscontrol/test/ac_test.go
  69. 86
      pkg/services/sqlstore/migrations/migrations_test.go
  70. 5
      pkg/services/sqlstore/permissions/dashboard_test.go
  71. 5
      pkg/services/sqlstore/searchstore/search_test.go
  72. 136
      pkg/services/sqlstore/sqlstore.go
  73. 8
      pkg/services/sqlstore/sqlstore_test.go
  74. 140
      pkg/services/sqlstore/sqlutil/sqlutil.go
  75. 5
      pkg/services/ssosettings/database/database_test.go
  76. 5
      pkg/services/star/starimpl/store_test.go
  77. 5
      pkg/services/stats/statsimpl/stats_test.go
  78. 5
      pkg/services/store/entity/sqlstash/sql_storage_server_test.go
  79. 5
      pkg/services/store/entity/tests/common_test.go
  80. 4
      pkg/services/store/entity/tests/server_integration_test.go
  81. 5
      pkg/services/store/service_test.go
  82. 5
      pkg/services/tag/tagimpl/store_test.go
  83. 5
      pkg/services/team/teamimpl/store_test.go
  84. 5
      pkg/services/temp_user/tempuserimpl/store_test.go
  85. 5
      pkg/services/user/userimpl/store_test.go
  86. 5
      pkg/tests/api/alerting/api_testing_test.go
  87. 5
      pkg/tests/api/azuremonitor/azuremonitor_test.go
  88. 5
      pkg/tests/api/correlations/common_test.go
  89. 5
      pkg/tests/api/dashboards/api_dashboards_test.go
  90. 5
      pkg/tests/api/elasticsearch/elasticsearch_test.go
  91. 5
      pkg/tests/api/folders/api_folders_test.go
  92. 5
      pkg/tests/api/graphite/graphite_test.go
  93. 5
      pkg/tests/api/influxdb/influxdb_test.go
  94. 5
      pkg/tests/api/loki/loki_test.go
  95. 5
      pkg/tests/api/opentdsb/opentdsb_test.go
  96. 5
      pkg/tests/api/plugins/api_plugins_test.go
  97. 5
      pkg/tests/api/plugins/backendplugin/backendplugin_test.go
  98. 5
      pkg/tests/api/prometheus/prometheus_test.go
  99. 5
      pkg/tests/api/stats/admin_test.go
  100. 18
      pkg/tests/testinfra/testinfra.go
  101. Some files were not shown because too many files have changed in this diff Show More

@ -29,13 +29,40 @@ We value clean and readable code, that is loosely coupled and covered by unit te
Tests must use the standard library, `testing`. For assertions, prefer using [testify](https://github.com/stretchr/testify). Tests must use the standard library, `testing`. For assertions, prefer using [testify](https://github.com/stretchr/testify).
### Test Suite and Database Tests
We have a [testsuite](https://github.com/grafana/grafana/tree/main/pkg/tests/testsuite) package which provides utilities for package-level setup and teardown.
Currently this is just used to ensure that test databases are correctly set up and torn down, but it also provides a place we can attach future tasks.
Each package SHOULD include a [TestMain](https://pkg.go.dev/testing#hdr-Main) function that calls `testsuite.Run(m)`:
```go
package mypkg
import (
"testing"
"github.com/grafana/grafana/pkg/tests/testsuite"
)
func TestMain(m *testing.M) {
testsuite.Run(m)
}
```
You only need to define `TestMain` in one `_test.go` file within each package.
> Warning
> For tests that use the database, you MUST define `TestMain` so that the test databases can be cleaned up properly.
### Integration Tests ### Integration Tests
We run unit and integration tests separately, to help keep our CI pipeline running smoothly and provide a better developer experience. We run unit and integration tests separately, to help keep our CI pipeline running smoothly and provide a better developer experience.
To properly mark a test as being an integration test, you must format your test function definition as follows, with the function name starting with `TestIntegration` and the check for `testing.Short()`: To properly mark a test as being an integration test, you must format your test function definition as follows, with the function name starting with `TestIntegration` and the check for `testing.Short()`:
``` ```go
func TestIntegrationFoo(t *testing.T) { func TestIntegrationFoo(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -0,0 +1,11 @@
package api
import (
"testing"
"github.com/grafana/grafana/pkg/tests/testsuite"
)
func TestMain(m *testing.M) {
testsuite.Run(m)
}

@ -45,9 +45,14 @@ import (
secretsmng "github.com/grafana/grafana/pkg/services/secrets/manager" secretsmng "github.com/grafana/grafana/pkg/services/secrets/manager"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/web" "github.com/grafana/grafana/pkg/web"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestDataSourceProxy_routeRule(t *testing.T) { func TestDataSourceProxy_routeRule(t *testing.T) {
cfg := &setting.Cfg{} cfg := &setting.Cfg{}

@ -23,11 +23,16 @@ import (
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/services/user/usertest" "github.com/grafana/grafana/pkg/services/user/usertest"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
// "Skipping conflicting users test for mysql as it does make unique constraint case insensitive by default // "Skipping conflicting users test for mysql as it does make unique constraint case insensitive by default
const ignoredDatabase = migrator.MySQL const ignoredDatabase = migrator.MySQL
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestBuildConflictBlock(t *testing.T) { func TestBuildConflictBlock(t *testing.T) {
type testBuildConflictBlock struct { type testBuildConflictBlock struct {
desc string desc string

@ -12,9 +12,14 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/services/datasources" "github.com/grafana/grafana/pkg/services/datasources"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestPasswordMigrationCommand(t *testing.T) { func TestPasswordMigrationCommand(t *testing.T) {
// setup datasources with password, basic_auth and none // setup datasources with password, basic_auth and none
store := db.InitTestDB(t) store := db.InitTestDB(t)

@ -10,6 +10,8 @@ import (
"github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/sqlstore/migrator" "github.com/grafana/grafana/pkg/services/sqlstore/migrator"
"github.com/grafana/grafana/pkg/services/sqlstore/session" "github.com/grafana/grafana/pkg/services/sqlstore/session"
"github.com/grafana/grafana/pkg/services/sqlstore/sqlutil"
"github.com/grafana/grafana/pkg/setting"
) )
type DB interface { type DB interface {
@ -51,10 +53,16 @@ type DB interface {
type Session = sqlstore.DBSession type Session = sqlstore.DBSession
type InitTestDBOpt = sqlstore.InitTestDBOpt type InitTestDBOpt = sqlstore.InitTestDBOpt
var SetupTestDB = sqlstore.SetupTestDB
var InitTestDB = sqlstore.InitTestDB var InitTestDB = sqlstore.InitTestDB
var InitTestDBwithCfg = sqlstore.InitTestDBWithCfg var CleanupTestDB = sqlstore.CleanupTestDB
var ProvideService = sqlstore.ProvideService var ProvideService = sqlstore.ProvideService
func InitTestDBwithCfg(t sqlutil.ITestDB, opts ...InitTestDBOpt) (*sqlstore.SQLStore, *setting.Cfg) {
store := InitTestDB(t, opts...)
return store, store.Cfg
}
func IsTestDbSQLite() bool { func IsTestDbSQLite() bool {
if db, present := os.LookupEnv("GRAFANA_TEST_DB"); !present || db == "sqlite" { if db, present := os.LookupEnv("GRAFANA_TEST_DB"); !present || db == "sqlite" {
return true return true

@ -12,12 +12,17 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
const ( const (
pngImageBase64 = "iVBORw0KGgoNAANSUhEUgAAAC4AAAAmCAYAAAC76qlaAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAABFSURBVFiF7c5BDQAhEACx4/x7XjzwGELSKuiamfke9N8OnBKvidfEa+I18Zp4TbwmXhOvidfEa+I18Zp4TbwmXhOvidc2lcsESD1LGnUAAAAASUVORK5CYII=" pngImageBase64 = "iVBORw0KGgoNAANSUhEUgAAAC4AAAAmCAYAAAC76qlaAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAABFSURBVFiF7c5BDQAhEACx4/x7XjzwGELSKuiamfke9N8OnBKvidfEa+I18Zp4TbwmXhOvidfEa+I18Zp4TbwmXhOvidc2lcsESD1LGnUAAAAASUVORK5CYII="
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
type fsTestCase struct { type fsTestCase struct {
name string name string
skip *bool skip *bool

@ -10,8 +10,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func createTestableKVStore(t *testing.T) KVStore { func createTestableKVStore(t *testing.T) KVStore {
t.Helper() t.Helper()

@ -13,8 +13,13 @@ import (
"github.com/grafana/grafana/pkg/services/secrets" "github.com/grafana/grafana/pkg/services/secrets"
"github.com/grafana/grafana/pkg/services/secrets/fakes" "github.com/grafana/grafana/pkg/services/secrets/fakes"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func createTestClient(t *testing.T, opts *setting.RemoteCacheOptions, sqlstore db.DB) CacheStorage { func createTestClient(t *testing.T, opts *setting.RemoteCacheOptions, sqlstore db.DB) CacheStorage {
t.Helper() t.Helper()

@ -11,8 +11,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/infra/tracing"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func createTestableServerLock(t *testing.T) *ServerLockService { func createTestableServerLock(t *testing.T) *ServerLockService {
t.Helper() t.Helper()

@ -25,8 +25,13 @@ import (
"github.com/grafana/grafana/pkg/services/accesscontrol/actest" "github.com/grafana/grafana/pkg/services/accesscontrol/actest"
"github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest" "github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
// This is to ensure that the interface contract is held by the implementation // This is to ensure that the interface contract is held by the implementation
func Test_InterfaceContractValidity(t *testing.T) { func Test_InterfaceContractValidity(t *testing.T) {
newUsageStats := func() usagestats.Service { newUsageStats := func() usagestats.Service {

@ -14,9 +14,15 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/services/stats/statsimpl" "github.com/grafana/grafana/pkg/services/stats/statsimpl"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
// run tests with cleanup
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestConcurrentUsersMetrics(t *testing.T) { func TestConcurrentUsersMetrics(t *testing.T) {
sqlStore, cfg := db.InitTestDBwithCfg(t) sqlStore, cfg := db.InitTestDBwithCfg(t)
statsService := statsimpl.ProvideService(&setting.Cfg{}, sqlStore) statsService := statsimpl.ProvideService(&setting.Cfg{}, sqlStore)

@ -18,8 +18,13 @@ import (
"github.com/grafana/grafana/pkg/services/ssosettings/ssosettingsimpl" "github.com/grafana/grafana/pkg/services/ssosettings/ssosettingsimpl"
"github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest" "github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestSocialService_ProvideService(t *testing.T) { func TestSocialService_ProvideService(t *testing.T) {
type testEnv struct { type testEnv struct {
features featuremgmt.FeatureToggles features featuremgmt.FeatureToggles

@ -131,6 +131,7 @@ import (
"github.com/grafana/grafana/pkg/services/signingkeys" "github.com/grafana/grafana/pkg/services/signingkeys"
"github.com/grafana/grafana/pkg/services/signingkeys/signingkeysimpl" "github.com/grafana/grafana/pkg/services/signingkeys/signingkeysimpl"
"github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/sqlstore/sqlutil"
"github.com/grafana/grafana/pkg/services/ssosettings" "github.com/grafana/grafana/pkg/services/ssosettings"
ssoSettingsImpl "github.com/grafana/grafana/pkg/services/ssosettings/ssosettingsimpl" ssoSettingsImpl "github.com/grafana/grafana/pkg/services/ssosettings/ssosettingsimpl"
starApi "github.com/grafana/grafana/pkg/services/star/api" starApi "github.com/grafana/grafana/pkg/services/star/api"
@ -441,7 +442,7 @@ func Initialize(cfg *setting.Cfg, opts Options, apiOpts api.ServerOptions) (*Ser
return &Server{}, nil return &Server{}, nil
} }
func InitializeForTest(cfg *setting.Cfg, opts Options, apiOpts api.ServerOptions) (*TestEnv, error) { func InitializeForTest(t sqlutil.ITestDB, cfg *setting.Cfg, opts Options, apiOpts api.ServerOptions) (*TestEnv, error) {
wire.Build(wireExtsTestSet) wire.Build(wireExtsTestSet)
return &TestEnv{Server: &Server{}, SQLStore: &sqlstore.SQLStore{}}, nil return &TestEnv{Server: &Server{}, SQLStore: &sqlstore.SQLStore{}}, nil
} }

@ -21,8 +21,13 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/usertest" "github.com/grafana/grafana/pkg/services/user/usertest"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func setupTestEnv(t testing.TB) *Service { func setupTestEnv(t testing.TB) *Service {
t.Helper() t.Helper()
cfg := setting.NewCfg() cfg := setting.NewCfg()

@ -23,8 +23,14 @@ import (
"github.com/grafana/grafana/pkg/services/team/teamimpl" "github.com/grafana/grafana/pkg/services/team/teamimpl"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
// run tests with cleanup
func TestMain(m *testing.M) {
testsuite.Run(m)
}
type getUserPermissionsTestCase struct { type getUserPermissionsTestCase struct {
desc string desc string
anonymousUser bool anonymousUser bool

@ -14,6 +14,7 @@ import (
"github.com/grafana/grafana/pkg/services/datasources" "github.com/grafana/grafana/pkg/services/datasources"
dsService "github.com/grafana/grafana/pkg/services/datasources/service" dsService "github.com/grafana/grafana/pkg/services/datasources/service"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
type filterDatasourcesTestCase struct { type filterDatasourcesTestCase struct {
@ -27,6 +28,10 @@ type filterDatasourcesTestCase struct {
expectErr bool expectErr bool
} }
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestFilter_Datasources(t *testing.T) { func TestFilter_Datasources(t *testing.T) {
tests := []filterDatasourcesTestCase{ tests := []filterDatasourcesTestCase{
{ {

@ -14,8 +14,13 @@ import (
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log"
ac "github.com/grafana/grafana/pkg/services/accesscontrol" ac "github.com/grafana/grafana/pkg/services/accesscontrol"
"github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func batchInsertPermissions(cnt int, sqlStore db.DB) error { func batchInsertPermissions(cnt int, sqlStore db.DB) error {
now := time.Now() now := time.Now()

@ -21,6 +21,7 @@ import (
"github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest" "github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
type setUserResourcePermissionTest struct { type setUserResourcePermissionTest struct {
@ -34,6 +35,10 @@ type setUserResourcePermissionTest struct {
seeds []SetResourcePermissionCommand seeds []SetResourcePermissionCommand
} }
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationStore_SetUserResourcePermission(t *testing.T) { func TestIntegrationStore_SetUserResourcePermission(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -18,8 +18,13 @@ import (
encryptionservice "github.com/grafana/grafana/pkg/services/encryption/service" encryptionservice "github.com/grafana/grafana/pkg/services/encryption/service"
"github.com/grafana/grafana/pkg/services/notifications" "github.com/grafana/grafana/pkg/services/notifications"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestService(t *testing.T) { func TestService(t *testing.T) {
sqlStore := &sqlStore{ sqlStore := &sqlStore{
db: db.InitTestDB(t), db: db.InitTestDB(t),

@ -12,9 +12,14 @@ import (
"github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/dashboards"
"github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationAuthorize(t *testing.T) { func TestIntegrationAuthorize(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -29,8 +29,13 @@ import (
"github.com/grafana/grafana/pkg/services/tag/tagimpl" "github.com/grafana/grafana/pkg/services/tag/tagimpl"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationAnnotationListingWithRBAC(t *testing.T) { func TestIntegrationAnnotationListingWithRBAC(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -27,11 +27,16 @@ import (
"github.com/grafana/grafana/pkg/services/ngalert/state/historian" "github.com/grafana/grafana/pkg/services/ngalert/state/historian"
historymodel "github.com/grafana/grafana/pkg/services/ngalert/state/historian/model" historymodel "github.com/grafana/grafana/pkg/services/ngalert/state/historian/model"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationAlertStateHistoryStore(t *testing.T) { func TestIntegrationAlertStateHistoryStore(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -9,8 +9,13 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationAnonStore_DeleteDevicesOlderThan(t *testing.T) { func TestIntegrationAnonStore_DeleteDevicesOlderThan(t *testing.T) {
store := db.InitTestDB(t) store := db.InitTestDB(t)
anonDBStore := ProvideAnonDBStore(store, 0) anonDBStore := ProvideAnonDBStore(store, 0)

@ -18,8 +18,13 @@ import (
"github.com/grafana/grafana/pkg/services/authn/authntest" "github.com/grafana/grafana/pkg/services/authn/authntest"
"github.com/grafana/grafana/pkg/services/org/orgtest" "github.com/grafana/grafana/pkg/services/org/orgtest"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationDeviceService_tag(t *testing.T) { func TestIntegrationDeviceService_tag(t *testing.T) {
type tagReq struct { type tagReq struct {
httpReq *http.Request httpReq *http.Request

@ -14,8 +14,13 @@ import (
"github.com/grafana/grafana/pkg/services/apikey" "github.com/grafana/grafana/pkg/services/apikey"
"github.com/grafana/grafana/pkg/services/auth/identity" "github.com/grafana/grafana/pkg/services/auth/identity"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
type getStore func(db.DB) store type getStore func(db.DB) store
type getApiKeysTestCase struct { type getApiKeysTestCase struct {

@ -19,8 +19,13 @@ import (
"github.com/grafana/grafana/pkg/services/quota" "github.com/grafana/grafana/pkg/services/quota"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationUserAuthToken(t *testing.T) { func TestIntegrationUserAuthToken(t *testing.T) {
ctx := createTestContext(t) ctx := createTestContext(t)
usr := &user.User{ID: int64(10)} usr := &user.User{ID: int64(10)}

@ -20,6 +20,7 @@ import (
"github.com/grafana/grafana/pkg/infra/remotecache" "github.com/grafana/grafana/pkg/infra/remotecache"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
type scenarioContext struct { type scenarioContext struct {
@ -39,6 +40,10 @@ type cachingScenarioFunc func(*testing.T, cachingScenarioContext)
const subject = "foo-subj" const subject = "foo-subj"
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestVerifyUsingPKIXPublicKeyFile(t *testing.T) { func TestVerifyUsingPKIXPublicKeyFile(t *testing.T) {
key := rsaKeys[0] key := rsaKeys[0]
unknownKey := rsaKeys[1] unknownKey := rsaKeys[1]

@ -29,9 +29,15 @@ import (
"github.com/grafana/grafana/pkg/services/tag/tagimpl" "github.com/grafana/grafana/pkg/services/tag/tagimpl"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
// run tests with cleanup
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationDashboardDataAccess(t *testing.T) { func TestIntegrationDashboardDataAccess(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -27,10 +27,15 @@ import (
"github.com/grafana/grafana/pkg/services/tag/tagimpl" "github.com/grafana/grafana/pkg/services/tag/tagimpl"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
const testOrgID int64 = 1 const testOrgID int64 = 1
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationIntegratedDashboardService(t *testing.T) { func TestIntegrationIntegratedDashboardService(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -18,8 +18,13 @@ import (
"github.com/grafana/grafana/pkg/services/secrets/fakes" "github.com/grafana/grafana/pkg/services/secrets/fakes"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationDashboardSnapshotDBAccess(t *testing.T) { func TestIntegrationDashboardSnapshotDBAccess(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -15,8 +15,13 @@ import (
"github.com/grafana/grafana/pkg/services/secrets/database" "github.com/grafana/grafana/pkg/services/secrets/database"
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/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestDashboardSnapshotsService(t *testing.T) { func TestDashboardSnapshotsService(t *testing.T) {
sqlStore := db.InitTestDB(t) sqlStore := db.InitTestDB(t)
cfg := setting.NewCfg() cfg := setting.NewCfg()

@ -13,9 +13,14 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/dashboards"
dashver "github.com/grafana/grafana/pkg/services/dashboardversion" dashver "github.com/grafana/grafana/pkg/services/dashboardversion"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
type getStore func(db.DB) store type getStore func(db.DB) store
func testIntegrationGetDashboardVersion(t *testing.T, fn getStore) { func testIntegrationGetDashboardVersion(t *testing.T, fn getStore) {

@ -31,8 +31,13 @@ import (
secretskvs "github.com/grafana/grafana/pkg/services/secrets/kvstore" secretskvs "github.com/grafana/grafana/pkg/services/secrets/kvstore"
secretsmng "github.com/grafana/grafana/pkg/services/secrets/manager" secretsmng "github.com/grafana/grafana/pkg/services/secrets/manager"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
type dataSourceMockRetriever struct { type dataSourceMockRetriever struct {
res []*datasources.DataSource res []*datasources.DataSource
} }

@ -12,8 +12,13 @@ import (
"github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/accesscontrol"
"github.com/grafana/grafana/pkg/services/extsvcauth/oauthserver" "github.com/grafana/grafana/pkg/services/extsvcauth/oauthserver"
"github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestStore_RegisterAndGetClient(t *testing.T) { func TestStore_RegisterAndGetClient(t *testing.T) {
s := &store{db: db.InitTestDB(t, db.InitTestDBOpt{FeatureFlags: []string{featuremgmt.FlagExternalServiceAuth}})} s := &store{db: db.InitTestDB(t, db.InitTestDBOpt{FeatureFlags: []string{featuremgmt.FlagExternalServiceAuth}})}
tests := []struct { tests := []struct {

@ -15,8 +15,14 @@ import (
"github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/tag/tagimpl" "github.com/grafana/grafana/pkg/services/tag/tagimpl"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
// run tests with cleanup
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationDashboardFolderStore(t *testing.T) { func TestIntegrationDashboardFolderStore(t *testing.T) {
var sqlStore *sqlstore.SQLStore var sqlStore *sqlstore.SQLStore
var cfg *setting.Cfg var cfg *setting.Cfg

@ -44,12 +44,17 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/web" "github.com/grafana/grafana/pkg/web"
) )
const userInDbName = "user_in_db" const userInDbName = "user_in_db"
const userInDbAvatar = "/avatar/402d08de060496d6b6874495fe20f5ad" const userInDbAvatar = "/avatar/402d08de060496d6b6874495fe20f5ad"
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestDeleteLibraryPanelsInFolder(t *testing.T) { func TestDeleteLibraryPanelsInFolder(t *testing.T) {
scenarioWithPanel(t, "When an admin tries to delete a folder that contains connected library elements, it should fail", scenarioWithPanel(t, "When an admin tries to delete a folder that contains connected library elements, it should fail",
func(t *testing.T, sc scenarioContext) { func(t *testing.T, sc scenarioContext) {

@ -40,11 +40,17 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
const userInDbName = "user_in_db" const userInDbName = "user_in_db"
const userInDbAvatar = "/avatar/402d08de060496d6b6874495fe20f5ad" const userInDbAvatar = "/avatar/402d08de060496d6b6874495fe20f5ad"
// run tests with cleanup
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestConnectLibraryPanelsForDashboard(t *testing.T) { func TestConnectLibraryPanelsForDashboard(t *testing.T) {
scenarioWithLibraryPanel(t, "When an admin tries to store a dashboard with a library panel, it should connect the two", scenarioWithLibraryPanel(t, "When an admin tries to store a dashboard with a library panel, it should connect the two",
func(t *testing.T, sc scenarioContext) { func(t *testing.T, sc scenarioContext) {

@ -7,8 +7,13 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/services/live/model" "github.com/grafana/grafana/pkg/services/live/model"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationLiveMessage(t *testing.T) { func TestIntegrationLiveMessage(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -17,8 +17,13 @@ import (
"github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/dashboards"
"github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func Test_provideLiveService_RedisUnavailable(t *testing.T) { func Test_provideLiveService_RedisUnavailable(t *testing.T) {
cfg := setting.NewCfg() cfg := setting.NewCfg()

@ -13,8 +13,13 @@ import (
"github.com/grafana/grafana/pkg/services/login" "github.com/grafana/grafana/pkg/services/login"
secretstest "github.com/grafana/grafana/pkg/services/secrets/fakes" secretstest "github.com/grafana/grafana/pkg/services/secrets/fakes"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationAuthInfoStore(t *testing.T) { func TestIntegrationAuthInfoStore(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -8,8 +8,13 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationLoginAttemptsQuery(t *testing.T) { func TestIntegrationLoginAttemptsQuery(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -35,10 +35,15 @@ import (
secrets_fakes "github.com/grafana/grafana/pkg/services/secrets/fakes" secrets_fakes "github.com/grafana/grafana/pkg/services/secrets/fakes"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
"github.com/grafana/grafana/pkg/web" "github.com/grafana/grafana/pkg/web"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestProvisioningApi(t *testing.T) { func TestProvisioningApi(t *testing.T) {
t.Run("policies", func(t *testing.T) { t.Run("policies", func(t *testing.T) {
t.Run("successful GET returns 200", func(t *testing.T) { t.Run("successful GET returns 200", func(t *testing.T) {

@ -30,9 +30,14 @@ import (
"github.com/grafana/grafana/pkg/services/ngalert/store" "github.com/grafana/grafana/pkg/services/ngalert/store"
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/tsdb/legacydata" "github.com/grafana/grafana/pkg/tsdb/legacydata"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
// TestServiceStart tests the wrapper method that decides when to run the migration based on migration status and settings. // TestServiceStart tests the wrapper method that decides when to run the migration based on migration status and settings.
func TestServiceStart(t *testing.T) { func TestServiceStart(t *testing.T) {
tc := []struct { tc := []struct {

@ -17,8 +17,13 @@ import (
"github.com/grafana/grafana/pkg/services/secrets/database" "github.com/grafana/grafana/pkg/services/secrets/database"
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/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func setupAMTest(t *testing.T) *alertmanager { func setupAMTest(t *testing.T) *alertmanager {
dir := t.TempDir() dir := t.TempDir()
cfg := &setting.Cfg{ cfg := &setting.Cfg{

@ -0,0 +1,11 @@
package provisioning
import (
"testing"
"github.com/grafana/grafana/pkg/tests/testsuite"
)
func TestMain(m *testing.M) {
testsuite.Run(m)
}

@ -34,9 +34,14 @@ import (
"github.com/grafana/grafana/pkg/services/ngalert/state" "github.com/grafana/grafana/pkg/services/ngalert/state"
"github.com/grafana/grafana/pkg/services/ngalert/state/historian" "github.com/grafana/grafana/pkg/services/ngalert/state/historian"
"github.com/grafana/grafana/pkg/services/ngalert/tests" "github.com/grafana/grafana/pkg/services/ngalert/tests"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestWarmStateCache(t *testing.T) { func TestWarmStateCache(t *testing.T) {
evaluationTime, err := time.Parse("2006-01-02", "2021-03-25") evaluationTime, err := time.Parse("2006-01-02", "2021-03-25")
require.NoError(t, err) require.NoError(t, err)

@ -13,8 +13,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/models"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationAlertmanagerStore(t *testing.T) { func TestIntegrationAlertmanagerStore(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -21,8 +21,13 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationOrgDataAccess(t *testing.T) { func TestIntegrationOrgDataAccess(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -11,8 +11,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/services/playlist" "github.com/grafana/grafana/pkg/services/playlist"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
type getStore func(db.DB) store type getStore func(db.DB) store
func testIntegrationPlaylistDataAccess(t *testing.T, fn getStore) { func testIntegrationPlaylistDataAccess(t *testing.T, fn getStore) {

@ -22,6 +22,7 @@ import (
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
"github.com/grafana/grafana/pkg/services/searchV2" "github.com/grafana/grafana/pkg/services/searchV2"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/tsdb/azuremonitor" "github.com/grafana/grafana/pkg/tsdb/azuremonitor"
cloudmonitoring "github.com/grafana/grafana/pkg/tsdb/cloud-monitoring" cloudmonitoring "github.com/grafana/grafana/pkg/tsdb/cloud-monitoring"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch" "github.com/grafana/grafana/pkg/tsdb/cloudwatch"
@ -41,6 +42,10 @@ import (
"github.com/grafana/grafana/pkg/tsdb/tempo" "github.com/grafana/grafana/pkg/tsdb/tempo"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationPluginManager(t *testing.T) { func TestIntegrationPluginManager(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -12,8 +12,13 @@ import (
"github.com/grafana/grafana/pkg/services/secrets" "github.com/grafana/grafana/pkg/services/secrets"
"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/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestService_DecryptedValuesCache(t *testing.T) { func TestService_DecryptedValuesCache(t *testing.T) {
t.Run("When plugin settings hasn't been updated, encrypted JSON should be fetched from cache", func(t *testing.T) { t.Run("When plugin settings hasn't been updated, encrypted JSON should be fetched from cache", func(t *testing.T) {
ctx := context.Background() ctx := context.Background()

@ -11,8 +11,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
pref "github.com/grafana/grafana/pkg/services/preference" pref "github.com/grafana/grafana/pkg/services/preference"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
type getStore func(db.DB) store type getStore func(db.DB) store
func testIntegrationPreferencesDataAccess(t *testing.T, fn getStore) { func testIntegrationPreferencesDataAccess(t *testing.T, fn getStore) {

@ -19,6 +19,7 @@ import (
"github.com/grafana/grafana/pkg/services/quota/quotatest" "github.com/grafana/grafana/pkg/services/quota/quotatest"
"github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
var ( var (
@ -34,6 +35,10 @@ var (
unknownNotifier = "./testdata/test-configs/unknown-notifier" unknownNotifier = "./testdata/test-configs/unknown-notifier"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestNotificationAsConfig(t *testing.T) { func TestNotificationAsConfig(t *testing.T) {
var sqlStore *sqlstore.SQLStore var sqlStore *sqlstore.SQLStore
var orgService org.Service var orgService org.Service

@ -34,9 +34,14 @@ import (
fakeSecrets "github.com/grafana/grafana/pkg/services/secrets/fakes" fakeSecrets "github.com/grafana/grafana/pkg/services/secrets/fakes"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/web" "github.com/grafana/grafana/pkg/web"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func setupTestServer( func setupTestServer(
t *testing.T, t *testing.T,
cfg *setting.Cfg, cfg *setting.Cfg,

@ -24,6 +24,7 @@ import (
"github.com/grafana/grafana/pkg/services/tag/tagimpl" "github.com/grafana/grafana/pkg/services/tag/tagimpl"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
@ -33,6 +34,11 @@ var DefaultTimeSettings = &TimeSettings{}
// Default time to pass in with seconds rounded // Default time to pass in with seconds rounded
var DefaultTime = time.Now().UTC().Round(time.Second) var DefaultTime = time.Now().UTC().Round(time.Second)
// run tests with cleanup
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestLogPrefix(t *testing.T) { func TestLogPrefix(t *testing.T) {
assert.Equal(t, LogPrefix, "publicdashboards.store") assert.Equal(t, LogPrefix, "publicdashboards.store")
} }

@ -31,6 +31,7 @@ import (
"github.com/grafana/grafana/pkg/services/tag/tagimpl" "github.com/grafana/grafana/pkg/services/tag/tagimpl"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
"github.com/grafana/grafana/pkg/util/errutil" "github.com/grafana/grafana/pkg/util/errutil"
) )
@ -40,6 +41,10 @@ var defaultPubdashTimeSettings = &TimeSettings{}
var dashboardData = simplejson.NewFromAny(map[string]any{"time": map[string]any{"from": "now-8h", "to": "now"}}) var dashboardData = simplejson.NewFromAny(map[string]any{"time": map[string]any{"from": "now-8h", "to": "now"}})
var SignedInUser = &user.SignedInUser{UserID: 1234, Login: "user@login.com"} var SignedInUser = &user.SignedInUser{UserID: 1234, Login: "user@login.com"}
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestLogPrefix(t *testing.T) { func TestLogPrefix(t *testing.T) {
assert.Equal(t, LogPrefix, "publicdashboards.service") assert.Equal(t, LogPrefix, "publicdashboards.service")
} }

@ -41,9 +41,14 @@ import (
secretsmng "github.com/grafana/grafana/pkg/services/secrets/manager" secretsmng "github.com/grafana/grafana/pkg/services/secrets/manager"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/web" "github.com/grafana/grafana/pkg/web"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestParseMetricRequest(t *testing.T) { func TestParseMetricRequest(t *testing.T) {
t.Run("Test a simple single datasource query", func(t *testing.T) { t.Run("Test a simple single datasource query", func(t *testing.T) {
tc := setup(t) tc := setup(t)

@ -23,6 +23,7 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/web" "github.com/grafana/grafana/pkg/web"
) )
@ -33,6 +34,10 @@ var (
testDsUID2 = "ABch1a1" testDsUID2 = "ABch1a1"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
type scenarioContext struct { type scenarioContext struct {
ctx *web.Context ctx *web.Context
service *QueryHistoryService service *QueryHistoryService

@ -8,8 +8,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/services/quota" "github.com/grafana/grafana/pkg/services/quota"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationQuotaDataAccess(t *testing.T) { func TestIntegrationQuotaDataAccess(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -19,8 +19,13 @@ import (
"github.com/grafana/grafana/pkg/services/store" "github.com/grafana/grafana/pkg/services/store"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
// setupBenchEnv will set up a database with folderCount folders and dashboardsPerFolder dashboards per folder // setupBenchEnv will set up a database with folderCount folders and dashboardsPerFolder dashboards per folder
// It will also set up and run the search service // It will also set up and run the search service
// and create a signed in user object with explicit permissions on each dashboard and folder. // and create a signed in user object with explicit permissions on each dashboard and folder.

@ -20,8 +20,13 @@ import (
secretskvs "github.com/grafana/grafana/pkg/services/secrets/kvstore" secretskvs "github.com/grafana/grafana/pkg/services/secrets/kvstore"
secretsmng "github.com/grafana/grafana/pkg/services/secrets/manager" secretsmng "github.com/grafana/grafana/pkg/services/secrets/manager"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func SetupTestDataSourceSecretMigrationService(t *testing.T, sqlStore db.DB, kvStore kvstore.KVStore, secretsStore secretskvs.SecretsKVStore, compatibility bool) *DataSourceSecretMigrationService { func SetupTestDataSourceSecretMigrationService(t *testing.T, sqlStore db.DB, kvStore kvstore.KVStore, secretsStore secretskvs.SecretsKVStore, compatibility bool) *DataSourceSecretMigrationService {
t.Helper() t.Helper()
cfg := &setting.Cfg{} cfg := &setting.Cfg{}

@ -8,8 +8,13 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/plugins/backendplugin/secretsmanagerplugin" "github.com/grafana/grafana/pkg/plugins/backendplugin/secretsmanagerplugin"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
// Set fatal flag to true, then simulate a plugin start failure // Set fatal flag to true, then simulate a plugin start failure
// Should result in an error from the secret store provider // Should result in an error from the secret store provider
func TestFatalPluginErr_PluginFailsToStartWithFatalFlagSet(t *testing.T) { func TestFatalPluginErr_PluginFailsToStartWithFatalFlagSet(t *testing.T) {

@ -20,9 +20,14 @@ import (
"github.com/grafana/grafana/pkg/services/secrets/database" "github.com/grafana/grafana/pkg/services/secrets/database"
"github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestSecretsService_EnvelopeEncryption(t *testing.T) { func TestSecretsService_EnvelopeEncryption(t *testing.T) {
testDB := db.InitTestDB(t) testDB := db.InitTestDB(t)
store := database.ProvideSecretsStore(testDB) store := database.ProvideSecretsStore(testDB)

@ -20,8 +20,13 @@ import (
"github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest" "github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
// Service Account should not create an org on its own // Service Account should not create an org on its own
func TestStore_CreateServiceAccountOrgNonExistant(t *testing.T) { func TestStore_CreateServiceAccountOrgNonExistant(t *testing.T) {
_, store := setupTestDatabase(t) _, store := setupTestDatabase(t)

@ -10,8 +10,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/services/shorturls" "github.com/grafana/grafana/pkg/services/shorturls"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestShortURLService(t *testing.T) { func TestShortURLService(t *testing.T) {
user := &user.SignedInUser{UserID: 1} user := &user.SignedInUser{UserID: 1}
store := db.InitTestDB(t) store := db.InitTestDB(t)

@ -10,8 +10,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/services/signingkeys" "github.com/grafana/grafana/pkg/services/signingkeys"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationSigningKeyStore(t *testing.T) { func TestIntegrationSigningKeyStore(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -2,7 +2,6 @@ package test
import ( import (
"fmt" "fmt"
"os"
"testing" "testing"
"time" "time"
@ -105,37 +104,6 @@ func convertToRawPermissions(permissions []accesscontrol.Permission) []rawPermis
return raw return raw
} }
func getDBType() string {
dbType := migrator.SQLite
// environment variable present for test db?
if db, present := os.LookupEnv("GRAFANA_TEST_DB"); present {
dbType = db
}
return dbType
}
func getTestDB(t *testing.T, dbType string) sqlutil.TestDB {
switch dbType {
case "mysql":
return sqlutil.MySQLTestDB()
case "postgres":
return sqlutil.PostgresTestDB()
default:
f, err := os.CreateTemp(".", "grafana-test-db-")
require.NoError(t, err)
t.Cleanup(func() {
err := os.Remove(f.Name())
require.NoError(t, err)
})
return sqlutil.TestDB{
DriverName: "sqlite3",
ConnStr: f.Name(),
}
}
}
func TestMigrations(t *testing.T) { func TestMigrations(t *testing.T) {
// Run initial migration to have a working DB // Run initial migration to have a working DB
x := setupTestDB(t) x := setupTestDB(t)
@ -253,12 +221,21 @@ func TestMigrations(t *testing.T) {
func setupTestDB(t *testing.T) *xorm.Engine { func setupTestDB(t *testing.T) *xorm.Engine {
t.Helper() t.Helper()
dbType := getDBType() dbType := sqlutil.GetTestDBType()
testDB := getTestDB(t, dbType) testDB, err := sqlutil.GetTestDB(dbType)
require.NoError(t, err)
t.Cleanup(testDB.Cleanup)
x, err := xorm.NewEngine(testDB.DriverName, testDB.ConnStr) x, err := xorm.NewEngine(testDB.DriverName, testDB.ConnStr)
require.NoError(t, err) require.NoError(t, err)
t.Cleanup(func() {
if err := x.Close(); err != nil {
fmt.Printf("failed to close xorm engine: %v", err)
}
})
err = migrator.NewDialect(x.DriverName()).CleanDB(x) err = migrator.NewDialect(x.DriverName()).CleanDB(x)
require.NoError(t, err) require.NoError(t, err)

@ -3,7 +3,6 @@ package migrations
import ( import (
"errors" "errors"
"fmt" "fmt"
"os"
"strings" "strings"
"sync" "sync"
"sync/atomic" "sync/atomic"
@ -21,13 +20,23 @@ import (
) )
func TestMigrations(t *testing.T) { func TestMigrations(t *testing.T) {
testDB := sqlutil.SQLite3TestDB() testDB, err := sqlutil.GetTestDB(SQLite)
require.NoError(t, err)
t.Cleanup(testDB.Cleanup)
const query = `select count(*) as count from migration_log` const query = `select count(*) as count from migration_log`
result := struct{ Count int }{} result := struct{ Count int }{}
x, err := xorm.NewEngine(testDB.DriverName, testDB.ConnStr) x, err := xorm.NewEngine(testDB.DriverName, testDB.ConnStr)
require.NoError(t, err) require.NoError(t, err)
t.Cleanup(func() {
if err := x.Close(); err != nil {
fmt.Printf("failed to close xorm engine: %v", err)
}
})
err = NewDialect(x.DriverName()).CleanDB(x) err = NewDialect(x.DriverName()).CleanDB(x)
require.NoError(t, err) require.NoError(t, err)
@ -61,16 +70,25 @@ func TestMigrations(t *testing.T) {
} }
func TestMigrationLock(t *testing.T) { func TestMigrationLock(t *testing.T) {
dbType := getDBType() dbType := sqlutil.GetTestDBType()
if dbType == SQLite { if dbType == SQLite {
t.Skip() t.Skip()
} }
testDB := getTestDB(t, dbType) testDB, err := sqlutil.GetTestDB(dbType)
require.NoError(t, err)
t.Cleanup(testDB.Cleanup)
x, err := xorm.NewEngine(testDB.DriverName, testDB.ConnStr) x, err := xorm.NewEngine(testDB.DriverName, testDB.ConnStr)
require.NoError(t, err) require.NoError(t, err)
t.Cleanup(func() {
if err := x.Close(); err != nil {
fmt.Printf("failed to close xorm engine: %v", err)
}
})
dialect := NewDialect(x.DriverName()) dialect := NewDialect(x.DriverName())
sess := x.NewSession() sess := x.NewSession()
@ -157,17 +175,28 @@ func TestMigrationLock(t *testing.T) {
} }
func TestMigratorLocking(t *testing.T) { func TestMigratorLocking(t *testing.T) {
dbType := getDBType() dbType := sqlutil.GetTestDBType()
testDB := getTestDB(t, dbType)
// skip for SQLite for now since it occasionally fails for not clear reason // skip for SQLite for now since it occasionally fails for not clear reason
// anyway starting migrations concurretly for the same migrator is impossible use case // anyway starting migrations concurretly for the same migrator is impossible use case
if dbType == SQLite { if dbType == SQLite {
t.Skip() t.Skip()
} }
testDB, err := sqlutil.GetTestDB(dbType)
require.NoError(t, err)
t.Cleanup(testDB.Cleanup)
x, err := xorm.NewEngine(testDB.DriverName, testDB.ConnStr) x, err := xorm.NewEngine(testDB.DriverName, testDB.ConnStr)
require.NoError(t, err) require.NoError(t, err)
t.Cleanup(func() {
if err := x.Close(); err != nil {
fmt.Printf("failed to close xorm engine: %v", err)
}
})
err = NewDialect(x.DriverName()).CleanDB(x) err = NewDialect(x.DriverName()).CleanDB(x)
require.NoError(t, err) require.NoError(t, err)
@ -194,17 +223,27 @@ func TestMigratorLocking(t *testing.T) {
} }
func TestDatabaseLocking(t *testing.T) { func TestDatabaseLocking(t *testing.T) {
dbType := getDBType() dbType := sqlutil.GetTestDBType()
// skip for SQLite since there is no database locking (only migrator locking) // skip for SQLite since there is no database locking (only migrator locking)
if dbType == SQLite { if dbType == SQLite {
t.Skip() t.Skip()
} }
testDB := getTestDB(t, dbType) testDB, err := sqlutil.GetTestDB(dbType)
require.NoError(t, err)
t.Cleanup(testDB.Cleanup)
x, err := xorm.NewEngine(testDB.DriverName, testDB.ConnStr) x, err := xorm.NewEngine(testDB.DriverName, testDB.ConnStr)
require.NoError(t, err) require.NoError(t, err)
t.Cleanup(func() {
if err := x.Close(); err != nil {
fmt.Printf("failed to close xorm engine: %v", err)
}
})
err = NewDialect(x.DriverName()).CleanDB(x) err = NewDialect(x.DriverName()).CleanDB(x)
require.NoError(t, err) require.NoError(t, err)
@ -280,37 +319,6 @@ func checkStepsAndDatabaseMatch(t *testing.T, mg *Migrator, expected []string) {
require.Failf(t, "the number of migrations does not match log in database", msg) require.Failf(t, "the number of migrations does not match log in database", msg)
} }
func getDBType() string {
dbType := SQLite
// environment variable present for test db?
if db, present := os.LookupEnv("GRAFANA_TEST_DB"); present {
dbType = db
}
return dbType
}
func getTestDB(t *testing.T, dbType string) sqlutil.TestDB {
switch dbType {
case "mysql":
return sqlutil.MySQLTestDB()
case "postgres":
return sqlutil.PostgresTestDB()
default:
f, err := os.CreateTemp(".", "grafana-test-db-")
require.NoError(t, err)
t.Cleanup(func() {
err := os.Remove(f.Name())
require.NoError(t, err)
})
return sqlutil.TestDB{
DriverName: "sqlite3",
ConnStr: f.Name(),
}
}
}
func replaceDBName(t *testing.T, connStr, dbType string) string { func replaceDBName(t *testing.T, connStr, dbType string) string {
switch dbType { switch dbType {
case "mysql": case "mysql":

@ -31,8 +31,13 @@ import (
"github.com/grafana/grafana/pkg/services/sqlstore/searchstore" "github.com/grafana/grafana/pkg/services/sqlstore/searchstore"
"github.com/grafana/grafana/pkg/services/tag/tagimpl" "github.com/grafana/grafana/pkg/services/tag/tagimpl"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegration_DashboardPermissionFilter(t *testing.T) { func TestIntegration_DashboardPermissionFilter(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -18,6 +18,7 @@ import (
"github.com/grafana/grafana/pkg/services/sqlstore/permissions" "github.com/grafana/grafana/pkg/services/sqlstore/permissions"
"github.com/grafana/grafana/pkg/services/sqlstore/searchstore" "github.com/grafana/grafana/pkg/services/sqlstore/searchstore"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
@ -26,6 +27,10 @@ const (
page int64 = 1 page int64 = 1
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestBuilder_EqualResults_Basic(t *testing.T) { func TestBuilder_EqualResults_Basic(t *testing.T) {
user := &user.SignedInUser{ user := &user.SignedInUser{
UserID: 1, UserID: 1,

@ -91,8 +91,8 @@ func ProvideService(cfg *setting.Cfg,
return s, nil return s, nil
} }
func ProvideServiceForTests(cfg *setting.Cfg, features featuremgmt.FeatureToggles, migrations registry.DatabaseMigrator) (*SQLStore, error) { func ProvideServiceForTests(t sqlutil.ITestDB, cfg *setting.Cfg, features featuremgmt.FeatureToggles, migrations registry.DatabaseMigrator) (*SQLStore, error) {
return initTestDB(cfg, features, migrations, InitTestDBOpt{EnsureDefaultOrgAndUser: true}) return initTestDB(t, cfg, features, migrations, InitTestDBOpt{EnsureDefaultOrgAndUser: true})
} }
func newSQLStore(cfg *setting.Cfg, engine *xorm.Engine, func newSQLStore(cfg *setting.Cfg, engine *xorm.Engine,
@ -145,11 +145,6 @@ func (ss *SQLStore) Migrate(isDatabaseLockingEnabled bool) error {
return migrator.Start(isDatabaseLockingEnabled, ss.dbCfg.MigrationLockAttemptTimeout) return migrator.Start(isDatabaseLockingEnabled, ss.dbCfg.MigrationLockAttemptTimeout)
} }
// Sync syncs changes to the database.
func (ss *SQLStore) Sync() error {
return ss.engine.Sync2()
}
// Reset resets database state. // Reset resets database state.
// If default org and user creation is enabled, it will be ensured they exist in the database. // If default org and user creation is enabled, it will be ensured they exist in the database.
func (ss *SQLStore) Reset() error { func (ss *SQLStore) Reset() error {
@ -388,16 +383,10 @@ func (ss *SQLStore) RecursiveQueriesAreSupported() (bool, error) {
return *ss.recursiveQueriesAreSupported, nil return *ss.recursiveQueriesAreSupported, nil
} }
// ITestDB is an interface of arguments for testing db var testSQLStoreSetup = false
type ITestDB interface {
Helper()
Fatalf(format string, args ...any)
Logf(format string, args ...any)
Log(args ...any)
}
var testSQLStore *SQLStore var testSQLStore *SQLStore
var testSQLStoreMutex sync.Mutex var testSQLStoreMutex sync.Mutex
var testSQLStoreCleanup []func()
// InitTestDBOpt contains options for InitTestDB. // InitTestDBOpt contains options for InitTestDB.
type InitTestDBOpt struct { type InitTestDBOpt struct {
@ -407,10 +396,10 @@ type InitTestDBOpt struct {
} }
// InitTestDBWithMigration initializes the test DB given custom migrations. // InitTestDBWithMigration initializes the test DB given custom migrations.
func InitTestDBWithMigration(t ITestDB, migration registry.DatabaseMigrator, opts ...InitTestDBOpt) *SQLStore { func InitTestDBWithMigration(t sqlutil.ITestDB, migration registry.DatabaseMigrator, opts ...InitTestDBOpt) *SQLStore {
t.Helper() t.Helper()
features := getFeaturesForTesting(opts...) features := getFeaturesForTesting(opts...)
store, err := initTestDB(setting.NewCfg(), features, migration, opts...) store, err := initTestDB(t, setting.NewCfg(), features, migration, opts...)
if err != nil { if err != nil {
t.Fatalf("failed to initialize sql store: %s", err) t.Fatalf("failed to initialize sql store: %s", err)
} }
@ -418,20 +407,46 @@ func InitTestDBWithMigration(t ITestDB, migration registry.DatabaseMigrator, opt
} }
// InitTestDB initializes the test DB. // InitTestDB initializes the test DB.
func InitTestDB(t ITestDB, opts ...InitTestDBOpt) *SQLStore { func InitTestDB(t sqlutil.ITestDB, opts ...InitTestDBOpt) *SQLStore {
t.Helper() t.Helper()
features := getFeaturesForTesting(opts...) features := getFeaturesForTesting(opts...)
store, err := initTestDB(setting.NewCfg(), features, migrations.ProvideOSSMigrations(features), opts...) store, err := initTestDB(t, setting.NewCfg(), features, migrations.ProvideOSSMigrations(features), opts...)
if err != nil { if err != nil {
t.Fatalf("failed to initialize sql store: %s", err) t.Fatalf("failed to initialize sql store: %s", err)
} }
return store return store
} }
func InitTestDBWithCfg(t ITestDB, opts ...InitTestDBOpt) (*SQLStore, *setting.Cfg) { func SetupTestDB() {
store := InitTestDB(t, opts...) testSQLStoreMutex.Lock()
return store, store.Cfg defer testSQLStoreMutex.Unlock()
if testSQLStoreSetup {
fmt.Printf("ERROR: Test DB already set up, SetupTestDB called twice\n")
os.Exit(1)
}
testSQLStoreSetup = true
}
func CleanupTestDB() {
testSQLStoreMutex.Lock()
defer testSQLStoreMutex.Unlock()
if !testSQLStoreSetup {
fmt.Printf("ERROR: Test DB not set up, SetupTestDB not called\n")
os.Exit(1)
}
if testSQLStore != nil {
if err := testSQLStore.GetEngine().Close(); err != nil {
fmt.Printf("Failed to close testSQLStore engine: %s\n", err)
}
for _, cleanup := range testSQLStoreCleanup {
cleanup()
}
testSQLStoreCleanup = []func(){}
testSQLStore = nil
}
} }
func getFeaturesForTesting(opts ...InitTestDBOpt) featuremgmt.FeatureToggles { func getFeaturesForTesting(opts ...InitTestDBOpt) featuremgmt.FeatureToggles {
@ -450,24 +465,43 @@ func getFeaturesForTesting(opts ...InitTestDBOpt) featuremgmt.FeatureToggles {
} }
//nolint:gocyclo //nolint:gocyclo
func initTestDB(testCfg *setting.Cfg, func initTestDB(t sqlutil.ITestDB, testCfg *setting.Cfg,
features featuremgmt.FeatureToggles, features featuremgmt.FeatureToggles,
migration registry.DatabaseMigrator, migration registry.DatabaseMigrator,
opts ...InitTestDBOpt) (*SQLStore, error) { opts ...InitTestDBOpt) (*SQLStore, error) {
testSQLStoreMutex.Lock() testSQLStoreMutex.Lock()
defer testSQLStoreMutex.Unlock() defer testSQLStoreMutex.Unlock()
if !testSQLStoreSetup {
t.Fatalf(`
ERROR: Test DB not set up, are you missing TestMain?
https://github.com/grafana/grafana/blob/main/contribute/backend/style-guide.md
Example:
package mypkg
import (
"testing"
"github.com/grafana/grafana/pkg/tests/testsuite"
)
func TestMain(m *testing.M) {
testsuite.Run(m)
}
`)
os.Exit(1)
}
if len(opts) == 0 { if len(opts) == 0 {
opts = []InitTestDBOpt{{EnsureDefaultOrgAndUser: false, FeatureFlags: []string{}}} opts = []InitTestDBOpt{{EnsureDefaultOrgAndUser: false, FeatureFlags: []string{}}}
} }
if testSQLStore == nil { if testSQLStore == nil {
dbType := migrator.SQLite dbType := sqlutil.GetTestDBType()
// environment variable present for test db?
if db, present := os.LookupEnv("GRAFANA_TEST_DB"); present {
dbType = db
}
// set test db config // set test db config
cfg := setting.NewCfg() cfg := setting.NewCfg()
@ -482,21 +516,21 @@ func initTestDB(testCfg *setting.Cfg,
if _, err := sec.NewKey("type", dbType); err != nil { if _, err := sec.NewKey("type", dbType); err != nil {
return nil, err return nil, err
} }
switch dbType {
case "mysql": testDB, err := sqlutil.GetTestDB(dbType)
if _, err := sec.NewKey("connection_string", sqlutil.MySQLTestDB().ConnStr); err != nil { if err != nil {
return nil, err return nil, err
} }
case "postgres":
if _, err := sec.NewKey("connection_string", sqlutil.PostgresTestDB().ConnStr); err != nil { if _, err := sec.NewKey("connection_string", testDB.ConnStr); err != nil {
return nil, err return nil, err
} }
default: if _, err := sec.NewKey("path", testDB.Path); err != nil {
if _, err := sec.NewKey("connection_string", sqlutil.SQLite3TestDB().ConnStr); err != nil { return nil, err
return nil, err
}
} }
testSQLStoreCleanup = append(testSQLStoreCleanup, testDB.Cleanup)
// useful if you already have a database that you want to use for tests. // useful if you already have a database that you want to use for tests.
// cannot just set it on testSQLStore as it overrides the config in Init // cannot just set it on testSQLStore as it overrides the config in Init
if _, present := os.LookupEnv("SKIP_MIGRATIONS"); present { if _, present := os.LookupEnv("SKIP_MIGRATIONS"); present {
@ -539,24 +573,6 @@ func initTestDB(testCfg *setting.Cfg,
if err := testSQLStore.Migrate(false); err != nil { if err := testSQLStore.Migrate(false); err != nil {
return nil, err return nil, err
} }
if err := testSQLStore.Dialect.TruncateDBTables(engine); err != nil {
return nil, err
}
if err := testSQLStore.Reset(); err != nil {
return nil, err
}
// Make sure the changes are synced, so they get shared with eventual other DB connections
// XXX: Why is this only relevant when not skipping migrations?
if !testSQLStore.dbCfg.SkipMigrations {
if err := testSQLStore.Sync(); err != nil {
return nil, err
}
}
return testSQLStore, nil
} }
// nolint:staticcheck // nolint:staticcheck

@ -2,6 +2,7 @@ package sqlstore
import ( import (
"context" "context"
"os"
"testing" "testing"
"time" "time"
@ -11,6 +12,13 @@ import (
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
) )
func TestMain(m *testing.M) {
SetupTestDB()
code := m.Run()
CleanupTestDB()
os.Exit(code)
}
func TestIntegrationIsUniqueConstraintViolation(t *testing.T) { func TestIntegrationIsUniqueConstraintViolation(t *testing.T) {
store := InitTestDB(t) store := InitTestDB(t)

@ -1,25 +1,123 @@
package sqlutil package sqlutil
import ( import (
"errors"
"fmt" "fmt"
"io/fs"
"os" "os"
"path/filepath"
) )
// ITestDB is an interface of arguments for testing db
type ITestDB interface {
Helper()
Fatalf(format string, args ...any)
Logf(format string, args ...any)
Log(args ...any)
Cleanup(func())
}
type TestDB struct { type TestDB struct {
DriverName string DriverName string
ConnStr string ConnStr string
Path string
Cleanup func()
} }
func SQLite3TestDB() TestDB { func GetTestDBType() string {
// To run all tests in a local test database, set ConnStr to "grafana_test.db" dbType := "sqlite3"
return TestDB{
// environment variable present for test db?
if db, present := os.LookupEnv("GRAFANA_TEST_DB"); present {
dbType = db
}
return dbType
}
func GetTestDB(dbType string) (*TestDB, error) {
switch dbType {
case "mysql":
return mySQLTestDB()
case "postgres":
return postgresTestDB()
case "sqlite3":
return sqLite3TestDB()
}
return nil, fmt.Errorf("unknown test db type: %s", dbType)
}
func sqLite3TestDB() (*TestDB, error) {
if os.Getenv("SQLITE_INMEMORY") == "true" {
return &TestDB{
DriverName: "sqlite3",
ConnStr: "file::memory:",
Cleanup: func() {},
}, nil
}
ret := &TestDB{
DriverName: "sqlite3", DriverName: "sqlite3",
// ConnStr specifies an In-memory database shared between connections. Cleanup: func() {},
ConnStr: "file::memory:?cache=shared",
} }
sqliteDb := os.Getenv("SQLITE_TEST_DB")
if sqliteDb == "" {
// try to create a database file in the user's cache directory
dir, err := os.UserCacheDir()
if err != nil {
return nil, err
}
// if cache dir doesn't exist, fall back to temp dir
if _, err := os.Stat(dir); errors.Is(err, fs.ErrNotExist) {
dir = os.TempDir()
if _, err := os.Stat(dir); err != nil {
return nil, err
}
}
err = os.Mkdir(filepath.Join(dir, "grafana-test"), 0750)
if err != nil && !errors.Is(err, fs.ErrExist) {
return nil, err
}
f, err := os.CreateTemp(filepath.Join(dir, "grafana-test"), "grafana-test-*.db")
if err != nil {
return nil, err
}
sqliteDb = f.Name()
ret.Cleanup = func() {
// remove db file if it exists
err := os.Remove(sqliteDb)
if err != nil && !errors.Is(err, fs.ErrNotExist) {
fmt.Printf("Error removing sqlite db file %s: %v\n", sqliteDb, err)
}
// remove wal & shm files if they exist
err = os.Remove(sqliteDb + "-wal")
if err != nil && !errors.Is(err, fs.ErrNotExist) {
fmt.Printf("Error removing sqlite wal file %s: %v\n", sqliteDb+"-wal", err)
}
err = os.Remove(sqliteDb + "-shm")
if err != nil && !errors.Is(err, fs.ErrNotExist) {
fmt.Printf("Error removing sqlite shm file %s: %v\n", sqliteDb+"-shm", err)
}
}
}
ret.ConnStr = "file:" + sqliteDb + "?cache=private&mode=rwc"
if os.Getenv("SQLITE_JOURNAL_MODE") != "false" {
ret.ConnStr += "&_journal_mode=WAL"
}
ret.Path = sqliteDb
return ret, nil
} }
func MySQLTestDB() TestDB { func mySQLTestDB() (*TestDB, error) {
host := os.Getenv("MYSQL_HOST") host := os.Getenv("MYSQL_HOST")
if host == "" { if host == "" {
host = "localhost" host = "localhost"
@ -29,13 +127,14 @@ func MySQLTestDB() TestDB {
port = "3306" port = "3306"
} }
conn_str := fmt.Sprintf("grafana:password@tcp(%s:%s)/grafana_tests?collation=utf8mb4_unicode_ci&sql_mode='ANSI_QUOTES'&parseTime=true", host, port) conn_str := fmt.Sprintf("grafana:password@tcp(%s:%s)/grafana_tests?collation=utf8mb4_unicode_ci&sql_mode='ANSI_QUOTES'&parseTime=true", host, port)
return TestDB{ return &TestDB{
DriverName: "mysql", DriverName: "mysql",
ConnStr: conn_str, ConnStr: conn_str,
} Cleanup: func() {},
}, nil
} }
func PostgresTestDB() TestDB { func postgresTestDB() (*TestDB, error) {
host := os.Getenv("POSTGRES_HOST") host := os.Getenv("POSTGRES_HOST")
if host == "" { if host == "" {
host = "localhost" host = "localhost"
@ -44,25 +143,10 @@ func PostgresTestDB() TestDB {
if port == "" { if port == "" {
port = "5432" port = "5432"
} }
connStr := fmt.Sprintf("user=grafanatest password=grafanatest host=%s port=%s dbname=grafanatest sslmode=disable", connStr := fmt.Sprintf("user=grafanatest password=grafanatest host=%s port=%s dbname=grafanatest sslmode=disable", host, port)
host, port) return &TestDB{
return TestDB{
DriverName: "postgres", DriverName: "postgres",
ConnStr: connStr, ConnStr: connStr,
} Cleanup: func() {},
} }, nil
func MSSQLTestDB() TestDB {
host := os.Getenv("MSSQL_HOST")
if host == "" {
host = "localhost"
}
port := os.Getenv("MSSQL_PORT")
if port == "" {
port = "1433"
}
return TestDB{
DriverName: "mssql",
ConnStr: fmt.Sprintf("server=%s;port=%s;database=grafanatest;user id=grafana;password=Password!", host, port),
}
} }

@ -12,12 +12,17 @@ import (
"github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/ssosettings" "github.com/grafana/grafana/pkg/services/ssosettings"
"github.com/grafana/grafana/pkg/services/ssosettings/models" "github.com/grafana/grafana/pkg/services/ssosettings/models"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
const ( const (
withinDuration = 5 * time.Minute withinDuration = 5 * time.Minute
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationGetSSOSettings(t *testing.T) { func TestIntegrationGetSSOSettings(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -8,8 +8,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/services/star" "github.com/grafana/grafana/pkg/services/star"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
type getStore func(db.DB) store type getStore func(db.DB) store
func testIntegrationUserStarsDataAccess(t *testing.T, fn getStore) { func testIntegrationUserStarsDataAccess(t *testing.T, fn getStore) {

@ -19,8 +19,13 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationStatsDataAccess(t *testing.T) { func TestIntegrationStatsDataAccess(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -11,8 +11,13 @@ import (
"github.com/grafana/grafana/pkg/services/store/entity" "github.com/grafana/grafana/pkg/services/store/entity"
"github.com/grafana/grafana/pkg/services/store/entity/db/dbimpl" "github.com/grafana/grafana/pkg/services/store/entity/db/dbimpl"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestCreate(t *testing.T) { func TestCreate(t *testing.T) {
s := setUpTestServer(t) s := setUpTestServer(t)

@ -18,8 +18,13 @@ import (
"github.com/grafana/grafana/pkg/services/store/entity/sqlstash" "github.com/grafana/grafana/pkg/services/store/entity/sqlstash"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func createServiceAccountAdminToken(t *testing.T, env *server.TestEnv) (string, *user.SignedInUser) { func createServiceAccountAdminToken(t *testing.T, env *server.TestEnv) (string, *user.SignedInUser) {
t.Helper() t.Helper()

@ -110,9 +110,9 @@ func requireVersionMatch(t *testing.T, obj *entity.Entity, m objectVersionMatche
} }
func TestIntegrationEntityServer(t *testing.T) { func TestIntegrationEntityServer(t *testing.T) {
// TODO figure out why this still runs into sqlite database locked error
if true { if true {
// TODO: enable this test once we fix test "database locked" issues t.Skip("skipping integration test")
t.Skip()
} }
if testing.Short() { if testing.Short() {

@ -19,6 +19,7 @@ import (
"github.com/grafana/grafana/pkg/services/quota/quotatest" "github.com/grafana/grafana/pkg/services/quota/quotatest"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
testdatasource "github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource" testdatasource "github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource"
) )
@ -68,6 +69,10 @@ var (
}}) }})
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestListFiles(t *testing.T) { func TestListFiles(t *testing.T) {
roots := []storageRuntime{publicStaticFilesStorage} roots := []storageRuntime{publicStaticFilesStorage}

@ -8,8 +8,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/services/tag" "github.com/grafana/grafana/pkg/services/tag"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
type getStore func(db.DB) store type getStore func(db.DB) store
func testIntegrationSavingTags(t *testing.T, fn getStore) { func testIntegrationSavingTags(t *testing.T, fn getStore) {

@ -22,8 +22,13 @@ import (
"github.com/grafana/grafana/pkg/services/team/sortopts" "github.com/grafana/grafana/pkg/services/team/sortopts"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationTeamCommandsAndQueries(t *testing.T) { func TestIntegrationTeamCommandsAndQueries(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -9,8 +9,13 @@ import (
"github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/db"
tempuser "github.com/grafana/grafana/pkg/services/temp_user" tempuser "github.com/grafana/grafana/pkg/services/temp_user"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationTempUserCommandsAndQueries(t *testing.T) { func TestIntegrationTempUserCommandsAndQueries(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -19,8 +19,13 @@ import (
"github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest" "github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationUserGet(t *testing.T) { func TestIntegrationUserGet(t *testing.T) {
testCases := []struct { testCases := []struct {
name string name string

@ -24,6 +24,7 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
@ -31,6 +32,10 @@ const (
TESTDATA_UID = "testdata" TESTDATA_UID = "testdata"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestGrafanaRuleConfig(t *testing.T) { func TestGrafanaRuleConfig(t *testing.T) {
dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{
DisableLegacyAlerting: true, DisableLegacyAlerting: true,

@ -18,8 +18,13 @@ import (
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationAzureMonitor(t *testing.T) { func TestIntegrationAzureMonitor(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -18,6 +18,7 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
type errorResponseBody struct { type errorResponseBody struct {
@ -30,6 +31,10 @@ type TestContext struct {
t *testing.T t *testing.T
} }
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func NewTestEnv(t *testing.T) TestContext { func NewTestEnv(t *testing.T) TestContext {
t.Helper() t.Helper()
dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{

@ -30,9 +30,14 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationDashboardQuota(t *testing.T) { func TestIntegrationDashboardQuota(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -18,8 +18,13 @@ import (
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationElasticsearch(t *testing.T) { func TestIntegrationElasticsearch(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -15,11 +15,16 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests" "github.com/grafana/grafana/pkg/tests"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/grafana/grafana/pkg/util/retryer" "github.com/grafana/grafana/pkg/util/retryer"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestGetFolders(t *testing.T) { func TestGetFolders(t *testing.T) {
// Setup Grafana and its Database // Setup Grafana and its Database
dir, p := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{ dir, p := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{

@ -18,8 +18,13 @@ import (
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationGraphite(t *testing.T) { func TestIntegrationGraphite(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -18,8 +18,13 @@ import (
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationInflux(t *testing.T) { func TestIntegrationInflux(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -18,8 +18,13 @@ import (
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationLoki(t *testing.T) { func TestIntegrationLoki(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -18,8 +18,13 @@ import (
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationOpenTSDB(t *testing.T) { func TestIntegrationOpenTSDB(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -22,6 +22,7 @@ import (
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
const ( const (
@ -32,6 +33,10 @@ const (
var updateSnapshotFlag = false var updateSnapshotFlag = false
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationPlugins(t *testing.T) { func TestIntegrationPlugins(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -27,10 +27,15 @@ import (
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
const loginCookieName = "grafana_session" const loginCookieName = "grafana_session"
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationBackendPlugins(t *testing.T) { func TestIntegrationBackendPlugins(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -17,8 +17,13 @@ import (
"github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationPrometheus(t *testing.T) { func TestIntegrationPrometheus(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")

@ -16,8 +16,13 @@ import (
"github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/services/user/userimpl" "github.com/grafana/grafana/pkg/services/user/userimpl"
"github.com/grafana/grafana/pkg/tests/testinfra" "github.com/grafana/grafana/pkg/tests/testinfra"
"github.com/grafana/grafana/pkg/tests/testsuite"
) )
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationAdminStats(t *testing.T) { func TestIntegrationAdminStats(t *testing.T) {
t.Run("with unified alerting enabled", func(t *testing.T) { t.Run("with unified alerting enabled", func(t *testing.T) {
url := grafanaSetup(t, testinfra.GrafanaOpts{ url := grafanaSetup(t, testinfra.GrafanaOpts{

@ -50,9 +50,8 @@ func StartGrafanaEnv(t *testing.T, grafDir, cfgPath string) (string, *server.Tes
serverOpts := server.Options{Listener: listener, HomePath: grafDir} serverOpts := server.Options{Listener: listener, HomePath: grafDir}
apiServerOpts := api.ServerOptions{Listener: listener} apiServerOpts := api.ServerOptions{Listener: listener}
env, err := server.InitializeForTest(cfg, serverOpts, apiServerOpts) env, err := server.InitializeForTest(t, cfg, serverOpts, apiServerOpts)
require.NoError(t, err) require.NoError(t, err)
require.NoError(t, env.SQLStore.Sync())
require.NotNil(t, env.SQLStore.Cfg) require.NotNil(t, env.SQLStore.Cfg)
dbSec, err := env.SQLStore.Cfg.Raw.GetSection("database") dbSec, err := env.SQLStore.Cfg.Raw.GetSection("database")
@ -99,21 +98,6 @@ func StartGrafanaEnv(t *testing.T, grafDir, cfgPath string) (string, *server.Tes
return addr, env return addr, env
} }
// SetUpDatabase sets up the Grafana database.
func SetUpDatabase(t *testing.T, grafDir string) *sqlstore.SQLStore {
t.Helper()
sqlStore := db.InitTestDB(t, sqlstore.InitTestDBOpt{
EnsureDefaultOrgAndUser: true,
})
// Make sure changes are synced with other goroutines
err := sqlStore.Sync()
require.NoError(t, err)
return sqlStore
}
// CreateGrafDir creates the Grafana directory. // CreateGrafDir creates the Grafana directory.
// The log by default is muted in the regression test, to activate it, pass option EnableLog = true // The log by default is muted in the regression test, to activate it, pass option EnableLog = true
func CreateGrafDir(t *testing.T, opts ...GrafanaOpts) (string, string) { func CreateGrafDir(t *testing.T, opts ...GrafanaOpts) (string, string) {

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save