(t *testing.T, username, password string, logOutput *bytes.Buffer)
| 286 | if err := server.EnsureCertificates(certPath, keyPath); err != nil { |
| 287 | return nil, fmt.Errorf("generate tls certs: %w", err) |
| 288 | } |
| 289 | |
| 290 | port, err := freePort() |
| 291 | if err != nil { |
| 292 | return nil, fmt.Errorf("allocate pgwire port: %w", err) |
| 293 | } |
| 294 | dataDir := filepath.Join(tmpDir, "data") |
| 295 | if err := os.MkdirAll(dataDir, 0o755); err != nil { |
| 296 | return nil, fmt.Errorf("create data dir: %w", err) |
| 297 | } |
| 298 | socketDir, err := os.MkdirTemp("/tmp", "perf-cp-") |
| 299 | if err != nil { |
| 300 | return nil, fmt.Errorf("create socket dir: %w", err) |
| 301 | } |
| 302 | |
| 303 | cfgPath := filepath.Join(tmpDir, "duckgres.yaml") |
| 304 | cfg := fmt.Sprintf(`host: 127.0.0.1 |
| 305 | port: %d |
| 306 | data_dir: %s |
| 307 | tls: |
| 308 | cert: %s |
| 309 | key: %s |
| 310 | users: |
| 311 | %s: %s |
| 312 | `, port, dataDir, certPath, keyPath, username, password) |
| 313 | if err := os.WriteFile(cfgPath, []byte(cfg), 0o644); err != nil { |
| 314 | return nil, fmt.Errorf("write config: %w", err) |
| 315 | } |
| 316 | |
| 317 | cmd := exec.Command(binaryPath, "--config", cfgPath, "--mode", "control-plane", "--socket-dir", socketDir) |
| 318 | cmd.Stdout = logOutput |
| 319 | cmd.Stderr = logOutput |
| 320 | cmd.Env = []string{ |
| 321 | "HOME=" + os.Getenv("HOME"), |
| 322 | "PATH=" + os.Getenv("PATH"), |
| 323 | } |
| 324 | if err := cmd.Start(); err != nil { |
| 325 | return nil, fmt.Errorf("start duckgres: %w", err) |
| 326 | } |
| 327 | |
| 328 | dsn := fmt.Sprintf( |
| 329 | "host=127.0.0.1 port=%d user=%s password=%s sslmode=require connect_timeout=5", |
| 330 | port, |
| 331 | username, |
| 332 | password, |
| 333 | ) |
| 334 | if err := waitForPGWireReady(dsn, 30*time.Second); err != nil { |
| 335 | _ = cmd.Process.Kill() |
| 336 | _, _ = cmd.Process.Wait() |
| 337 | return nil, fmt.Errorf("duckgres did not become ready: %w\nlogs:\n%s", err, logOutput.String()) |
| 338 | } |
| 339 | |
| 340 | return &localDuckgres{ |
| 341 | cmd: cmd, |
| 342 | pgwireDSN: dsn, |
| 343 | socketDir: socketDir, |
| 344 | }, nil |
| 345 | } |
no test coverage detected