32
32
from torchx .specs .finder import ComponentNotFoundException
33
33
from torchx .test .fixtures import TestWithTmpDir
34
34
from torchx .tracker .api import ENV_TORCHX_JOB_ID , ENV_TORCHX_PARENT_RUN_ID
35
+ from torchx .util .session import get_session_id
35
36
from torchx .util .types import none_throws
36
37
from torchx .workspace import WorkspaceMixin
37
38
@@ -51,7 +52,7 @@ def get_full_path(name: str) -> str:
51
52
return os .path .join (os .path .dirname (__file__ ), "resource" , name )
52
53
53
54
54
- @patch ("torchx.runner.api.log_event " )
55
+ @patch ("torchx.runner.events.record " )
55
56
class RunnerTest (TestWithTmpDir ):
56
57
def setUp (self ) -> None :
57
58
super ().setUp ()
@@ -104,7 +105,34 @@ def test_validate_invalid_replicas(self, _) -> None:
104
105
with self .assertRaises (ValueError ):
105
106
runner .run (app , scheduler = "local_dir" )
106
107
107
- def test_run (self , _ ) -> None :
108
+ def test_session_id (self , record_mock : MagicMock ) -> None :
109
+ test_file = self .tmpdir / "test_file"
110
+
111
+ with self .get_runner () as runner :
112
+ self .assertEqual (1 , len (runner .scheduler_backends ()))
113
+ role = Role (
114
+ name = "touch" ,
115
+ image = str (self .tmpdir ),
116
+ resource = resource .SMALL ,
117
+ entrypoint = "touch.sh" ,
118
+ args = [str (test_file )],
119
+ )
120
+ app = AppDef ("name" , roles = [role ])
121
+
122
+ app_handle_1 = runner .run (app , scheduler = "local_dir" , cfg = self .cfg )
123
+ none_throws (runner .wait (app_handle_1 , wait_interval = 0.1 ))
124
+
125
+ app_handle_2 = runner .run (app , scheduler = "local_dir" , cfg = self .cfg )
126
+ none_throws (runner .wait (app_handle_2 , wait_interval = 0.1 ))
127
+
128
+ session_id = get_session_id ()
129
+ self .assertIsNotNone (session_id )
130
+ record_mock .assert_called ()
131
+ for i in range (record_mock .call_count ):
132
+ event = record_mock .call_args_list [i ].args [0 ]
133
+ self .assertEqual (event .session , session_id )
134
+
135
+ def test_run (self , record_mock : MagicMock ) -> None :
108
136
test_file = self .tmpdir / "test_file"
109
137
110
138
with self .get_runner () as runner :
@@ -121,8 +149,14 @@ def test_run(self, _) -> None:
121
149
app_handle = runner .run (app , scheduler = "local_dir" , cfg = self .cfg )
122
150
app_status = none_throws (runner .wait (app_handle , wait_interval = 0.1 ))
123
151
self .assertEqual (AppState .SUCCEEDED , app_status .state )
124
-
125
- def test_dryrun (self , _ ) -> None :
152
+ session_id = get_session_id ()
153
+ self .assertIsNotNone (session_id )
154
+ record_mock .assert_called ()
155
+ for i in range (record_mock .call_count ):
156
+ event = record_mock .call_args_list [i ].args [0 ]
157
+ self .assertEqual (event .session , session_id )
158
+
159
+ def test_dryrun (self , record_mock : MagicMock ) -> None :
126
160
scheduler_mock = MagicMock ()
127
161
scheduler_mock .run_opts .return_value .resolve .return_value = {
128
162
** self .cfg ,
@@ -145,6 +179,12 @@ def test_dryrun(self, _) -> None:
145
179
app , {** self .cfg , "foo" : "bar" }
146
180
)
147
181
scheduler_mock ._validate .assert_called_once ()
182
+ session_id = get_session_id ()
183
+ self .assertIsNotNone (session_id )
184
+ record_mock .assert_called ()
185
+ for i in range (record_mock .call_count ):
186
+ event = record_mock .call_args_list [i ].args [0 ]
187
+ self .assertEqual (event .session , session_id )
148
188
149
189
def test_dryrun_env_variables (self , _ ) -> None :
150
190
scheduler_mock = MagicMock ()
0 commit comments