@@ -392,10 +392,63 @@ public async Task GetExtensionsStartupTypes_LegacyBundles_UsesExtensionBundleBin
392392 }
393393 }
394394
395+ [ Fact ]
396+ public async Task GetExtensionsStartupTypes_WorkerRuntimeNotSetForNodeApp_LoadsExtensionBundle ( )
397+ {
398+ var vars = new Dictionary < string , string > ( ) ;
399+
400+ using ( var directory = GetTempDirectory ( ) )
401+ using ( var env = new TestScopedEnvironmentVariable ( vars ) )
402+ {
403+ var binPath = Path . Combine ( directory . Path , "bin" ) ;
404+ TestMetricsLogger testMetricsLogger = new TestMetricsLogger ( ) ;
405+ TestLoggerProvider testLoggerProvider = new TestLoggerProvider ( ) ;
406+ LoggerFactory factory = new LoggerFactory ( ) ;
407+ factory . AddProvider ( testLoggerProvider ) ;
408+ var testLogger = factory . CreateLogger < ScriptStartupTypeLocator > ( ) ;
409+
410+ var mockExtensionBundleManager = new Mock < IExtensionBundleManager > ( ) ;
411+ mockExtensionBundleManager . Setup ( e => e . IsExtensionBundleConfigured ( ) ) . Returns ( true ) ;
412+ mockExtensionBundleManager . Setup ( e => e . GetExtensionBundleBinPathAsync ( ) ) . Returns ( Task . FromResult ( binPath ) ) ;
413+ mockExtensionBundleManager . Setup ( e => e . IsLegacyExtensionBundle ( ) ) . Returns ( false ) ;
414+ mockExtensionBundleManager . Setup ( e => e . GetExtensionBundleDetails ( ) ) . Returns ( Task . FromResult ( GetV2BundleDetails ( ) ) ) ;
415+
416+ RpcWorkerConfig nodeWorkerConfig = new RpcWorkerConfig ( ) { Description = TestHelpers . GetTestWorkerDescription ( "node" , "none" , false ) } ;
417+ RpcWorkerConfig dotnetIsolatedWorkerConfig = new RpcWorkerConfig ( ) { Description = TestHelpers . GetTestWorkerDescription ( "dotnet-isolated" , "none" , false ) } ;
418+
419+ var tempOptions = new LanguageWorkerOptions ( ) ;
420+ tempOptions . WorkerConfigs = new List < RpcWorkerConfig > ( ) ;
421+ tempOptions . WorkerConfigs . Add ( nodeWorkerConfig ) ;
422+ tempOptions . WorkerConfigs . Add ( dotnetIsolatedWorkerConfig ) ;
423+
424+ var optionsMonitor = new TestOptionsMonitor < LanguageWorkerOptions > ( tempOptions ) ;
425+ var mockFunctionMetadataManager = GetTestFunctionMetadataManager ( optionsMonitor , hasNodeFunctions : true ) ;
426+
427+ var languageWorkerOptions = new TestOptionsMonitor < LanguageWorkerOptions > ( tempOptions ) ;
428+
429+ var discoverer = new ScriptStartupTypeLocator ( directory . Path , testLogger , mockExtensionBundleManager . Object , mockFunctionMetadataManager , testMetricsLogger , languageWorkerOptions ) ;
430+
431+ // Act
432+ var types = await discoverer . GetExtensionsStartupTypesAsync ( ) ;
433+
434+ //Assert
435+ var traces = testLoggerProvider . GetAllLogMessages ( ) ;
436+ var traceMessage = traces . FirstOrDefault ( val => val . EventId . Name . Equals ( "ScriptStartNotLoadingExtensionBundle" ) ) ;
437+ bool loadingExtensionBundle = traceMessage == null ;
438+
439+ Assert . True ( loadingExtensionBundle ) ;
440+ AreExpectedMetricsGenerated ( testMetricsLogger ) ;
441+ Assert . Single ( types ) ;
442+ Assert . Equal ( typeof ( AzureStorageWebJobsStartup ) . FullName , types . Single ( ) . FullName ) ;
443+ }
444+ }
445+
395446 [ Theory ]
396- [ InlineData ( true ) ]
397- [ InlineData ( false ) ]
398- public async Task GetExtensionsStartupTypes_DotnetIsolated_ExtensionBundleConfigured ( bool isLogicApp )
447+ [ InlineData ( true , true ) ]
448+ [ InlineData ( true , false ) ]
449+ [ InlineData ( false , true ) ]
450+ [ InlineData ( false , false ) ]
451+ public async Task GetExtensionsStartupTypes_DotnetIsolated_ExtensionBundleConfigured ( bool isLogicApp , bool workerRuntimeSet )
399452 {
400453 var vars = new Dictionary < string , string > ( ) ;
401454
@@ -404,6 +457,11 @@ public async Task GetExtensionsStartupTypes_DotnetIsolated_ExtensionBundleConfig
404457 vars . Add ( EnvironmentSettingNames . AppKind , ScriptConstants . WorkFlowAppKind ) ;
405458 }
406459
460+ if ( workerRuntimeSet )
461+ {
462+ vars . Add ( EnvironmentSettingNames . FunctionWorkerRuntime , "dotnet-isolated" ) ;
463+ }
464+
407465 using ( var directory = GetTempDirectory ( ) )
408466 using ( var env = new TestScopedEnvironmentVariable ( vars ) )
409467 {
@@ -424,11 +482,15 @@ public async Task GetExtensionsStartupTypes_DotnetIsolated_ExtensionBundleConfig
424482 var tempOptions = new LanguageWorkerOptions ( ) ;
425483 tempOptions . WorkerConfigs = new List < RpcWorkerConfig > ( ) ;
426484 tempOptions . WorkerConfigs . Add ( workerConfig ) ;
485+
486+ RpcWorkerConfig nodeWorkerConfig = new RpcWorkerConfig ( ) { Description = TestHelpers . GetTestWorkerDescription ( "node" , "none" , false ) } ;
487+ tempOptions . WorkerConfigs . Add ( nodeWorkerConfig ) ;
488+
427489 var optionsMonitor = new TestOptionsMonitor < LanguageWorkerOptions > ( tempOptions ) ;
428- var mockFunctionMetadataManager = GetTestFunctionMetadataManager ( optionsMonitor ) ;
490+
491+ var mockFunctionMetadataManager = GetTestFunctionMetadataManager ( optionsMonitor , hasDotnetIsolatedFunctions : true ) ;
429492
430493 var languageWorkerOptions = new TestOptionsMonitor < LanguageWorkerOptions > ( tempOptions ) ;
431- Environment . SetEnvironmentVariable ( EnvironmentSettingNames . FunctionWorkerRuntime , "dotnet-isolated" ) ;
432494
433495 var discoverer = new ScriptStartupTypeLocator ( directory . Path , testLogger , mockExtensionBundleManager . Object , mockFunctionMetadataManager , testMetricsLogger , languageWorkerOptions ) ;
434496
@@ -437,15 +499,17 @@ public async Task GetExtensionsStartupTypes_DotnetIsolated_ExtensionBundleConfig
437499
438500 //Assert
439501 var traces = testLoggerProvider . GetAllLogMessages ( ) ;
440- var expectedTrace = traces . FirstOrDefault ( val => val . EventId . Name . Equals ( "ScriptStartNotLoadingExtensionBundle" ) ) ;
502+ var traceMessage = traces . FirstOrDefault ( val => val . EventId . Name . Equals ( "ScriptStartNotLoadingExtensionBundle" ) ) ;
503+
504+ bool loadingExtensionBundle = traceMessage == null ;
441505
442506 if ( isLogicApp )
443507 {
444- Assert . Null ( expectedTrace ) ;
508+ Assert . True ( loadingExtensionBundle ) ;
445509 }
446510 else
447511 {
448- Assert . NotNull ( expectedTrace ) ;
512+ Assert . False ( loadingExtensionBundle ) ;
449513 }
450514
451515 AreExpectedMetricsGenerated ( testMetricsLogger ) ;
@@ -678,7 +742,7 @@ void CopyToBin(string path)
678742 }
679743 }
680744
681- private IFunctionMetadataManager GetTestFunctionMetadataManager ( IOptionsMonitor < LanguageWorkerOptions > options , ICollection < FunctionMetadata > metadataColection = null , bool hasPrecompiledFunction = false )
745+ private IFunctionMetadataManager GetTestFunctionMetadataManager ( IOptionsMonitor < LanguageWorkerOptions > options , ICollection < FunctionMetadata > metadataColection = null , bool hasPrecompiledFunction = false , bool hasNodeFunctions = false , bool hasDotnetIsolatedFunctions = false )
682746 {
683747 var functionMetdata = new FunctionMetadata ( ) ;
684748 functionMetdata . Bindings . Add ( new BindingMetadata ( ) { Type = "blob" } ) ;
@@ -687,6 +751,15 @@ private IFunctionMetadataManager GetTestFunctionMetadataManager(IOptionsMonitor<
687751 {
688752 functionMetdata . Language = DotNetScriptTypes . DotNetAssembly ;
689753 }
754+ if ( hasNodeFunctions )
755+ {
756+ functionMetdata . Language = RpcWorkerConstants . NodeLanguageWorkerName ;
757+ }
758+
759+ if ( hasDotnetIsolatedFunctions )
760+ {
761+ functionMetdata . Language = RpcWorkerConstants . DotNetIsolatedLanguageWorkerName ;
762+ }
690763
691764 var functionMetadataCollection = metadataColection ?? new List < FunctionMetadata > ( ) { functionMetdata } ;
692765
0 commit comments