@@ -52,6 +52,48 @@ export const httpsAgent = new https.Agent({
5252 rejectUnauthorized : false
5353} )
5454
55+ function createServerWithGCSpy ( ) {
56+ const route = jest . fn ( ( req , res ) => {
57+ res . send ( '<html/>' )
58+ } )
59+
60+ const options = {
61+ buildDir : testFixtures ,
62+ mobify : testPackageMobify ,
63+ sslFilePath : path . join ( testFixtures , 'localhost.pem' ) ,
64+ quiet : true ,
65+ port : TEST_PORT ,
66+ fetchAgents : {
67+ https : httpsAgent
68+ }
69+ }
70+
71+ const { handler, server, app} = RemoteServerFactory . createHandler ( options , ( app ) => {
72+ app . get ( '/*' , route )
73+ } )
74+
75+ const collectGarbage = jest . spyOn ( app , '_collectGarbage' )
76+ const sendMetric = jest . spyOn ( app , 'sendMetric' )
77+ return { route, handler, collectGarbage, sendMetric, server}
78+ }
79+
80+ function createApiGatewayEvent ( ) {
81+ // Set up a fake event and a fake context for the Lambda call
82+ const event = createEvent ( 'aws:apiGateway' , {
83+ path : '/' ,
84+ body : undefined
85+ } )
86+
87+ if ( event . queryStringParameters ) {
88+ delete event . queryStringParameters
89+ }
90+
91+ const context = AWSMockContext ( {
92+ functionName : 'SSRTest'
93+ } )
94+ return { event, context}
95+ }
96+
5597describe ( 'SSRServer Lambda integration' , ( ) => {
5698 let savedEnvironment
5799 let server
@@ -371,47 +413,40 @@ describe('SSRServer Lambda integration', () => {
371413 } )
372414 } )
373415
374- test ( 'Lambda reuse behaviour' , ( ) => {
375- const route = jest . fn ( ( req , res ) => {
376- res . send ( '<html/>' )
377- } )
378-
379- const options = {
380- buildDir : testFixtures ,
381- mobify : testPackageMobify ,
382- sslFilePath : path . join ( testFixtures , 'localhost.pem' ) ,
383- quiet : true ,
384- port : TEST_PORT ,
385- fetchAgents : {
386- https : httpsAgent
387- }
388- }
389-
390- const {
391- app,
392- handler,
393- server : srv
394- } = RemoteServerFactory . createHandler ( options , ( app ) => {
395- app . get ( '/*' , route )
396- } )
416+ test ( 'Lambda reuse -- Default Behavior' , ( ) => {
417+ const { route, handler, collectGarbage, sendMetric, new_server} = createServerWithGCSpy ( )
418+ const { event, context} = createApiGatewayEvent ( )
419+ server = new_server
397420
398- const collectGarbage = jest . spyOn ( app , '_collectGarbage' )
399- const sendMetric = jest . spyOn ( app , 'sendMetric' )
400- server = srv
401-
402- // Set up a fake event and a fake context for the Lambda call
403- const event = createEvent ( 'aws:apiGateway' , {
404- path : '/' ,
405- body : undefined
406- } )
421+ const call = ( event ) =>
422+ new Promise ( ( resolve ) => handler ( event , context , ( err , response ) => resolve ( response ) ) )
407423
408- if ( event . queryStringParameters ) {
409- delete event . queryStringParameters
410- }
424+ return Promise . resolve ( )
425+ . then ( ( ) => call ( event ) )
426+ . then ( ( response ) => {
427+ // First request - Lambda container created
428+ expect ( response . statusCode ) . toBe ( 200 )
429+ expect ( collectGarbage . mock . calls ) . toHaveLength ( 0 )
430+ expect ( route . mock . calls ) . toHaveLength ( 1 )
431+ expect ( sendMetric ) . toHaveBeenCalledWith ( 'LambdaCreated' )
432+ expect ( sendMetric ) . not . toHaveBeenCalledWith ( 'LambdaReused' )
433+ } )
434+ . then ( ( ) => call ( event ) )
435+ . then ( ( response ) => {
436+ // Second call - Lambda container reused
437+ expect ( response . statusCode ) . toBe ( 200 )
438+ expect ( collectGarbage . mock . calls ) . toHaveLength ( 0 )
439+ expect ( route . mock . calls ) . toHaveLength ( 2 )
440+ expect ( sendMetric ) . toHaveBeenCalledWith ( 'LambdaCreated' )
441+ expect ( sendMetric ) . toHaveBeenCalledWith ( 'LambdaReused' )
442+ } )
443+ } )
411444
412- const context = AWSMockContext ( {
413- functionName : 'SSRTest'
414- } )
445+ test ( 'Lambda reuse -- with Forced Garbage Collection Enabled' , ( ) => {
446+ process . env . FORCE_GC = 'true'
447+ const { event, context} = createApiGatewayEvent ( )
448+ const { route, handler, collectGarbage, sendMetric, new_server} = createServerWithGCSpy ( )
449+ server = new_server
415450
416451 const call = ( event ) =>
417452 new Promise ( ( resolve ) => handler ( event , context , ( err , response ) => resolve ( response ) ) )
0 commit comments