@@ -157,7 +157,7 @@ func TestSelectContainersToStart_AttachesWhenExternalContainerOnConfiguredPort(t
157157 }
158158
159159 mockRT .EXPECT ().IsRunning (gomock .Any (), c .Name ).Return (false , nil )
160- mockRT .EXPECT ().FindRunningByImage (gomock .Any (), []string {"localstack/localstack-pro" , "localstack/localstack" , "localstack/snowflake" }, "4566/tcp" ).
160+ mockRT .EXPECT ().FindRunningByImage (gomock .Any (), []string {"localstack/localstack-pro" , "localstack/localstack" , "localstack/snowflake" , "localstack/localstack-azure" }, "4566/tcp" ).
161161 Return (& runtime.RunningContainer {Name : "external-container" , Image : "localstack/localstack-pro:3.5.0" , BoundPort : "4566" }, nil )
162162 mockRT .EXPECT ().ContainerEnv (gomock .Any (), "external-container" ).Return (nil , nil )
163163
@@ -186,7 +186,7 @@ func TestSelectContainersToStart_AttachesWhenExternalContainerVersionDiffers(t *
186186 }
187187
188188 mockRT .EXPECT ().IsRunning (gomock .Any (), c .Name ).Return (false , nil )
189- mockRT .EXPECT ().FindRunningByImage (gomock .Any (), []string {"localstack/localstack-pro" , "localstack/localstack" , "localstack/snowflake" }, "4566/tcp" ).
189+ mockRT .EXPECT ().FindRunningByImage (gomock .Any (), []string {"localstack/localstack-pro" , "localstack/localstack" , "localstack/snowflake" , "localstack/localstack-azure" }, "4566/tcp" ).
190190 Return (& runtime.RunningContainer {Name : "external-container" , Image : "localstack/localstack-pro:3.5.0" , BoundPort : "4566" }, nil )
191191 mockRT .EXPECT ().ContainerEnv (gomock .Any (), "external-container" ).Return (nil , nil )
192192
@@ -220,7 +220,7 @@ func TestSelectContainersToStart_QueuesContainerWhenNoneRunningOnPort(t *testing
220220 }
221221
222222 mockRT .EXPECT ().IsRunning (gomock .Any (), c .Name ).Return (false , nil )
223- mockRT .EXPECT ().FindRunningByImage (gomock .Any (), []string {"localstack/localstack-pro" , "localstack/localstack" , "localstack/snowflake" }, "4566/tcp" ).
223+ mockRT .EXPECT ().FindRunningByImage (gomock .Any (), []string {"localstack/localstack-pro" , "localstack/localstack" , "localstack/snowflake" , "localstack/localstack-azure" }, "4566/tcp" ).
224224 Return (nil , nil )
225225
226226 sink := output .NewPlainSink (io .Discard )
@@ -246,7 +246,7 @@ func TestSelectContainersToStart_ErrorsOnEmulatorTypeMismatch(t *testing.T) {
246246 }
247247
248248 mockRT .EXPECT ().IsRunning (gomock .Any (), c .Name ).Return (false , nil )
249- mockRT .EXPECT ().FindRunningByImage (gomock .Any (), []string {"localstack/localstack-pro" , "localstack/localstack" , "localstack/snowflake" }, "4566/tcp" ).
249+ mockRT .EXPECT ().FindRunningByImage (gomock .Any (), []string {"localstack/localstack-pro" , "localstack/localstack" , "localstack/snowflake" , "localstack/localstack-azure" }, "4566/tcp" ).
250250 Return (& runtime.RunningContainer {Name : "localstack-aws" , Image : "localstack/localstack-pro:latest" , BoundPort : "4566" }, nil )
251251
252252 var out bytes.Buffer
@@ -263,6 +263,20 @@ func TestSelectContainersToStart_ErrorsOnEmulatorTypeMismatch(t *testing.T) {
263263 assert .Contains (t , got , "docker stop localstack-aws" )
264264}
265265
266+ func TestEmitPostStartPointers_Azure (t * testing.T ) {
267+ var out bytes.Buffer
268+ sink := output .NewPlainSink (& out )
269+
270+ emitPostStartPointers (sink , config .EmulatorAzure , "localhost.localstack.cloud:4566" , "https://app.localstack.cloud/" , false )
271+
272+ got := out .String ()
273+ assert .Contains (t , got , "• Endpoint: localhost.localstack.cloud:4566\n " )
274+ assert .Contains (t , got , "• Web app: https://app.localstack.cloud\n " )
275+ assert .Contains (t , got , "> Tip:" )
276+ assert .NotContains (t , got , "• Snowflake endpoint:" ,
277+ "Azure must not show the snowflake-prefixed endpoint" )
278+ }
279+
266280func TestEmitPostStartPointers_UnknownEmulator_NoTip (t * testing.T ) {
267281 var out bytes.Buffer
268282 sink := output .NewPlainSink (& out )
@@ -357,3 +371,49 @@ func TestStartContainers_SnowflakeLicenseError(t *testing.T) {
357371 t .Fatal ("no telemetry event received" )
358372 }
359373}
374+
375+ func TestStartContainers_AzureLicenseError (t * testing.T ) {
376+ ctrl := gomock .NewController (t )
377+ mockRT := runtime .NewMockRuntime (ctrl )
378+
379+ c := runtime.ContainerConfig {
380+ Image : "localstack/localstack-azure:latest" ,
381+ Name : "localstack-azure" ,
382+ EmulatorType : config .EmulatorAzure ,
383+ Tag : "latest" ,
384+ Port : "4566" ,
385+ ContainerPort : "4566/tcp" ,
386+ HealthPath : "/_localstack/health" ,
387+ }
388+ const containerID = "abc123"
389+ licenseLog := "The Azure emulator is currently not covered by your license."
390+ mockRT .EXPECT ().Start (gomock .Any (), c ).Return (containerID , nil )
391+ mockRT .EXPECT ().IsRunning (gomock .Any (), containerID ).Return (false , nil )
392+ mockRT .EXPECT ().Logs (gomock .Any (), containerID , 20 ).Return (licenseLog , nil )
393+
394+ tel , capturedEvents := newCapturingTelClient (t )
395+
396+ var out bytes.Buffer
397+ sink := output .NewPlainSink (& out )
398+
399+ err := startContainers (context .Background (), mockRT , sink , tel , []runtime.ContainerConfig {c }, map [string ]bool {})
400+ tel .Close ()
401+
402+ require .Error (t , err )
403+ assert .True (t , output .IsSilent (err ), "error should be silent since ErrorEvent was already emitted" )
404+ got := out .String ()
405+ assert .Contains (t , got , "Your license does not include the Azure emulator." )
406+ assert .Contains (t , got , "https://app.localstack.cloud/sign-up" )
407+ assert .Contains (t , got , "https://www.localstack.cloud/demo" )
408+
409+ select {
410+ case ev := <- capturedEvents :
411+ payload , ok := ev ["payload" ].(map [string ]any )
412+ require .True (t , ok , "telemetry event should have a payload map" )
413+ assert .Equal (t , telemetry .LifecycleStartError , payload ["event_type" ])
414+ assert .Equal (t , telemetry .ErrCodeLicenseInvalid , payload ["error_code" ])
415+ assert .Equal (t , "azure" , payload ["emulator" ])
416+ default :
417+ t .Fatal ("no telemetry event received" )
418+ }
419+ }
0 commit comments