func TestIndexUnserialize(t *testing.T) { oldIdx := backend.IDs{ParseID("ed54ae36197f4745ebc4b54d10e0f623eaaaedd03013eb7ae90df881b7781452")} idx, err := repository.DecodeIndex(bytes.NewReader(docExample)) OK(t, err) for _, test := range exampleTests { blob, err := idx.Lookup(test.id) OK(t, err) Equals(t, test.packID, blob.PackID) Equals(t, test.tpe, blob.Type) Equals(t, test.offset, blob.Offset) Equals(t, test.length, blob.Length) } Equals(t, oldIdx, idx.Supersedes()) blobs := idx.ListPack(exampleLookupTest.packID) if len(blobs) != len(exampleLookupTest.blobs) { t.Fatalf("expected %d blobs in pack, got %d", len(exampleLookupTest.blobs), len(blobs)) } for _, blob := range blobs { if !exampleLookupTest.blobs.Has(blob.ID) { t.Errorf("unexpected blob %v found", blob.ID.Str()) } } }
func TestIndexUnserialize(t *testing.T) { oldIdx := restic.IDs{restic.TestParseID("ed54ae36197f4745ebc4b54d10e0f623eaaaedd03013eb7ae90df881b7781452")} idx, err := repository.DecodeIndex(bytes.NewReader(docExample)) OK(t, err) for _, test := range exampleTests { list, err := idx.Lookup(test.id, test.tpe) OK(t, err) if len(list) != 1 { t.Errorf("expected one result for blob %v, got %v: %v", test.id.Str(), len(list), list) } blob := list[0] t.Logf("looking for blob %v/%v, got %v", test.tpe, test.id.Str(), blob) Equals(t, test.packID, blob.PackID) Equals(t, test.tpe, blob.Type) Equals(t, test.offset, blob.Offset) Equals(t, test.length, blob.Length) } Equals(t, oldIdx, idx.Supersedes()) blobs := idx.ListPack(exampleLookupTest.packID) if len(blobs) != len(exampleLookupTest.blobs) { t.Fatalf("expected %d blobs in pack, got %d", len(exampleLookupTest.blobs), len(blobs)) } for _, blob := range blobs { b, ok := exampleLookupTest.blobs[blob.ID] if !ok { t.Errorf("unexpected blob %v found", blob.ID.Str()) } if blob.Type != b { t.Errorf("unexpected type for blob %v: want %v, got %v", blob.ID.Str(), b, blob.Type) } } }
func TestIndexSerialize(t *testing.T) { type testEntry struct { id restic.ID pack restic.ID tpe restic.BlobType offset, length uint } tests := []testEntry{} idx := repository.NewIndex() // create 50 packs with 20 blobs each for i := 0; i < 50; i++ { packID := restic.NewRandomID() pos := uint(0) for j := 0; j < 20; j++ { id := restic.NewRandomID() length := uint(i*100 + j) idx.Store(restic.PackedBlob{ Blob: restic.Blob{ Type: restic.DataBlob, ID: id, Offset: pos, Length: length, }, PackID: packID, }) tests = append(tests, testEntry{ id: id, pack: packID, tpe: restic.DataBlob, offset: pos, length: length, }) pos += length } } wr := bytes.NewBuffer(nil) err := idx.Encode(wr) OK(t, err) idx2, err := repository.DecodeIndex(wr) OK(t, err) Assert(t, idx2 != nil, "nil returned for decoded index") wr2 := bytes.NewBuffer(nil) err = idx2.Encode(wr2) OK(t, err) for _, testBlob := range tests { list, err := idx.Lookup(testBlob.id, testBlob.tpe) OK(t, err) if len(list) != 1 { t.Errorf("expected one result for blob %v, got %v: %v", testBlob.id.Str(), len(list), list) } result := list[0] Equals(t, testBlob.pack, result.PackID) Equals(t, testBlob.tpe, result.Type) Equals(t, testBlob.offset, result.Offset) Equals(t, testBlob.length, result.Length) list2, err := idx2.Lookup(testBlob.id, testBlob.tpe) OK(t, err) if len(list2) != 1 { t.Errorf("expected one result for blob %v, got %v: %v", testBlob.id.Str(), len(list2), list2) } result2 := list2[0] Equals(t, testBlob.pack, result2.PackID) Equals(t, testBlob.tpe, result2.Type) Equals(t, testBlob.offset, result2.Offset) Equals(t, testBlob.length, result2.Length) } // add more blobs to idx newtests := []testEntry{} for i := 0; i < 10; i++ { packID := restic.NewRandomID() pos := uint(0) for j := 0; j < 10; j++ { id := restic.NewRandomID() length := uint(i*100 + j) idx.Store(restic.PackedBlob{ Blob: restic.Blob{ Type: restic.DataBlob, ID: id, Offset: pos, Length: length, }, PackID: packID, }) newtests = append(newtests, testEntry{ id: id, pack: packID, tpe: restic.DataBlob, offset: pos, length: length, }) pos += length } } // serialize idx, unserialize to idx3 wr3 := bytes.NewBuffer(nil) err = idx.Finalize(wr3) OK(t, err) Assert(t, idx.Final(), "index not final after encoding") id := restic.NewRandomID() OK(t, idx.SetID(id)) id2, err := idx.ID() Assert(t, id2.Equal(id), "wrong ID returned: want %v, got %v", id, id2) idx3, err := repository.DecodeIndex(wr3) OK(t, err) Assert(t, idx3 != nil, "nil returned for decoded index") Assert(t, idx3.Final(), "decoded index is not final") // all new blobs must be in the index for _, testBlob := range newtests { list, err := idx3.Lookup(testBlob.id, testBlob.tpe) OK(t, err) if len(list) != 1 { t.Errorf("expected one result for blob %v, got %v: %v", testBlob.id.Str(), len(list), list) } blob := list[0] Equals(t, testBlob.pack, blob.PackID) Equals(t, testBlob.tpe, blob.Type) Equals(t, testBlob.offset, blob.Offset) Equals(t, testBlob.length, blob.Length) } }