@@ -474,3 +474,59 @@ func TestStartContainers_AzureLicenseError(t *testing.T) {
474474 t .Fatal ("no telemetry event received" )
475475 }
476476}
477+
478+ func TestPullImages_ReusesLocalImageWhenPresent (t * testing.T ) {
479+ ctrl := gomock .NewController (t )
480+ mockRT := runtime .NewMockRuntime (ctrl )
481+ mockTel := telemetry .New ("" , true )
482+
483+ c := runtime.ContainerConfig {
484+ Image : "localstack/localstack-pro:3.5.0" ,
485+ Name : "localstack-aws" ,
486+ EmulatorType : config .EmulatorAWS ,
487+ Tag : "3.5.0" ,
488+ }
489+
490+ mockRT .EXPECT ().Remove (gomock .Any (), c .Name ).Return (nil )
491+ mockRT .EXPECT ().ImageExists (gomock .Any (), c .Image ).Return (true , nil )
492+ // No PullImage call expected when the image is already present.
493+
494+ var out bytes.Buffer
495+ sink := output .NewPlainSink (& out )
496+
497+ pulled , err := pullImages (context .Background (), mockRT , sink , mockTel , []runtime.ContainerConfig {c })
498+
499+ require .NoError (t , err )
500+ assert .False (t , pulled [c .Name ], "telemetry must not count a reused image as pulled" )
501+ assert .Contains (t , out .String (), "Using local image localstack/localstack-pro:3.5.0" )
502+ }
503+
504+ func TestPullImages_PullsWhenImageMissing (t * testing.T ) {
505+ ctrl := gomock .NewController (t )
506+ mockRT := runtime .NewMockRuntime (ctrl )
507+ mockTel := telemetry .New ("" , true )
508+
509+ c := runtime.ContainerConfig {
510+ Image : "localstack/localstack-pro:3.5.0" ,
511+ Name : "localstack-aws" ,
512+ EmulatorType : config .EmulatorAWS ,
513+ Tag : "3.5.0" ,
514+ }
515+
516+ mockRT .EXPECT ().Remove (gomock .Any (), c .Name ).Return (nil )
517+ mockRT .EXPECT ().ImageExists (gomock .Any (), c .Image ).Return (false , nil )
518+ mockRT .EXPECT ().PullImage (gomock .Any (), c .Image , gomock .Any ()).
519+ DoAndReturn (func (_ context.Context , _ string , progress chan <- runtime.PullProgress ) error {
520+ close (progress )
521+ return nil
522+ })
523+
524+ var out bytes.Buffer
525+ sink := output .NewPlainSink (& out )
526+
527+ pulled , err := pullImages (context .Background (), mockRT , sink , mockTel , []runtime.ContainerConfig {c })
528+
529+ require .NoError (t , err )
530+ assert .True (t , pulled [c .Name ], "a freshly pulled image must be counted as pulled" )
531+ assert .Contains (t , out .String (), "Pulled localstack/localstack-pro:3.5.0" )
532+ }
0 commit comments