android-env 1.2.2__py3-none-any.whl → 1.2.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. android_env/__init__.py +1 -1
  2. android_env/components/__init__.py +1 -1
  3. android_env/components/a11y/__init__.py +15 -0
  4. android_env/components/a11y/a11y_events.py +118 -0
  5. android_env/components/a11y/a11y_events_test.py +173 -0
  6. android_env/components/a11y/a11y_forests.py +128 -0
  7. android_env/components/a11y/a11y_forests_test.py +237 -0
  8. android_env/components/a11y/a11y_servicer.py +199 -0
  9. android_env/components/a11y/a11y_servicer_test.py +224 -0
  10. android_env/components/action_fns.py +132 -0
  11. android_env/components/action_fns_test.py +227 -0
  12. android_env/components/action_type.py +26 -3
  13. android_env/components/adb_call_parser.py +233 -185
  14. android_env/components/adb_call_parser_test.py +165 -163
  15. android_env/components/adb_controller.py +19 -28
  16. android_env/components/adb_controller_test.py +100 -9
  17. android_env/components/adb_log_stream.py +3 -3
  18. android_env/components/adb_log_stream_test.py +1 -1
  19. android_env/components/app_screen_checker.py +15 -13
  20. android_env/components/app_screen_checker_test.py +1 -1
  21. android_env/components/config_classes.py +203 -0
  22. android_env/components/coordinator.py +53 -338
  23. android_env/components/coordinator_test.py +26 -283
  24. android_env/components/device_settings.py +174 -0
  25. android_env/components/device_settings_test.py +228 -0
  26. android_env/components/dumpsys_thread.py +3 -4
  27. android_env/components/dumpsys_thread_test.py +1 -1
  28. android_env/components/errors.py +2 -5
  29. android_env/components/errors_test.py +1 -1
  30. android_env/components/log_stream.py +2 -2
  31. android_env/components/log_stream_test.py +1 -1
  32. android_env/components/logcat_thread.py +9 -8
  33. android_env/components/logcat_thread_test.py +2 -3
  34. android_env/components/{utils.py → pixel_fns.py} +19 -20
  35. android_env/components/{utils_test.py → pixel_fns_test.py} +20 -15
  36. android_env/components/setup_step_interpreter.py +45 -37
  37. android_env/components/setup_step_interpreter_test.py +1 -1
  38. android_env/components/simulators/__init__.py +1 -1
  39. android_env/components/simulators/base_simulator.py +79 -23
  40. android_env/components/simulators/base_simulator_test.py +131 -9
  41. android_env/components/simulators/emulator/__init__.py +1 -1
  42. android_env/components/simulators/emulator/emulator_launcher.py +62 -81
  43. android_env/components/simulators/emulator/emulator_launcher_test.py +120 -43
  44. android_env/components/simulators/emulator/emulator_simulator.py +111 -98
  45. android_env/components/simulators/emulator/emulator_simulator_test.py +174 -138
  46. android_env/components/simulators/fake/__init__.py +1 -1
  47. android_env/components/simulators/fake/fake_simulator.py +9 -17
  48. android_env/components/simulators/fake/fake_simulator_test.py +23 -8
  49. android_env/components/specs.py +1 -1
  50. android_env/components/specs_test.py +1 -1
  51. android_env/components/task_manager.py +26 -31
  52. android_env/components/task_manager_test.py +1 -18
  53. android_env/env_interface.py +1 -17
  54. android_env/environment.py +27 -17
  55. android_env/environment_test.py +51 -25
  56. android_env/loader.py +57 -43
  57. android_env/loader_test.py +115 -35
  58. android_env/proto/__init__.py +1 -1
  59. android_env/proto/a11y/__init__.py +15 -0
  60. android_env/proto/a11y/a11y.proto +75 -0
  61. android_env/proto/a11y/a11y_pb2.py +54 -0
  62. android_env/proto/a11y/a11y_pb2.pyi +49 -0
  63. android_env/proto/a11y/a11y_pb2_grpc.py +202 -0
  64. android_env/proto/a11y/android_accessibility_action.proto +32 -0
  65. android_env/proto/a11y/android_accessibility_action_pb2.py +37 -0
  66. android_env/proto/a11y/android_accessibility_action_pb2.pyi +13 -0
  67. android_env/proto/a11y/android_accessibility_action_pb2_grpc.py +24 -0
  68. android_env/proto/a11y/android_accessibility_forest.proto +29 -0
  69. android_env/proto/a11y/android_accessibility_forest_pb2.py +38 -0
  70. android_env/proto/a11y/android_accessibility_forest_pb2.pyi +13 -0
  71. android_env/proto/a11y/android_accessibility_forest_pb2_grpc.py +24 -0
  72. android_env/proto/a11y/android_accessibility_node_info.proto +122 -0
  73. android_env/proto/a11y/android_accessibility_node_info_clickable_span.proto +49 -0
  74. android_env/proto/a11y/android_accessibility_node_info_clickable_span_pb2.py +39 -0
  75. android_env/proto/a11y/android_accessibility_node_info_clickable_span_pb2.pyi +28 -0
  76. android_env/proto/a11y/android_accessibility_node_info_clickable_span_pb2_grpc.py +24 -0
  77. android_env/proto/a11y/android_accessibility_node_info_pb2.py +42 -0
  78. android_env/proto/a11y/android_accessibility_node_info_pb2.pyi +75 -0
  79. android_env/proto/a11y/android_accessibility_node_info_pb2_grpc.py +24 -0
  80. android_env/proto/a11y/android_accessibility_tree.proto +29 -0
  81. android_env/proto/a11y/android_accessibility_tree_pb2.py +38 -0
  82. android_env/proto/a11y/android_accessibility_tree_pb2.pyi +13 -0
  83. android_env/proto/a11y/android_accessibility_tree_pb2_grpc.py +24 -0
  84. android_env/proto/a11y/android_accessibility_window_info.proto +84 -0
  85. android_env/proto/a11y/android_accessibility_window_info_pb2.py +41 -0
  86. android_env/proto/a11y/android_accessibility_window_info_pb2.pyi +48 -0
  87. android_env/proto/a11y/android_accessibility_window_info_pb2_grpc.py +24 -0
  88. android_env/proto/a11y/rect.proto +30 -0
  89. android_env/proto/a11y/rect_pb2.py +37 -0
  90. android_env/proto/a11y/rect_pb2.pyi +17 -0
  91. android_env/proto/a11y/rect_pb2_grpc.py +24 -0
  92. android_env/proto/adb.proto +13 -1
  93. android_env/proto/adb_pb2.py +120 -107
  94. android_env/proto/adb_pb2.pyi +396 -0
  95. android_env/proto/adb_pb2_grpc.py +20 -0
  96. android_env/proto/emulator_controller.proto +1 -1
  97. android_env/proto/emulator_controller_pb2.py +142 -131
  98. android_env/proto/emulator_controller_pb2.pyi +672 -0
  99. android_env/proto/emulator_controller_pb2_grpc.py +497 -136
  100. android_env/proto/snapshot.proto +1 -1
  101. android_env/proto/snapshot_pb2.py +30 -19
  102. android_env/proto/snapshot_pb2.pyi +117 -0
  103. android_env/proto/snapshot_pb2_grpc.py +20 -0
  104. android_env/proto/snapshot_service.proto +1 -1
  105. android_env/proto/snapshot_service_pb2.py +36 -25
  106. android_env/proto/snapshot_service_pb2.pyi +86 -0
  107. android_env/proto/snapshot_service_pb2_grpc.py +119 -28
  108. android_env/proto/state.proto +1 -1
  109. android_env/proto/state_pb2.py +46 -35
  110. android_env/proto/state_pb2.pyi +85 -0
  111. android_env/proto/state_pb2_grpc.py +20 -0
  112. android_env/proto/task.proto +4 -1
  113. android_env/proto/task_pb2.py +41 -30
  114. android_env/proto/task_pb2.pyi +160 -0
  115. android_env/proto/task_pb2_grpc.py +20 -0
  116. android_env/wrappers/__init__.py +1 -1
  117. android_env/wrappers/a11y_grpc_wrapper.py +500 -0
  118. android_env/wrappers/a11y_grpc_wrapper_test.py +849 -0
  119. android_env/wrappers/base_wrapper.py +1 -5
  120. android_env/wrappers/base_wrapper_test.py +1 -7
  121. android_env/wrappers/discrete_action_wrapper.py +15 -14
  122. android_env/wrappers/discrete_action_wrapper_test.py +1 -1
  123. android_env/wrappers/flat_interface_wrapper.py +5 -5
  124. android_env/wrappers/flat_interface_wrapper_test.py +1 -1
  125. android_env/wrappers/float_pixels_wrapper.py +5 -4
  126. android_env/wrappers/float_pixels_wrapper_test.py +1 -1
  127. android_env/wrappers/gym_wrapper.py +1 -1
  128. android_env/wrappers/gym_wrapper_test.py +1 -1
  129. android_env/wrappers/image_rescale_wrapper.py +13 -10
  130. android_env/wrappers/image_rescale_wrapper_test.py +1 -1
  131. android_env/wrappers/last_action_wrapper.py +5 -4
  132. android_env/wrappers/last_action_wrapper_test.py +1 -1
  133. android_env/wrappers/rate_limit_wrapper.py +1 -1
  134. android_env/wrappers/rate_limit_wrapper_test.py +1 -1
  135. android_env/wrappers/tap_action_wrapper.py +12 -12
  136. android_env/wrappers/tap_action_wrapper_test.py +49 -14
  137. {android_env-1.2.2.dist-info → android_env-1.2.3.dist-info}/METADATA +14 -16
  138. android_env-1.2.3.dist-info/RECORD +141 -0
  139. {android_env-1.2.2.dist-info → android_env-1.2.3.dist-info}/WHEEL +1 -1
  140. android_env-1.2.2.dist-info/RECORD +0 -88
  141. {android_env-1.2.2.dist-info → android_env-1.2.3.dist-info/licenses}/LICENSE +0 -0
  142. {android_env-1.2.2.dist-info → android_env-1.2.3.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,5 @@
1
1
  # coding=utf-8
2
- # Copyright 2023 DeepMind Technologies Limited.
2
+ # Copyright 2024 DeepMind Technologies Limited.
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
5
5
  # you may not use this file except in compliance with the License.
@@ -22,10 +22,12 @@ import tempfile
22
22
  from unittest import mock
23
23
 
24
24
  from absl.testing import absltest
25
+ from absl.testing import parameterized
26
+ from android_env.components import config_classes
25
27
  from android_env.components.simulators.emulator import emulator_launcher
26
28
 
27
29
 
28
- class EmulatorLauncherTest(absltest.TestCase):
30
+ class EmulatorLauncherTest(parameterized.TestCase):
29
31
 
30
32
  def setUp(self):
31
33
  super().setUp()
@@ -42,13 +44,14 @@ class EmulatorLauncherTest(absltest.TestCase):
42
44
  '-adb-path',
43
45
  'fake/path/adb',
44
46
  '-gpu',
45
- 'swiftshader_indirect',
47
+ 'swangle_indirect',
46
48
  '-no-audio',
47
49
  '-show-kernel',
48
50
  '-verbose',
49
51
  '-avd',
50
52
  self._avd_name,
51
53
  ]
