@@ -9,13 +9,21 @@ package azcontainerregistry
99import (
1010 "bytes"
1111 "context"
12+ "fmt"
13+ "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
1214 "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime"
1315 "github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming"
16+ "github.com/Azure/azure-sdk-for-go/sdk/internal/mock"
1417 "github.com/stretchr/testify/require"
1518 "io"
19+ "net/http"
20+ "strconv"
21+ "strings"
1622 "testing"
1723)
1824
25+ const alpineBlobDigest = "sha256:042a816809aac8d0f7d7cacac7965782ee2ecac3f21bcf9f24b1de1a7387b769"
26+
1927func TestBlobClient_CancelUpload (t * testing.T ) {
2028 startRecording (t )
2129 endpoint , cred , options := getEndpointCredAndClientOptions (t )
@@ -44,10 +52,9 @@ func TestBlobClient_CheckBlobExists(t *testing.T) {
4452 ctx := context .Background ()
4553 client , err := NewBlobClient (endpoint , cred , & BlobClientOptions {ClientOptions : options })
4654 require .NoError (t , err )
47- digest := "sha256:042a816809aac8d0f7d7cacac7965782ee2ecac3f21bcf9f24b1de1a7387b769"
48- res , err := client .CheckBlobExists (ctx , "alpine" , digest , nil )
55+ res , err := client .CheckBlobExists (ctx , "alpine" , alpineBlobDigest , nil )
4956 require .NoError (t , err )
50- require .Equal (t , digest , * res .DockerContentDigest )
57+ require .Equal (t , alpineBlobDigest , * res .DockerContentDigest )
5158}
5259
5360func TestBlobClient_CheckBlobExists_fail (t * testing.T ) {
@@ -76,8 +83,7 @@ func TestBlobClient_CheckChunkExists(t *testing.T) {
7683 ctx := context .Background ()
7784 client , err := NewBlobClient (endpoint , cred , & BlobClientOptions {ClientOptions : options })
7885 require .NoError (t , err )
79- digest := "sha256:042a816809aac8d0f7d7cacac7965782ee2ecac3f21bcf9f24b1de1a7387b769"
80- res , err := client .CheckChunkExists (ctx , "alpine" , digest , "bytes=0-299" , nil )
86+ res , err := client .CheckChunkExists (ctx , "alpine" , alpineBlobDigest , "bytes=0-299" , nil )
8187 require .NoError (t , err )
8288 require .NotEmpty (t , * res .ContentLength )
8389}
@@ -108,8 +114,7 @@ func TestBlobClient_completeUpload_wrongDigest(t *testing.T) {
108114 ctx := context .Background ()
109115 client , err := NewBlobClient (endpoint , cred , & BlobClientOptions {ClientOptions : options })
110116 require .NoError (t , err )
111- digest := "sha256:042a816809aac8d0f7d7cacac7965782ee2ecac3f21bcf9f24b1de1a7387b769"
112- getRes , err := client .GetBlob (ctx , "alpine" , digest , nil )
117+ getRes , err := client .GetBlob (ctx , "alpine" , alpineBlobDigest , nil )
113118 require .NoError (t , err )
114119 blob , err := io .ReadAll (getRes .BlobData )
115120 require .NoError (t , err )
@@ -127,8 +132,7 @@ func TestBlobClient_DeleteBlob(t *testing.T) {
127132 ctx := context .Background ()
128133 client , err := NewBlobClient (endpoint , cred , & BlobClientOptions {ClientOptions : options })
129134 require .NoError (t , err )
130- digest := "sha256:042a816809aac8d0f7d7cacac7965782ee2ecac3f21bcf9f24b1de1a7387b769"
131- _ , err = client .DeleteBlob (ctx , "alpine" , digest , nil )
135+ _ , err = client .DeleteBlob (ctx , "alpine" , alpineBlobDigest , nil )
132136 require .NoError (t , err )
133137}
134138
@@ -158,10 +162,32 @@ func TestBlobClient_GetBlob(t *testing.T) {
158162 ctx := context .Background ()
159163 client , err := NewBlobClient (endpoint , cred , & BlobClientOptions {ClientOptions : options })
160164 require .NoError (t , err )
161- digest := "sha256:042a816809aac8d0f7d7cacac7965782ee2ecac3f21bcf9f24b1de1a7387b769"
162- res , err := client .GetBlob (ctx , "alpine" , digest , nil )
165+ res , err := client .GetBlob (ctx , "alpine" , alpineBlobDigest , nil )
163166 require .NoError (t , err )
164167 require .NotEmpty (t , * res .ContentLength )
168+ reader , err := NewDigestValidationReader (alpineBlobDigest , res .BlobData )
169+ require .NoError (t , err )
170+ _ , err = io .ReadAll (reader )
171+ require .NoError (t , err )
172+ }
173+
174+ func TestBlobClient_GetBlob_wrongDigest (t * testing.T ) {
175+ srv , closeServer := mock .NewServer ()
176+ defer closeServer ()
177+ srv .AppendResponse (mock .WithStatusCode (http .StatusOK ), mock .WithBody ([]byte ("test" )))
178+
179+ pl := runtime .NewPipeline (moduleName , moduleVersion , runtime.PipelineOptions {}, & policy.ClientOptions {Transport : srv })
180+ client := & BlobClient {
181+ srv .URL (),
182+ pl ,
183+ }
184+ ctx := context .Background ()
185+ resp , err := client .GetBlob (ctx , "name" , "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" , nil )
186+ require .NoError (t , err )
187+ reader , err := NewDigestValidationReader ("sha256:wrong" , resp .BlobData )
188+ require .NoError (t , err )
189+ _ , err = io .ReadAll (reader )
190+ require .Error (t , err , ErrMismatchedHash )
165191}
166192
167193func TestBlobClient_GetBlob_fail (t * testing.T ) {
@@ -190,10 +216,27 @@ func TestBlobClient_GetChunk(t *testing.T) {
190216 ctx := context .Background ()
191217 client , err := NewBlobClient (endpoint , cred , & BlobClientOptions {ClientOptions : options })
192218 require .NoError (t , err )
193- digest := "sha256:042a816809aac8d0f7d7cacac7965782ee2ecac3f21bcf9f24b1de1a7387b769"
194- res , err := client .GetChunk (ctx , "alpine" , digest , "bytes=0-999" , nil )
219+ chunkSize := 1000
220+ current := 0
221+ blob := bytes .NewBuffer (nil )
222+ for {
223+ res , err := client .GetChunk (ctx , "alpine" , alpineBlobDigest , fmt .Sprintf ("bytes=%d-%d" , current , current + chunkSize - 1 ), nil )
224+ require .NoError (t , err )
225+ chunk , err := io .ReadAll (res .ChunkData )
226+ require .NoError (t , err )
227+ _ , err = blob .Write (chunk )
228+ require .NoError (t , err )
229+ totalSize , _ := strconv .Atoi (strings .Split (* res .ContentRange , "/" )[1 ])
230+ currentRangeEnd , _ := strconv .Atoi (strings .Split (strings .Split (* res .ContentRange , "/" )[0 ], "-" )[1 ])
231+ if totalSize == currentRangeEnd + 1 {
232+ break
233+ }
234+ current += chunkSize
235+ }
236+ reader , err := NewDigestValidationReader (alpineBlobDigest , blob )
237+ require .NoError (t , err )
238+ _ , err = io .ReadAll (reader )
195239 require .NoError (t , err )
196- require .Equal (t , int64 (1000 ), * res .ContentLength )
197240}
198241
199242func TestBlobClient_GetChunk_fail (t * testing.T ) {
@@ -247,8 +290,7 @@ func TestBlobClient_MountBlob(t *testing.T) {
247290 ctx := context .Background ()
248291 client , err := NewBlobClient (endpoint , cred , & BlobClientOptions {ClientOptions : options })
249292 require .NoError (t , err )
250- digest := "sha256:042a816809aac8d0f7d7cacac7965782ee2ecac3f21bcf9f24b1de1a7387b769"
251- res , err := client .MountBlob (ctx , "hello-world" , "alpine" , digest , nil )
293+ res , err := client .MountBlob (ctx , "hello-world" , "alpine" , alpineBlobDigest , nil )
252294 require .NoError (t , err )
253295 require .NotEmpty (t , res .Location )
254296}
0 commit comments