10
10
using Microsoft . Azure . WebJobs . Script . Description ;
11
11
using Microsoft . Azure . WebJobs . Script . Workers . Rpc ;
12
12
using Microsoft . Extensions . Logging ;
13
+ using Microsoft . Extensions . Logging . Abstractions ;
13
14
using Microsoft . Extensions . Options ;
14
15
using Moq ;
15
16
using Xunit ;
@@ -29,11 +30,11 @@ public WorkerFunctionMetadataProviderTests()
29
30
var mockScriptHostManager = new Mock < IScriptHostManager > ( ) ;
30
31
31
32
_workerFunctionMetadataProvider = new WorkerFunctionMetadataProvider (
32
- mockScriptOptions . Object ,
33
- mockLogger . Object ,
34
- mockEnvironment . Object ,
35
- mockChannelManager . Object ,
36
- mockScriptHostManager . Object ) ;
33
+ mockScriptOptions . Object ,
34
+ mockLogger . Object ,
35
+ mockEnvironment . Object ,
36
+ mockChannelManager . Object ,
37
+ mockScriptHostManager . Object ) ;
37
38
}
38
39
39
40
[ Fact ]
@@ -221,5 +222,74 @@ public void ValidateFunctionMetadata_IsoStringNotAltered()
221
222
var function = _workerFunctionMetadataProvider . ValidateBindings ( rawBindings , functionMetadata ) ;
222
223
Assert . Equal ( isoString , function . Bindings . FirstOrDefault ( ) . Raw [ "startFromTime" ] . ToString ( ) ) ;
223
224
}
225
+
226
+ [ Fact ]
227
+ public async Task GetFunctionMetadataAsync_Idempotent ( )
228
+ {
229
+ var mockFunctionMetadataProvider = new Mock < IWorkerFunctionMetadataProvider > ( MockBehavior . Strict ) ;
230
+ var mockChannelManager = new Mock < IWebHostRpcWorkerChannelManager > ( MockBehavior . Strict ) ;
231
+ var mockScriptHostManager = new Mock < IScriptHostManager > ( MockBehavior . Strict ) ;
232
+ var mockOptionsMonitor = new Mock < IOptionsMonitor < ScriptApplicationHostOptions > > ( MockBehavior . Strict ) ;
233
+ var scriptOptions = new ScriptApplicationHostOptions
234
+ {
235
+ IsFileSystemReadOnly = true
236
+ } ;
237
+ mockOptionsMonitor . Setup ( m => m . CurrentValue ) . Returns ( scriptOptions ) ;
238
+
239
+ var testEnvironment = new TestEnvironment ( ) ;
240
+ testEnvironment . SetEnvironmentVariable ( "FUNCTIONS_WORKER_RUNTIME" , "node" ) ;
241
+
242
+ var mockRpcWorkerChannel = new Mock < IRpcWorkerChannel > ( MockBehavior . Strict ) ;
243
+ var rawFunctionMetadataList = new List < RawFunctionMetadata >
244
+ {
245
+ new RawFunctionMetadata
246
+ {
247
+ Metadata = new FunctionMetadata { Name = "TestFunction" } ,
248
+ Bindings = [ "{\" type\" : \" httpTrigger\" , \" name\" : \" req\" , \" direction\" : \" in\" }" ] ,
249
+ UseDefaultMetadataIndexing = false
250
+ }
251
+ } ;
252
+ mockRpcWorkerChannel . Setup ( m => m . GetFunctionMetadata ( ) ) . ReturnsAsync ( rawFunctionMetadataList ) ;
253
+
254
+ var tcs = new TaskCompletionSource < IRpcWorkerChannel > ( ) ;
255
+ tcs . SetResult ( mockRpcWorkerChannel . Object ) ;
256
+ var channels = new Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > >
257
+ {
258
+ { "testWorkerId" , tcs }
259
+ } ;
260
+
261
+ mockChannelManager . Setup ( m => m . GetChannels ( "node" ) ) . Returns ( channels ) ;
262
+
263
+ var provider = new WorkerFunctionMetadataProvider (
264
+ mockOptionsMonitor . Object ,
265
+ NullLogger < WorkerFunctionMetadataProvider > . Instance ,
266
+ testEnvironment ,
267
+ mockChannelManager . Object ,
268
+ mockScriptHostManager . Object ) ;
269
+
270
+ var workerConfigs = new List < RpcWorkerConfig > ( ) ;
271
+
272
+ // Calling this twice should return the same data
273
+ var result1 = await provider . GetFunctionMetadataAsync ( workerConfigs , true ) ;
274
+ var result2 = await provider . GetFunctionMetadataAsync ( workerConfigs , true ) ;
275
+
276
+ var function1 = result1 . Functions . Single ( ) ;
277
+ var function2 = result2 . Functions . Single ( ) ;
278
+
279
+ static void AssertFunction ( FunctionMetadata function )
280
+ {
281
+ Assert . Equal ( "TestFunction" , function . Name ) ;
282
+ Assert . Equal ( "node" , function . Language ) ;
283
+ Assert . Collection ( function . Bindings , binding =>
284
+ {
285
+ Assert . Equal ( "httpTrigger" , binding . Type ) ;
286
+ Assert . Equal ( "req" , binding . Name ) ;
287
+ Assert . Equal ( BindingDirection . In , binding . Direction ) ;
288
+ } ) ;
289
+ }
290
+
291
+ AssertFunction ( function1 ) ;
292
+ AssertFunction ( function2 ) ;
293
+ }
224
294
}
225
295
}
0 commit comments