54
+ self._headless = ['-no-skin', '-no-window']
52
55
  self._ports = ['-ports', f'{self._emulator_console_port},{self._adb_port}']
53
56
  self._snapshot = ['-no-snapshot']
54
57
 
@@ -58,10 +61,12 @@ class EmulatorLauncherTest(absltest.TestCase):
58
61
  base_lib_dir + 'gles_swiftshader/', base_lib_dir
59
62
  ])
60
63
 
64
+ # Instantiate the config to extract default values.
65
+ config = config_classes.EmulatorLauncherConfig()
61
66
  self._expected_env_vars = {
62
67
  'ANDROID_HOME': '',
63
- 'ANDROID_SDK_ROOT': '',
64
- 'ANDROID_AVD_HOME': '',
68
+ 'ANDROID_SDK_ROOT': config.android_sdk_root,
69
+ 'ANDROID_AVD_HOME': config.android_avd_home,
65
70
  'ANDROID_EMULATOR_KVM_DEVICE': '/dev/kvm',
66
71
  'ANDROID_ADB_SERVER_PORT': '1234',
67
72
  'LD_LIBRARY_PATH': ld_library_path,
@@ -69,130 +74,195 @@ class EmulatorLauncherTest(absltest.TestCase):
69
74
  'ANDROID_EMU_ENABLE_CRASH_REPORTING': '1',
70
75
  }
