온습도(METRIC) 기본 > 전역 기본. $root = dirname(__DIR__); require_once $root . '/php/config.php'; // resolve_heartbeat_timeout() 포함 $failures = []; function check(bool $cond, string $msg): void { global $failures; if (!$cond) { $failures[] = $msg; } } check(function_exists('resolve_heartbeat_timeout'), 'resolve_heartbeat_timeout() should exist.'); $overrides = [3 => 900]; // 3번만 명시 오버라이드 $metricIds = [2, 4]; // 온습도 센서 $metricDef = 7500; $globalDef = 1200; // ── 1) 명시 오버라이드 최우선(온습도여도) ── check(resolve_heartbeat_timeout(3, $overrides, $metricIds, $metricDef, $globalDef) === 900, 'explicit override wins'); // ── 2) 온습도 센서 → METRIC 기본 ── check(resolve_heartbeat_timeout(2, $overrides, $metricIds, $metricDef, $globalDef) === 7500, 'metric sensor -> metric default'); check(resolve_heartbeat_timeout(4, $overrides, $metricIds, $metricDef, $globalDef) === 7500, 'metric sensor 4 -> metric default'); // ── 3) 그 외(누수 등) → 전역 기본 ── check(resolve_heartbeat_timeout(1, $overrides, $metricIds, $metricDef, $globalDef) === 1200, 'leak/other sensor -> global default'); // ── 4) 명시 오버라이드가 온습도 기본을 이긴다 ── $ov2 = [2 => 4000]; check(resolve_heartbeat_timeout(2, $ov2, $metricIds, $metricDef, $globalDef) === 4000, 'explicit override beats metric default for a metric sensor'); // ── 5) 동일-id 온습도 통합: 누수 노드(1·3)가 METRIC_SENSOR_IDS 에도 포함돼도, // 명시 오버라이드가 metric 기본(7500)을 이겨 누수 타임아웃(1800)을 유지해야 한다. ── $sameIdOverride = [1 => 1800, 3 => 1800]; $sameIdMetric = [1, 2, 3]; // 1·3 은 온습도도 같은 id 로 보고 → 목록에 포함 check(resolve_heartbeat_timeout(1, $sameIdOverride, $sameIdMetric, 7500, 1200) === 1800, 'same-id leak(1) keeps leak timeout despite metric membership'); check(resolve_heartbeat_timeout(3, $sameIdOverride, $sameIdMetric, 7500, 1200) === 1800, 'same-id leak(3) keeps leak timeout despite metric membership'); check(resolve_heartbeat_timeout(2, $sameIdOverride, $sameIdMetric, 7500, 1200) === 7500, 'pure metric(2) still uses metric default'); if ($failures) { fwrite(STDERR, "Heartbeat timeout test failures:\n"); foreach ($failures as $f) { fwrite(STDERR, "- {$f}\n"); } exit(1); } echo "Heartbeat timeout resolution checks passed.\n";