gitea源码

tests.go 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package base
  4. import (
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. "runtime"
  9. "testing"
  10. "code.gitea.io/gitea/models/unittest"
  11. "code.gitea.io/gitea/modules/git"
  12. "code.gitea.io/gitea/modules/setting"
  13. "code.gitea.io/gitea/modules/tempdir"
  14. "code.gitea.io/gitea/modules/test"
  15. "code.gitea.io/gitea/modules/testlogger"
  16. "github.com/stretchr/testify/require"
  17. "xorm.io/xorm"
  18. )
  19. // FIXME: this file shouldn't be in a normal package, it should only be compiled for tests
  20. // PrepareTestEnv prepares the test environment and reset the database. The skip parameter should usually be 0.
  21. // Provide models to be sync'd with the database - in particular any models you expect fixtures to be loaded from.
  22. //
  23. // fixtures in `models/migrations/fixtures/<TestName>` will be loaded automatically
  24. func PrepareTestEnv(t *testing.T, skip int, syncModels ...any) (*xorm.Engine, func()) {
  25. t.Helper()
  26. ourSkip := 2
  27. ourSkip += skip
  28. deferFn := testlogger.PrintCurrentTest(t, ourSkip)
  29. require.NoError(t, unittest.SyncDirs(filepath.Join(filepath.Dir(setting.AppPath), "tests/gitea-repositories-meta"), setting.RepoRootPath))
  30. if err := deleteDB(); err != nil {
  31. t.Fatalf("unable to reset database: %v", err)
  32. return nil, deferFn
  33. }
  34. x, err := newXORMEngine()
  35. require.NoError(t, err)
  36. if x != nil {
  37. oldDefer := deferFn
  38. deferFn = func() {
  39. oldDefer()
  40. if err := x.Close(); err != nil {
  41. t.Errorf("error during close: %v", err)
  42. }
  43. if err := deleteDB(); err != nil {
  44. t.Errorf("unable to reset database: %v", err)
  45. }
  46. }
  47. }
  48. if err != nil {
  49. return x, deferFn
  50. }
  51. if len(syncModels) > 0 {
  52. if err := x.Sync(syncModels...); err != nil {
  53. t.Errorf("error during sync: %v", err)
  54. return x, deferFn
  55. }
  56. }
  57. fixturesDir := filepath.Join(filepath.Dir(setting.AppPath), "models", "migrations", "fixtures", t.Name())
  58. if _, err := os.Stat(fixturesDir); err == nil {
  59. t.Logf("initializing fixtures from: %s", fixturesDir)
  60. if err := unittest.InitFixtures(
  61. unittest.FixturesOptions{
  62. Dir: fixturesDir,
  63. }, x); err != nil {
  64. t.Errorf("error whilst initializing fixtures from %s: %v", fixturesDir, err)
  65. return x, deferFn
  66. }
  67. if err := unittest.LoadFixtures(); err != nil {
  68. t.Errorf("error whilst loading fixtures from %s: %v", fixturesDir, err)
  69. return x, deferFn
  70. }
  71. } else if !os.IsNotExist(err) {
  72. t.Errorf("unexpected error whilst checking for existence of fixtures: %v", err)
  73. } else {
  74. t.Logf("no fixtures found in: %s", fixturesDir)
  75. }
  76. return x, deferFn
  77. }
  78. func MainTest(m *testing.M) {
  79. testlogger.Init()
  80. giteaRoot := test.SetupGiteaRoot()
  81. giteaBinary := "gitea"
  82. if runtime.GOOS == "windows" {
  83. giteaBinary += ".exe"
  84. }
  85. setting.AppPath = filepath.Join(giteaRoot, giteaBinary)
  86. if _, err := os.Stat(setting.AppPath); err != nil {
  87. testlogger.Fatalf("Could not find gitea binary at %s\n", setting.AppPath)
  88. }
  89. giteaConf := os.Getenv("GITEA_CONF")
  90. if giteaConf == "" {
  91. giteaConf = filepath.Join(filepath.Dir(setting.AppPath), "tests/sqlite.ini")
  92. _, _ = fmt.Fprintf(os.Stderr, "Environment variable $GITEA_CONF not set - defaulting to %s\n", giteaConf)
  93. }
  94. if !filepath.IsAbs(giteaConf) {
  95. setting.CustomConf = filepath.Join(giteaRoot, giteaConf)
  96. } else {
  97. setting.CustomConf = giteaConf
  98. }
  99. tmpDataPath, cleanup, err := tempdir.OsTempDir("gitea-test").MkdirTempRandom("data")
  100. if err != nil {
  101. testlogger.Fatalf("Unable to create temporary data path %v\n", err)
  102. }
  103. defer cleanup()
  104. setting.CustomPath = filepath.Join(setting.AppWorkPath, "custom")
  105. setting.AppDataPath = tmpDataPath
  106. unittest.InitSettingsForTesting()
  107. if err = git.InitFull(); err != nil {
  108. testlogger.Fatalf("Unable to InitFull: %v\n", err)
  109. }
  110. setting.LoadDBSetting()
  111. setting.InitLoggersForTest()
  112. exitStatus := m.Run()
  113. if err := removeAllWithRetry(setting.RepoRootPath); err != nil {
  114. _, _ = fmt.Fprintf(os.Stderr, "os.RemoveAll: %v\n", err)
  115. }
  116. os.Exit(exitStatus)
  117. }