#!/usr/bin/env python3 """Compile the production mDNS owner against bounded host fakes; no IDF build.""" import pathlib import subprocess import tempfile ROOT = pathlib.Path(__file__).resolve().parents[2] with tempfile.TemporaryDirectory(prefix="mdns-phase12-") as tmp: p = pathlib.Path(tmp) (p / "freertos").mkdir() headers = { "esp_err.h": """#pragma once typedef int esp_err_t; #define ESP_OK 0 #define ESP_ERR_INVALID_ARG 1 #define ESP_ERR_INVALID_STATE 2 #define ESP_ERR_NO_MEM 3 #define ESP_ERR_NOT_FOUND 4 #define ESP_ERR_TIMEOUT 5 """, "sdkconfig.h": """#define CONFIG_MDNS_PREDEF_NETIF_STA 1 #define CONFIG_MDNS_PREDEF_NETIF_AP 0 #define CONFIG_MDNS_PREDEF_NETIF_ETH 0 #define CONFIG_LWIP_IPV6_NUM_ADDRESSES 3 """, "freertos/FreeRTOS.h": """#pragma once #define portMAX_DELAY 100 #define pdTRUE 1 typedef int portMUX_TYPE; #define portMUX_INITIALIZER_UNLOCKED 0 void fake_enter(portMUX_TYPE *); void fake_exit(portMUX_TYPE *); #define portENTER_CRITICAL(m) fake_enter(m) #define portEXIT_CRITICAL(m) fake_exit(m) """, "freertos/semphr.h": """#pragma once typedef void *SemaphoreHandle_t; SemaphoreHandle_t xSemaphoreCreateMutex(void); int xSemaphoreTake(SemaphoreHandle_t, int); int xSemaphoreGive(SemaphoreHandle_t); """, "esp_timer.h": """#pragma once #include int64_t esp_timer_get_time(void); """, "esp_netif.h": """#pragma once #include #include #include "esp_err.h" typedef struct { int unused; } esp_netif_t; typedef struct { uint32_t addr; } esp_ip4_addr_t; typedef struct { uint32_t addr[4]; } esp_ip6_addr_t; typedef struct { esp_ip4_addr_t ip; } esp_netif_ip_info_t; esp_netif_t *esp_netif_get_handle_from_ifkey(const char *); bool esp_netif_is_netif_up(esp_netif_t *); esp_err_t esp_netif_get_ip_info(esp_netif_t *, esp_netif_ip_info_t *); int esp_netif_get_all_ip6(esp_netif_t *, esp_ip6_addr_t *); esp_err_t esp_netif_tcpip_exec(esp_err_t (*)(void *), void *); """, "mdns.h": """#pragma once #include #include #include "esp_err.h" #include "esp_netif.h" typedef enum { MDNS_EVENT_ENABLE_IP4 = 1 << 1, MDNS_EVENT_ENABLE_IP6 = 1 << 2, MDNS_EVENT_DISABLE_IP4 = 1 << 5, MDNS_EVENT_DISABLE_IP6 = 1 << 6 } mdns_event_actions_t; esp_err_t mdns_netif_action(esp_netif_t *, mdns_event_actions_t); esp_err_t mdns_init(void); void mdns_free(void); esp_err_t mdns_hostname_set(const char *); esp_err_t mdns_instance_name_set(const char *); esp_err_t mdns_service_add(const char *, const char *, const char *, uint16_t, void *, size_t); esp_err_t mdns_service_remove(const char *, const char *); """, } for name, text in headers.items(): (p / name).write_text(text) exe = p / "test" subprocess.run(["cc", "-std=c11", "-Wall", "-Wextra", "-Werror", "-I", tmp, "-I", str(ROOT / "src"), str(pathlib.Path(__file__).with_name("test.c")), "-o", str(exe)], check=True) for case in ("normal", "init-failure", "hostname-failure", "instance-failure"): subprocess.run([str(exe), case], check=True)