v0.9.0: add manifest checksums
This commit is contained in:
@@ -2662,6 +2662,23 @@ func TestExportPendingParallelManifestAdd(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportPendingParallelChecksumError(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
mf := manifest.LoadJSONL(dir)
|
||||
if err := mf.OpenAppend(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
b := &mockBridge{assets: []photos.Asset{{ID: "x1", Filename: "img.jpg"}}}
|
||||
b.exportPreviewFn = func(assetID, out string, targetSize, quality, index int) (photos.ExportResult, error) {
|
||||
return photos.ExportResult{Filename: "missing.jpg", Size: 3}, nil
|
||||
}
|
||||
bar := newProgressBar(io.Discard, 1)
|
||||
done, failed := exportPendingParallel([]pendingAsset{{asset: b.assets[0], path: dir}}, 1024, 85, false, 1, bar, b, 1, mf, manifest.NoopLogWriter, exportOptions{checksum: "sha256"})
|
||||
if done != 0 || failed != 1 {
|
||||
t.Fatalf("done=%d failed=%d", done, failed)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportPendingParallelCancel(t *testing.T) {
|
||||
b := &mockBridge{assets: []photos.Asset{{ID: "x1", Filename: "img.jpg"}}}
|
||||
b.Cancel()
|
||||
@@ -2804,6 +2821,58 @@ func TestExportAssetsManifestWrite(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportAssetsChecksum(t *testing.T) {
|
||||
b := &mockBridge{assets: []photos.Asset{{ID: "x1", Filename: "img.jpg"}}}
|
||||
dir := t.TempDir()
|
||||
b.exportPreviewFn = func(assetID, out string, targetSize, quality, index int) (photos.ExportResult, error) {
|
||||
if err := os.WriteFile(filepath.Join(out, "img.jpg"), []byte("abc"), 0644); err != nil {
|
||||
return photos.ExportResult{}, err
|
||||
}
|
||||
return photos.ExportResult{Filename: "img.jpg", Size: 3, Cloud: "local"}, nil
|
||||
}
|
||||
done, failed := exportAssets(b.assets, dir, 1024, 85, 1, false, 1, io.Discard, b, "", false, manifest.FormatJSONL, false, exportOptions{checksum: "sha256"})
|
||||
if done != 1 || failed != 0 {
|
||||
t.Fatalf("done=%d failed=%d", done, failed)
|
||||
}
|
||||
entry := manifest.LoadJSONL(dir).Entries()["x1"]
|
||||
if entry.Checksum != "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" {
|
||||
t.Fatalf("checksum=%q", entry.Checksum)
|
||||
}
|
||||
got, err := fileSHA256(filepath.Join(dir, "img.jpg"))
|
||||
if err != nil || got != entry.Checksum {
|
||||
t.Fatalf("fileSHA256 got=%q err=%v", got, err)
|
||||
}
|
||||
if _, err := fileSHA256(filepath.Join(dir, "missing.jpg")); err == nil {
|
||||
t.Fatal("expected missing checksum error")
|
||||
}
|
||||
if _, err := fileSHA256(dir); err == nil {
|
||||
t.Fatal("expected directory checksum error")
|
||||
}
|
||||
if err := addManifestEntryForResult(nil, pendingAsset{}, photos.ExportResult{}, exportOptions{}); err != nil {
|
||||
t.Fatalf("nil manifest add error: %v", err)
|
||||
}
|
||||
if err := addManifestEntryForResult(manifest.LoadJSONL(dir), pendingAsset{asset: photos.Asset{ID: "skip"}, path: dir}, photos.ExportResult{Filename: "missing.jpg", Skipped: true}, exportOptions{checksum: "sha256"}); err != nil {
|
||||
t.Fatalf("skipped checksum add error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportAssetsChecksumErrors(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
b := &mockBridge{assets: []photos.Asset{{ID: "x1", Filename: "img.jpg"}}}
|
||||
b.exportPreviewFn = func(assetID, out string, targetSize, quality, index int) (photos.ExportResult, error) {
|
||||
return photos.ExportResult{Filename: "missing.jpg", Size: 3}, nil
|
||||
}
|
||||
done, failed := exportAssets(b.assets, dir, 1024, 85, 1, false, 1, io.Discard, b, "", false, manifest.FormatJSONL, false, exportOptions{checksum: "sha256"})
|
||||
if done != 0 || failed != 1 {
|
||||
t.Fatalf("serial checksum error done=%d failed=%d", done, failed)
|
||||
}
|
||||
dir = t.TempDir()
|
||||
done, failed = exportAssets(b.assets, dir, 1024, 85, 2, false, 2, io.Discard, b, "", false, manifest.FormatJSONL, false, exportOptions{checksum: "sha256"})
|
||||
if done != 0 || failed != 1 {
|
||||
t.Fatalf("parallel checksum error done=%d failed=%d", done, failed)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBackupTreeManifestOpenErr(t *testing.T) {
|
||||
b := &mockBridge{
|
||||
tree: []photos.CollectionNode{
|
||||
@@ -4657,6 +4726,10 @@ func TestSidecarConfigAndErrors(t *testing.T) {
|
||||
if _, ok := parseExportOptions([]string{"--xmp-rating", "bad"}, &stderr); ok || !strings.Contains(stderr.String(), "--xmp-rating") {
|
||||
t.Fatalf("expected xmp rating validation error, stderr=%q", stderr.String())
|
||||
}
|
||||
stderr.Reset()
|
||||
if _, ok := parseExportOptions([]string{"--checksum", "bad"}, &stderr); ok || !strings.Contains(stderr.String(), "--checksum") {
|
||||
t.Fatalf("expected checksum validation error, stderr=%q", stderr.String())
|
||||
}
|
||||
|
||||
b := &mockBridge{assets: []photos.Asset{{ID: "x1", Filename: "photo.jpg"}}}
|
||||
b.exportPreviewFn = func(assetID, out string, targetSize, quality, index int) (photos.ExportResult, error) {
|
||||
@@ -5018,7 +5091,7 @@ func TestInjectedErrorBranchesForCoverage(t *testing.T) {
|
||||
removeFunc = oldRemove
|
||||
|
||||
mf := &mockManifest{}
|
||||
addManifestEntry(mf, pendingAsset{asset: photos.Asset{ID: "x"}, root: filepath.Join(dir, "other"), path: dir}, photos.ExportResult{Filename: "file.jpg", Size: 1})
|
||||
addManifestEntry(mf, pendingAsset{asset: photos.Asset{ID: "x"}, root: filepath.Join(dir, "other"), path: dir}, photos.ExportResult{Filename: "file.jpg", Size: 1}, "")
|
||||
if mf.last.Path != "file.jpg" {
|
||||
t.Fatalf("expected fallback rel path, got %+v", mf.last)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user