온습도(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'); 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";