check / check (push) Waiting to run
WithReadTx ended the process when its rollback failed, including after Ctrl-C, when database/sql has already rolled back and Rollback returns sql.ErrTxDone; it now handles the rollback as WithTx does. The query functions ended the process when closing their rows failed; they now leave the deferred close alone, since database/sql reports a close failure through rows.Err(), which each returns. The unused database.Fatalf is removed. cleanupBlobTempFile now returns its close or remove failure, which fails the backup. No test makes a rows close fail: SQLite fails it only with the error the last read already returned. Model: opus-5-5
63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
//nolint:testpackage // exercises the unexported cleanupBlobTempFile
|
|
package snapshot
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/spf13/afero"
|
|
"sneak.berlin/go/vaultik/internal/blob"
|
|
)
|
|
|
|
// A blob temp file that cannot be closed or removed must make the cleanup
|
|
// return an error, not end the process.
|
|
func TestCleanupBlobTempFileReturnsErrors(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
fs := afero.NewOsFs()
|
|
s := &Scanner{fs: fs}
|
|
|
|
tests := []struct {
|
|
name string
|
|
// prepare runs before the cleanup and makes its close or remove
|
|
// fail.
|
|
prepare func(tempFile afero.File) error
|
|
want error
|
|
}{
|
|
{
|
|
name: "close fails",
|
|
prepare: func(tempFile afero.File) error { return tempFile.Close() },
|
|
want: os.ErrClosed,
|
|
},
|
|
{
|
|
name: "remove fails",
|
|
prepare: func(tempFile afero.File) error {
|
|
return fs.Remove(tempFile.Name())
|
|
},
|
|
want: os.ErrNotExist,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tempFile, err := afero.TempFile(fs, t.TempDir(), "blob-*.tmp")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = tt.prepare(tempFile)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = s.cleanupBlobTempFile(&blob.WithReader{TempFile: tempFile})
|
|
if !errors.Is(err, tt.want) {
|
|
t.Fatalf("expected an error wrapping %v, got: %v", tt.want, err)
|
|
}
|
|
})
|
|
}
|
|
}
|