package containerimageregistryclient import ( "bytes" "context" "crypto/sha256" "encoding/base64" "encoding/hex" "encoding/json" "io" "testing" seat "git.novox.be/novox/mesh-contracts/go/seats/containerimageregistry" "git.novox.be/novox/mesh-sdk/go/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) } }