71
76
 
77
+ @parameterized.named_parameters([
78
+ ('hide_perf_stats', False),
79
+ ('show_perf_stats', True),
80
+ ])
72
81
  @mock.patch.object(os, 'makedirs')
73
82
  @mock.patch.object(os, 'environ', autospec=True, return_value=dict())
74
83
  @mock.patch.object(tempfile, 'TemporaryDirectory', instance=True)
75
84
  def test_launch(
76
85
  self,
86
+ show_perf_stats: bool,
77
87
  mock_tmp_dir,
78
88
  unused_os_environ,
79
89
  unused_os_makedirs,
80
90
  ):
81
-
82
91
  mock_tmp_dir.return_value.name.return_value = 'local_tmp_dir'
83
92
 
84
- launcher = emulator_launcher.EmulatorLauncher(
85
- adb_path=self._adb_path,
93
+ config = config_classes.EmulatorLauncherConfig(
86
94
  adb_port=self._adb_port,
87
- adb_server_port=self._adb_server_port,
88
95
  emulator_console_port=self._emulator_console_port,
89
96
  emulator_path=self._emulator_path,
90
97
  avd_name=self._avd_name,
91
- grpc_port=-1)
98
+ grpc_port=-1,
99
+ show_perf_stats=show_perf_stats,
100
+ )
101
+ adb_controller_config = config_classes.AdbControllerConfig(
102
+ adb_path=self._adb_path,
103
+ adb_server_port=self._adb_server_port,
104
+ )
105
+ launcher = emulator_launcher.EmulatorLauncher(
106
+ config=config, adb_controller_config=adb_controller_config
107
+ )
108
+
109
+ expected_env_vars = self._expected_env_vars
110
+ expected_env_vars['SHOW_PERF_STATS'] = '1' if show_perf_stats else '0'
92
111
 
