@@ -34,59 +34,77 @@ var (
3434)
3535
3636func BidirectionalConversion (t * testing.T , ignoredFields []string , ignoredAssetFields []string ) {
37- retries := 0
38- flakyAction := func (ctx context.Context ) error {
39- log .Printf ("Starting the retry %d" , retries )
40- resourceTestData , primaryResource , err := prepareTestData (t .Name (), retries )
41- retries ++
42- if err != nil {
43- return fmt .Errorf ("error preparing the input data: %v" , err )
44- }
37+ testName := t .Name ()
38+ stepNumbers , err := getStepNumbers (testName )
39+ if err != nil {
40+ t .Fatalf ("error preparing the input data: %v" , err )
41+ }
4542
46- if resourceTestData == nil {
47- return retry . RetryableError ( fmt . Errorf ( "fail: test data is unavailable") )
48- }
43+ if len ( stepNumbers ) == 0 {
44+ t . Skipf ( " test steps are unavailable" )
45+ }
4946
50- // Create a temporary directory for running terraform.
51- tfDir , err := os .MkdirTemp (tmpDir , "terraform" )
52- if err != nil {
53- return err
54- }
55- defer os .RemoveAll (tfDir )
47+ // Create a temporary directory for running terraform.
48+ tfDir , err := os .MkdirTemp (tmpDir , "terraform" )
49+ if err != nil {
50+ t . Fatalf ( "error creating a temporary directory for running terraform: %v" , err )
51+ }
52+ defer os .RemoveAll (tfDir )
5653
57- logger := zaptest .NewLogger (t )
54+ logger := zaptest .NewLogger (t )
5855
59- // If the primary resource is specified, only test the primary resource.
60- // Otherwise, test all of the resources in the test.
61- if primaryResource != "" {
62- t .Logf ("Test for the primary resource %s begins." , primaryResource )
63- err = testSingleResource (t , t .Name (), resourceTestData [primaryResource ], tfDir , ignoredFields , ignoredAssetFields , logger , true )
64- if err != nil {
65- return err
66- }
67- } else {
68- for _ , testData := range resourceTestData {
69- err = testSingleResource (t , t .Name (), testData , tfDir , ignoredFields , ignoredAssetFields , logger , false )
56+ for _ , stepN := range stepNumbers {
57+ subtestName := fmt .Sprintf ("step%d" , stepN )
58+ t .Run (subtestName , func (t * testing.T ) {
59+ retries := 0
60+ flakyAction := func (ctx context.Context ) error {
61+ testData , err := prepareTestData (testName , stepN , retries )
62+ retries ++
63+ log .Printf ("Starting the attempt %d" , retries )
7064 if err != nil {
71- return err
65+ return fmt . Errorf ( "error preparing the input data: %v" , err )
7266 }
73- }
74- }
7567
76- return nil
77- }
68+ if testData == nil {
69+ return retry .RetryableError (fmt .Errorf ("fail: test data is unavailable" ))
70+ }
71+
72+ // If the primary resource is specified, only test the primary resource.
73+ // Otherwise, test all of the resources in the test.
74+ primaryResource := testData .PrimaryResource
75+ resourceTestData := testData .ResourceTestData
76+ tName := fmt .Sprintf ("%s_%s" , testName , subtestName )
77+ if primaryResource != "" {
78+ t .Logf ("Test for the primary resource %s begins." , primaryResource )
79+ err = testSingleResource (t , tName , resourceTestData [primaryResource ], tfDir , ignoredFields , ignoredAssetFields , logger , true )
80+ if err != nil {
81+ return err
82+ }
83+ } else {
84+ for _ , testData := range resourceTestData {
85+ err = testSingleResource (t , tName , testData , tfDir , ignoredFields , ignoredAssetFields , logger , false )
86+ if err != nil {
87+ return err
88+ }
89+ }
90+ }
7891
79- // Note maxAttempts-1 is retries, not attempts.
80- backoffPolicy := retry . WithMaxRetries ( maxAttempts - 1 , retry . NewConstant ( 50 * time . Millisecond ))
92+ return nil
93+ }
8194
82- t .Log ("Starting test with retry logic." )
95+ // Note maxAttempts-1 is retries, not attempts.
96+ backoffPolicy := retry .WithMaxRetries (maxAttempts - 1 , retry .NewConstant (50 * time .Millisecond ))
8397
84- if err := retry .Do (context .Background (), backoffPolicy , flakyAction ); err != nil {
85- if strings .Contains (err .Error (), "test data is unavailable" ) {
86- t .Skipf ("Test skipped because data was unavailable after all retries: %v" , err )
87- } else {
88- t .Fatalf ("Failed after all retries %d: %v" , retries , err )
89- }
98+ t .Log ("Starting test with retry logic." )
99+
100+ if err := retry .Do (context .Background (), backoffPolicy , flakyAction ); err != nil {
101+ if strings .Contains (err .Error (), "test data is unavailable" ) {
102+ t .Skipf ("Test skipped because data was unavailable after all retries: %v" , err )
103+ } else {
104+ t .Fatalf ("Failed after all attempts %d: %v" , maxAttempts , err )
105+ }
106+ }
107+ })
90108 }
91109}
92110
@@ -108,7 +126,8 @@ func testSingleResource(t *testing.T, testName string, testData ResourceTestData
108126 assets = append (assets , assetData .CaiAsset )
109127 assetType := assetData .CaiAsset .Type
110128 if assetType == "" {
111- return fmt .Errorf ("cai asset is unavailable for %s" , assetName )
129+ log .Printf ("cai asset is unavailable for %s" , assetName )
130+ return retry .RetryableError (fmt .Errorf ("fail: test data is unavailable" ))
112131 }
113132 if _ , cai2hclSupported = cai2hclconverters .ConverterMap [assetType ]; ! cai2hclSupported {
114133 log .Printf ("%s is not supported in cai2hcl conversion." , assetType )
@@ -129,7 +148,7 @@ func testSingleResource(t *testing.T, testName string, testData ResourceTestData
129148 }
130149
131150 if os .Getenv ("WRITE_FILES" ) != "" {
132- assetFile := fmt .Sprintf ("%s.json" , t . Name () )
151+ assetFile := fmt .Sprintf ("%s.json" , testName )
133152 writeJSONFile (assetFile , assets )
134153 }
135154
@@ -144,14 +163,14 @@ func testSingleResource(t *testing.T, testName string, testData ResourceTestData
144163 }
145164
146165 if os .Getenv ("WRITE_FILES" ) != "" {
147- exportTfFile := fmt .Sprintf ("%s_export.tf" , t . Name () )
166+ exportTfFile := fmt .Sprintf ("%s_export.tf" , testName )
148167 err = os .WriteFile (exportTfFile , exportConfigData , 0644 )
149168 if err != nil {
150169 return fmt .Errorf ("error writing file %s" , exportTfFile )
151170 }
152171 }
153172
154- exportTfFilePath := fmt .Sprintf ("%s/%s_export.tf" , tfDir , t . Name () )
173+ exportTfFilePath := fmt .Sprintf ("%s/%s_export.tf" , tfDir , testName )
155174 err = os .WriteFile (exportTfFilePath , exportConfigData , 0644 )
156175 if err != nil {
157176 return fmt .Errorf ("error when writing the file %s" , exportTfFilePath )
@@ -374,7 +393,7 @@ func getRoundtripConfig(t *testing.T, testName string, tfDir string, ancestryCac
374393 deleteFieldsFromAssets (roundtripAssets , ignoredAssetFields )
375394
376395 if os .Getenv ("WRITE_FILES" ) != "" {
377- roundtripAssetFile := fmt .Sprintf ("%s_roundtrip.json" , t . Name () )
396+ roundtripAssetFile := fmt .Sprintf ("%s_roundtrip.json" , testName )
378397 writeJSONFile (roundtripAssetFile , roundtripAssets )
379398 }
380399
0 commit comments