@@ -392,10 +392,63 @@ public async Task GetExtensionsStartupTypes_LegacyBundles_UsesExtensionBundleBin
392
392
}
393
393
}
394
394
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
+
395
446
[ 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 )
399
452
{
400
453
var vars = new Dictionary < string , string > ( ) ;
401
454
@@ -404,6 +457,11 @@ public async Task GetExtensionsStartupTypes_DotnetIsolated_ExtensionBundleConfig
404
457
vars . Add ( EnvironmentSettingNames . AppKind , ScriptConstants . WorkFlowAppKind ) ;
405
458
}
406
459
460
+ if ( workerRuntimeSet )
461
+ {
462
+ vars . Add ( EnvironmentSettingNames . FunctionWorkerRuntime , "dotnet-isolated" ) ;
463
+ }
464
+
407
465
using ( var directory = GetTempDirectory ( ) )
408
466
using ( var env = new TestScopedEnvironmentVariable ( vars ) )
409
467
{
@@ -424,11 +482,15 @@ public async Task GetExtensionsStartupTypes_DotnetIsolated_ExtensionBundleConfig
424
482
var tempOptions = new LanguageWorkerOptions ( ) ;
425
483
tempOptions . WorkerConfigs = new List < RpcWorkerConfig > ( ) ;
426
484
tempOptions . WorkerConfigs . Add ( workerConfig ) ;
485
+
486
+ RpcWorkerConfig nodeWorkerConfig = new RpcWorkerConfig ( ) { Description = TestHelpers . GetTestWorkerDescription ( "node" , "none" , false ) } ;
487
+ tempOptions . WorkerConfigs . Add ( nodeWorkerConfig ) ;
488
+
427
489
var optionsMonitor = new TestOptionsMonitor < LanguageWorkerOptions > ( tempOptions ) ;
428
- var mockFunctionMetadataManager = GetTestFunctionMetadataManager ( optionsMonitor ) ;
490
+
491
+ var mockFunctionMetadataManager = GetTestFunctionMetadataManager ( optionsMonitor , hasDotnetIsolatedFunctions : true ) ;
429
492
430
493
var languageWorkerOptions = new TestOptionsMonitor < LanguageWorkerOptions > ( tempOptions ) ;
431
- Environment . SetEnvironmentVariable ( EnvironmentSettingNames . FunctionWorkerRuntime , "dotnet-isolated" ) ;
432
494
433
495
var discoverer = new ScriptStartupTypeLocator ( directory . Path , testLogger , mockExtensionBundleManager . Object , mockFunctionMetadataManager , testMetricsLogger , languageWorkerOptions ) ;
434
496
@@ -437,15 +499,17 @@ public async Task GetExtensionsStartupTypes_DotnetIsolated_ExtensionBundleConfig
437
499
438
500
//Assert
439
501
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 ;
441
505
442
506
if ( isLogicApp )
443
507
{
444
- Assert . Null ( expectedTrace ) ;
508
+ Assert . True ( loadingExtensionBundle ) ;
445
509
}
446
510
else
447
511
{
448
- Assert . NotNull ( expectedTrace ) ;
512
+ Assert . False ( loadingExtensionBundle ) ;
449
513
}
450
514
451
515
AreExpectedMetricsGenerated ( testMetricsLogger ) ;
@@ -678,7 +742,7 @@ void CopyToBin(string path)
678
742
}
679
743
}
680
744
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 )
682
746
{
683
747
var functionMetdata = new FunctionMetadata ( ) ;
684
748
functionMetdata . Bindings . Add ( new BindingMetadata ( ) { Type = "blob" } ) ;
@@ -687,6 +751,15 @@ private IFunctionMetadataManager GetTestFunctionMetadataManager(IOptionsMonitor<
687
751
{
688
752
functionMetdata . Language = DotNetScriptTypes . DotNetAssembly ;
689
753
}
754
+ if ( hasNodeFunctions )
755
+ {
756
+ functionMetdata . Language = RpcWorkerConstants . NodeLanguageWorkerName ;
757
+ }
758
+
759
+ if ( hasDotnetIsolatedFunctions )
760
+ {
761
+ functionMetdata . Language = RpcWorkerConstants . DotNetIsolatedLanguageWorkerName ;
762
+ }
690
763
691
764
var functionMetadataCollection = metadataColection ?? new List < FunctionMetadata > ( ) { functionMetdata } ;
692
765
0 commit comments