ref: ab174c473618dd3743881cf44e02c2db4d1ecd5f
dir: /network/receivepack/service/service_test.go/
package service_test
import (
"context"
"os"
"strings"
"testing"
"codeberg.org/lindenii/furgit/internal/testgit"
"codeberg.org/lindenii/furgit/network/receivepack/service"
objectid "codeberg.org/lindenii/furgit/object/id"
objectstore "codeberg.org/lindenii/furgit/object/store"
objectdual "codeberg.org/lindenii/furgit/object/store/dual"
objectloose "codeberg.org/lindenii/furgit/object/store/loose"
"codeberg.org/lindenii/furgit/object/store/memory"
objectpacked "codeberg.org/lindenii/furgit/object/store/packed"
)
func TestExecutePackExpectedWithoutObjectIngress(t *testing.T) {
t.Parallel()
//nolint:thelper
testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) {
t.Parallel()
store := memory.New(algo)
svc := service.New(service.Options{
ExistingObjects: store,
})
result, err := svc.Execute(context.Background(), &service.Request{
Commands: []service.Command{{
Name: "refs/heads/main",
OldID: algo.Zero(),
NewID: algo.Zero(),
}},
PackExpected: true,
Pack: strings.NewReader("not a pack"),
})
if err != nil {
t.Fatalf("Execute: %v", err)
}
if result.UnpackError != "object ingress not configured" {
t.Fatalf("unexpected unpack error %q", result.UnpackError)
}
})
}
func TestExecuteDiscardedQuarantineAfterIngestFailure(t *testing.T) {
t.Parallel()
//nolint:thelper
testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) {
t.Parallel()
store := memory.New(algo)
objectIngress := newDualIngress(t, algo)
svc := service.New(service.Options{
ExistingObjects: store,
ObjectIngress: objectIngress,
})
result, err := svc.Execute(context.Background(), &service.Request{
Commands: []service.Command{{
Name: "refs/heads/main",
OldID: algo.Zero(),
NewID: algo.Zero(),
}},
PackExpected: true,
Pack: strings.NewReader("not a pack"),
})
if err != nil {
t.Fatalf("Execute: %v", err)
}
if result.UnpackError == "" {
t.Fatal("Execute returned empty unpack error for invalid pack")
}
})
}
func newDualIngress(tb testing.TB, algo objectid.Algorithm) objectstore.Quarantiner {
tb.Helper()
objectsRoot, err := os.OpenRoot(tb.TempDir())
if err != nil {
tb.Fatalf("os.OpenRoot: %v", err)
}
tb.Cleanup(func() {
_ = objectsRoot.Close()
})
err = objectsRoot.Mkdir("pack", 0o755)
if err != nil {
tb.Fatalf("Mkdir(pack): %v", err)
}
packRoot, err := objectsRoot.OpenRoot("pack")
if err != nil {
tb.Fatalf("OpenRoot(pack): %v", err)
}
tb.Cleanup(func() {
_ = packRoot.Close()
})
looseStore, err := objectloose.New(objectsRoot, algo)
if err != nil {
tb.Fatalf("loose.New: %v", err)
}
tb.Cleanup(func() {
_ = looseStore.Close()
})
packedStore, err := objectpacked.New(packRoot, algo, objectpacked.Options{WriteRev: true})
if err != nil {
tb.Fatalf("packed.New: %v", err)
}
tb.Cleanup(func() {
_ = packedStore.Close()
})
return objectdual.New(looseStore, packedStore)
}