esp-test-utils 0.2.1__tar.gz → 0.2.2__tar.gz

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 (112) hide show
  1. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/CHANGELOG.md +6 -0
  2. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/PKG-INFO +1 -1
  3. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esp_test_utils.egg-info/PKG-INFO +1 -1
  4. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/dut/dut_base.py +8 -2
  5. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/dut/esp_mixin.py +6 -1
  6. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/config/env_config.py +37 -7
  7. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/devices/esp_serial.py +11 -0
  8. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/tools/download_bin.py +1 -1
  9. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/utility/parse_bin_path.py +8 -0
  10. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/.github/.gitkeep +0 -0
  11. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/.github/workflows/pypi-publish.yml +0 -0
  12. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/.gitignore +0 -0
  13. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/.gitlab-ci.yml +0 -0
  14. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/.pre-commit-config.yaml +0 -0
  15. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/CONTRIBUTING.md +0 -0
  16. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/LICENSE +0 -0
  17. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/README.md +0 -0
  18. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/docs/Makefile +0 -0
  19. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/docs/conf.py +0 -0
  20. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/docs/index.rst +0 -0
  21. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/docs/make.bat +0 -0
  22. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esp_test_utils.egg-info/SOURCES.txt +0 -0
  23. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esp_test_utils.egg-info/dependency_links.txt +0 -0
  24. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esp_test_utils.egg-info/entry_points.txt +0 -0
  25. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esp_test_utils.egg-info/requires.txt +0 -0
  26. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esp_test_utils.egg-info/top_level.txt +0 -0
  27. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/__init__.py +0 -0
  28. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/__main__.py +0 -0
  29. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/__init__.py +0 -0
  30. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/dut/__init__.py +0 -0
  31. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/dut/create_dut.py +0 -0
  32. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/dut/esp_dut.py +0 -0
  33. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/dut/esp_port.py +0 -0
  34. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/dut/mac_mixin.py +0 -0
  35. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/dut/wrapper.py +0 -0
  36. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/port/__init__.py +0 -0
  37. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/port/base_port.py +0 -0
  38. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/adapter/port/serial_port.py +0 -0
  39. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/all.py +0 -0
  40. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/common/__init__.py +0 -0
  41. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/common/compat_typing.py +0 -0
  42. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/common/data_monitor.py +0 -0
  43. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/common/decorators.py +0 -0
  44. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/common/encoding.py +0 -0
  45. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/common/generator.py +0 -0
  46. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/common/shell.py +0 -0
  47. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/common/timestamp.py +0 -0
  48. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/config/__init__.py +0 -0
  49. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/config/default_config.py +0 -0
  50. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/db/__init__.py +0 -0
  51. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/db/runners.py +0 -0
  52. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/devices/__init__.py +0 -0
  53. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/devices/attenuator.py +0 -0
  54. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/devices/serial_dut.py +0 -0
  55. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/devices/serial_tools.py +0 -0
  56. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/env/__init__.py +0 -0
  57. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/env/base_env.py +0 -0
  58. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/env/wifi_env.py +0 -0
  59. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/esp_console/__init__.py +0 -0
  60. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/esp_console/wifi_cmd.py +0 -0
  61. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/interface/__init__.py +0 -0
  62. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/interface/dut.py +0 -0
  63. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/interface/port.py +0 -0
  64. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/iperf_utility/__init__.py +0 -0
  65. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/iperf_utility/iperf_results.py +0 -0
  66. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/iperf_utility/iperf_test.py +0 -0
  67. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/iperf_utility/iperf_test.test.py +0 -0
  68. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/iperf_utility/line_chart.py +0 -0
  69. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/logger/__init__.py +0 -0
  70. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/logger/logger.py +0 -0
  71. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/network/__init__.py +0 -0
  72. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/network/mac.py +0 -0
  73. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/network/netif.py +0 -0
  74. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/network/nic.py +0 -0
  75. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/scripts/downbin.py +0 -0
  76. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/scripts/list_ports.py +0 -0
  77. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/scripts/monitor.py +0 -0
  78. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/scripts/set_att.py +0 -0
  79. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/tools/copy_bin.py +0 -0
  80. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/tools/http_download.py +0 -0
  81. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/tools/pip_check.py +0 -0
  82. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/esptest/utility/gen_esp32part.py +0 -0
  83. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/example/jap_test.py +0 -0
  84. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/example/restart_test.py +0 -0
  85. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/pyproject.toml +0 -0
  86. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/setup.cfg +0 -0
  87. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/__init__.py +0 -0
  88. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/basic/test_decorators.py +0 -0
  89. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/basic/test_network.py +0 -0
  90. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/conftest.py +0 -0
  91. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/db/test_db_runners.py +0 -0
  92. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/esp_console/_files/wifi_cmd_connected_1.log +0 -0
  93. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/esp_console/_files/wifi_cmd_connected_2.log +0 -0
  94. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/esp_console/conftest.py +0 -0
  95. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/esp_console/test_WifiCmd.py +0 -0
  96. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/iperf_utility/_files/dut_iperf_rx1.log +0 -0
  97. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/iperf_utility/_files/dut_iperf_rx2.log +0 -0
  98. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/iperf_utility/_files/pc_iperf_rx.log +0 -0
  99. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/iperf_utility/_files/pc_iperf_rx2.log +0 -0
  100. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/iperf_utility/test_chart.py +0 -0
  101. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/iperf_utility/test_iperf_results.py +0 -0
  102. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/iperf_utility/test_iperf_util.py +0 -0
  103. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/test_Dut.py +0 -0
  104. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/test_EnvConfig.py +0 -0
  105. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/test_common.py +0 -0
  106. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/test_import.py +0 -0
  107. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/tools/test_download_file.py +0 -0
  108. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/tools/test_pip_check.py +0 -0
  109. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/utility/_files/test-bin.zip +0 -0
  110. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/utility/_files/test-get-baud/ESP32AT-V4.1.1.0/sdkconfig +0 -0
  111. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tests/utility/test_parse_bin_path.py +0 -0
  112. {esp_test_utils-0.2.1 → esp_test_utils-0.2.2}/tools/ci/check_dev_version.py +0 -0
