Skip to content

Commit

Permalink
refactor(postgres): Refactor benchmark tests
Browse files Browse the repository at this point in the history
This commit refactors the benchmark tests in the `benchmark_test.go` file for the PostgreSQL driver.
  • Loading branch information
bartventer committed May 14, 2024
1 parent f31eeb9 commit 44cb183
Showing 1 changed file with 59 additions and 62 deletions.
121 changes: 59 additions & 62 deletions drivers/postgres/schema/benchmark_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,64 +28,14 @@ type Book struct {
func (Book) TableName() string { return "books" }
func (Book) IsTenantTable() bool { return true }

func setupScopingBenchmark(b *testing.B, dsnOpt testutil.DSNOption) (*gorm.DB, *Tenant, func(), error) {
b.Helper()
db, err := gorm.Open(pgdriver.Open(testutil.GetDSN(dsnOpt)), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
return nil, nil, nil, err
}
if err := pgdriver.RegisterModels(db, &Tenant{}, &Book{}); err != nil {
return nil, nil, nil, err
}
if err := pgdriver.MigratePublicSchema(db); err != nil {
return nil, nil, nil, err
}
tenant := Tenant{
TenantPKModel: pgdriver.TenantPKModel{
DomainURL: "tenant1.example.com",
SchemaName: "tenant1",
},
}
if err := db.Clauses(clause.OnConflict{DoNothing: true}).Create(&tenant).Error; err != nil {
return nil, nil, nil, err
}
if err := pgdriver.CreateSchemaForTenant(db, tenant.SchemaName); err != nil {
return nil, nil, nil, err
}
cleanup := func() {
if err := pgdriver.DropSchemaForTenant(db, tenant.SchemaName); err != nil {
b.Fatalf("Drop schema for tenant failed: %v", err)
}
}
return db, &tenant, cleanup, nil
}

func createBook(b *testing.B, db *gorm.DB, tenant *Tenant) {
b.Helper()
book := Book{
Tenant: *tenant,
}
if err := db.Scopes(scopes.WithTenantSchema(tenant.SchemaName)).Create(&book).Error; err != nil {
b.Errorf("Create book failed, expected %v, got %v", nil, err)
}
}

// RunFunc is a function that runs a benchmark test.
type RunFunc func(*testing.B, *gorm.DB, *Tenant)

func BenchmarkScopingQueries(b *testing.B) {
db, tenant, cleanup, err := setupScopingBenchmark(b, testutil.WithDBName("tenants1"))
if err != nil {
b.Fatalf("Setup failed: %v", err)
}
b.Cleanup(cleanup)
type args struct {
preRun RunFunc
setup RunFunc
withTenantSchema RunFunc
setSearchPath RunFunc
preRun, setup, withTenantSchema, setSearchPath RunFunc
}
tests := []struct {
name string
Expand Down Expand Up @@ -195,19 +145,51 @@ func BenchmarkScopingQueries(b *testing.B) {
}
}

// runScopingBenchmark runs a benchmark test.
func runScopingBenchmark(b *testing.B, name string, db *gorm.DB, tenant *Tenant, setup RunFunc, fn RunFunc) {
// RunFunc is a function that runs a benchmark test.
type RunFunc func(*testing.B, *gorm.DB, *Tenant)

func setupScopingBenchmark(b *testing.B, dsnOpt testutil.DSNOption) (*gorm.DB, *Tenant, func(), error) {
b.Helper()
b.Run(name, func(b *testing.B) {
for i := 0; i < b.N; i++ {
if setup != nil {
b.StopTimer()
setup(b, db, tenant)
b.StartTimer()
}
fn(b, db, tenant)
}
db, err := gorm.Open(pgdriver.Open(testutil.GetDSN(dsnOpt)), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
return nil, nil, nil, err
}
if err := pgdriver.RegisterModels(db, &Tenant{}, &Book{}); err != nil {
return nil, nil, nil, err
}
if err := pgdriver.MigratePublicSchema(db); err != nil {
return nil, nil, nil, err
}
tenant := Tenant{
TenantPKModel: pgdriver.TenantPKModel{
DomainURL: "tenant1.example.com",
SchemaName: "tenant1",
},
}
if err := db.Clauses(clause.OnConflict{DoNothing: true}).Create(&tenant).Error; err != nil {
return nil, nil, nil, err
}
if err := pgdriver.CreateSchemaForTenant(db, tenant.SchemaName); err != nil {
return nil, nil, nil, err
}
cleanup := func() {
if err := pgdriver.DropSchemaForTenant(db, tenant.SchemaName); err != nil {
b.Fatalf("Drop schema for tenant failed: %v", err)
}
}
return db, &tenant, cleanup, nil
}

func createBook(b *testing.B, db *gorm.DB, tenant *Tenant) {
b.Helper()
book := Book{
Tenant: *tenant,
}
if err := db.Scopes(scopes.WithTenantSchema(tenant.SchemaName)).Create(&book).Error; err != nil {
b.Errorf("Create book failed, expected %v, got %v", nil, err)
}
}

// findBook finds a book.
Expand All @@ -219,3 +201,18 @@ func findBook(b *testing.B, db *gorm.DB) Book {
}
return book
}

// runScopingBenchmark runs a benchmark test.
func runScopingBenchmark(b *testing.B, name string, db *gorm.DB, tenant *Tenant, setup, fn RunFunc) {
b.Helper()
b.Run(name, func(b *testing.B) {
for i := 0; i < b.N; i++ {
if setup != nil {
b.StopTimer()
setup(b, db, tenant)
b.StartTimer()
}
fn(b, db, tenant)
}
})
}

0 comments on commit 44cb183

Please sign in to comment.