Skip to content

Commit 5d4e2bf

Browse files
committed
[WIP] Add tag parameter tests
This also reworks passing push and pull API options per digest. Signed-off-by: Brandon Mitchell <git@bmitch.net>
1 parent ccbec5e commit 5d4e2bf

7 files changed

Lines changed: 183 additions & 79 deletions

File tree

conformance/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export OCI_API_BLOBS_UPLOAD_CANCEL=false # cancel a running upload
4141
export OCI_API_MANIFESTS_ATOMIC=true # whether manifest delete operations should be immediate
4242
export OCI_API_MANIFESTS_DELETE=true
4343
export OCI_API_MANIFESTS_DIGEST_HEADER=false # whether Docker-Content-Digest header is required
44+
export OCI_API_MANIFESTS_TAG_PARAM=false # push manifest by digest with tags as parameters
4445
export OCI_API_TAGS_ATOMIC=true # whether tag delete operations should be immediate
4546
export OCI_API_TAGS_DELETE=true
4647
export OCI_API_TAGS_LIST=true
@@ -105,6 +106,7 @@ apis:
105106
atomic: true
106107
delete: true
107108
digestHeader: false
109+
tagParam: false
108110
tags:
109111
atomic: true
110112
delete: true

conformance/api.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,7 @@ func (a *api) ManifestHeadExists(registry, repo, ref string, dig digest.Digest,
920920
return errors.Join(errs...)
921921
}
922922

923-
func (a *api) ManifestPut(registry, repo, ref string, dig digest.Digest, td *testData, referrersEnabled bool, opts ...apiDoOpt) error {
923+
func (a *api) ManifestPut(registry, repo, ref string, dig digest.Digest, td *testData, referrersEnabled bool, putOpts []apiDoOpt, opts ...apiDoOpt) error {
924924
flags := a.GetFlags(opts...)
925925
bodyBytes, ok := td.manifests[dig]
926926
if !ok {
@@ -933,16 +933,16 @@ func (a *api) ManifestPut(registry, repo, ref string, dig digest.Digest, td *tes
933933
mediaType := detectMediaType(bodyBytes)
934934
resp := http.Response{Header: http.Header{}}
935935
loc := ""
936-
var putOpts []apiDoOpt
936+
putOpts = append(putOpts, opts...)
937937
if flags["ExpectBadDigest"] {
938938
putOpts = append([]apiDoOpt{
939939
apiExpectStatus(http.StatusBadRequest),
940-
}, opts...)
940+
}, putOpts...)
941941
} else {
942942
putOpts = append([]apiDoOpt{
943943
apiExpectStatus(http.StatusCreated),
944944
apiReturnHeader("Location", &loc),
945-
}, opts...)
945+
}, putOpts...)
946946
}
947947
if referrersEnabled {
948948
// if the referrers API is being tested, verify OCI-Subject header is returned when appropriate
@@ -1170,7 +1170,7 @@ func apiWithURLParam(key, val string) apiDoOpt {
11701170
return fmt.Errorf("URL must be set before adding a parameter")
11711171
}
11721172
params := req.URL.Query()
1173-
params.Set(key, val)
1173+
params.Add(key, val)
11741174
req.URL.RawQuery = params.Encode()
11751175
return nil
11761176
},
@@ -1243,13 +1243,13 @@ func apiExpectBody(bodyExpect []byte) apiDoOpt {
12431243
func apiExpectHeader(key, val string) apiDoOpt {
12441244
return apiDoOpt{
12451245
respFn: func(resp *http.Response) error {
1246-
cur := resp.Header.Get(key)
1246+
cur := resp.Header.Values(key)
12471247
if val == "" {
1248-
if cur == "" {
1248+
if len(cur) == 0 {
12491249
return fmt.Errorf("missing header %q", key)
12501250
}
12511251
} else {
1252-
if cur != val {
1252+
if !slices.Contains(cur, val) {
12531253
return fmt.Errorf("header value mismatch for %q, expected %q, received %q", key, val, cur)
12541254
}
12551255
}

conformance/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ type configManifests struct {
7575
Atomic bool `conformance:"ATOMIC" yaml:"atomic"`
7676
Delete bool `conformance:"DELETE" yaml:"delete"`
7777
DigestHeader bool `conformance:"DIGEST_HEADER" yaml:"digestHeader"`
78+
TagParam bool `conformance:"TAG_PARAM" yaml:"tagParam"`
7879
}
7980

8081
type configTags struct {
@@ -167,6 +168,7 @@ func configLoad() (config, error) {
167168
Atomic: true,
168169
Delete: true,
169170
DigestHeader: false,
171+
TagParam: false,
170172
},
171173
Tags: configTags{
172174
Atomic: true,
@@ -198,6 +200,7 @@ func configLoad() (config, error) {
198200
c.APIs.Blobs.UploadCancel = true
199201
c.APIs.Blobs.DigestHeader = true
200202
c.APIs.Manifests.DigestHeader = true
203+
c.APIs.Manifests.TagParam = true
201204
c.Version = "1.1+dev"
202205
case "", "stable", "1.1":
203206
c.Version = "1.1"

conformance/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ func mainRun(legacy bool) {
7878
fmt.Fprintf(os.Stderr, "WARNING: \"go test\" is deprecated. Please update to using \"go build\".\n")
7979
}
8080
if r.Results.Status != statusPass {
81+
fmt.Fprintf(os.Stderr, "*** Conformance test detected a failure. ***\n")
8182
os.Exit(1)
8283
}
8384
}

0 commit comments

Comments
 (0)