@@ -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
112115type 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