1
1
package google
2
2
3
3
import (
4
+ "bytes"
5
+ "context"
6
+ "encoding/json"
4
7
"fmt"
8
+ "io"
5
9
"io/ioutil"
10
+ "net/http"
6
11
"testing"
7
12
13
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8
14
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
15
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9
16
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
10
17
)
11
18
@@ -31,8 +38,7 @@ func TestAccStorageObjectAcl_basic(t *testing.T) {
31
38
}
32
39
testAccPreCheck (t )
33
40
},
34
- Providers : testAccProviders ,
35
- CheckDestroy : testAccStorageObjectAclDestroyProducer (t ),
41
+ Providers : testAccProviders ,
36
42
Steps : []resource.TestStep {
37
43
{
38
44
Config : testGoogleStorageObjectsAclBasic1 (bucketName , objectName ),
@@ -278,6 +284,82 @@ func TestAccStorageObjectAcl_unordered(t *testing.T) {
278
284
})
279
285
}
280
286
287
+ // a round tripper that returns fake response for get object API removing `owner` attribute
288
+ // it only modifies the response once, since otherwise resource will fail to delete.
289
+ type testRoundTripper struct {
290
+ http.RoundTripper
291
+ bucketName , objectName string
292
+ done bool
293
+ }
294
+
295
+ func (t * testRoundTripper ) RoundTrip (r * http.Request ) (* http.Response , error ) {
296
+ response , err := t .RoundTripper .RoundTrip (r )
297
+ if err != nil {
298
+ return response , err
299
+ }
300
+ expectedPath := fmt .Sprintf ("/storage/v1/b/%s/o/%s" , t .bucketName , t .objectName )
301
+ if t .done || r .URL .Path != expectedPath || r .Host != "storage.googleapis.com" {
302
+ return response , err
303
+ }
304
+ t .done = true
305
+ responseBytes , err := ioutil .ReadAll (response .Body )
306
+ if err != nil {
307
+ return response , err
308
+ }
309
+ var responseMap map [string ]json.RawMessage
310
+ err = json .Unmarshal (responseBytes , & responseMap )
311
+ if err != nil {
312
+ return response , err
313
+ }
314
+ delete (responseMap , "owner" )
315
+ responseBytes , err = json .Marshal (responseMap )
316
+ if err != nil {
317
+ return response , err
318
+ }
319
+ response .Body = io .NopCloser (bytes .NewBuffer (responseBytes ))
320
+ return response , nil
321
+ }
322
+
323
+ // Test that we don't fail if there's no owner for object
324
+ func TestAccStorageObjectAcl_noOwner (t * testing.T ) {
325
+ skipIfVcr (t )
326
+ t .Parallel ()
327
+
328
+ bucketName := testBucketName (t )
329
+ objectName := testAclObjectName (t )
330
+ objectData := []byte ("data data data" )
331
+ if err := ioutil .WriteFile (tfObjectAcl .Name (), objectData , 0644 ); err != nil {
332
+ t .Errorf ("error writing file: %v" , err )
333
+ }
334
+ provider := Provider ()
335
+ oldConfigureFunc := provider .ConfigureContextFunc
336
+ provider .ConfigureContextFunc = func (ctx context.Context , d * schema.ResourceData ) (interface {}, diag.Diagnostics ) {
337
+ c , diagnostics := oldConfigureFunc (ctx , d )
338
+ config := c .(* Config )
339
+ roundTripper := & testRoundTripper {RoundTripper : config .client .Transport , bucketName : bucketName , objectName : objectName }
340
+ config .client .Transport = roundTripper
341
+ return c , diagnostics
342
+ }
343
+ providers := map [string ]* schema.Provider {
344
+ "google" : provider ,
345
+ }
346
+ vcrTest (t , resource.TestCase {
347
+ PreCheck : func () {
348
+ if errObjectAcl != nil {
349
+ panic (errObjectAcl )
350
+ }
351
+ testAccPreCheck (t )
352
+ },
353
+ Providers : providers ,
354
+ Steps : []resource.TestStep {
355
+ {
356
+ Config : testGoogleStorageObjectsAclBasic1 (bucketName , objectName ),
357
+ ExpectNonEmptyPlan : true ,
358
+ },
359
+ },
360
+ })
361
+ }
362
+
281
363
func testAccCheckGoogleStorageObjectAcl (t * testing.T , bucket , object , roleEntityS string ) resource.TestCheckFunc {
282
364
return func (s * terraform.State ) error {
283
365
roleEntity , _ := getRoleEntityPair (roleEntityS )
0 commit comments