@@ -34,11 +34,11 @@ func TestRegisterExtension(t *testing.T) {
3434 client := NewClient (srv .URL [7 :], extensionName )
3535
3636 // Without Context
37- response , err := client .RegisterExtension (context .TODO ())
37+ response , err := client .RegisterExtension (context .TODO (), false )
3838 commonAsserts (t , client , response , err )
3939
4040 // With Context
41- response , err = client .RegisterExtension (context .Background ())
41+ response , err = client .RegisterExtension (context .Background (), false )
4242 commonAsserts (t , client , response , err )
4343}
4444
@@ -147,3 +147,146 @@ func TestExitError(t *testing.T) {
147147 response , err = client .ExitError (context .Background (), "EXIT ERROR" )
148148 commonAsserts (t , client , response , err )
149149}
150+
151+ // TestRegisterExtension_ManagedInstanceMode tests extension registration in managed instance mode
152+ // In ManagedInstance mode, only SHUTDOWN events are registered (not INVOKE)
153+ func TestRegisterExtension_ManagedInstanceMode (t * testing.T ) {
154+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
155+ assertEqual (t , r .Method , http .MethodPost , "Method is not POST" )
156+ assertNotEmpty (t , r .Header .Get (extensionNameHeader ), "Extension Name Header not present" )
157+
158+ reqBytes , err := ioutil .ReadAll (r .Body )
159+ assertNoError (t , err , "Received error while reading request" )
160+ defer func () {
161+ if err := r .Body .Close (); err != nil {
162+ log .Printf ("failed to close body: %v" , err )
163+ }
164+ }()
165+ assertNotEmpty (t , reqBytes , "Received error in request" )
166+
167+ // Verify the request body contains only SHUTDOWN event for managed instance mode
168+ var reqBody map [string ]interface {}
169+ err = json .Unmarshal (reqBytes , & reqBody )
170+ assertNoError (t , err , "Failed to unmarshal request body" )
171+
172+ events , ok := reqBody ["events" ].([]interface {})
173+ if ! ok {
174+ t .Error ("Events field not found or not an array" )
175+ }
176+ assertEqual (t , len (events ), 1 , "Expected 1 event for managed instance mode" )
177+ assertEqual (t , events [0 ], "SHUTDOWN" , "Expected only SHUTDOWN event for managed instance mode" )
178+
179+ w .Header ().Add (extensionIdentiferHeader , "test-sumo-id" )
180+ w .WriteHeader (200 )
181+ respBytes , _ := json .Marshal (RegisterResponse {
182+ FunctionName : "test-function" ,
183+ FunctionVersion : "$LATEST" ,
184+ Handler : "index.handler" ,
185+ })
186+ _ , _ = w .Write (respBytes )
187+ }))
188+
189+ defer srv .Close ()
190+ client := NewClient (srv .URL [7 :], extensionName )
191+
192+ // Test with isManagedInstance = true
193+ response , err := client .RegisterExtension (context .Background (), true )
194+ commonAsserts (t , client , response , err )
195+
196+ // Verify the response is properly unmarshaled
197+ if response .FunctionName != "test-function" {
198+ t .Errorf ("Expected function name 'test-function', got '%s'" , response .FunctionName )
199+ }
200+ }
201+
202+ // TestRegisterExtension_ManagedInstanceModeWithoutContext tests managed instance mode without context
203+ func TestRegisterExtension_ManagedInstanceModeWithoutContext (t * testing.T ) {
204+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
205+ reqBytes , err := ioutil .ReadAll (r .Body )
206+ assertNoError (t , err , "Received error while reading request" )
207+ defer func () {
208+ if err := r .Body .Close (); err != nil {
209+ log .Printf ("failed to close body: %v" , err )
210+ }
211+ }()
212+
213+ var reqBody map [string ]interface {}
214+ err = json .Unmarshal (reqBytes , & reqBody )
215+ assertNoError (t , err , "Failed to unmarshal request body" )
216+
217+ events , ok := reqBody ["events" ].([]interface {})
218+ if ! ok {
219+ t .Error ("Events field not found or not an array" )
220+ }
221+ assertEqual (t , len (events ), 1 , "Expected 1 event for managed instance mode" )
222+
223+ w .Header ().Add (extensionIdentiferHeader , "test-sumo-id" )
224+ w .WriteHeader (200 )
225+ respBytes , _ := json .Marshal (RegisterResponse {})
226+ _ , _ = w .Write (respBytes )
227+ }))
228+
229+ defer srv .Close ()
230+ client := NewClient (srv .URL [7 :], extensionName )
231+
232+ // Test with isManagedInstance = true and nil context
233+ response , err := client .RegisterExtension (context .TODO (), true )
234+ commonAsserts (t , client , response , err )
235+ }
236+
237+ // TestRegisterExtension_ManagedInstanceModeEventValidation tests that managed instance mode registers correct events
238+ func TestRegisterExtension_ManagedInstanceModeEventValidation (t * testing.T ) {
239+ receivedEvents := make ([]string , 0 )
240+
241+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
242+ reqBytes , err := ioutil .ReadAll (r .Body )
243+ assertNoError (t , err , "Received error while reading request" )
244+ defer func () {
245+ if err := r .Body .Close (); err != nil {
246+ log .Printf ("failed to close body: %v" , err )
247+ }
248+ }()
249+
250+ var reqBody map [string ]interface {}
251+ err = json .Unmarshal (reqBytes , & reqBody )
252+ assertNoError (t , err , "Failed to unmarshal request body" )
253+
254+ events , ok := reqBody ["events" ].([]interface {})
255+ if ! ok {
256+ t .Error ("Events field not found or not an array" )
257+ }
258+
259+ for _ , e := range events {
260+ receivedEvents = append (receivedEvents , e .(string ))
261+ }
262+
263+ w .Header ().Add (extensionIdentiferHeader , "test-sumo-id" )
264+ w .WriteHeader (200 )
265+ respBytes , _ := json .Marshal (RegisterResponse {})
266+ _ , _ = w .Write (respBytes )
267+ }))
268+
269+ defer srv .Close ()
270+ client := NewClient (srv .URL [7 :], extensionName )
271+
272+ _ , err := client .RegisterExtension (context .Background (), true )
273+ assertNoError (t , err , "Failed to register extension in ManagedInstance mode" )
274+
275+ // Validate that INVOKE event is NOT present in managed instance mode
276+ for _ , event := range receivedEvents {
277+ if event == "INVOKE" {
278+ t .Error ("INVOKE event should not be registered in managed instance mode" )
279+ }
280+ }
281+
282+ // Validate that SHUTDOWN event IS present
283+ foundShutdown := false
284+ for _ , event := range receivedEvents {
285+ if event == "SHUTDOWN" {
286+ foundShutdown = true
287+ }
288+ }
289+ if ! foundShutdown {
290+ t .Error ("SHUTDOWN event should be registered in managed instance mode" )
291+ }
292+ }
0 commit comments