Add IPv6-aware Wi-Fi state, HTTPS/SSH listeners, mDNS service reconciliation, and browser Wi-Fi administration. Include a guarded build-local fix for mDNS 1.12.0 membership handling, focused regression suites, and Phase 12 acceptance documentation.
86 lines
3.0 KiB
Python
86 lines
3.0 KiB
Python
#!/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 <stdint.h>
|
|
int64_t esp_timer_get_time(void);
|
|
""",
|
|
"esp_netif.h": """#pragma once
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#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 <stddef.h>
|
|
#include <stdint.h>
|
|
#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)
|