58 lines
2.1 KiB
Go
58 lines
2.1 KiB
Go
package containerimageregistryclient
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"crypto/sha256"
|
|
"encoding/base64"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"io"
|
|
"testing"
|
|
|
|
seat "git.novox.be/novox/mesh-delivery/contracts/go/seats/containerimageregistry"
|
|
"git.novox.be/novox/mesh-delivery/sdk/parts"
|
|
)
|
|
|
|
// The client publishes over its own seat's verbs alone (ADR 0627 §1): publish names every part, and only the part the
|
|
// holder lacks travels by publish-part, its bytes whole, the last chunk marked.
|
|
func TestPublishTalksToItsOwnSeat(t *testing.T) {
|
|
held, lacked := []byte("held"), []byte("lacked")
|
|
part := func(b []byte) parts.Part {
|
|
sum := sha256.Sum256(b)
|
|
return parts.Part{Digest: "sha256:" + hex.EncodeToString(sum[:]), Size: int64(len(b)),
|
|
Open: func() (io.ReadCloser, error) { return io.NopCloser(bytes.NewReader(b)), nil }}
|
|
}
|
|
ps := []parts.Part{part(held), part(lacked)}
|
|
var asked []string
|
|
var got []byte
|
|
call := func(key string, body any) (json.RawMessage, error) {
|
|
asked = append(asked, key)
|
|
raw, _ := json.Marshal(body)
|
|
switch key {
|
|
case "seat:container-image-registry.publish":
|
|
var in seat.PublishInput
|
|
_ = json.Unmarshal(raw, &in)
|
|
if len(in.Parts) != 2 {
|
|
t.Errorf("publish names %d parts, want 2", len(in.Parts))
|
|
}
|
|
return json.Marshal(seat.PublishAnswer{Transfer: in.Transfer, Lacks: []string{ps[1].Digest}})
|
|
case "seat:container-image-registry.publish-part":
|
|
var in seat.PublishPartInput
|
|
_ = json.Unmarshal(raw, &in)
|
|
data, _ := base64.StdEncoding.DecodeString(in.Data)
|
|
if in.Part != ps[1].Digest || !in.Last || in.Transfer != "t1" {
|
|
t.Errorf("publish-part %+v", in)
|
|
}
|
|
got = append(got, data...)
|
|
return json.Marshal(seat.PublishPartAnswer{Transfer: in.Transfer, Part: in.Part})
|
|
}
|
|
t.Fatalf("asked %s", key)
|
|
return nil, nil
|
|
}
|
|
sent, err := Publish(context.Background(), call, seat.PublishInput{Transfer: "t1", Name: "x"}, ps)
|
|
if err != nil || sent.Transfer != "t1" || sent.Chunks != 1 || len(sent.Parts) != 1 || !bytes.Equal(got, lacked) || len(asked) != 2 {
|
|
t.Errorf("sent %+v, %q arrived, asked %v, %v", sent, got, asked, err)
|
|
}
|
|
}
|