CI/mdns: Reworked example test to be run repeatably

This commit is contained in:
David Cermak 2021-12-15 15:48:59 +01:00
parent 98e9426b66
commit dd3cd52fd6
6 changed files with 54 additions and 37 deletions

View File

@ -13,10 +13,6 @@ import ttfw_idf
from tiny_test_fw import DUT from tiny_test_fw import DUT
from tiny_test_fw.Utility import console_log from tiny_test_fw.Utility import console_log
stop_mdns_server = Event()
esp_answered = Event()
esp_delegated_answered = Event()
def get_dns_query_for_esp(esp_host): def get_dns_query_for_esp(esp_host):
dns = dpkt.dns.DNS(b'\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01') dns = dpkt.dns.DNS(b'\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01')
@ -52,8 +48,7 @@ def get_dns_answer_to_mdns_lwip(tester_host, id):
return dns.pack() return dns.pack()
def mdns_server(esp_host): def mdns_server(esp_host, events):
global esp_answered
UDP_IP = '0.0.0.0' UDP_IP = '0.0.0.0'
UDP_PORT = 5353 UDP_PORT = 5353
MCAST_GRP = '224.0.0.251' MCAST_GRP = '224.0.0.251'
@ -68,14 +63,14 @@ def mdns_server(esp_host):
mreq = struct.pack('4sl', socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) mreq = struct.pack('4sl', socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
last_query_timepoint = time.time() last_query_timepoint = time.time()
while not stop_mdns_server.is_set(): while not events['stop'].is_set():
try: try:
current_time = time.time() current_time = time.time()
if current_time - last_query_timepoint > QUERY_TIMEOUT: if current_time - last_query_timepoint > QUERY_TIMEOUT:
last_query_timepoint = current_time last_query_timepoint = current_time
if not esp_answered.is_set(): if not events['esp_answered'].is_set():
sock.sendto(get_dns_query_for_esp(esp_host), (MCAST_GRP, UDP_PORT)) sock.sendto(get_dns_query_for_esp(esp_host), (MCAST_GRP, UDP_PORT))
if not esp_delegated_answered.is_set(): if not events['esp_delegated_answered'].is_set():
sock.sendto(get_dns_query_for_esp(esp_host + '-delegated'), (MCAST_GRP, UDP_PORT)) sock.sendto(get_dns_query_for_esp(esp_host + '-delegated'), (MCAST_GRP, UDP_PORT))
timeout = max(0, QUERY_TIMEOUT - (current_time - last_query_timepoint)) timeout = max(0, QUERY_TIMEOUT - (current_time - last_query_timepoint))
read_socks, _, _ = select.select([sock], [], [], timeout) read_socks, _, _ = select.select([sock], [], [], timeout)
@ -94,19 +89,17 @@ def mdns_server(esp_host):
console_log('Received answer from {}'.format(dns.an[0].name)) console_log('Received answer from {}'.format(dns.an[0].name))
if dns.an[0].name == esp_host + u'.local': if dns.an[0].name == esp_host + u'.local':
console_log('Received answer to esp32-mdns query: {}'.format(dns.__repr__())) console_log('Received answer to esp32-mdns query: {}'.format(dns.__repr__()))
esp_answered.set() events['esp_answered'].set()
if dns.an[0].name == esp_host + u'-delegated.local': if dns.an[0].name == esp_host + u'-delegated.local':
console_log('Received answer to esp32-mdns-delegate query: {}'.format(dns.__repr__())) console_log('Received answer to esp32-mdns-delegate query: {}'.format(dns.__repr__()))
esp_delegated_answered.set() events['esp_delegated_answered'].set()
except socket.timeout: except socket.timeout:
break break
except dpkt.UnpackError: except dpkt.UnpackError:
continue continue
@ttfw_idf.idf_example_test(env_tag='Example_EthKitV1')
def test_examples_protocol_mdns(env, config): def test_examples_protocol_mdns(env, config):
global stop_mdns_server
""" """
steps: | steps: |
1. obtain IP address + init mdns example 1. obtain IP address + init mdns example
@ -114,7 +107,7 @@ def test_examples_protocol_mdns(env, config):
3. check the mdns name is accessible 3. check the mdns name is accessible
4. check DUT output if mdns advertized host is resolved 4. check DUT output if mdns advertized host is resolved
""" """
dut1 = env.get_dut('mdns-test', 'examples/protocols/mdns', dut_class=ttfw_idf.ESP32DUT, app_config_name='eth_kit') dut1 = env.get_dut('mdns-test', 'examples/protocols/mdns', dut_class=ttfw_idf.ESP32DUT, app_config_name=config)
# check and log bin size # check and log bin size
binary_file = os.path.join(dut1.app.binary_path, 'mdns_test.bin') binary_file = os.path.join(dut1.app.binary_path, 'mdns_test.bin')
bin_size = os.path.getsize(binary_file) bin_size = os.path.getsize(binary_file)
@ -123,7 +116,9 @@ def test_examples_protocol_mdns(env, config):
dut1.start_app() dut1.start_app()
# 2. get the dut host name (and IP address) # 2. get the dut host name (and IP address)
specific_host = dut1.expect(re.compile(r'mdns hostname set to: \[([^\]]+)\]'), timeout=30)[0] specific_host = dut1.expect(re.compile(r'mdns hostname set to: \[([^\]]+)\]'), timeout=30)[0]
mdns_responder = Thread(target=mdns_server, args=(str(specific_host),))
mdns_server_events = {'stop': Event(), 'esp_answered': Event(), 'esp_delegated_answered': Event()}
mdns_responder = Thread(target=mdns_server, args=(str(specific_host), mdns_server_events))
try: try:
ip_address = dut1.expect(re.compile(r' eth ip: ([^,]+),'), timeout=30)[0] ip_address = dut1.expect(re.compile(r' eth ip: ([^,]+),'), timeout=30)[0]
console_log('Connected to AP with IP: {}'.format(ip_address)) console_log('Connected to AP with IP: {}'.format(ip_address))
@ -132,9 +127,9 @@ def test_examples_protocol_mdns(env, config):
try: try:
# 3. check the mdns name is accessible # 3. check the mdns name is accessible
mdns_responder.start() mdns_responder.start()
if not esp_answered.wait(timeout=30): if not mdns_server_events['esp_answered'].wait(timeout=30):
raise ValueError('Test has failed: did not receive mdns answer within timeout') raise ValueError('Test has failed: did not receive mdns answer within timeout')
if not esp_delegated_answered.wait(timeout=30): if not mdns_server_events['esp_delegated_answered'].wait(timeout=30):
raise ValueError('Test has failed: did not receive mdns answer for delegated host within timeout') raise ValueError('Test has failed: did not receive mdns answer for delegated host within timeout')
# 4. check DUT output if mdns advertized host is resolved # 4. check DUT output if mdns advertized host is resolved
dut1.expect(re.compile(r'mdns-test: Query A: tinytester.local resolved to: 127.0.0.1'), timeout=30) dut1.expect(re.compile(r'mdns-test: Query A: tinytester.local resolved to: 127.0.0.1'), timeout=30)
@ -148,23 +143,23 @@ def test_examples_protocol_mdns(env, config):
raise ValueError('Test has failed: Incorrectly resolved DUT hostname using dig' raise ValueError('Test has failed: Incorrectly resolved DUT hostname using dig'
"Output should've contained DUT's IP address:{}".format(ip_address)) "Output should've contained DUT's IP address:{}".format(ip_address))
finally: finally:
stop_mdns_server.set() mdns_server_events['stop'].set()
mdns_responder.join() mdns_responder.join()
@ttfw_idf.idf_example_test(env_tag='Example_WIFI_Protocols') @ttfw_idf.idf_example_test(env_tag='Example_EthKitV1')
def test_examples_protocol_mdns_default(env, _): def test_examples_protocol_mdns_default(env, _):
test_examples_protocol_mdns(env, None) test_examples_protocol_mdns(env, 'eth_def')
@ttfw_idf.idf_example_test(env_tag='Example_WIFI_Protocols') @ttfw_idf.idf_example_test(env_tag='Example_EthKitV1')
def test_examples_protocol_mdns_socket(env, _): def test_examples_protocol_mdns_socket(env, _):
test_examples_protocol_mdns(env, 'socket') test_examples_protocol_mdns(env, 'eth_socket')
@ttfw_idf.idf_example_test(env_tag='Example_WIFI_Protocols') @ttfw_idf.idf_example_test(env_tag='Example_EthKitV1')
def test_examples_protocol_mdns_custom_netif(env, _): def test_examples_protocol_mdns_custom_netif(env, _):
test_examples_protocol_mdns(env, 'custom_netif') test_examples_protocol_mdns(env, 'eth_custom_netif')
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -1,8 +0,0 @@
CONFIG_MDNS_RESOLVE_TEST_SERVICES=y
CONFIG_MDNS_ADD_MAC_TO_HOSTNAME=y
CONFIG_MDNS_PUBLISH_DELEGATE_HOST=y
CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
CONFIG_MDNS_PREDEF_NETIF_STA=n
CONFIG_MDNS_PREDEF_NETIF_AP=n
CONFIG_MDNS_PREDEF_NETIF_ETH=n
CONFIG_MDNS_ADD_CUSTOM_NETIF=y

View File

@ -0,0 +1,19 @@
CONFIG_IDF_TARGET="esp32"
CONFIG_MDNS_RESOLVE_TEST_SERVICES=y
CONFIG_MDNS_ADD_MAC_TO_HOSTNAME=y
CONFIG_MDNS_PUBLISH_DELEGATE_HOST=y
CONFIG_MDNS_PREDEF_NETIF_STA=n
CONFIG_MDNS_PREDEF_NETIF_AP=n
CONFIG_MDNS_PREDEF_NETIF_ETH=n
CONFIG_MDNS_ADD_CUSTOM_NETIF=y
CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
CONFIG_EXAMPLE_CONNECT_ETHERNET=y
CONFIG_EXAMPLE_CONNECT_WIFI=n
CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y
CONFIG_EXAMPLE_ETH_PHY_IP101=y
CONFIG_EXAMPLE_ETH_MDC_GPIO=23
CONFIG_EXAMPLE_ETH_MDIO_GPIO=18
CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=5
CONFIG_EXAMPLE_ETH_PHY_ADDR=1
CONFIG_EXAMPLE_CONNECT_IPV6=y
CONFIG_MDNS_BUTTON_GPIO=32

View File

@ -0,0 +1,16 @@
CONFIG_IDF_TARGET="esp32"
CONFIG_MDNS_RESOLVE_TEST_SERVICES=y
CONFIG_MDNS_ADD_MAC_TO_HOSTNAME=y
CONFIG_MDNS_PUBLISH_DELEGATE_HOST=y
CONFIG_MDNS_NETWORKING_SOCKET=y
CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
CONFIG_EXAMPLE_CONNECT_ETHERNET=y
CONFIG_EXAMPLE_CONNECT_WIFI=n
CONFIG_EXAMPLE_USE_INTERNAL_ETHERNET=y
CONFIG_EXAMPLE_ETH_PHY_IP101=y
CONFIG_EXAMPLE_ETH_MDC_GPIO=23
CONFIG_EXAMPLE_ETH_MDIO_GPIO=18
CONFIG_EXAMPLE_ETH_PHY_RST_GPIO=5
CONFIG_EXAMPLE_ETH_PHY_ADDR=1
CONFIG_EXAMPLE_CONNECT_IPV6=y
CONFIG_MDNS_BUTTON_GPIO=32

View File

@ -1,5 +0,0 @@
CONFIG_MDNS_RESOLVE_TEST_SERVICES=y
CONFIG_MDNS_ADD_MAC_TO_HOSTNAME=y
CONFIG_MDNS_PUBLISH_DELEGATE_HOST=y
CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
CONFIG_MDNS_NETWORKING_SOCKET=y