93
112
  with mock.patch.object(
94
- subprocess, 'Popen', autospec=True) as emulator_init, \
95
- mock.patch.object(builtins, 'open', autospec=True) as f:
113
+ subprocess, 'Popen', autospec=True
114
+ ) as emulator_init, mock.patch.object(builtins, 'open', autospec=True) as f:
96
115
  f.return_value.__enter__ = f()
97
116
  launcher.launch_emulator_process()
98
117
  emulator_init.assert_called_once_with(
99
- args=self._expected_command + self._ports + self._snapshot,
100
- env=self._expected_env_vars,
118
+ args=self._expected_command
119
+ + self._headless
120
+ + self._ports
121
+ + self._snapshot,
122
+ env=expected_env_vars,
101
123
  stdout=f(),
102
- stderr=f())
124
+ stderr=f(),
125
+ )
103
126
 
127
+ @parameterized.named_parameters([
128
+ ('hide_perf_stats', False),
129
+ ('show_perf_stats', True),
130
+ ])
104
131
  @mock.patch.object(os, 'makedirs')
105
132
  @mock.patch.object(os, 'environ', autospec=True, return_value=dict())
106
133
  @mock.patch.object(tempfile, 'TemporaryDirectory', instance=True)
107
134
  def test_grpc_port(
108
135
  self,
136
+ show_perf_stats: bool,
109
137
  mock_tmp_dir,
110
138
  unused_os_environ,
111
139
  unused_os_makedirs,
112
140
  ):
