1212from alttester import *
1313
1414from test import TestConfig , UnityTest
15- from test_windows_helpers import login , open_sample_app , launch_browser , bring_sample_app_to_foreground , stop_browser , stop_sample_app , logout_with_controlled_browser
15+ from test_windows_helpers import login , open_sample_app , launch_browser , bring_sample_app_to_foreground , stop_browser , stop_sample_app , logout_with_controlled_browser , get_product_name
1616
1717class WindowsTest (UnityTest ):
1818
@@ -120,11 +120,56 @@ def _perform_login(self):
120120 bring_sample_app_to_foreground ()
121121
122122 # Wait for authenticated screen
123- self .get_altdriver ().wait_for_current_scene_to_be ("AuthenticatedScene" )
123+ # Default AltTester timeout for this command is ~20s; CI often needs longer,
124+ # especially when the browser auto-handles the deep-link without a dialog.
125+ self .get_altdriver ().wait_for_current_scene_to_be ("AuthenticatedScene" , timeout = 90 )
124126 stop_browser ()
125127 print ("[SUCCESS] Login successful" )
126128
127129 except Exception as err :
130+ # Dump Player.log tail to help diagnose why the deep-link callback
131+ # wasn't processed (or why Unity failed after receiving it).
132+ try :
133+ import os
134+ product_name = os .getenv ("UNITY_APP_NAME" , get_product_name ())
135+ log_path = os .path .join (
136+ "C:\\ Users\\ WindowsBuildsdkServi\\ AppData\\ LocalLow\\ Immutable" ,
137+ product_name ,
138+ "Player.log" ,
139+ )
140+ print (f"Attempting to dump Unity Player.log tail: { log_path } " )
141+ if os .path .exists (log_path ):
142+ with open (log_path , "r" , encoding = "utf-8" , errors = "ignore" ) as f :
143+ lines = f .read ().splitlines ()
144+ # The tail is often dominated by AltTester noise. Print:
145+ # 1) last lines, and 2) last relevant lines (Passport/Immutable/URLs/errors).
146+ tail = lines [- 200 :] if len (lines ) > 200 else lines
147+ print ("----- Player.log (tail) -----" )
148+ for line in tail :
149+ print (line )
150+ print ("----- end Player.log (tail) -----" )
151+
152+ needles = (
153+ "immutable" ,
154+ "passport" ,
155+ "launchauthurl" ,
156+ "passport_auth_url" ,
157+ "immutablerunner" ,
158+ "error" ,
159+ "exception" ,
160+ "gb:" ,
161+ )
162+ relevant = [ln for ln in lines if any (n in ln .lower () for n in needles )]
163+ relevant_tail = relevant [- 200 :] if len (relevant ) > 200 else relevant
164+ print ("----- Player.log (relevant tail) -----" )
165+ for line in relevant_tail :
166+ print (line )
167+ print ("----- end Player.log (relevant tail) -----" )
168+ else :
169+ print ("Player.log not found." )
170+ except Exception as e :
171+ print (f"Failed to dump Player.log: { e } " )
172+
128173 stop_browser ()
129174 raise SystemExit (f"Login failed: { err } " )
130175
@@ -224,7 +269,7 @@ def test_6_relogin(self):
224269 self .get_altdriver ().wait_for_object (By .NAME , "ReloginBtn" ).tap ()
225270
226271 # Wait for authenticated screen
227- self .get_altdriver ().wait_for_current_scene_to_be ("AuthenticatedScene" )
272+ self .get_altdriver ().wait_for_current_scene_to_be ("AuthenticatedScene" , timeout = 90 )
228273 print ("Re-logged in" )
229274
230275 # Get access token
@@ -251,7 +296,7 @@ def test_7_reconnect_connect_imx(self):
251296 self .get_altdriver ().wait_for_object (By .NAME , "ReconnectBtn" ).tap ()
252297
253298 # Wait for authenticated screen
254- self .get_altdriver ().wait_for_current_scene_to_be ("AuthenticatedScene" )
299+ self .get_altdriver ().wait_for_current_scene_to_be ("AuthenticatedScene" , timeout = 90 )
255300 print ("Reconnected" )
256301
257302 # Get access token
@@ -304,7 +349,7 @@ def test_8_connect_imx(self):
304349 bring_sample_app_to_foreground ()
305350
306351 # Wait for authenticated screen
307- self .get_altdriver ().wait_for_current_scene_to_be ("AuthenticatedScene" )
352+ self .get_altdriver ().wait_for_current_scene_to_be ("AuthenticatedScene" , timeout = 90 )
308353 print ("Logged in and connected to IMX" )
309354 stop_browser ()
310355
0 commit comments