Skip to content

Commit 439f543

Browse files
authored
rewrite db cache tests to use test suite, skip if root user (#321)
1 parent 4cc38dd commit 439f543

9 files changed

Lines changed: 670 additions & 731 deletions

pkg/cache/dbcache/dbcache_test.go

Lines changed: 77 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"context"
1919
"fmt"
2020
"os"
21+
"os/user"
2122
"testing"
2223
"time"
2324

@@ -27,42 +28,50 @@ import (
2728
"github.com/nephio-project/porch/pkg/externalrepo"
2829
"github.com/nephio-project/porch/pkg/repository"
2930
mockdbcache "github.com/nephio-project/porch/test/mockery/mocks/porch/pkg/cache/dbcache"
30-
"github.com/stretchr/testify/assert"
31+
"github.com/stretchr/testify/suite"
3132
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3233
"k8s.io/apimachinery/pkg/watch"
3334
"k8s.io/klog/v2"
3435
)
3536

36-
var (
37-
defaultPorchSQLSchema string = "api/sql/porch-db.sql"
38-
nextPkgRev int = 1
39-
savedDBHandler *DBHandler
40-
)
37+
const defaultPorchSQLSchema = "api/sql/porch-db.sql"
38+
39+
type DbTestSuite struct {
40+
suite.Suite
4141

42-
func TestMain(m *testing.M) {
43-
code, err := run(m)
44-
if err != nil {
45-
klog.Errorf("tests failed: %q", err)
42+
ctx context.Context
43+
nextPkgRev int
44+
savedDBHandler *DBHandler
45+
}
46+
47+
func Test_DbTestSuite(t *testing.T) {
48+
if u, err := user.Current(); err == nil && u.Username == "root" {
49+
t.Skipf("This test cannot run as %q user", u.Username)
4650
}
47-
os.Exit(code)
51+
// TODO: replace ctx with t.Context() in go 1.24<
52+
suite.Run(t, &DbTestSuite{nextPkgRev: 1, ctx: context.Background()})
4853
}
4954

50-
func run(m *testing.M) (code int, err error) {
55+
func (t *DbTestSuite) Context() context.Context {
56+
t.T().Helper()
57+
return t.ctx
58+
}
59+
60+
func (t *DbTestSuite) SetupSuite() {
5161
postgres := embeddedpostgres.NewDatabase(embeddedpostgres.DefaultConfig().
5262
Username("porch").
5363
Password("porch").
5464
Database("porch").
5565
Port(55432))
5666

57-
if err := postgres.Start(); err != nil {
58-
return -1, fmt.Errorf("could not start test instance of postgres: %w", err)
59-
}
67+
err := postgres.Start()
68+
t.Require().NoError(err, "could not start test instance of postgres")
6069

61-
defer func() {
70+
t.T().Cleanup(func() {
6271
if err := postgres.Stop(); err != nil {
6372
klog.Errorf("stop of test database failed: %q", err)
6473
}
65-
}()
74+
})
6675

6776
dbOpts := &cachetypes.CacheOptions{
6877
DBCacheOptions: cachetypes.DBCacheOptions{
@@ -71,9 +80,17 @@ func run(m *testing.M) (code int, err error) {
7180
},
7281
}
7382

74-
if err := OpenDB(context.TODO(), *dbOpts); err != nil {
75-
return -1, fmt.Errorf("could not connect to test database: %w", err)
76-
}
83+
err = OpenDB(t.Context(), *dbOpts)
84+
t.Require().NoError(err, "could not connect to test database")
85+
86+
t.T().Cleanup(func() {
87+
// TODO: is this sleep necessary?
88+
time.Sleep(5 * time.Second)
89+
90+
if err := CloseDB(t.Context()); err != nil {
91+
t.T().Log(err)
92+
}
93+
})
7794

7895
schemaFile, ok := os.LookupEnv("PORCH_SQL_SCHEMA")
7996
if !ok {
@@ -89,24 +106,10 @@ func run(m *testing.M) (code int, err error) {
89106
}
90107

91108
schemaBytes, err := os.ReadFile(schemaFile)
92-
if err != nil {
93-
return -1, fmt.Errorf("could not read Porch SQL schema file %q: %w", schemaFile, err)
94-
}
109+
t.Require().NoErrorf(err, "could not read Porch SQL schema file %q", schemaFile)
95110

96111
_, err = GetDB().db.Exec(string(schemaBytes))
97-
if err != nil {
98-
return -1, fmt.Errorf("could not process Porch SQL schema file %q: %w", schemaFile, err)
99-
}
100-
101-
result := m.Run()
102-
103-
time.Sleep(5 * time.Second)
104-
105-
if err := CloseDB(context.TODO()); err == nil {
106-
return result, nil
107-
} else {
108-
return result, err
109-
}
112+
t.Require().NoErrorf(err, "could not process Porch SQL schema file %q", schemaFile)
110113
}
111114

112115
type mockNotifier struct {
@@ -125,38 +128,38 @@ func (n *mockNotifier) NotifyPackageRevisionChange(eventType watch.EventType, ob
125128
return n.returnVal
126129
}
127130

128-
func switchToMockSQL(t *testing.T) {
129-
mockDBCache := mockdbcache.NewMockdbSQLInterface(t)
131+
func (t *DbTestSuite) switchToMockSQL() {
132+
mockDBCache := mockdbcache.NewMockdbSQLInterface(t.T())
130133

131-
savedDBHandler = GetDB()
134+
t.savedDBHandler = GetDB()
132135
dbHandler = nil
133136

134-
err := CloseDB(context.TODO())
135-
assert.Nil(t, err)
137+
err := CloseDB(t.Context())
138+
t.NoError(err)
136139

137140
dbHandler = &DBHandler{
138-
dBCacheOptions: savedDBHandler.dBCacheOptions,
139-
dataSource: savedDBHandler.dataSource,
141+
dBCacheOptions: t.savedDBHandler.dBCacheOptions,
142+
dataSource: t.savedDBHandler.dataSource,
140143
db: mockDBCache,
141144
}
142-
assert.NotNil(t, dbHandler)
145+
t.NotNil(dbHandler)
143146
}
144147

145-
func revertToPostgreSQL(_ *testing.T) {
146-
dbHandler = savedDBHandler
148+
func (t *DbTestSuite) revertToPostgreSQL() {
149+
dbHandler = t.savedDBHandler
147150
}
148151

149-
func TestDBRepositoryCrud(t *testing.T) {
152+
func (t *DbTestSuite) TestDBRepositoryCrud() {
150153
externalrepo.ExternalRepoInUnitTestMode = true
151154

152-
ctx := context.TODO()
155+
ctx := t.Context()
153156

154157
options := cachetypes.CacheOptions{
155158
RepoSyncFrequency: 60 * time.Minute,
156159
}
157160
dbCache, err := new(DBCacheFactory).NewCache(ctx, options)
158-
assert.Nil(t, err)
159-
assert.Equal(t, 0, len(dbCache.GetRepositories()))
161+
t.NoError(err)
162+
t.Empty(dbCache.GetRepositories())
160163

161164
repositorySpec := configapi.Repository{
162165
ObjectMeta: v1.ObjectMeta{
@@ -165,22 +168,22 @@ func TestDBRepositoryCrud(t *testing.T) {
165168
},
166169
}
167170
testRepo, err := dbCache.OpenRepository(ctx, &repositorySpec)
168-
assert.Nil(t, err)
169-
assert.Equal(t, "my-repo", testRepo.Key().Name)
171+
t.NoError(err)
172+
t.Equal("my-repo", testRepo.Key().Name)
170173

171174
gotRepo := dbCache.GetRepository(testRepo.Key())
172-
assert.Equal(t, testRepo.Key(), gotRepo.Key())
175+
t.Equal(testRepo.Key(), gotRepo.Key())
173176

174177
repositorySpec.Spec.Description = "My lovely Repo"
175178

176179
err = dbCache.UpdateRepository(ctx, &repositorySpec)
177-
assert.Nil(t, err)
180+
t.NoError(err)
178181

179182
err = dbCache.CloseRepository(ctx, &repositorySpec, nil)
180-
assert.Nil(t, err)
183+
t.NoError(err)
181184
}
182185

183-
func createTestRepo(t *testing.T, namespace, name string) *dbRepository {
186+
func (t *DbTestSuite) createTestRepo(namespace, name string) *dbRepository {
184187
dbRepo := dbRepository{
185188
repoKey: repository.RepositoryKey{
186189
Namespace: namespace,
@@ -195,18 +198,18 @@ func createTestRepo(t *testing.T, namespace, name string) *dbRepository {
195198
},
196199
},
197200
}
198-
err := repoWriteToDB(context.TODO(), &dbRepo)
199-
assert.Nil(t, err)
201+
err := repoWriteToDB(t.Context(), &dbRepo)
202+
t.NoError(err)
200203

201204
return &dbRepo
202205
}
203206

204-
func deleteTestRepo(t *testing.T, key repository.RepositoryKey) {
205-
err := repoDeleteFromDB(context.TODO(), key)
206-
assert.Nil(t, err)
207+
func (t *DbTestSuite) deleteTestRepo(key repository.RepositoryKey) {
208+
err := repoDeleteFromDB(t.Context(), key)
209+
t.NoError(err)
207210
}
208211

209-
func createTestPkg(t *testing.T, repoKey repository.RepositoryKey, name string) dbPackage {
212+
func (t *DbTestSuite) createTestPkg(repoKey repository.RepositoryKey, name string) dbPackage {
210213
dbPkg := dbPackage{
211214
repo: cachetypes.CacheInstance.GetRepository(repoKey).(*dbRepository),
212215
pkgKey: repository.PackageKey{
@@ -215,47 +218,47 @@ func createTestPkg(t *testing.T, repoKey repository.RepositoryKey, name string)
215218
},
216219
}
217220

218-
err := pkgWriteToDB(context.TODO(), &dbPkg)
219-
assert.Nil(t, err)
221+
err := pkgWriteToDB(t.Context(), &dbPkg)
222+
t.NoError(err)
220223

221224
return dbPkg
222225
}
223226

224-
func createTestPkgs(t *testing.T, repoKey repository.RepositoryKey, namePrefix string, count int) []dbPackage {
227+
func (t *DbTestSuite) createTestPkgs(repoKey repository.RepositoryKey, namePrefix string, count int) []dbPackage {
225228
var testPkgs []dbPackage
226229

227230
for i := range count {
228-
testPkgs = append(testPkgs, createTestPkg(t, repoKey, fmt.Sprintf("%s-%d", namePrefix, i)))
231+
testPkgs = append(testPkgs, t.createTestPkg(repoKey, fmt.Sprintf("%s-%d", namePrefix, i)))
229232
}
230233

231234
return testPkgs
232235
}
233236

234-
func createTestPR(t *testing.T, pkgKey repository.PackageKey, name string) dbPackageRevision {
237+
func (t *DbTestSuite) createTestPR(pkgKey repository.PackageKey, name string) dbPackageRevision {
235238
dbPkgRev := dbPackageRevision{
236239
pkgRevKey: repository.PackageRevisionKey{
237240
PkgKey: pkgKey,
238241
WorkspaceName: name,
239-
Revision: nextPkgRev,
242+
Revision: t.nextPkgRev,
240243
},
241244
lifecycle: "Published",
242245
resources: map[string]string{"Hello.txt": "Hello", "Goodbye.txt": "Goodbye"},
243246
}
244247

245-
err := pkgRevWriteToDB(context.TODO(), &dbPkgRev)
246-
assert.Nil(t, err)
248+
err := pkgRevWriteToDB(t.Context(), &dbPkgRev)
249+
t.NoError(err)
247250

248251
return dbPkgRev
249252
}
250253

251-
func createTestPRs(t *testing.T, packages []dbPackage, wsNamePrefix string, count int) []dbPackageRevision {
254+
func (t *DbTestSuite) createTestPRs(packages []dbPackage, wsNamePrefix string, count int) []dbPackageRevision {
252255
var testPRs []dbPackageRevision
253256

254257
for _, pkg := range packages {
255-
nextPkgRev = 1
258+
t.nextPkgRev = 1
256259
for prNo := range count {
257-
testPRs = append(testPRs, createTestPR(t, pkg.Key(), fmt.Sprintf("%s-%d", wsNamePrefix, prNo)))
258-
nextPkgRev++
260+
testPRs = append(testPRs, t.createTestPR(pkg.Key(), fmt.Sprintf("%s-%d", wsNamePrefix, prNo)))
261+
t.nextPkgRev++
259262
}
260263
}
261264
return testPRs

0 commit comments

Comments
 (0)