113
-
114
141
  mock_tmp_dir.return_value.name.return_value = 'local_tmp_dir'
115
142
 
116
- launcher = emulator_launcher.EmulatorLauncher(
117
- adb_path=self._adb_path,
143
+ config = config_classes.EmulatorLauncherConfig(
118
144
  adb_port=self._adb_port,
119
- adb_server_port=self._adb_server_port,
120
145
  emulator_console_port=self._emulator_console_port,
121
146
  emulator_path=self._emulator_path,
122
147
  avd_name=self._avd_name,
123
- grpc_port=8554)
148
+ grpc_port=8554,
149
+ show_perf_stats=show_perf_stats,
150
+ )
151
+ adb_controller_config = config_classes.AdbControllerConfig(
152
+ adb_path=self._adb_path,
153
+ adb_server_port=self._adb_server_port,
154
+ )
155
+ launcher = emulator_launcher.EmulatorLauncher(
156
+ config=config, adb_controller_config=adb_controller_config
157
+ )
158
+
159
+ expected_env_vars = self._expected_env_vars
160
+ expected_env_vars['SHOW_PERF_STATS'] = '1' if show_perf_stats else '0'
124
161
 
125
162
  with mock.patch.object(
126
- subprocess, 'Popen', autospec=True) as emulator_init, \
127
- mock.patch.object(builtins, 'open', autospec=True) as f:
163
+ subprocess, 'Popen', autospec=True
164
+ ) as emulator_init, mock.patch.object(builtins, 'open', autospec=True) as f:
128
165
  f.return_value.__enter__ = f()
129
166
  launcher.launch_emulator_process()
130
167
  emulator_init.assert_called_once_with(
131
- args=self._expected_command + ['-grpc', '8554'] + self._ports +
132
- self._snapshot,
133
- env=self._expected_env_vars,
168
+ args=self._expected_command
169
+ + ['-grpc', '8554']
170
+ + self._headless
171
+ + self._ports
172
+ + self._snapshot,
173
+ env=expected_env_vars,
134
174
  stdout=f(),
135
- stderr=f())
175
+ stderr=f(),
176
+ )
136
177
 
178
+ @parameterized.named_parameters([
179
+ ('hide_perf_stats', False),
180
+ ('show_perf_stats', True),
181
+ ])
137
182
  @mock.patch.object(os, 'makedirs')
138
183
  @mock.patch.object(os, 'environ', autospec=True, return_value=dict())
139
184
  @mock.patch.object(tempfile, 'TemporaryDirectory', instance=True)
140
185
  def test_snapshot(
141
186
  self,
187
+ show_perf_stats: bool,
142
188
  mock_tmp_dir,
143
189
  unused_os_environ,
144
190
  unused_os_makedirs,
145
191
  ):
146
-
147
192
  mock_tmp_dir.return_value.name.return_value = 'local_tmp_dir'
148
193
 
149
- launcher = emulator_launcher.EmulatorLauncher(
150
- adb_path=self._adb_path,
194
+ config = config_classes.EmulatorLauncherConfig(
151
195
  adb_port=self._adb_port,
152
- adb_server_port=self._adb_server_port,
153
196
  emulator_console_port=self._emulator_console_port,
154
197
  emulator_path=self._emulator_path,
155
198
  avd_name=self._avd_name,
156
199
  grpc_port=-1,
157
- snapshot_name='my_snapshot')
200
+ snapshot_name='my_snapshot',
201
+ show_perf_stats=show_perf_stats,
202
+ )
203
+ adb_controller_config = config_classes.AdbControllerConfig(
204
+ adb_path=self._adb_path,
205
+ adb_server_port=self._adb_server_port,
206
+ )
207
+ launcher = emulator_launcher.EmulatorLauncher(
208
+ config=config, adb_controller_config=adb_controller_config
209
+ )
158
210
 
