package memory_test import ( "bytes" "testing" "lindenii.org/go/furgit/object/header" "lindenii.org/go/furgit/object/id" "lindenii.org/go/furgit/object/store/memory" "lindenii.org/go/furgit/object/typ" ) func TestWriteReaderContent(t *testing.T) { t.Parallel() for _, objectFormat := range id.SupportedObjectFormats() { t.Run(objectFormat.String(), func(t *testing.T) { t.Parallel() store := memory.New(objectFormat) content := []byte("memory-content\n") raw := append(header.Append(nil, typ.TypeBlob, uint64(len(content))), content...) gotID, err := store.WriteReaderContent(typ.TypeBlob, uint64(len(content)), bytes.NewReader(content)) if err != nil { t.Fatalf("WriteReaderContent: %v", err) } wantID := objectFormat.Sum(raw) if gotID != wantID { t.Fatalf("WriteReaderContent id = %s, want %s", gotID, wantID) } gotType, gotContent, err := store.ReadBytesContent(gotID) if err != nil { t.Fatalf("ReadBytesContent: %v", err) } if gotType != typ.TypeBlob { t.Fatalf("ReadBytesContent type = %v, want %v", gotType, typ.TypeBlob) } if !bytes.Equal(gotContent, content) { t.Fatalf("ReadBytesContent content = %q, want %q", gotContent, content) } }) } } func TestWriteReaderFull(t *testing.T) { t.Parallel() for _, objectFormat := range id.SupportedObjectFormats() { t.Run(objectFormat.String(), func(t *testing.T) { t.Parallel() store := memory.New(objectFormat) content := []byte("memory-full\n") raw := append(header.Append(nil, typ.TypeBlob, uint64(len(content))), content...) gotID, err := store.WriteReaderFull(bytes.NewReader(raw)) if err != nil { t.Fatalf("WriteReaderFull: %v", err) } wantID := objectFormat.Sum(raw) if gotID != wantID { t.Fatalf("WriteReaderFull id = %s, want %s", gotID, wantID) } gotRaw, err := store.ReadBytesFull(gotID) if err != nil { t.Fatalf("ReadBytesFull: %v", err) } if !bytes.Equal(gotRaw, raw) { t.Fatalf("ReadBytesFull = %q, want %q", gotRaw, raw) } }) } } func TestWriteBytes(t *testing.T) { t.Parallel() for _, objectFormat := range id.SupportedObjectFormats() { t.Run(objectFormat.String(), func(t *testing.T) { t.Parallel() store := memory.New(objectFormat) content := []byte("memory-bytes\n") raw := append(header.Append(nil, typ.TypeBlob, uint64(len(content))), content...) gotID, err := store.WriteBytesContent(typ.TypeBlob, content) if err != nil { t.Fatalf("WriteBytesContent: %v", err) } wantID := objectFormat.Sum(raw) if gotID != wantID { t.Fatalf("WriteBytesContent id = %s, want %s", gotID, wantID) } gotID2, err := store.WriteBytesFull(raw) if err != nil { t.Fatalf("WriteBytesFull: %v", err) } if gotID2 != wantID { t.Fatalf("WriteBytesFull id = %s, want %s", gotID2, wantID) } }) } } func TestWriteValidationErrors(t *testing.T) { t.Parallel() cases := []struct { name string run func(store *memory.Memory) error }{ { name: "content overflow", run: func(store *memory.Memory) error { _, err := store.WriteReaderContent(typ.TypeBlob, 1, bytes.NewReader([]byte("hello"))) return err //nolint:wrapcheck }, }, { name: "content short", run: func(store *memory.Memory) error { _, err := store.WriteReaderContent(typ.TypeBlob, 5, bytes.NewReader([]byte("x"))) return err //nolint:wrapcheck }, }, { name: "full malformed header", run: func(store *memory.Memory) error { _, err := store.WriteReaderFull(bytes.NewReader([]byte("not-a-header"))) return err //nolint:wrapcheck }, }, { name: "full size mismatch", run: func(store *memory.Memory) error { _, err := store.WriteReaderFull(bytes.NewReader([]byte("blob 1\x00hello"))) return err //nolint:wrapcheck }, }, { name: "bytes malformed header", run: func(store *memory.Memory) error { _, err := store.WriteBytesFull([]byte("not-a-header")) return err //nolint:wrapcheck }, }, } for _, objectFormat := range id.SupportedObjectFormats() { t.Run(objectFormat.String(), func(t *testing.T) { t.Parallel() for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { t.Parallel() store := memory.New(objectFormat) err := tc.run(store) if err == nil { t.Fatalf("expected error") } }) } }) } }