77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"crypto/tls"
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"example.com/mysqlAcceptance/internal/config"
|
|
"example.com/mysqlAcceptance/internal/svc"
|
|
"git.yuntuo.hk/k2safe/go-omni/logx"
|
|
)
|
|
|
|
func TestGeneratedMySQLConfigurationAndLifecycle(t *testing.T) {
|
|
cfg, err := config.Load("etc/config.yaml")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if cfg.Database.User != "omni_test" || cfg.Database.TLS.ServerName != "localhost" || cfg.Database.Pool.MaxOpenConns != 2 {
|
|
t.Fatal("explicit database configuration references were not applied")
|
|
}
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
var logs bytes.Buffer
|
|
logger, err := logx.New(logx.Config{Writer: &logs})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer logger.Close()
|
|
first, err := svc.New(ctx, logger, cfg)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer first.Close()
|
|
second, err := svc.New(ctx, logger, cfg)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer second.Close()
|
|
if first.DB == second.DB {
|
|
t.Fatal("contexts share a pool")
|
|
}
|
|
if err = first.DB.Health(ctx); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var key, cipher string
|
|
if err = first.DB.QueryRowContext(ctx, "SHOW SESSION STATUS LIKE 'Ssl_cipher'").Scan(&key, &cipher); err != nil || cipher == "" {
|
|
t.Fatal("generated pool has no TLS", err)
|
|
}
|
|
if err = first.Finish(nil); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err = first.Finish(nil); err != nil {
|
|
t.Fatal("cleanup not idempotent", err)
|
|
}
|
|
if err = first.DB.PingContext(ctx); err == nil {
|
|
t.Fatal("dependency pool remains open")
|
|
}
|
|
if err = second.DB.Health(ctx); err != nil {
|
|
t.Fatal("another context was closed", err)
|
|
}
|
|
bad := cfg
|
|
bad.Database.TLS.ServerName = "wrong.invalid"
|
|
failed, err := svc.New(ctx, logger, bad)
|
|
var verify *tls.CertificateVerificationError
|
|
if failed != nil || !errors.As(err, &verify) {
|
|
t.Fatal("TLS failure not propagated", err)
|
|
}
|
|
logger.Info("logger remains usable")
|
|
if !strings.Contains(logs.String(), "logger remains usable") {
|
|
t.Fatal("borrowed logger was closed")
|
|
}
|
|
}
|