waitForDB polls the database until it's ready or timeout is reached.
(driver, dsn string, timeout time.Duration)
| 158 | |
| 159 | // waitForDB polls the database until it's ready or timeout is reached. |
| 160 | func waitForDB(driver, dsn string, timeout time.Duration) error { |
| 161 | ctx, cancel := context.WithTimeout(context.Background(), timeout) |
| 162 | defer cancel() |
| 163 | |
| 164 | ticker := time.NewTicker(500 * time.Millisecond) |
| 165 | defer ticker.Stop() |
| 166 | |
| 167 | var lastErr error |
| 168 | for { |
| 169 | select { |
| 170 | case <-ctx.Done(): |
| 171 | if lastErr != nil { |
| 172 | return errors.Errorf("timeout waiting for %s database: %v", driver, lastErr) |
| 173 | } |
| 174 | return errors.Errorf("timeout waiting for %s database to be ready", driver) |
| 175 | case <-ticker.C: |
| 176 | db, err := sql.Open(driver, dsn) |
| 177 | if err != nil { |
| 178 | lastErr = err |
| 179 | continue |
| 180 | } |
| 181 | err = db.PingContext(ctx) |
| 182 | db.Close() |
| 183 | if err == nil { |
| 184 | return nil |
| 185 | } |
| 186 | lastErr = err |
| 187 | } |
| 188 | } |
| 189 | } |
| 190 | |
| 191 | // GetPostgresDSN starts a PostgreSQL container (if not already running) and creates a fresh database for this test. |
| 192 | func GetPostgresDSN(t *testing.T) string { |
no test coverage detected