@@ -1,3 +1,9 @@
1
+ ## v0.2.2 (2025-10-29)
2
+
3
+
4
+ - feat: get test variables from shell env
5
+ - fix: flash esp32 option no-stub
6
+
1
7
  ## v0.2.1 (2025-09-24)
2
8
 
3
9
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esp-test-utils
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: ESP Test Utils
5
5
  Author-email: Chen Yudong <chenyudong@espressif.com>
6
6
  License: Apache License
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esp-test-utils
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: ESP Test Utils
5
5
  Author-email: Chen Yudong <chenyudong@espressif.com>
6
6
  License: Apache License
@@ -11,7 +11,7 @@ from esptool.loader import ESPLoader
11
11
 
12
12
  import esptest.common.compat_typing as t
13
13
 
14
- from ...common.timestamp import timestamp_str
14
+ from ...common.timestamp import timestamp_slug
15
15
  from ...interface.dut import DutInterface
16
16
  from ...interface.port import PortInterface
17
17
  from ...logger import get_logger
@@ -62,7 +62,7 @@ class DutConfig:
62
62
  self._auto_gen_name()
63
63
  if not self.log_file:
64
64
  _log_path = self.log_path or './dut_logs'
65
- _file_name = f'{self.name}_{timestamp_str()}.log'.replace(':', '-')
65
+ _file_name = f'{self.name}_{timestamp_slug()}.log'.replace(':', '-')
66
66
  self.log_file = str(Path(_log_path) / _file_name)
67
67
  # serial configs
68
68
  _serial_configs = DEFAULT_SERIAL_CONFIGS.copy()
@@ -229,6 +229,12 @@ class DutBase(VariablesMixin, DutInterface): # pylint: disable=too-many-public-
229
229
  return self._base_port_proxy.raw_port
230
230
  raise NotImplementedError()
231
231
 
232
+ @property
233
+ def log_file(self) -> t.Any:
234
+ if self._base_port_proxy:
235
+ return self._base_port_proxy.log_file
236
+ return None
237
+
232
238
  @property
233
239
  def name(self) -> t.Any:
234
240
  return self.dut_config.name
@@ -95,7 +95,7 @@ class EspMixin(BaseProtocol):
95
95
  esptool=self.dut_config.use_esptool,
96
96
  erase_nvs=erase_nvs,
97
97
  )
98
- if not self.esp.IS_STUB:
98
+ if not self.esp.IS_STUB and self.esp.CHIP_NAME not in ['ESP32']:
99
99
  # preview or dev targets
100
100
  down_bin_tool.force_no_stub = True
101
101
  with self.disable_redirect_thread():
@@ -105,6 +105,11 @@ class EspMixin(BaseProtocol):
105
105
  def start_redirect_thread(self) -> None:
106
106
  if self.esp:
107
107
  self.esp._port.open() # pylint: disable=protected-access
108
+ if self.log_file:
109
+ with open(self.log_file, 'a', encoding='utf-8') as log_f:
110
+ log_f.write(
111
+ f'------------ reopen port: {self.esp._port.port} {self.esp._port.baudrate} --------------- \n' # pylint: disable=protected-access
112
+ )
108
113
  super().start_redirect_thread()
109
114
 
110
115
  def stop_redirect_thread(self) -> bool:
@@ -5,6 +5,30 @@ from typing import Any, List, Optional
5
5
 
6
6
  import yaml
7
7
 
