@@ -309,9 +309,10 @@ func (m *mockSecretProvider) GetSecrets(ctx context.Context, secretIDs []string)
309309
310310// mockImageManager implements images.Manager for testing
311311type mockImageManager struct {
312- mu sync.RWMutex
313- images map [string ]* images.Image
314- getImageErr error
312+ mu sync.RWMutex
313+ images map [string ]* images.Image
314+ createImageFunc func (ctx context.Context , req images.CreateImageRequest ) (* images.Image , error )
315+ getImageErr error
315316}
316317
317318func newMockImageManager () * mockImageManager {
@@ -329,6 +330,9 @@ func (m *mockImageManager) ListImages(ctx context.Context) ([]images.Image, erro
329330}
330331
331332func (m * mockImageManager ) CreateImage (ctx context.Context , req images.CreateImageRequest ) (* images.Image , error ) {
333+ if m .createImageFunc != nil {
334+ return m .createImageFunc (ctx , req )
335+ }
332336 img := & images.Image {
333337 Name : req .Name ,
334338 Status : images .StatusPending ,
@@ -898,6 +902,34 @@ func TestStart(t *testing.T) {
898902 assert .NoError (t , err )
899903}
900904
905+ func TestStart_RetriesBuilderPreparationAfterFailure (t * testing.T ) {
906+ mgr , _ , _ , imageMgr , tempDir := setupTestManagerWithImageMgr (t )
907+ defer os .RemoveAll (tempDir )
908+ mgr .builderReady .Store (false )
909+
910+ attempts := 0
911+ imageMgr .createImageFunc = func (ctx context.Context , req images.CreateImageRequest ) (* images.Image , error ) {
912+ attempts ++
913+ if attempts == 1 {
914+ return nil , fmt .Errorf ("transient pull failure" )
915+ }
916+ imageMgr .mu .Lock ()
917+ defer imageMgr .mu .Unlock ()
918+ img := & images.Image {
919+ Name : req .Name ,
920+ Status : images .StatusReady ,
921+ }
922+ imageMgr .images [req .Name ] = img
923+ return img , nil
924+ }
925+
926+ ctx , cancel := context .WithCancel (context .Background ())
927+ defer cancel ()
928+
929+ require .NoError (t , mgr .Start (ctx ))
930+ require .Eventually (t , mgr .ReadyForBuilds , 5 * time .Second , 50 * time .Millisecond )
931+ }
932+
901933func TestCreateBuild_MultipleConcurrent (t * testing.T ) {
902934 mgr , _ , _ , tempDir := setupTestManager (t )
903935 defer os .RemoveAll (tempDir )
0 commit comments