159
211
  expected_snapshot = [
160
212
  '-snapshot', 'my_snapshot', '-feature',
161
213
  'AllowSnapshotMigration,MigratableSnapshotSave'
162
214
  ]
163
215
 
216
+ expected_env_vars = self._expected_env_vars
217
+ expected_env_vars['SHOW_PERF_STATS'] = '1' if show_perf_stats else '0'
218
+
164
219
  with mock.patch.object(
165
220
  subprocess, 'Popen', autospec=True) as emulator_init, \
166
221
  mock.patch.object(builtins, 'open', autospec=True) as f:
167
222
  f.return_value.__enter__ = f()
168
223
  launcher.launch_emulator_process()
169
224
  emulator_init.assert_called_once_with(
170
- args=self._expected_command + self._ports + expected_snapshot,
171
- env=self._expected_env_vars,
225
+ args=self._expected_command
226
+ + self._headless
227
+ + self._ports
228
+ + expected_snapshot,
229
+ env=expected_env_vars,
172
230
  stdout=f(),
173
- stderr=f())
231
+ stderr=f(),
232
+ )
174
233
 
234
+ @parameterized.named_parameters([
235
+ ('hide_perf_stats', False),
236
+ ('show_perf_stats', True),
237
+ ])
175
238
  @mock.patch.object(os, 'makedirs')
176
239
  @mock.patch.object(os, 'environ', autospec=True, return_value=dict())
177
240
  @mock.patch.object(tempfile, 'TemporaryDirectory', instance=True)
178
241
  def test_network_restrict(
179
242
  self,
243
+ show_perf_stats: bool,
180
244
  mock_tmp_dir,
181
245
  unused_os_environ,
182
246
  unused_os_makedirs,
183
247
  ):
184
-
185
248
  mock_tmp_dir.return_value.name.return_value = 'local_tmp_dir'
186
249
 
187
- launcher = emulator_launcher.EmulatorLauncher(
188
- adb_path=self._adb_path,
250
+ config = config_classes.EmulatorLauncherConfig(
189
251
  adb_port=self._adb_port,
190
- adb_server_port=self._adb_server_port,
191
252
  emulator_console_port=self._emulator_console_port,
192
253
  emulator_path=self._emulator_path,
193
254
  avd_name=self._avd_name,
194
255
  grpc_port=-1,
195
- restrict_network=True)
256
+ restrict_network=True,
257
+ show_perf_stats=show_perf_stats,
258
+ )
259
+ adb_controller_config = config_classes.AdbControllerConfig(
260
+ adb_path=self._adb_path,
261
+ adb_server_port=self._adb_server_port,
262
+ )
263
+ launcher = emulator_launcher.EmulatorLauncher(
264
+ config=config, adb_controller_config=adb_controller_config
265
+ )
196
266
 
197
267
  expected_snapshot = ['-no-snapshot']
198
268
  expected_network_restrict = [
@@ -200,17 +270,24 @@ class EmulatorLauncherTest(absltest.TestCase):
200
270
  'restrict=y'
201
271
  ]
202
272
 
273
+ expected_env_vars = self._expected_env_vars
274
+ expected_env_vars['SHOW_PERF_STATS'] = '1' if show_perf_stats else '0'
275
+
203
276
  with mock.patch.object(
204
277
  subprocess, 'Popen', autospec=True) as emulator_init, \
205
278
  mock.patch.object(builtins, 'open', autospec=True) as f:
206
279
  f.return_value.__enter__ = f()
207
280
  launcher.launch_emulator_process()
208
281
  emulator_init.assert_called_once_with(
209
- self._expected_command + self._ports + expected_snapshot +
210
- expected_network_restrict,
211
- env=self._expected_env_vars,
282
+ self._expected_command
283
+ + self._headless
284
+ + self._ports
285
+ + expected_snapshot
286
+ + expected_network_restrict,
287
+ env=expected_env_vars,
212
288
  stdout=f(),
213
- stderr=f())
289
+ stderr=f(),
290
+ )
214
291
 
215
292
 
216
293
  if __name__ == '__main__':