8
+ VAR_NAME_MAPPING = {
9
+ 'ap_ssid': ['RUNNER_WIFI_SSID', 'RUNNER_AP_SSID'],
10
+ 'ap_password': ['RUNNER_WIFI_PASSWORD', 'RUNNER_AP_PASSWORD'],
11
+ 'pc_nic': ['RUNNER_PC_NIC'],
12
+ 'dut1': ['ESPPORT1'],
13
+ 'dut2': ['ESPPORT2'],
14
+ 'dut3': ['ESPPORT3'],
15
+ }
16
+
17
+
18
+ def get_variable_from_env(key: str) -> Any:
19
+ """Get test variable from shell environment
20
+
21
+ Args:
22
+ key (str): which variable to get
23
+ """
24
+ if key in VAR_NAME_MAPPING:
25
+ for var_name in VAR_NAME_MAPPING[key]:
26
+ var = os.getenv(var_name)
27
+ if var is not None:
28
+ logging.debug(f'Got env variable from shell env {var_name}: {var}')
29
+ return var
30
+ return None
31
+
8
32
 
9
33
  class EnvConfig:
10
34
  """Get test environment variables from config file.
@@ -32,6 +56,8 @@ class EnvConfig:
32
56
  # Find env config file from project root path
33
57
  # CI_PROJECT_DIR was set by gitlab CI
34
58
  PROJECT_ROOT_DIR = os.getenv('PROJECT_ROOT_DIR') or os.getenv('CI_PROJECT_DIR', '')
59
+ # allow EnvConfig load shell env variables, default enabled
60
+ DISABLE_LOAD_SHELL_ENV = os.getenv('ESPTEST_DISABLE_LOAD_SHELL_ENV', '').lower() in ('true', '1', 'yes', 'y')
35
61
 
36
62
  # Allow input variables from terminal during local debugging
37
63
  ALLOW_INPUT = not os.getenv('CI')
@@ -115,14 +141,18 @@ class EnvConfig:
115
141
  # do not use dict.get because we can input the variable for local tests
116
142
  if key in self.config_data:
117
143
  var = self.config_data[key]
118
- elif default:
144
+ elif default is not None:
119
145
  var = default
120
146
  else:
121
- logging.warning(f'Failed to get env variable {self.env_tag}/{key}.')
122
- logging.info(self.__doc__)
123
- if not self.ALLOW_INPUT:
124
- raise ValueError(f'Env variable not found: {self.env_tag}/{key}')
125
- # For local test, support input the variable from console
126
- var = input('You can input the variable now:')
147
+ if not self.DISABLE_LOAD_SHELL_ENV:
148
+ # Try to get from shell environment variables
149
+ var = get_variable_from_env(key)
150
+ if var is None:
151
+ logging.warning(f'Failed to get env variable {self.env_tag}/{key}.')
152
+ logging.info(self.__doc__)
153
+ if not self.ALLOW_INPUT:
154
+ raise ValueError(f'Env variable not found: {self.env_tag}/{key}')
155
+ # For local test, support input the variable from console
156
+ var = input('You can input the variable now:')
127
157
  logging.debug(f'Got env variable {self.env_tag}/{key}: {var}')
128
158
  return var
@@ -84,3 +84,14 @@ def list_all_esp_ports() -> t.List[EspPortInfo]:
84
84
  for port in get_all_serial_ports():
85
85
  esp_ports.append(detect_one_port(port))
86
86
  return esp_ports
87
+
88
+
89
+ def get_available_ports(target: str, max_num: int = 0) -> t.List[EspPortInfo]:
90
+ detect_ports = []
91
+ for port in get_all_serial_ports():
92
+ esp_port = detect_one_port(port)
93
+ if esp_port.target == target:
94
+ detect_ports.append(esp_port)
95
+ if max_num > 0 and len(detect_ports) >= max_num: # pylint: disable=chained-comparison
96
+ return detect_ports
97
+ return detect_ports
@@ -77,7 +77,7 @@ class DownBinTool:
77
77
  parttool: str = '',
78
78
  esptool: str = '',
79
79
  erase_nvs: bool = True,
80
- force_no_stub: bool = True,
80
+ force_no_stub: bool = False,
81
81
  ): # pylint: disable=too-many-positional-arguments,too-many-arguments
82
82
  self.bin_path = bin_path
83
83
  self.port = compute_serial_port(port, strict=True)
@@ -4,6 +4,7 @@ import os
4
4
  import subprocess
5
5
  import tempfile
6
6
  from dataclasses import dataclass
7
+ from functools import lru_cache
7
8
  from pathlib import Path
8
9
 
9
10
  import esptest.common.compat_typing as t
@@ -181,6 +182,7 @@ class ParseBinPath:
181
182
  except subprocess.SubprocessError as e:
182
183
  logger.error(f'Failed to gen partition-table.csv: {str(e)}')
183
184
 
185
+ @lru_cache()
184
186
  def parse_partitions(self) -> t.List[PartitionInfo]:
185
187
  """Parse partitions from partition-table.csv"""
186
188
  self._gen_partition_table()
@@ -293,3 +295,9 @@ class ParseBinPath:
293
295
  # erase nvs
294
296
  return args + list(self._gen_erase_nvs_bin())
295
297
  raise ValueError('Can not find nvs partition info')
298
+
299
+ def get_partition_info(self, part_name: str) -> PartitionInfo:
300
+ for part in self.parse_partitions():
301
+ if part.name == part_name:
302
+ return part
303
+ raise ValueError('Can not find nvs partition info')
File without changes
File without changes
File without changes