@@ -23,7 +23,7 @@ import {
23
23
TestGenTimedOutError ,
24
24
} from '../../amazonqTest/error'
25
25
import { getMd5 , uploadArtifactToS3 } from './securityScanHandler'
26
- import { fs , randomUUID , sleep , tempDirPath } from '../../shared'
26
+ import { fs , randomUUID , sleep , tempDirPath , waitUntil } from '../../shared'
27
27
import { ShortAnswer , testGenState } from '../models/model'
28
28
import { ChatSessionManager } from '../../amazonqTest/chat/storages/chatSession'
29
29
import { createCodeWhispererChatStreamingClient } from '../../shared/clients/codewhispererChatClient'
@@ -54,17 +54,39 @@ export async function getPresignedUrlAndUploadTestGen(zipMetadata: ZipMetadata)
54
54
uploadIntent : CodeWhispererConstants . testGenUploadIntent ,
55
55
}
56
56
logger . verbose ( `Prepare for uploading src context...` )
57
- const srcResp = await codeWhisperer . codeWhispererClient . createUploadUrl ( srcReq ) . catch ( ( err ) => {
58
- getLogger ( ) . error ( `Failed getting presigned url for uploading src context. Request id: ${ err . requestId } ` )
59
- throw new CreateUploadUrlError ( err . message )
60
- } )
61
- logger . verbose ( `CreateUploadUrlRequest requestId: ${ srcResp . $response . requestId } ` )
57
+ let errorMessage = ''
58
+ const result = await waitUntil (
59
+ async ( ) => {
60
+ try {
61
+ const srcResp = await codeWhisperer . codeWhispererClient . createUploadUrl ( srcReq )
62
+ // Only return the response if it's successful, otherwise return false to continue retrying
63
+ return srcResp . $response ?. httpResponse . statusCode === 200 ? srcResp : false
64
+ } catch ( err : any ) {
65
+ getLogger ( ) . error (
66
+ `Failed getting presigned url for uploading src context. Request id: ${ err . requestId } `
67
+ )
68
+ errorMessage = err . message
69
+ return false // Return false to continue retrying
70
+ }
71
+ } ,
72
+ {
73
+ interval : 200 , // 200ms between attempts
74
+ timeout : 1000 , // 1 second timeout
75
+ truthy : true ,
76
+ }
77
+ )
78
+
79
+ if ( ! result ) {
80
+ throw new CreateUploadUrlError ( errorMessage )
81
+ }
82
+
83
+ logger . verbose ( `CreateUploadUrlRequest requestId: ${ result . $response . requestId } ` )
62
84
logger . verbose ( `Complete Getting presigned Url for uploading src context.` )
63
85
logger . verbose ( `Uploading src context...` )
64
- await uploadArtifactToS3 ( zipMetadata . zipFilePath , srcResp , CodeWhispererConstants . FeatureUseCase . TEST_GENERATION )
86
+ await uploadArtifactToS3 ( zipMetadata . zipFilePath , result , CodeWhispererConstants . FeatureUseCase . TEST_GENERATION )
65
87
logger . verbose ( `Complete uploading src context.` )
66
88
const artifactMap : ArtifactMap = {
67
- SourceCode : srcResp . uploadId ,
89
+ SourceCode : result . uploadId ,
68
90
}
69
91
return artifactMap
70
92
}
@@ -102,11 +124,31 @@ export async function createTestJob(
102
124
logger . debug ( 'target line range start: %O' , firstTargetLineRangeList ?. start )
103
125
logger . debug ( 'target line range end: %O' , firstTargetLineRangeList ?. end )
104
126
105
- const resp = await codewhispererClient . codeWhispererClient . startTestGeneration ( req ) . catch ( ( err ) => {
106
- ChatSessionManager . Instance . getSession ( ) . startTestGenerationRequestId = err . requestId
107
- logger . error ( `Failed creating test job. Request id: ${ err . requestId } ` )
108
- throw new CreateTestJobError ( err . message )
109
- } )
127
+ let errorMessage = ''
128
+ const resp = await waitUntil (
129
+ async ( ) => {
130
+ try {
131
+ const response = await codewhispererClient . codeWhispererClient . startTestGeneration ( req )
132
+ // Only return the response if it's successful, otherwise return false to continue retrying
133
+ return response . $response ?. httpResponse . statusCode === 200 ? response : false
134
+ } catch ( err : any ) {
135
+ ChatSessionManager . Instance . getSession ( ) . startTestGenerationRequestId = err . requestId
136
+ logger . error ( `Failed creating test job. Request id: ${ err . requestId } ` )
137
+ errorMessage = err . message
138
+ return false // Return false to continue retrying
139
+ }
140
+ } ,
141
+ {
142
+ interval : 200 , // 200ms between attempts
143
+ timeout : 1000 , // 1 second timeout
144
+ truthy : true ,
145
+ }
146
+ )
147
+
148
+ if ( ! resp ) {
149
+ throw new CreateTestJobError ( errorMessage )
150
+ }
151
+
110
152
logger . info ( 'Unit test generation request id: %s' , resp . $response . requestId )
111
153
logger . debug ( 'Unit test generation data: %O' , resp . $response . data )
112
154
ChatSessionManager . Instance . getSession ( ) . startTestGenerationRequestId = resp . $response . requestId
0 commit comments