Features: - Per-Section MAC Exclusions: nft, generator_routes, section.js, i18n - Per-Section Routed DNS: connections, generator_routes, nft, validator, types.ts, section.js, state.uc, reload.uc - Boot Latency Sweep: ui.uc latency boot sweep with fixture dispatchers - WDTT provider: full backend (common, validator, runtime), sing-box outbound, diagnostics, component install, updater, i18n, section.js UI - OlcRTC provider: full backend (common, validator, runtime), sing-box outbound, diagnostics, component install, updater, i18n, section.js UI - WireGuard-over-TURN tunnel (WDTT) and TCP-over-WebRTC tunnel (OlcRTC) as sidecar processes with local SOCKS5, routed through sing-box outbound Bug fixes: - route.uc: restrict hijack-dns to local DNS inbounds only (dns-in, source-dns-in, dns-health-*) — fixes socket collision between sing-box and dnsmasq on port 53 via SO_REUSEADDR transparent write-back sockets - runtime.uc: add Port 53 socket collision diagnostic with auto-fix (sing-box restart to clear parasitic UNCONN sockets with Recv-Q) - runtime.uc: add dnsmasq dns_redirect check with auto-fix — disables firewall4 DNAT that causes TProxy to rewrite destination to router :53 - failover.uc: add wdtt/olcrtc to failover candidate actions - telegram.uc: show WDTT/OlcRTC installed status in /info Tests: 135/155 shell + 591/591 frontend
1 line
217 KiB
JSON
1 line
217 KiB
JSON
{"numTotalTestSuites":497,"numPassedTestSuites":497,"numFailedTestSuites":0,"numPendingTestSuites":0,"numTotalTests":591,"numPassedTests":591,"numFailedTests":0,"numPendingTests":0,"numTodoTests":0,"snapshot":{"added":0,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0,"didUpdate":false},"startTime":1789128885605,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["runtimeTags"],"fullName":"runtimeTags uses the same direct section collision format as the backend generator","status":"passed","title":"uses the same direct section collision format as the backend generator","duration":2.1036,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887392,"endTime":1789128887394.1035,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tests/runtimeTags.test.ts"},{"assertionResults":[{"ancestorTitles":["cascadeDeleteSection logic"],"fullName":"cascadeDeleteSection logic cascades deletion of all child sections for a given section","status":"passed","title":"cascades deletion of all child sections for a given section","duration":4.315899999999999,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["cascadeDeleteSection logic"],"fullName":"cascadeDeleteSection logic cleans references in settings","status":"passed","title":"cleans references in settings","duration":1.6803999999999633,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["cascadeDeleteSection logic"],"fullName":"cascadeDeleteSection logic cleans detour references in other sections","status":"passed","title":"cleans detour references in other sections","duration":0.5488000000000284,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["cascadeDeleteSection logic"],"fullName":"cascadeDeleteSection logic cleans server routing references and resets routing_mode","status":"passed","title":"cleans server routing references and resets routing_mode","duration":0.661200000000008,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["cascadeDeleteSection logic"],"fullName":"cascadeDeleteSection logic removes disk cache files","status":"passed","title":"removes disk cache files","duration":1.4033999999999764,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["cascadeDeleteSection logic"],"fullName":"cascadeDeleteSection logic re-creating a section with the same name starts clean","status":"passed","title":"re-creating a section with the same name starts clean","duration":1.3578999999999724,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886094,"endTime":1789128886104.358,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tests/sectionCascadeDelete.test.ts"},{"assertionResults":[{"ancestorTitles":["formatOutboundType"],"fullName":"formatOutboundType formats protocol with transport in uppercase parentheses","status":"passed","title":"formats protocol with transport in uppercase parentheses","duration":2.7076999999999884,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["formatOutboundType"],"fullName":"formatOutboundType leaves protocol untouched if transport is not provided","status":"passed","title":"leaves protocol untouched if transport is not provided","duration":0.4685000000000059,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["formatOutboundType"],"fullName":"formatOutboundType handles group types without adding transport","status":"passed","title":"handles group types without adding transport","duration":0.31639999999998736,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887343,"endTime":1789128887346.4685,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/helpers/tests/formatOutboundType.test.ts"},{"assertionResults":[{"ancestorTitles":["canUseDirectClashApi"],"fullName":"canUseDirectClashApi allows direct Clash API access from HTTP LuCI","status":"passed","title":"allows direct Clash API access from HTTP LuCI","duration":1.9793999999999983,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["canUseDirectClashApi"],"fullName":"canUseDirectClashApi blocks direct Clash API access from HTTPS LuCI","status":"passed","title":"blocks direct Clash API access from HTTPS LuCI","duration":0.2839999999999918,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["canUseDirectClashApi"],"fullName":"canUseDirectClashApi blocks direct Clash API access outside a browser location","status":"passed","title":"blocks direct Clash API access outside a browser location","duration":0.1969999999999743,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887365,"endTime":1789128887368.197,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/helpers/tests/getClashApiUrl.test.js"},{"assertionResults":[{"ancestorTitles":["getProxyUrlTransport"],"fullName":"getProxyUrlTransport extracts transport from vless query parameters","status":"passed","title":"extracts transport from vless query parameters","duration":2.9273000000000025,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getProxyUrlTransport"],"fullName":"getProxyUrlTransport extracts transport from vmess base64 net field","status":"passed","title":"extracts transport from vmess base64 net field","duration":0.558099999999996,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getProxyUrlTransport"],"fullName":"getProxyUrlTransport returns undefined for invalid or empty links","status":"passed","title":"returns undefined for invalid or empty links","duration":0.39620000000002165,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887327,"endTime":1789128887331.3962,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/helpers/tests/getProxyUrlTransport.test.ts"},{"assertionResults":[{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI vless://uuid@example.com:443"],"fullName":"isCopyableProxyLink copyable proxy URI vless://uuid@example.com:443 returns true","status":"passed","title":"returns true","duration":2.4013999999999953,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI vmess://encoded"],"fullName":"isCopyableProxyLink copyable proxy URI vmess://encoded returns true","status":"passed","title":"returns true","duration":0.2541999999999973,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI trojan://password@example.com:443"],"fullName":"isCopyableProxyLink copyable proxy URI trojan://password@example.com:443 returns true","status":"passed","title":"returns true","duration":0.24230000000000018,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI ss://encoded@example.com:443"],"fullName":"isCopyableProxyLink copyable proxy URI ss://encoded@example.com:443 returns true","status":"passed","title":"returns true","duration":0.17490000000000805,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI ssr://encoded"],"fullName":"isCopyableProxyLink copyable proxy URI ssr://encoded returns true","status":"passed","title":"returns true","duration":0.21359999999998536,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI hysteria2://password@example.com:443"],"fullName":"isCopyableProxyLink copyable proxy URI hysteria2://password@example.com:443 returns true","status":"passed","title":"returns true","duration":0.1793999999999869,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI hy2://password@example.com:443"],"fullName":"isCopyableProxyLink copyable proxy URI hy2://password@example.com:443 returns true","status":"passed","title":"returns true","duration":0.2616000000000156,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI tuic://uuid:password@example.com:443"],"fullName":"isCopyableProxyLink copyable proxy URI tuic://uuid:password@example.com:443 returns true","status":"passed","title":"returns true","duration":0.2021000000000015,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI socks4://example.com:1080"],"fullName":"isCopyableProxyLink copyable proxy URI socks4://example.com:1080 returns true","status":"passed","title":"returns true","duration":0.6756000000000029,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI socks4a://example.com:1080"],"fullName":"isCopyableProxyLink copyable proxy URI socks4a://example.com:1080 returns true","status":"passed","title":"returns true","duration":0.2675000000000125,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI socks5://user:pass@example.com:1080"],"fullName":"isCopyableProxyLink copyable proxy URI socks5://user:pass@example.com:1080 returns true","status":"passed","title":"returns true","duration":0.25260000000000105,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI http://example.com:80"],"fullName":"isCopyableProxyLink copyable proxy URI http://example.com:80 returns true","status":"passed","title":"returns true","duration":0.18469999999999231,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","copyable proxy URI https://user:pass@example.com:443"],"fullName":"isCopyableProxyLink copyable proxy URI https://user:pass@example.com:443 returns true","status":"passed","title":"returns true","duration":0.10450000000000159,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","non-copyable value "],"fullName":"isCopyableProxyLink non-copyable value returns false","status":"passed","title":"returns false","duration":0.13530000000000086,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","non-copyable value direct"],"fullName":"isCopyableProxyLink non-copyable value direct returns false","status":"passed","title":"returns false","duration":0.11379999999999768,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","non-copyable value block"],"fullName":"isCopyableProxyLink non-copyable value block returns false","status":"passed","title":"returns false","duration":0.09889999999998622,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","non-copyable value urltest"],"fullName":"isCopyableProxyLink non-copyable value urltest returns false","status":"passed","title":"returns false","duration":0.09519999999997708,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","non-copyable value wireguard://example.com"],"fullName":"isCopyableProxyLink non-copyable value wireguard://example.com returns false","status":"passed","title":"returns false","duration":0.11750000000000682,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isCopyableProxyLink","non-copyable value tcp://127.0.0.1:8080"],"fullName":"isCopyableProxyLink non-copyable value tcp://127.0.0.1:8080 returns false","status":"passed","title":"returns false","duration":0.08770000000001232,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886971,"endTime":1789128886978.1353,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/helpers/tests/isCopyableProxyLink.test.js"},{"assertionResults":[{"ancestorTitles":["buildHysteria2Link"],"fullName":"buildHysteria2Link exports a single certificate pin alias and omits stale obfs password when obfs is disabled","status":"passed","title":"exports a single certificate pin alias and omits stale obfs password when obfs is disabled","duration":75.30769999999995,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["buildHysteria2Link"],"fullName":"buildHysteria2Link exports salamander obfuscation together with its password","status":"passed","title":"exports salamander obfuscation together with its password","duration":42.45619999999997,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["buildHysteria2Link"],"fullName":"buildHysteria2Link brackets IPv6 public host in exported URI","status":"passed","title":"brackets IPv6 public host in exported URI","duration":32.34559999999999,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886146,"endTime":1789128886296.3457,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/helpers/tests/serverHysteria2Link.test.js"},{"assertionResults":[{"ancestorTitles":["validateIP IPv4","Valid IP: Private LAN"],"fullName":"validateIP IPv4 Valid IP: Private LAN returns {valid:true} for \"192.168.1.1\"","status":"passed","title":"returns {valid:true} for \"192.168.1.1\"","duration":2.5329000000000406,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Valid IP: All zeros"],"fullName":"validateIP IPv4 Valid IP: All zeros returns {valid:true} for \"0.0.0.0\"","status":"passed","title":"returns {valid:true} for \"0.0.0.0\"","duration":0.24230000000000018,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Valid IP: Broadcast"],"fullName":"validateIP IPv4 Valid IP: Broadcast returns {valid:true} for \"255.255.255.255\"","status":"passed","title":"returns {valid:true} for \"255.255.255.255\"","duration":0.25909999999998945,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Valid IP: Simple"],"fullName":"validateIP IPv4 Valid IP: Simple returns {valid:true} for \"1.2.3.4\"","status":"passed","title":"returns {valid:true} for \"1.2.3.4\"","duration":0.22270000000003165,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Valid IP: Loopback"],"fullName":"validateIP IPv4 Valid IP: Loopback returns {valid:true} for \"127.0.0.1\"","status":"passed","title":"returns {valid:true} for \"127.0.0.1\"","duration":0.24540000000001783,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Octet too large"],"fullName":"validateIP IPv4 Invalid IP: Octet too large returns {valid:false} for \"256.0.0.1\"","status":"passed","title":"returns {valid:false} for \"256.0.0.1\"","duration":0.21310000000005402,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Too few octets"],"fullName":"validateIP IPv4 Invalid IP: Too few octets returns {valid:false} for \"192.168.1\"","status":"passed","title":"returns {valid:false} for \"192.168.1\"","duration":0.2557000000000471,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Too many octets"],"fullName":"validateIP IPv4 Invalid IP: Too many octets returns {valid:false} for \"1.2.3.4.5\"","status":"passed","title":"returns {valid:false} for \"1.2.3.4.5\"","duration":0.19180000000005748,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Leading zero (1st octet)"],"fullName":"validateIP IPv4 Invalid IP: Leading zero (1st octet) returns {valid:false} for \"01.2.3.4\"","status":"passed","title":"returns {valid:false} for \"01.2.3.4\"","duration":0.7024999999999864,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Leading zero (2nd octet)"],"fullName":"validateIP IPv4 Invalid IP: Leading zero (2nd octet) returns {valid:false} for \"1.02.3.4\"","status":"passed","title":"returns {valid:false} for \"1.02.3.4\"","duration":0.2998999999999796,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Leading zero (3rd octet)"],"fullName":"validateIP IPv4 Invalid IP: Leading zero (3rd octet) returns {valid:false} for \"1.2.003.4\"","status":"passed","title":"returns {valid:false} for \"1.2.003.4\"","duration":0.23709999999994125,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Leading zero (4th octet)"],"fullName":"validateIP IPv4 Invalid IP: Leading zero (4th octet) returns {valid:false} for \"1.2.3.004\"","status":"passed","title":"returns {valid:false} for \"1.2.3.004\"","duration":0.147199999999998,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Four digits in octet"],"fullName":"validateIP IPv4 Invalid IP: Four digits in octet returns {valid:false} for \"1.2.3.0004\"","status":"passed","title":"returns {valid:false} for \"1.2.3.0004\"","duration":0.10450000000003001,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Trailing dot"],"fullName":"validateIP IPv4 Invalid IP: Trailing dot returns {valid:false} for \"1.2.3.\"","status":"passed","title":"returns {valid:false} for \"1.2.3.\"","duration":0.1150000000000091,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Valid IPv6: Loopback"],"fullName":"validateIP IPv6 Valid IPv6: Loopback returns {valid:true} for \"::1\"","status":"passed","title":"returns {valid:true} for \"::1\"","duration":0.1574000000000524,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Valid IPv6: ULA"],"fullName":"validateIP IPv6 Valid IPv6: ULA returns {valid:true} for \"fc00::1\"","status":"passed","title":"returns {valid:true} for \"fc00::1\"","duration":0.12859999999989213,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Valid IPv6: Documentation prefix"],"fullName":"validateIP IPv6 Valid IPv6: Documentation prefix returns {valid:true} for \"2001:db8::1\"","status":"passed","title":"returns {valid:true} for \"2001:db8::1\"","duration":0.12440000000003693,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Valid IPv6: Full form"],"fullName":"validateIP IPv6 Valid IPv6: Full form returns {valid:true} for \"2001:0db8:0000:0000:0000:ff00:0042:8329\"","status":"passed","title":"returns {valid:true} for \"2001:0db8:0000:0000:0000:ff00:0042:8329\"","duration":0.12580000000002656,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Invalid IPv6: Bad hex"],"fullName":"validateIP IPv6 Invalid IPv6: Bad hex returns {valid:false} for \"2001:db8::zzzz\"","status":"passed","title":"returns {valid:false} for \"2001:db8::zzzz\"","duration":0.19429999999999836,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Invalid IPv6: Two compression markers"],"fullName":"validateIP IPv6 Invalid IPv6: Two compression markers returns {valid:false} for \"2001::db8::1\"","status":"passed","title":"returns {valid:false} for \"2001::db8::1\"","duration":0.12580000000002656,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Invalid IPv6: Zone id"],"fullName":"validateIP IPv6 Invalid IPv6: Zone id returns {valid:false} for \"fe80::1%eth0\"","status":"passed","title":"returns {valid:false} for \"fe80::1%eth0\"","duration":0.09330000000011296,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Simple domain"],"fullName":"validateDomain Valid domain: Simple domain returns valid=true for \"example.com\"","status":"passed","title":"returns valid=true for \"example.com\"","duration":0.4520999999999731,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Subdomain"],"fullName":"validateDomain Valid domain: Subdomain returns valid=true for \"sub.example.com\"","status":"passed","title":"returns valid=true for \"sub.example.com\"","duration":0.1872000000000753,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: With dash"],"fullName":"validateDomain Valid domain: With dash returns valid=true for \"my-site.org\"","status":"passed","title":"returns valid=true for \"my-site.org\"","duration":0.13599999999996726,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: With numbers"],"fullName":"validateDomain Valid domain: With numbers returns valid=true for \"site123.net\"","status":"passed","title":"returns valid=true for \"site123.net\"","duration":0.1391000000000986,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Deep subdomain"],"fullName":"validateDomain Valid domain: Deep subdomain returns valid=true for \"a.b.c.example.co.uk\"","status":"passed","title":"returns valid=true for \"a.b.c.example.co.uk\"","duration":0.14179999999998927,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: With path"],"fullName":"validateDomain Valid domain: With path returns valid=true for \"example.com/path/to/resource\"","status":"passed","title":"returns valid=true for \"example.com/path/to/resource\"","duration":0.16150000000004638,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Punycode RU"],"fullName":"validateDomain Valid domain: Punycode RU returns valid=true for \"xn--d1acufc.xn--p1ai\"","status":"passed","title":"returns valid=true for \"xn--d1acufc.xn--p1ai\"","duration":0.16989999999998417,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Unicode RU"],"fullName":"validateDomain Valid domain: Unicode RU returns valid=true for \"сайт.рф\"","status":"passed","title":"returns valid=true for \"сайт.рф\"","duration":0.17240000000003874,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Unicode RU uppercase"],"fullName":"validateDomain Valid domain: Unicode RU uppercase returns valid=true for \"САЙТ.РФ\"","status":"passed","title":"returns valid=true for \"САЙТ.РФ\"","duration":0.19619999999997617,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Unicode test domain"],"fullName":"validateDomain Valid domain: Unicode test domain returns valid=true for \"пример.испытание\"","status":"passed","title":"returns valid=true for \"пример.испытание\"","duration":0.14569999999991978,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Unicode latin label"],"fullName":"validateDomain Valid domain: Unicode latin label returns valid=true for \"münich.example\"","status":"passed","title":"returns valid=true for \"münich.example\"","duration":0.1372000000000071,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Adguard dns"],"fullName":"validateDomain Valid domain: Adguard dns returns valid=true for \"dns.adguard-dns.com\"","status":"passed","title":"returns valid=true for \"dns.adguard-dns.com\"","duration":0.10759999999993397,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Nextdns dns"],"fullName":"validateDomain Valid domain: Nextdns dns returns valid=true for \"dns.nextdns.io/xxxxxxx\"","status":"passed","title":"returns valid=true for \"dns.nextdns.io/xxxxxxx\"","duration":0.15380000000004657,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Long domain (63 chars in label)"],"fullName":"validateDomain Valid domain: Long domain (63 chars in label) returns valid=true for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","status":"passed","title":"returns valid=true for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","duration":0.125,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: No TLD"],"fullName":"validateDomain Invalid domain: No TLD returns valid=false for \"localhost\"","status":"passed","title":"returns valid=false for \"localhost\"","duration":0.14960000000007767,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Only TLD"],"fullName":"validateDomain Invalid domain: Only TLD returns valid=false for \".com\"","status":"passed","title":"returns valid=false for \".com\"","duration":0.10190000000000055,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Double dot"],"fullName":"validateDomain Invalid domain: Double dot returns valid=false for \"example..com\"","status":"passed","title":"returns valid=false for \"example..com\"","duration":1.7666999999999007,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Illegal chars"],"fullName":"validateDomain Invalid domain: Illegal chars returns valid=false for \"exa!mple.com\"","status":"passed","title":"returns valid=false for \"exa!mple.com\"","duration":0.11230000000000473,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Space inside"],"fullName":"validateDomain Invalid domain: Space inside returns valid=false for \"exa mple.com\"","status":"passed","title":"returns valid=false for \"exa mple.com\"","duration":0.07529999999997017,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Ending with dash"],"fullName":"validateDomain Invalid domain: Ending with dash returns valid=false for \"example-.com\"","status":"passed","title":"returns valid=false for \"example-.com\"","duration":0.08000000000004093,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Starting with dash"],"fullName":"validateDomain Invalid domain: Starting with dash returns valid=false for \"-example.com\"","status":"passed","title":"returns valid=false for \"-example.com\"","duration":0.0946999999999889,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Trailing dot"],"fullName":"validateDomain Invalid domain: Trailing dot returns valid=false for \"example.com.\"","status":"passed","title":"returns valid=false for \"example.com.\"","duration":0.08900000000005548,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Too short TLD"],"fullName":"validateDomain Invalid domain: Too short TLD returns valid=false for \"example.c\"","status":"passed","title":"returns valid=false for \"example.c\"","duration":0.11159999999995307,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: With protocol (not allowed)"],"fullName":"validateDomain Invalid domain: With protocol (not allowed) returns valid=false for \"http://example.com\"","status":"passed","title":"returns valid=false for \"http://example.com\"","duration":0.10529999999994288,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Too long label (>63 chars)"],"fullName":"validateDomain Invalid domain: Too long label (>63 chars) returns valid=false for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","status":"passed","title":"returns valid=false for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","duration":0.11599999999998545,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Too long domain (>253 chars)"],"fullName":"validateDomain Invalid domain: Too long domain (>253 chars) returns valid=false for \"abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.com\"","status":"passed","title":"returns valid=false for \"abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.com\"","duration":0.2520999999999276,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Dot TLD allowed (.net)"],"fullName":"validateDomain Dot TLD toggle: Dot TLD allowed (.net) \".net\" with allowDotTLD=true → valid=true","status":"passed","title":"\".net\" with allowDotTLD=true → valid=true","duration":0.1590000000001055,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Dot TLD allowed (.рф)"],"fullName":"validateDomain Dot TLD toggle: Dot TLD allowed (.рф) \".рф\" with allowDotTLD=true → valid=true","status":"passed","title":"\".рф\" with allowDotTLD=true → valid=true","duration":0.12570000000005166,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Dot TLD not allowed (.net)"],"fullName":"validateDomain Dot TLD toggle: Dot TLD not allowed (.net) \".net\" with allowDotTLD=false → valid=false","status":"passed","title":"\".net\" with allowDotTLD=false → valid=false","duration":0.0806999999999789,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Invalid with double dot"],"fullName":"validateDomain Dot TLD toggle: Invalid with double dot \"..net\" with allowDotTLD=true → valid=false","status":"passed","title":"\"..net\" with allowDotTLD=true → valid=false","duration":0.07690000000002328,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Invalid dot domain"],"fullName":"validateDomain Dot TLD toggle: Invalid dot domain \".example.com\" with allowDotTLD=true → valid=false","status":"passed","title":"\".example.com\" with allowDotTLD=true → valid=false","duration":0.084699999999998,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Invalid single word TLD (net)"],"fullName":"validateDomain Dot TLD toggle: Invalid single word TLD (net) \"net\" with allowDotTLD=true → valid=false","status":"passed","title":"\"net\" with allowDotTLD=true → valid=false","duration":0.10040000000003602,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Private LAN"],"fullName":"validateDns Valid dns: Private LAN returns valid=true for \"192.168.1.1\"","status":"passed","title":"returns valid=true for \"192.168.1.1\"","duration":0.8882999999999583,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: All zeros"],"fullName":"validateDns Valid dns: All zeros returns valid=true for \"0.0.0.0\"","status":"passed","title":"returns valid=true for \"0.0.0.0\"","duration":0.1852999999999838,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Broadcast"],"fullName":"validateDns Valid dns: Broadcast returns valid=true for \"255.255.255.255\"","status":"passed","title":"returns valid=true for \"255.255.255.255\"","duration":0.11810000000002674,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Simple"],"fullName":"validateDns Valid dns: Simple returns valid=true for \"1.2.3.4\"","status":"passed","title":"returns valid=true for \"1.2.3.4\"","duration":0.10540000000003147,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Loopback"],"fullName":"validateDns Valid dns: Loopback returns valid=true for \"127.0.0.1\"","status":"passed","title":"returns valid=true for \"127.0.0.1\"","duration":0.13350000000002638,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Simple domain"],"fullName":"validateDns Valid dns: Simple domain returns valid=true for \"example.com\"","status":"passed","title":"returns valid=true for \"example.com\"","duration":0.11519999999995889,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Subdomain"],"fullName":"validateDns Valid dns: Subdomain returns valid=true for \"sub.example.com\"","status":"passed","title":"returns valid=true for \"sub.example.com\"","duration":0.11149999999997817,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: With dash"],"fullName":"validateDns Valid dns: With dash returns valid=true for \"my-site.org\"","status":"passed","title":"returns valid=true for \"my-site.org\"","duration":0.11590000000001055,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: With numbers"],"fullName":"validateDns Valid dns: With numbers returns valid=true for \"site123.net\"","status":"passed","title":"returns valid=true for \"site123.net\"","duration":0.11820000000000164,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Deep subdomain"],"fullName":"validateDns Valid dns: Deep subdomain returns valid=true for \"a.b.c.example.co.uk\"","status":"passed","title":"returns valid=true for \"a.b.c.example.co.uk\"","duration":0.20060000000000855,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: With path"],"fullName":"validateDns Valid dns: With path returns valid=true for \"example.com/path/to/resource\"","status":"passed","title":"returns valid=true for \"example.com/path/to/resource\"","duration":0.24080000000003565,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Punycode RU"],"fullName":"validateDns Valid dns: Punycode RU returns valid=true for \"xn--d1acufc.xn--p1ai\"","status":"passed","title":"returns valid=true for \"xn--d1acufc.xn--p1ai\"","duration":0.12220000000002074,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Unicode RU"],"fullName":"validateDns Valid dns: Unicode RU returns valid=true for \"сайт.рф\"","status":"passed","title":"returns valid=true for \"сайт.рф\"","duration":0.21449999999992997,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Unicode RU uppercase"],"fullName":"validateDns Valid dns: Unicode RU uppercase returns valid=true for \"САЙТ.РФ\"","status":"passed","title":"returns valid=true for \"САЙТ.РФ\"","duration":0.11399999999991905,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Unicode test domain"],"fullName":"validateDns Valid dns: Unicode test domain returns valid=true for \"пример.испытание\"","status":"passed","title":"returns valid=true for \"пример.испытание\"","duration":0.14650000000006003,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Unicode latin label"],"fullName":"validateDns Valid dns: Unicode latin label returns valid=true for \"münich.example\"","status":"passed","title":"returns valid=true for \"münich.example\"","duration":0.15689999999995052,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Adguard dns"],"fullName":"validateDns Valid dns: Adguard dns returns valid=true for \"dns.adguard-dns.com\"","status":"passed","title":"returns valid=true for \"dns.adguard-dns.com\"","duration":0.11249999999995453,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Nextdns dns"],"fullName":"validateDns Valid dns: Nextdns dns returns valid=true for \"dns.nextdns.io/xxxxxxx\"","status":"passed","title":"returns valid=true for \"dns.nextdns.io/xxxxxxx\"","duration":0.10550000000000637,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Long domain (63 chars in label)"],"fullName":"validateDns Valid dns: Long domain (63 chars in label) returns valid=true for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","status":"passed","title":"returns valid=true for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","duration":0.12590000000000146,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Google DNS (port 53)"],"fullName":"validateDns Valid dns: Google DNS (port 53) returns valid=true for \"8.8.8.8:53\"","status":"passed","title":"returns valid=true for \"8.8.8.8:53\"","duration":0.24350000000004002,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Google DNS (port 5353)"],"fullName":"validateDns Valid dns: Google DNS (port 5353) returns valid=true for \"8.8.8.8:5353\"","status":"passed","title":"returns valid=true for \"8.8.8.8:5353\"","duration":0.14950000000010277,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Cloudflare DNS (port 853)"],"fullName":"validateDns Valid dns: Cloudflare DNS (port 853) returns valid=true for \"1.1.1.1:853\"","status":"passed","title":"returns valid=true for \"1.1.1.1:853\"","duration":0.09429999999997563,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: Cloudflare domain (port 853)"],"fullName":"validateDns Valid dns: Cloudflare domain (port 853) returns valid=true for \"cloudflare-dns.com:853\"","status":"passed","title":"returns valid=true for \"cloudflare-dns.com:853\"","duration":0.15179999999998017,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: DoH IP"],"fullName":"validateDns Valid dns: DoH IP returns valid=true for \"1.1.1.1/dns-query\"","status":"passed","title":"returns valid=true for \"1.1.1.1/dns-query\"","duration":0.10059999999998581,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: DoH IP with port 443"],"fullName":"validateDns Valid dns: DoH IP with port 443 returns valid=true for \"1.1.1.1:443/dns-query\"","status":"passed","title":"returns valid=true for \"1.1.1.1:443/dns-query\"","duration":0.1027000000000271,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: DoH domain"],"fullName":"validateDns Valid dns: DoH domain returns valid=true for \"cloudflare-dns.com/dns-query\"","status":"passed","title":"returns valid=true for \"cloudflare-dns.com/dns-query\"","duration":0.11519999999995889,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: DoH domain with port 443"],"fullName":"validateDns Valid dns: DoH domain with port 443 returns valid=true for \"cloudflare-dns.com:443/dns-query\"","status":"passed","title":"returns valid=true for \"cloudflare-dns.com:443/dns-query\"","duration":0.13859999999999673,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: IPv6 DNS"],"fullName":"validateDns Valid dns: IPv6 DNS returns valid=true for \"2606:4700:4700::1111\"","status":"passed","title":"returns valid=true for \"2606:4700:4700::1111\"","duration":0.10419999999999163,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: IPv6 DNS with port"],"fullName":"validateDns Valid dns: IPv6 DNS with port returns valid=true for \"[2606:4700:4700::1111]:853\"","status":"passed","title":"returns valid=true for \"[2606:4700:4700::1111]:853\"","duration":0.12819999999999254,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Valid dns: IPv6 DoH with port"],"fullName":"validateDns Valid dns: IPv6 DoH with port returns valid=true for \"[2606:4700:4700::1111]:443/dns-query\"","status":"passed","title":"returns valid=true for \"[2606:4700:4700::1111]:443/dns-query\"","duration":0.10170000000005075,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Octet too large"],"fullName":"validateDns Invalid dns: Octet too large returns valid=false for \"256.0.0.1\"","status":"passed","title":"returns valid=false for \"256.0.0.1\"","duration":0.16049999999995634,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Too few octets"],"fullName":"validateDns Invalid dns: Too few octets returns valid=false for \"192.168.1\"","status":"passed","title":"returns valid=false for \"192.168.1\"","duration":0.10520000000008167,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Too many octets"],"fullName":"validateDns Invalid dns: Too many octets returns valid=false for \"1.2.3.4.5\"","status":"passed","title":"returns valid=false for \"1.2.3.4.5\"","duration":0.10730000000000928,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Leading zero (1st octet)"],"fullName":"validateDns Invalid dns: Leading zero (1st octet) returns valid=false for \"01.2.3.4\"","status":"passed","title":"returns valid=false for \"01.2.3.4\"","duration":0.08820000000002892,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Leading zero (2nd octet)"],"fullName":"validateDns Invalid dns: Leading zero (2nd octet) returns valid=false for \"1.02.3.4\"","status":"passed","title":"returns valid=false for \"1.02.3.4\"","duration":0.08989999999994325,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Leading zero (3rd octet)"],"fullName":"validateDns Invalid dns: Leading zero (3rd octet) returns valid=false for \"1.2.003.4\"","status":"passed","title":"returns valid=false for \"1.2.003.4\"","duration":0.08690000000001419,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Leading zero (4th octet)"],"fullName":"validateDns Invalid dns: Leading zero (4th octet) returns valid=false for \"1.2.3.004\"","status":"passed","title":"returns valid=false for \"1.2.3.004\"","duration":0.09760000000005675,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Four digits in octet"],"fullName":"validateDns Invalid dns: Four digits in octet returns valid=false for \"1.2.3.0004\"","status":"passed","title":"returns valid=false for \"1.2.3.0004\"","duration":0.08149999999989177,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Trailing dot"],"fullName":"validateDns Invalid dns: Trailing dot returns valid=false for \"1.2.3.\"","status":"passed","title":"returns valid=false for \"1.2.3.\"","duration":0.07999999999992724,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: No TLD"],"fullName":"validateDns Invalid dns: No TLD returns valid=false for \"localhost\"","status":"passed","title":"returns valid=false for \"localhost\"","duration":0.088799999999992,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Only TLD"],"fullName":"validateDns Invalid dns: Only TLD returns valid=false for \".com\"","status":"passed","title":"returns valid=false for \".com\"","duration":0.07429999999999382,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Double dot"],"fullName":"validateDns Invalid dns: Double dot returns valid=false for \"example..com\"","status":"passed","title":"returns valid=false for \"example..com\"","duration":0.08209999999996853,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Illegal chars"],"fullName":"validateDns Invalid dns: Illegal chars returns valid=false for \"exa!mple.com\"","status":"passed","title":"returns valid=false for \"exa!mple.com\"","duration":0.08579999999994925,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Space inside"],"fullName":"validateDns Invalid dns: Space inside returns valid=false for \"exa mple.com\"","status":"passed","title":"returns valid=false for \"exa mple.com\"","duration":0.07079999999996289,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Ending with dash"],"fullName":"validateDns Invalid dns: Ending with dash returns valid=false for \"example-.com\"","status":"passed","title":"returns valid=false for \"example-.com\"","duration":0.07439999999996871,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Starting with dash"],"fullName":"validateDns Invalid dns: Starting with dash returns valid=false for \"-example.com\"","status":"passed","title":"returns valid=false for \"-example.com\"","duration":0.07569999999998345,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Trailing dot"],"fullName":"validateDns Invalid dns: Trailing dot returns valid=false for \"example.com.\"","status":"passed","title":"returns valid=false for \"example.com.\"","duration":0.08609999999998763,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Too short TLD"],"fullName":"validateDns Invalid dns: Too short TLD returns valid=false for \"example.c\"","status":"passed","title":"returns valid=false for \"example.c\"","duration":0.07799999999997453,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: With protocol (not allowed)"],"fullName":"validateDns Invalid dns: With protocol (not allowed) returns valid=false for \"http://example.com\"","status":"passed","title":"returns valid=false for \"http://example.com\"","duration":0.10430000000008022,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Too long label (>63 chars)"],"fullName":"validateDns Invalid dns: Too long label (>63 chars) returns valid=false for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","status":"passed","title":"returns valid=false for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","duration":0.08289999999999509,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Too long domain (>253 chars)"],"fullName":"validateDns Invalid dns: Too long domain (>253 chars) returns valid=false for \"abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.com\"","status":"passed","title":"returns valid=false for \"abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.com\"","duration":0.0746000000000322,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Non-numeric port"],"fullName":"validateDns Invalid dns: Non-numeric port returns valid=false for \"8.8.8.8:abc\"","status":"passed","title":"returns valid=false for \"8.8.8.8:abc\"","duration":0.08570000000008804,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Port too high"],"fullName":"validateDns Invalid dns: Port too high returns valid=false for \"dns.example.com:99999\"","status":"passed","title":"returns valid=false for \"dns.example.com:99999\"","duration":0.0907999999999447,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDns","Invalid dns: Zero IPv6 port"],"fullName":"validateDns Invalid dns: Zero IPv6 port returns valid=false for \"[2606:4700:4700::1111]:0\"","status":"passed","title":"returns valid=false for \"[2606:4700:4700::1111]:0\"","duration":0.0745000000000573,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886321,"endTime":1789128886344.1042,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateDns.test.js"},{"assertionResults":[{"ancestorTitles":["validateDomain","Valid domain: Simple domain"],"fullName":"validateDomain Valid domain: Simple domain returns valid=true for \"example.com\"","status":"passed","title":"returns valid=true for \"example.com\"","duration":3.033799999999985,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Subdomain"],"fullName":"validateDomain Valid domain: Subdomain returns valid=true for \"sub.example.com\"","status":"passed","title":"returns valid=true for \"sub.example.com\"","duration":0.30100000000001614,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: With dash"],"fullName":"validateDomain Valid domain: With dash returns valid=true for \"my-site.org\"","status":"passed","title":"returns valid=true for \"my-site.org\"","duration":0.28069999999999595,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: With numbers"],"fullName":"validateDomain Valid domain: With numbers returns valid=true for \"site123.net\"","status":"passed","title":"returns valid=true for \"site123.net\"","duration":0.22810000000001196,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Deep subdomain"],"fullName":"validateDomain Valid domain: Deep subdomain returns valid=true for \"a.b.c.example.co.uk\"","status":"passed","title":"returns valid=true for \"a.b.c.example.co.uk\"","duration":0.30109999999999104,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: With path"],"fullName":"validateDomain Valid domain: With path returns valid=true for \"example.com/path/to/resource\"","status":"passed","title":"returns valid=true for \"example.com/path/to/resource\"","duration":0.19540000000000646,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Punycode RU"],"fullName":"validateDomain Valid domain: Punycode RU returns valid=true for \"xn--d1acufc.xn--p1ai\"","status":"passed","title":"returns valid=true for \"xn--d1acufc.xn--p1ai\"","duration":0.24580000000000268,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Unicode RU"],"fullName":"validateDomain Valid domain: Unicode RU returns valid=true for \"сайт.рф\"","status":"passed","title":"returns valid=true for \"сайт.рф\"","duration":0.23089999999999122,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Unicode RU uppercase"],"fullName":"validateDomain Valid domain: Unicode RU uppercase returns valid=true for \"САЙТ.РФ\"","status":"passed","title":"returns valid=true for \"САЙТ.РФ\"","duration":0.8575000000000159,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Unicode test domain"],"fullName":"validateDomain Valid domain: Unicode test domain returns valid=true for \"пример.испытание\"","status":"passed","title":"returns valid=true for \"пример.испытание\"","duration":0.38990000000001146,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Unicode latin label"],"fullName":"validateDomain Valid domain: Unicode latin label returns valid=true for \"münich.example\"","status":"passed","title":"returns valid=true for \"münich.example\"","duration":0.2394000000000176,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Adguard dns"],"fullName":"validateDomain Valid domain: Adguard dns returns valid=true for \"dns.adguard-dns.com\"","status":"passed","title":"returns valid=true for \"dns.adguard-dns.com\"","duration":0.09590000000000032,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Nextdns dns"],"fullName":"validateDomain Valid domain: Nextdns dns returns valid=true for \"dns.nextdns.io/xxxxxxx\"","status":"passed","title":"returns valid=true for \"dns.nextdns.io/xxxxxxx\"","duration":0.11019999999999186,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Valid domain: Long domain (63 chars in label)"],"fullName":"validateDomain Valid domain: Long domain (63 chars in label) returns valid=true for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","status":"passed","title":"returns valid=true for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","duration":0.08299999999999841,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: No TLD"],"fullName":"validateDomain Invalid domain: No TLD returns valid=false for \"localhost\"","status":"passed","title":"returns valid=false for \"localhost\"","duration":0.11590000000001055,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Only TLD"],"fullName":"validateDomain Invalid domain: Only TLD returns valid=false for \".com\"","status":"passed","title":"returns valid=false for \".com\"","duration":0.06940000000000168,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Double dot"],"fullName":"validateDomain Invalid domain: Double dot returns valid=false for \"example..com\"","status":"passed","title":"returns valid=false for \"example..com\"","duration":0.06749999999999545,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Illegal chars"],"fullName":"validateDomain Invalid domain: Illegal chars returns valid=false for \"exa!mple.com\"","status":"passed","title":"returns valid=false for \"exa!mple.com\"","duration":0.06729999999998881,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Space inside"],"fullName":"validateDomain Invalid domain: Space inside returns valid=false for \"exa mple.com\"","status":"passed","title":"returns valid=false for \"exa mple.com\"","duration":0.073599999999999,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Ending with dash"],"fullName":"validateDomain Invalid domain: Ending with dash returns valid=false for \"example-.com\"","status":"passed","title":"returns valid=false for \"example-.com\"","duration":0.06770000000000209,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Starting with dash"],"fullName":"validateDomain Invalid domain: Starting with dash returns valid=false for \"-example.com\"","status":"passed","title":"returns valid=false for \"-example.com\"","duration":0.06379999999998631,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Trailing dot"],"fullName":"validateDomain Invalid domain: Trailing dot returns valid=false for \"example.com.\"","status":"passed","title":"returns valid=false for \"example.com.\"","duration":0.056199999999989814,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Too short TLD"],"fullName":"validateDomain Invalid domain: Too short TLD returns valid=false for \"example.c\"","status":"passed","title":"returns valid=false for \"example.c\"","duration":0.06569999999999254,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: With protocol (not allowed)"],"fullName":"validateDomain Invalid domain: With protocol (not allowed) returns valid=false for \"http://example.com\"","status":"passed","title":"returns valid=false for \"http://example.com\"","duration":0.06470000000001619,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Too long label (>63 chars)"],"fullName":"validateDomain Invalid domain: Too long label (>63 chars) returns valid=false for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","status":"passed","title":"returns valid=false for \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com\"","duration":0.09189999999998122,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Invalid domain: Too long domain (>253 chars)"],"fullName":"validateDomain Invalid domain: Too long domain (>253 chars) returns valid=false for \"abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.com\"","status":"passed","title":"returns valid=false for \"abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.abcdef.com\"","duration":0.08249999999998181,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Dot TLD allowed (.net)"],"fullName":"validateDomain Dot TLD toggle: Dot TLD allowed (.net) \".net\" with allowDotTLD=true → valid=true","status":"passed","title":"\".net\" with allowDotTLD=true → valid=true","duration":0.113900000000001,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Dot TLD allowed (.рф)"],"fullName":"validateDomain Dot TLD toggle: Dot TLD allowed (.рф) \".рф\" with allowDotTLD=true → valid=true","status":"passed","title":"\".рф\" with allowDotTLD=true → valid=true","duration":0.0882000000000005,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Dot TLD not allowed (.net)"],"fullName":"validateDomain Dot TLD toggle: Dot TLD not allowed (.net) \".net\" with allowDotTLD=false → valid=false","status":"passed","title":"\".net\" with allowDotTLD=false → valid=false","duration":0.06019999999998049,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Invalid with double dot"],"fullName":"validateDomain Dot TLD toggle: Invalid with double dot \"..net\" with allowDotTLD=true → valid=false","status":"passed","title":"\"..net\" with allowDotTLD=true → valid=false","duration":0.07940000000002101,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Invalid dot domain"],"fullName":"validateDomain Dot TLD toggle: Invalid dot domain \".example.com\" with allowDotTLD=true → valid=false","status":"passed","title":"\".example.com\" with allowDotTLD=true → valid=false","duration":0.11969999999999459,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateDomain","Dot TLD toggle: Invalid single word TLD (net)"],"fullName":"validateDomain Dot TLD toggle: Invalid single word TLD (net) \"net\" with allowDotTLD=true → valid=false","status":"passed","title":"\"net\" with allowDotTLD=true → valid=false","duration":0.09709999999998331,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886484,"endTime":1789128886494.1196,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateDomain.test.js"},{"assertionResults":[{"ancestorTitles":["validateHttpProxyUrl","valid URL: http with port"],"fullName":"validateHttpProxyUrl valid URL: http with port returns valid=true","status":"passed","title":"returns valid=true","duration":3.4069000000000074,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","valid URL: https with port"],"fullName":"validateHttpProxyUrl valid URL: https with port returns valid=true","status":"passed","title":"returns valid=true","duration":0.41390000000001237,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","valid URL: http with auth"],"fullName":"validateHttpProxyUrl valid URL: http with auth returns valid=true","status":"passed","title":"returns valid=true","duration":0.33449999999999136,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","valid URL: http username only"],"fullName":"validateHttpProxyUrl valid URL: http username only returns valid=true","status":"passed","title":"returns valid=true","duration":0.2804000000000144,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","valid URL: http ip with port"],"fullName":"validateHttpProxyUrl valid URL: http ip with port returns valid=true","status":"passed","title":"returns valid=true","duration":0.29179999999999495,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","valid URL: http ipv6"],"fullName":"validateHttpProxyUrl valid URL: http ipv6 returns valid=true","status":"passed","title":"returns valid=true","duration":0.22129999999998518,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","valid URL: https ipv6"],"fullName":"validateHttpProxyUrl valid URL: https ipv6 returns valid=true","status":"passed","title":"returns valid=true","duration":0.262800000000027,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","invalid URL: missing port"],"fullName":"validateHttpProxyUrl invalid URL: missing port returns valid=false","status":"passed","title":"returns valid=false","duration":0.23850000000001614,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","invalid URL: missing host"],"fullName":"validateHttpProxyUrl invalid URL: missing host returns valid=false","status":"passed","title":"returns valid=false","duration":0.7502999999999815,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","invalid URL: invalid port"],"fullName":"validateHttpProxyUrl invalid URL: invalid port returns valid=false","status":"passed","title":"returns valid=false","duration":0.37949999999997885,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","invalid URL: path present"],"fullName":"validateHttpProxyUrl invalid URL: path present returns valid=false","status":"passed","title":"returns valid=false","duration":0.1862000000000137,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","invalid URL: query present"],"fullName":"validateHttpProxyUrl invalid URL: query present returns valid=false","status":"passed","title":"returns valid=false","duration":0.10970000000000368,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","invalid URL: space present"],"fullName":"validateHttpProxyUrl invalid URL: space present returns valid=false","status":"passed","title":"returns valid=false","duration":0.13120000000000687,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","invalid URL: empty username"],"fullName":"validateHttpProxyUrl invalid URL: empty username returns valid=false","status":"passed","title":"returns valid=false","duration":0.10969999999997526,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","invalid URL: unsupported scheme"],"fullName":"validateHttpProxyUrl invalid URL: unsupported scheme returns valid=false","status":"passed","title":"returns valid=false","duration":0.11100000000001842,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHttpProxyUrl","invalid URL: unbracketed ipv6 with port"],"fullName":"validateHttpProxyUrl invalid URL: unbracketed ipv6 with port returns valid=false","status":"passed","title":"returns valid=false","duration":0.10500000000001819,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886747,"endTime":1789128886756.131,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateHttpProxyUrl.test.js"},{"assertionResults":[{"ancestorTitles":["validateHysteria2Url","Valid HY2 URL: password basic"],"fullName":"validateHysteria2Url Valid HY2 URL: password basic returns valid=true for \"hysteria2://pass@example.com:443/#hy2-basic\"","status":"passed","title":"returns valid=true for \"hysteria2://pass@example.com:443/#hy2-basic\"","duration":3.45920000000001,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Valid HY2 URL: insecure allowed"],"fullName":"validateHysteria2Url Valid HY2 URL: insecure allowed returns valid=true for \"hysteria2://pass@example.com:443/?insecure=1#hy2-insecure\"","status":"passed","title":"returns valid=true for \"hysteria2://pass@example.com:443/?insecure=1#hy2-insecure\"","duration":0.47680000000002565,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Valid HY2 URL: SNI param"],"fullName":"validateHysteria2Url Valid HY2 URL: SNI param returns valid=true for \"hysteria2://pass@example.com:443/?sni=google.com#hy2-sni\"","status":"passed","title":"returns valid=true for \"hysteria2://pass@example.com:443/?sni=google.com#hy2-sni\"","duration":0.29129999999997835,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Valid HY2 URL: Obfs + password"],"fullName":"validateHysteria2Url Valid HY2 URL: Obfs + password returns valid=true for \"hysteria2://mypassword@1.1.1.1:8443/?obfs=salamander&obfs-password=abc123#hy2-obfs\"","status":"passed","title":"returns valid=true for \"hysteria2://mypassword@1.1.1.1:8443/?obfs=salamander&obfs-password=abc123#hy2-obfs\"","duration":0.22399999999998954,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Valid HY2 URL: All options combined"],"fullName":"validateHysteria2Url Valid HY2 URL: All options combined returns valid=true for \"hysteria2://pw@8.8.8.8:8443/?sni=example.com&obfs=salamander&obfs-password=hello&insecure=1#hy2-full\"","status":"passed","title":"returns valid=true for \"hysteria2://pw@8.8.8.8:8443/?sni=example.com&obfs=salamander&obfs-password=hello&insecure=1#hy2-full\"","duration":0.29539999999997235,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Valid HY2 URL: obfs none = ok"],"fullName":"validateHysteria2Url Valid HY2 URL: obfs none = ok returns valid=true for \"hysteria2://pw@example.com:443/?obfs=none#hy2-none\"","status":"passed","title":"returns valid=true for \"hysteria2://pw@example.com:443/?obfs=none#hy2-none\"","duration":0.1997000000000071,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Valid HY2 URL: port range 123,5000-6000"],"fullName":"validateHysteria2Url Valid HY2 URL: port range 123,5000-6000 returns valid=true for \"hysteria2://letmein@example.com:123,5000-6000/?insecure=1&obfs=salamander&obfs-password=gawrgura&pinSHA256=deadbeef&sni=real.example.com\"","status":"passed","title":"returns valid=true for \"hysteria2://letmein@example.com:123,5000-6000/?insecure=1&obfs=salamander&obfs-password=gawrgura&pinSHA256=deadbeef&sni=real.example.com\"","duration":0.2691000000000372,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Valid HY2 URL: mport range"],"fullName":"validateHysteria2Url Valid HY2 URL: mport range returns valid=true for \"hysteria2://letmein@example.com:2053/?mport=20000-50000&insecure=1&obfs=salamander&obfs-password=gawrgura&sni=real.example.com\"","status":"passed","title":"returns valid=true for \"hysteria2://letmein@example.com:2053/?mport=20000-50000&insecure=1&obfs=salamander&obfs-password=gawrgura&sni=real.example.com\"","duration":0.1963000000000079,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Valid HY2 URL: IPv6 host"],"fullName":"validateHysteria2Url Valid HY2 URL: IPv6 host returns valid=true for \"hysteria2://pass@[2001:db8::1]:443/#hy2-ipv6\"","status":"passed","title":"returns valid=true for \"hysteria2://pass@[2001:db8::1]:443/#hy2-ipv6\"","duration":0.7500999999999749,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: No prefix"],"fullName":"validateHysteria2Url Invalid HY2 URL: No prefix returns valid=false for \"pw@example.com:443\"","status":"passed","title":"returns valid=false for \"pw@example.com:443\"","duration":0.244700000000023,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Missing password"],"fullName":"validateHysteria2Url Invalid HY2 URL: Missing password returns valid=false for \"hysteria2://@example.com:443/\"","status":"passed","title":"returns valid=false for \"hysteria2://@example.com:443/\"","duration":0.19400000000001683,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Missing host"],"fullName":"validateHysteria2Url Invalid HY2 URL: Missing host returns valid=false for \"hysteria2://pw@:443/\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@:443/\"","duration":0.10700000000002774,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Missing port"],"fullName":"validateHysteria2Url Invalid HY2 URL: Missing port returns valid=false for \"hysteria2://pw@example.com/\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@example.com/\"","duration":0.0735000000000241,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Invalid host"],"fullName":"validateHysteria2Url Invalid HY2 URL: Invalid host returns valid=false for \"hysteria2://pw@bad_host:443/\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@bad_host:443/\"","duration":0.09520000000003392,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Non-numeric port"],"fullName":"validateHysteria2Url Invalid HY2 URL: Non-numeric port returns valid=false for \"hysteria2://pw@example.com:port/\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@example.com:port/\"","duration":0.117999999999995,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Port out of range"],"fullName":"validateHysteria2Url Invalid HY2 URL: Port out of range returns valid=false for \"hysteria2://pw@example.com:99999/\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@example.com:99999/\"","duration":0.10219999999998208,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Invalid port range order"],"fullName":"validateHysteria2Url Invalid HY2 URL: Invalid port range order returns valid=false for \"hysteria2://pw@example.com:6000-5000/\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@example.com:6000-5000/\"","duration":0.09499999999997044,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Invalid port range end"],"fullName":"validateHysteria2Url Invalid HY2 URL: Invalid port range end returns valid=false for \"hysteria2://pw@example.com:5000-/\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@example.com:5000-/\"","duration":0.13339999999999463,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Unbracketed IPv6 with port"],"fullName":"validateHysteria2Url Invalid HY2 URL: Unbracketed IPv6 with port returns valid=false for \"hysteria2://pw@2001:db8::1:443/\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@2001:db8::1:443/\"","duration":0.08440000000001646,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Unknown obfs type"],"fullName":"validateHysteria2Url Invalid HY2 URL: Unknown obfs type returns valid=false for \"hysteria2://pw@example.com:443/?obfs=weird\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@example.com:443/?obfs=weird\"","duration":0.09960000000000946,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: obfs without obfs-password"],"fullName":"validateHysteria2Url Invalid HY2 URL: obfs without obfs-password returns valid=false for \"hysteria2://pw@example.com:443/?obfs=salamander\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@example.com:443/?obfs=salamander\"","duration":0.10120000000000573,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: invalid insecure"],"fullName":"validateHysteria2Url Invalid HY2 URL: invalid insecure returns valid=false for \"hysteria2://pw@example.com:443/?insecure=5\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@example.com:443/?insecure=5\"","duration":0.10509999999999309,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: empty sni"],"fullName":"validateHysteria2Url Invalid HY2 URL: empty sni returns valid=false for \"hysteria2://pw@example.com:443/?sni=\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@example.com:443/?sni=\"","duration":0.09829999999999472,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url","Invalid HY2 URL: Invalid mport range end"],"fullName":"validateHysteria2Url Invalid HY2 URL: Invalid mport range end returns valid=false for \"hysteria2://pw@example.com:443/?mport=5000-\"","status":"passed","title":"returns valid=false for \"hysteria2://pw@example.com:443/?mport=5000-\"","duration":0.09429999999997563,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateHysteria2Url"],"fullName":"validateHysteria2Url detects invalid port range","status":"passed","title":"detects invalid port range","duration":0.11910000000000309,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886576,"endTime":1789128886585.1191,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateHysteriaUrl.test.js"},{"assertionResults":[{"ancestorTitles":["validateIP IPv4","Valid IP: Private LAN"],"fullName":"validateIP IPv4 Valid IP: Private LAN returns {valid:true} for \"192.168.1.1\"","status":"passed","title":"returns {valid:true} for \"192.168.1.1\"","duration":2.3906000000000063,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Valid IP: All zeros"],"fullName":"validateIP IPv4 Valid IP: All zeros returns {valid:true} for \"0.0.0.0\"","status":"passed","title":"returns {valid:true} for \"0.0.0.0\"","duration":0.25320000000002096,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Valid IP: Broadcast"],"fullName":"validateIP IPv4 Valid IP: Broadcast returns {valid:true} for \"255.255.255.255\"","status":"passed","title":"returns {valid:true} for \"255.255.255.255\"","duration":0.2599999999999909,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Valid IP: Simple"],"fullName":"validateIP IPv4 Valid IP: Simple returns {valid:true} for \"1.2.3.4\"","status":"passed","title":"returns {valid:true} for \"1.2.3.4\"","duration":0.23179999999999268,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Valid IP: Loopback"],"fullName":"validateIP IPv4 Valid IP: Loopback returns {valid:true} for \"127.0.0.1\"","status":"passed","title":"returns {valid:true} for \"127.0.0.1\"","duration":0.2780999999999949,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Octet too large"],"fullName":"validateIP IPv4 Invalid IP: Octet too large returns {valid:false} for \"256.0.0.1\"","status":"passed","title":"returns {valid:false} for \"256.0.0.1\"","duration":0.20989999999997622,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Too few octets"],"fullName":"validateIP IPv4 Invalid IP: Too few octets returns {valid:false} for \"192.168.1\"","status":"passed","title":"returns {valid:false} for \"192.168.1\"","duration":0.2295000000000016,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Too many octets"],"fullName":"validateIP IPv4 Invalid IP: Too many octets returns {valid:false} for \"1.2.3.4.5\"","status":"passed","title":"returns {valid:false} for \"1.2.3.4.5\"","duration":0.20319999999998117,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Leading zero (1st octet)"],"fullName":"validateIP IPv4 Invalid IP: Leading zero (1st octet) returns {valid:false} for \"01.2.3.4\"","status":"passed","title":"returns {valid:false} for \"01.2.3.4\"","duration":0.8079000000000178,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Leading zero (2nd octet)"],"fullName":"validateIP IPv4 Invalid IP: Leading zero (2nd octet) returns {valid:false} for \"1.02.3.4\"","status":"passed","title":"returns {valid:false} for \"1.02.3.4\"","duration":0.2615000000000123,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Leading zero (3rd octet)"],"fullName":"validateIP IPv4 Invalid IP: Leading zero (3rd octet) returns {valid:false} for \"1.2.003.4\"","status":"passed","title":"returns {valid:false} for \"1.2.003.4\"","duration":0.21739999999999782,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Leading zero (4th octet)"],"fullName":"validateIP IPv4 Invalid IP: Leading zero (4th octet) returns {valid:false} for \"1.2.3.004\"","status":"passed","title":"returns {valid:false} for \"1.2.3.004\"","duration":0.15379999999998972,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Four digits in octet"],"fullName":"validateIP IPv4 Invalid IP: Four digits in octet returns {valid:false} for \"1.2.3.0004\"","status":"passed","title":"returns {valid:false} for \"1.2.3.0004\"","duration":0.09809999999998809,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv4","Invalid IP: Trailing dot"],"fullName":"validateIP IPv4 Invalid IP: Trailing dot returns {valid:false} for \"1.2.3.\"","status":"passed","title":"returns {valid:false} for \"1.2.3.\"","duration":0.11369999999999436,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Valid IPv6: Loopback"],"fullName":"validateIP IPv6 Valid IPv6: Loopback returns {valid:true} for \"::1\"","status":"passed","title":"returns {valid:true} for \"::1\"","duration":0.13939999999999486,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Valid IPv6: ULA"],"fullName":"validateIP IPv6 Valid IPv6: ULA returns {valid:true} for \"fc00::1\"","status":"passed","title":"returns {valid:true} for \"fc00::1\"","duration":0.09720000000001505,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Valid IPv6: Documentation prefix"],"fullName":"validateIP IPv6 Valid IPv6: Documentation prefix returns {valid:true} for \"2001:db8::1\"","status":"passed","title":"returns {valid:true} for \"2001:db8::1\"","duration":0.08650000000000091,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Valid IPv6: Full form"],"fullName":"validateIP IPv6 Valid IPv6: Full form returns {valid:true} for \"2001:0db8:0000:0000:0000:ff00:0042:8329\"","status":"passed","title":"returns {valid:true} for \"2001:0db8:0000:0000:0000:ff00:0042:8329\"","duration":0.11840000000000828,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Invalid IPv6: Bad hex"],"fullName":"validateIP IPv6 Invalid IPv6: Bad hex returns {valid:false} for \"2001:db8::zzzz\"","status":"passed","title":"returns {valid:false} for \"2001:db8::zzzz\"","duration":0.20330000000001291,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Invalid IPv6: Two compression markers"],"fullName":"validateIP IPv6 Invalid IPv6: Two compression markers returns {valid:false} for \"2001::db8::1\"","status":"passed","title":"returns {valid:false} for \"2001::db8::1\"","duration":0.11400000000000432,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateIP IPv6","Invalid IPv6: Zone id"],"fullName":"validateIP IPv6 Invalid IPv6: Zone id returns {valid:false} for \"fe80::1%eth0\"","status":"passed","title":"returns {valid:false} for \"fe80::1%eth0\"","duration":0.09860000000000468,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886832,"endTime":1789128886840.2034,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateIp.test.js"},{"assertionResults":[{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson accepts a direct outbound with type and tag","status":"passed","title":"accepts a direct outbound with type and tag","duration":2.5751999999999953,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson accepts a server outbound with server and numeric server_port","status":"passed","title":"accepts a server outbound with server and numeric server_port","duration":0.46809999999999263,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson accepts HTTP only as a JSON outbound","status":"passed","title":"accepts HTTP only as a JSON outbound","duration":0.22580000000002087,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson accepts a URLTest outbound with referenced outbounds","status":"passed","title":"accepts a URLTest outbound with referenced outbounds","duration":0.3264999999999816,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson rejects empty input","status":"passed","title":"rejects empty input","duration":0.27649999999999864,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson rejects arrays","status":"passed","title":"rejects arrays","duration":0.3470000000000084,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson requires a non-empty type field","status":"passed","title":"requires a non-empty type field","duration":0.4072000000000173,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson requires a non-empty tag field","status":"passed","title":"requires a non-empty tag field","duration":0.2524999999999977,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson rejects a tag already used by another JSON outbound","status":"passed","title":"rejects a tag already used by another JSON outbound","duration":0.8582999999999856,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson requires server fields for common server outbound types","status":"passed","title":"requires server fields for common server outbound types","duration":0.377900000000011,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateOutboundJson"],"fullName":"validateOutboundJson requires group outbounds for selector-like types","status":"passed","title":"requires group outbounds for selector-like types","duration":0.30060000000000286,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887071,"endTime":1789128887078.3005,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateOutboundJson.test.js"},{"assertionResults":[{"ancestorTitles":["validatePath","Valid path: Single level"],"fullName":"validatePath Valid path: Single level returns valid=true for \"/etc\"","status":"passed","title":"returns valid=true for \"/etc\"","duration":2.318700000000007,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Valid path: Nested path"],"fullName":"validatePath Valid path: Nested path returns valid=true for \"/usr/local/bin\"","status":"passed","title":"returns valid=true for \"/usr/local/bin\"","duration":0.2429000000000201,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Valid path: With dash"],"fullName":"validatePath Valid path: With dash returns valid=true for \"/var/log/nginx-access\"","status":"passed","title":"returns valid=true for \"/var/log/nginx-access\"","duration":0.28000000000000114,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Valid path: With underscore"],"fullName":"validatePath Valid path: With underscore returns valid=true for \"/opt/my_app/config\"","status":"passed","title":"returns valid=true for \"/opt/my_app/config\"","duration":0.21210000000002083,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Valid path: With numbers"],"fullName":"validatePath Valid path: With numbers returns valid=true for \"/data123/files\"","status":"passed","title":"returns valid=true for \"/data123/files\"","duration":0.26730000000000587,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Valid path: With dots"],"fullName":"validatePath Valid path: With dots returns valid=true for \"/home/user/.config\"","status":"passed","title":"returns valid=true for \"/home/user/.config\"","duration":0.1810000000000116,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Valid path: Deep nested"],"fullName":"validatePath Valid path: Deep nested returns valid=true for \"/a/b/c/d/e/f/g\"","status":"passed","title":"returns valid=true for \"/a/b/c/d/e/f/g\"","duration":0.4309000000000083,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Invalid path: Empty string"],"fullName":"validatePath Invalid path: Empty string returns valid=false for \"\"","status":"passed","title":"returns valid=false for \"\"","duration":0.21399999999999864,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Invalid path: Missing starting slash"],"fullName":"validatePath Invalid path: Missing starting slash returns valid=false for \"usr/local\"","status":"passed","title":"returns valid=false for \"usr/local\"","duration":0.7088999999999999,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Invalid path: Only dot"],"fullName":"validatePath Invalid path: Only dot returns valid=false for \".\"","status":"passed","title":"returns valid=false for \".\"","duration":0.3032000000000039,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Invalid path: Space inside"],"fullName":"validatePath Invalid path: Space inside returns valid=false for \"/path with space\"","status":"passed","title":"returns valid=false for \"/path with space\"","duration":0.2768999999999835,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Invalid path: Illegal char"],"fullName":"validatePath Invalid path: Illegal char returns valid=false for \"/path$\"","status":"passed","title":"returns valid=false for \"/path$\"","duration":0.12309999999999377,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Invalid path: Backslash not allowed"],"fullName":"validatePath Invalid path: Backslash not allowed returns valid=false for \"\\windows\\path\"","status":"passed","title":"returns valid=false for \"\\windows\\path\"","duration":0.12970000000001392,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Invalid path: Relative path ./"],"fullName":"validatePath Invalid path: Relative path ./ returns valid=false for \"./relative\"","status":"passed","title":"returns valid=false for \"./relative\"","duration":0.11109999999999332,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validatePath","Invalid path: Relative path ../"],"fullName":"validatePath Invalid path: Relative path ../ returns valid=false for \"../parent\"","status":"passed","title":"returns valid=false for \"../parent\"","duration":0.11119999999999663,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887076,"endTime":1789128887083.2769,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validatePath.test.js"},{"assertionResults":[{"ancestorTitles":["validateProxyUrl","Valid proxy URL: shadowsocks"],"fullName":"validateProxyUrl Valid proxy URL: shadowsocks returns valid=true for \"ss://YWVzLTI1Ni1nY206cGFzcw@example.com:8388\"","status":"passed","title":"returns valid=true for \"ss://YWVzLTI1Ni1nY206cGFzcw@example.com:8388\"","duration":3.6458999999999833,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl","Valid proxy URL: vless"],"fullName":"validateProxyUrl Valid proxy URL: vless returns valid=true for \"vless://94792286-7bbe-4f33-8b36-18d1bbf70723@example.com:443?type=tcp&encryption=none&security=none\"","status":"passed","title":"returns valid=true for \"vless://94792286-7bbe-4f33-8b36-18d1bbf70723@example.com:443?type=tcp&encryption=none&security=none\"","duration":0.7008999999999901,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl","Valid proxy URL: vmess"],"fullName":"validateProxyUrl Valid proxy URL: vmess returns valid=true for \"vmess://eyJ2IjoiMiIsInBzIjoiRXhhbXBsZSBWTWVzcyIsImFkZCI6ImV4YW1wbGUuY29tIiwicG9ydCI6IjQ0MyIsImlkIjoiOTQ3OTIyODYtN2JiZS00ZjMzLThiMzYtMThkMWJiZjcwNzIzIiwiYWlkIjoiMCIsInNjeSI6ImF1dG8iLCJuZXQiOiJ3cyIsInR5cGUiOiJub25lIiwiaG9zdCI6ImV4YW1wbGUuY29tIiwicGF0aCI6Ii93cyIsInRscyI6InRscyIsInNuaSI6ImV4YW1wbGUuY29tIn0=\"","status":"passed","title":"returns valid=true for \"vmess://eyJ2IjoiMiIsInBzIjoiRXhhbXBsZSBWTWVzcyIsImFkZCI6ImV4YW1wbGUuY29tIiwicG9ydCI6IjQ0MyIsImlkIjoiOTQ3OTIyODYtN2JiZS00ZjMzLThiMzYtMThkMWJiZjcwNzIzIiwiYWlkIjoiMCIsInNjeSI6ImF1dG8iLCJuZXQiOiJ3cyIsInR5cGUiOiJub25lIiwiaG9zdCI6ImV4YW1wbGUuY29tIiwicGF0aCI6Ii93cyIsInRscyI6InRscyIsInNuaSI6ImV4YW1wbGUuY29tIn0=\"","duration":0.5466999999999871,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl","Valid proxy URL: trojan"],"fullName":"validateProxyUrl Valid proxy URL: trojan returns valid=true for \"trojan://password@example.com:443\"","status":"passed","title":"returns valid=true for \"trojan://password@example.com:443\"","duration":0.36779999999998836,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl","Valid proxy URL: socks4"],"fullName":"validateProxyUrl Valid proxy URL: socks4 returns valid=true for \"socks4://127.0.0.1:1080\"","status":"passed","title":"returns valid=true for \"socks4://127.0.0.1:1080\"","duration":0.47750000000002046,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl","Valid proxy URL: socks4a"],"fullName":"validateProxyUrl Valid proxy URL: socks4a returns valid=true for \"socks4a://example.com:1080\"","status":"passed","title":"returns valid=true for \"socks4a://example.com:1080\"","duration":0.21399999999999864,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl","Valid proxy URL: socks5"],"fullName":"validateProxyUrl Valid proxy URL: socks5 returns valid=true for \"socks5://user:pass@example.com:1080\"","status":"passed","title":"returns valid=true for \"socks5://user:pass@example.com:1080\"","duration":0.262800000000027,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl","Valid proxy URL: http"],"fullName":"validateProxyUrl Valid proxy URL: http returns valid=true for \"http://127.0.0.1:80\"","status":"passed","title":"returns valid=true for \"http://127.0.0.1:80\"","duration":0.39620000000002165,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl","Valid proxy URL: https"],"fullName":"validateProxyUrl Valid proxy URL: https returns valid=true for \"https://user:pass@example.com:443\"","status":"passed","title":"returns valid=true for \"https://user:pass@example.com:443\"","duration":0.7907000000000153,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl","Valid proxy URL: hysteria2"],"fullName":"validateProxyUrl Valid proxy URL: hysteria2 returns valid=true for \"hysteria2://password@example.com:443\"","status":"passed","title":"returns valid=true for \"hysteria2://password@example.com:443\"","duration":0.8089999999999691,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl","Valid proxy URL: hy2"],"fullName":"validateProxyUrl Valid proxy URL: hy2 returns valid=true for \"hy2://password@example.com:443\"","status":"passed","title":"returns valid=true for \"hy2://password@example.com:443\"","duration":0.22179999999997335,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl"],"fullName":"validateProxyUrl trims surrounding whitespace before dispatching","status":"passed","title":"trims surrounding whitespace before dispatching","duration":0.16779999999999973,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl"],"fullName":"validateProxyUrl returns a clear error for unsupported protocols","status":"passed","title":"returns a clear error for unsupported protocols","duration":0.37999999999999545,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl"],"fullName":"validateProxyUrl accepts native HTTP and HTTPS proxy URLs","status":"passed","title":"accepts native HTTP and HTTPS proxy URLs","duration":0.28000000000002956,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateProxyUrl"],"fullName":"validateProxyUrl rejects VMess configs with an invalid server host","status":"passed","title":"rejects VMess configs with an invalid server host","duration":0.2522000000000162,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886668,"endTime":1789128886679.2522,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateProxyUrl.test.js"},{"assertionResults":[{"ancestorTitles":["validateShadowsocksUrl","Valid URL: no-client"],"fullName":"validateShadowsocksUrl Valid URL: no-client returns valid=true for \"ss://MjAyMi1ibGFrZTMtYWVzLTI1Ni1nY206ZG1DbHkvWmgxNVd3OStzK0dGWGlGVElrcHc3Yy9xQ0lTYUJyYWk3V2hoWT0@127.0.0.1:25144?type=tcp#shadowsocks-no-client\"","status":"passed","title":"returns valid=true for \"ss://MjAyMi1ibGFrZTMtYWVzLTI1Ni1nY206ZG1DbHkvWmgxNVd3OStzK0dGWGlGVElrcHc3Yy9xQ0lTYUJyYWk3V2hoWT0@127.0.0.1:25144?type=tcp#shadowsocks-no-client\"","duration":2.991199999999992,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Valid URL: client"],"fullName":"validateShadowsocksUrl Valid URL: client returns valid=true for \"ss://MjAyMi1ibGFrZTMtYWVzLTI1Ni1nY206S3FiWXZiNkhwb1RmTUt0N2VGcUZQSmJNNXBXaHlFU0ZKTXY2dEp1Ym1Fdz06dzRNMEx5RU9OTGQ5SWlkSGc0endTbzN2R3h4NS9aQ3hId0FpaWlxck5hcz0@127.0.0.1:26627?type=tcp#shadowsocks-client\"","status":"passed","title":"returns valid=true for \"ss://MjAyMi1ibGFrZTMtYWVzLTI1Ni1nY206S3FiWXZiNkhwb1RmTUt0N2VGcUZQSmJNNXBXaHlFU0ZKTXY2dEp1Ym1Fdz06dzRNMEx5RU9OTGQ5SWlkSGc0endTbzN2R3h4NS9aQ3hId0FpaWlxck5hcz0@127.0.0.1:26627?type=tcp#shadowsocks-client\"","duration":0.32320000000001414,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Valid URL: plain-user"],"fullName":"validateShadowsocksUrl Valid URL: plain-user returns valid=true for \"ss://2022-blake3-aes-256-gcm:dmCly/Zh15Ww9+s+GFXiFTIkpw7c/qCISaBrai7WhhY=@127.0.0.1:27214?type=tcp#shadowsocks-plain-user\"","status":"passed","title":"returns valid=true for \"ss://2022-blake3-aes-256-gcm:dmCly/Zh15Ww9+s+GFXiFTIkpw7c/qCISaBrai7WhhY=@127.0.0.1:27214?type=tcp#shadowsocks-plain-user\"","duration":0.3088999999999942,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Valid URL: plain-user-ipv6"],"fullName":"validateShadowsocksUrl Valid URL: plain-user-ipv6 returns valid=true for \"ss://2022-blake3-aes-256-gcm:dmCly/Zh15Ww9+s+GFXiFTIkpw7c/qCISaBrai7WhhY=@[2001:db8::1]:27214?type=tcp#shadowsocks-ipv6\"","status":"passed","title":"returns valid=true for \"ss://2022-blake3-aes-256-gcm:dmCly/Zh15Ww9+s+GFXiFTIkpw7c/qCISaBrai7WhhY=@[2001:db8::1]:27214?type=tcp#shadowsocks-ipv6\"","duration":0.3545999999999765,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Invalid URL: No prefix"],"fullName":"validateShadowsocksUrl Invalid URL: No prefix returns valid=false for \"uuid@127.0.0.1:443?type=tcp\"","status":"passed","title":"returns valid=false for \"uuid@127.0.0.1:443?type=tcp\"","duration":0.29719999999997526,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Invalid URL: No host"],"fullName":"validateShadowsocksUrl Invalid URL: No host returns valid=false for \"ss://password@:443?type=tcp\"","status":"passed","title":"returns valid=false for \"ss://password@:443?type=tcp\"","duration":0.1863999999999919,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Invalid URL: No port"],"fullName":"validateShadowsocksUrl Invalid URL: No port returns valid=false for \"ss://password@127.0.0.1?type=tcp\"","status":"passed","title":"returns valid=false for \"ss://password@127.0.0.1?type=tcp\"","duration":0.2565999999999917,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Invalid URL: Invalid host"],"fullName":"validateShadowsocksUrl Invalid URL: Invalid host returns valid=false for \"ss://password@bad_host:443?type=tcp\"","status":"passed","title":"returns valid=false for \"ss://password@bad_host:443?type=tcp\"","duration":0.22339999999999804,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Invalid URL: Invalid port"],"fullName":"validateShadowsocksUrl Invalid URL: Invalid port returns valid=false for \"ss://password@127.0.0.1:abc?type=tcp\"","status":"passed","title":"returns valid=false for \"ss://password@127.0.0.1:abc?type=tcp\"","duration":0.7922000000000082,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Invalid URL: Missing type"],"fullName":"validateShadowsocksUrl Invalid URL: Missing type returns valid=false for \"ss://password@127.0.0.1:443\"","status":"passed","title":"returns valid=false for \"ss://password@127.0.0.1:443\"","duration":0.2948000000000093,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Invalid URL: Contains space"],"fullName":"validateShadowsocksUrl Invalid URL: Contains space returns valid=false for \"ss://password@127.0.0.1:443?type=tcp #extra\"","status":"passed","title":"returns valid=false for \"ss://password@127.0.0.1:443?type=tcp #extra\"","duration":0.25079999999999814,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl","Invalid URL: Unbracketed IPv6 with port"],"fullName":"validateShadowsocksUrl Invalid URL: Unbracketed IPv6 with port returns valid=false for \"ss://password@2001:db8::1:443?type=tcp\"","status":"passed","title":"returns valid=false for \"ss://password@2001:db8::1:443?type=tcp\"","duration":0.16059999999998809,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateShadowsocksUrl"],"fullName":"validateShadowsocksUrl detects invalid port range","status":"passed","title":"detects invalid port range","duration":0.1897000000000162,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886916,"endTime":1789128886924.1897,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateShadowsocksUrl.test.js"},{"assertionResults":[{"ancestorTitles":["validateSocksUrl","Valid URL: socks4 basic"],"fullName":"validateSocksUrl Valid URL: socks4 basic returns valid=true for \"socks4://127.0.0.1:1080\"","status":"passed","title":"returns valid=true for \"socks4://127.0.0.1:1080\"","duration":2.713300000000004,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Valid URL: socks4a basic"],"fullName":"validateSocksUrl Valid URL: socks4a basic returns valid=true for \"socks4a://127.0.0.1:1080\"","status":"passed","title":"returns valid=true for \"socks4a://127.0.0.1:1080\"","duration":0.28820000000001755,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Valid URL: socks5 basic"],"fullName":"validateSocksUrl Valid URL: socks5 basic returns valid=true for \"socks5://127.0.0.1:1080\"","status":"passed","title":"returns valid=true for \"socks5://127.0.0.1:1080\"","duration":0.23519999999999186,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Valid URL: socks5 with username"],"fullName":"validateSocksUrl Valid URL: socks5 with username returns valid=true for \"socks5://user@127.0.0.1:1080\"","status":"passed","title":"returns valid=true for \"socks5://user@127.0.0.1:1080\"","duration":0.17379999999999995,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Valid URL: socks5 with username/password"],"fullName":"validateSocksUrl Valid URL: socks5 with username/password returns valid=true for \"socks5://user:pass@127.0.0.1:1080\"","status":"passed","title":"returns valid=true for \"socks5://user:pass@127.0.0.1:1080\"","duration":0.2243999999999744,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Valid URL: socks5 with domain"],"fullName":"validateSocksUrl Valid URL: socks5 with domain returns valid=true for \"socks5://user:pass@my.proxy.com:1080\"","status":"passed","title":"returns valid=true for \"socks5://user:pass@my.proxy.com:1080\"","duration":0.4865000000000066,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Valid URL: socks5 with dash in domain"],"fullName":"validateSocksUrl Valid URL: socks5 with dash in domain returns valid=true for \"socks5://user:pass@fast-proxy.net:8080\"","status":"passed","title":"returns valid=true for \"socks5://user:pass@fast-proxy.net:8080\"","duration":0.2775000000000034,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Valid URL: socks5 with uppercase domain"],"fullName":"validateSocksUrl Valid URL: socks5 with uppercase domain returns valid=true for \"socks5://USER:PASSWORD@Example.COM:1080\"","status":"passed","title":"returns valid=true for \"socks5://USER:PASSWORD@Example.COM:1080\"","duration":0.17980000000000018,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Valid URL: socks5 with ipv6"],"fullName":"validateSocksUrl Valid URL: socks5 with ipv6 returns valid=true for \"socks5://user:pass@[2001:db8::1]:1080\"","status":"passed","title":"returns valid=true for \"socks5://user:pass@[2001:db8::1]:1080\"","duration":0.7550000000000239,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: no prefix"],"fullName":"validateSocksUrl Invalid URL: no prefix returns valid=false for \"127.0.0.1:1080\"","status":"passed","title":"returns valid=false for \"127.0.0.1:1080\"","duration":0.2682000000000073,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: wrong prefix"],"fullName":"validateSocksUrl Invalid URL: wrong prefix returns valid=false for \"http://127.0.0.1:1080\"","status":"passed","title":"returns valid=false for \"http://127.0.0.1:1080\"","duration":0.20250000000001478,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: missing host"],"fullName":"validateSocksUrl Invalid URL: missing host returns valid=false for \"socks5://user:pass@:1080\"","status":"passed","title":"returns valid=false for \"socks5://user:pass@:1080\"","duration":0.1272999999999911,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: missing port"],"fullName":"validateSocksUrl Invalid URL: missing port returns valid=false for \"socks5://127.0.0.1\"","status":"passed","title":"returns valid=false for \"socks5://127.0.0.1\"","duration":0.08830000000000382,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: invalid port (non-numeric)"],"fullName":"validateSocksUrl Invalid URL: invalid port (non-numeric) returns valid=false for \"socks5://127.0.0.1:abc\"","status":"passed","title":"returns valid=false for \"socks5://127.0.0.1:abc\"","duration":0.10369999999997503,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: invalid port (too high)"],"fullName":"validateSocksUrl Invalid URL: invalid port (too high) returns valid=false for \"socks5://127.0.0.1:99999\"","status":"passed","title":"returns valid=false for \"socks5://127.0.0.1:99999\"","duration":0.07749999999998636,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: space in url"],"fullName":"validateSocksUrl Invalid URL: space in url returns valid=false for \"socks5://127.0. 0.1:1080\"","status":"passed","title":"returns valid=false for \"socks5://127.0. 0.1:1080\"","duration":0.07019999999999982,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: missing username when auth provided"],"fullName":"validateSocksUrl Invalid URL: missing username when auth provided returns valid=false for \"socks5://:pass@127.0.0.1:1080\"","status":"passed","title":"returns valid=false for \"socks5://:pass@127.0.0.1:1080\"","duration":0.07070000000001642,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: invalid domain chars"],"fullName":"validateSocksUrl Invalid URL: invalid domain chars returns valid=false for \"socks5://user:pass@exa_mple.com:1080\"","status":"passed","title":"returns valid=false for \"socks5://user:pass@exa_mple.com:1080\"","duration":0.17449999999999477,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: extra symbol"],"fullName":"validateSocksUrl Invalid URL: extra symbol returns valid=false for \"socks5:///127.0.0.1:1080\"","status":"passed","title":"returns valid=false for \"socks5:///127.0.0.1:1080\"","duration":0.13329999999999131,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl","Invalid URL: unbracketed ipv6 with port"],"fullName":"validateSocksUrl Invalid URL: unbracketed ipv6 with port returns valid=false for \"socks5://2001:db8::1:1080\"","status":"passed","title":"returns valid=false for \"socks5://2001:db8::1:1080\"","duration":0.08279999999999177,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl"],"fullName":"validateSocksUrl detects invalid port range (0)","status":"passed","title":"detects invalid port range (0)","duration":0.11639999999999873,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSocksUrl"],"fullName":"validateSocksUrl detects invalid port range (65536)","status":"passed","title":"detects invalid port range (65536)","duration":0.11879999999999313,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886832,"endTime":1789128886840.1746,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateSocksUrl.test.js"},{"assertionResults":[{"ancestorTitles":["validateSubnet","Valid subnet: Simple IP"],"fullName":"validateSubnet Valid subnet: Simple IP returns {valid:true} for \"192.168.1.1\"","status":"passed","title":"returns {valid:true} for \"192.168.1.1\"","duration":2.8680999999999983,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Valid subnet: With CIDR /24"],"fullName":"validateSubnet Valid subnet: With CIDR /24 returns {valid:true} for \"192.168.1.1/24\"","status":"passed","title":"returns {valid:true} for \"192.168.1.1/24\"","duration":0.474899999999991,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Valid subnet: CIDR /0"],"fullName":"validateSubnet Valid subnet: CIDR /0 returns {valid:true} for \"10.0.0.1/0\"","status":"passed","title":"returns {valid:true} for \"10.0.0.1/0\"","duration":0.27889999999999304,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Valid subnet: Zero network with CIDR"],"fullName":"validateSubnet Valid subnet: Zero network with CIDR returns {valid:true} for \"0.0.0.0/3\"","status":"passed","title":"returns {valid:true} for \"0.0.0.0/3\"","duration":0.23680000000001655,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Valid subnet: CIDR /32"],"fullName":"validateSubnet Valid subnet: CIDR /32 returns {valid:true} for \"172.16.0.1/32\"","status":"passed","title":"returns {valid:true} for \"172.16.0.1/32\"","duration":0.316599999999994,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Valid subnet: Loopback"],"fullName":"validateSubnet Valid subnet: Loopback returns {valid:true} for \"127.0.0.1\"","status":"passed","title":"returns {valid:true} for \"127.0.0.1\"","duration":0.1828999999999894,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Valid subnet: Broadcast with mask"],"fullName":"validateSubnet Valid subnet: Broadcast with mask returns {valid:true} for \"255.255.255.255/32\"","status":"passed","title":"returns {valid:true} for \"255.255.255.255/32\"","duration":0.26149999999998386,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Valid subnet: IPv6 address"],"fullName":"validateSubnet Valid subnet: IPv6 address returns {valid:true} for \"2001:db8::1\"","status":"passed","title":"returns {valid:true} for \"2001:db8::1\"","duration":0.19880000000000564,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Valid subnet: IPv6 CIDR /64"],"fullName":"validateSubnet Valid subnet: IPv6 CIDR /64 returns {valid:true} for \"2001:db8::/64\"","status":"passed","title":"returns {valid:true} for \"2001:db8::/64\"","duration":0.8192999999999984,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Valid subnet: IPv6 default route"],"fullName":"validateSubnet Valid subnet: IPv6 default route returns {valid:true} for \"::/0\"","status":"passed","title":"returns {valid:true} for \"::/0\"","duration":0.28770000000000095,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Valid subnet: IPv6 host /128"],"fullName":"validateSubnet Valid subnet: IPv6 host /128 returns {valid:true} for \"fc00::1/128\"","status":"passed","title":"returns {valid:true} for \"fc00::1/128\"","duration":0.23550000000000182,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Empty string"],"fullName":"validateSubnet Invalid subnet: Empty string returns {valid:false} for \"\"","status":"passed","title":"returns {valid:false} for \"\"","duration":0.141399999999976,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Bad format letters"],"fullName":"validateSubnet Invalid subnet: Bad format letters returns {valid:false} for \"abc.def.ghi.jkl\"","status":"passed","title":"returns {valid:false} for \"abc.def.ghi.jkl\"","duration":0.08689999999998577,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Octet too large"],"fullName":"validateSubnet Invalid subnet: Octet too large returns {valid:false} for \"300.1.1.1\"","status":"passed","title":"returns {valid:false} for \"300.1.1.1\"","duration":0.08020000000001914,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Negative octet"],"fullName":"validateSubnet Invalid subnet: Negative octet returns {valid:false} for \"-1.2.3.4\"","status":"passed","title":"returns {valid:false} for \"-1.2.3.4\"","duration":0.08190000000001874,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Too many octets"],"fullName":"validateSubnet Invalid subnet: Too many octets returns {valid:false} for \"1.2.3.4.5\"","status":"passed","title":"returns {valid:false} for \"1.2.3.4.5\"","duration":0.06929999999999836,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Not enough octets"],"fullName":"validateSubnet Invalid subnet: Not enough octets returns {valid:false} for \"192.168.1\"","status":"passed","title":"returns {valid:false} for \"192.168.1\"","duration":0.06520000000000437,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Leading zero octet"],"fullName":"validateSubnet Invalid subnet: Leading zero octet returns {valid:false} for \"01.2.3.4\"","status":"passed","title":"returns {valid:false} for \"01.2.3.4\"","duration":0.09659999999999513,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Invalid CIDR (too high)"],"fullName":"validateSubnet Invalid subnet: Invalid CIDR (too high) returns {valid:false} for \"192.168.1.1/33\"","status":"passed","title":"returns {valid:false} for \"192.168.1.1/33\"","duration":0.0800000000000125,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Invalid CIDR (negative)"],"fullName":"validateSubnet Invalid subnet: Invalid CIDR (negative) returns {valid:false} for \"192.168.1.1/-1\"","status":"passed","title":"returns {valid:false} for \"192.168.1.1/-1\"","duration":0.07230000000001269,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: CIDR not number"],"fullName":"validateSubnet Invalid subnet: CIDR not number returns {valid:false} for \"192.168.1.1/abc\"","status":"passed","title":"returns {valid:false} for \"192.168.1.1/abc\"","duration":0.07549999999997681,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Forbidden 0.0.0.0"],"fullName":"validateSubnet Invalid subnet: Forbidden 0.0.0.0 returns {valid:false} for \"0.0.0.0\"","status":"passed","title":"returns {valid:false} for \"0.0.0.0\"","duration":0.06750000000002387,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Forbidden ::"],"fullName":"validateSubnet Invalid subnet: Forbidden :: returns {valid:false} for \"::\"","status":"passed","title":"returns {valid:false} for \"::\"","duration":0.08500000000000796,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Invalid IPv6 CIDR"],"fullName":"validateSubnet Invalid subnet: Invalid IPv6 CIDR returns {valid:false} for \"2001:db8::1/129\"","status":"passed","title":"returns {valid:false} for \"2001:db8::1/129\"","duration":0.08080000000001064,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateSubnet","Invalid subnet: Invalid IPv6 address"],"fullName":"validateSubnet Invalid subnet: Invalid IPv6 address returns {valid:false} for \"2001:db8::zzzz/64\"","status":"passed","title":"returns {valid:false} for \"2001:db8::zzzz/64\"","duration":0.11400000000000432,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886665,"endTime":1789128886674.114,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateSubnet.test.js"},{"assertionResults":[{"ancestorTitles":["validateTrojanUrl","Valid URL: tcp + none"],"fullName":"validateTrojanUrl Valid URL: tcp + none returns valid=true for \"trojan://04agAQapcl@127.0.0.1:33641?type=tcp&security=none#trojan-tcp-none\"","status":"passed","title":"returns valid=true for \"trojan://04agAQapcl@127.0.0.1:33641?type=tcp&security=none#trojan-tcp-none\"","duration":2.8991000000000042,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: tcp + reality"],"fullName":"validateTrojanUrl Valid URL: tcp + reality returns valid=true for \"trojan://cME3ZlUrYF@127.0.0.1:43772?type=tcp&security=reality&pbk=DckTwU6p6pTX9QxFXOi6vH4Vzt_RCE1vMCnj2c6hvjw&fp=chrome&sni=google.com&sid=221a80cf94&spx=%2F#trojan-tcp-reality\"","status":"passed","title":"returns valid=true for \"trojan://cME3ZlUrYF@127.0.0.1:43772?type=tcp&security=reality&pbk=DckTwU6p6pTX9QxFXOi6vH4Vzt_RCE1vMCnj2c6hvjw&fp=chrome&sni=google.com&sid=221a80cf94&spx=%2F#trojan-tcp-reality\"","duration":0.29640000000000555,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: tcp + tls"],"fullName":"validateTrojanUrl Valid URL: tcp + tls returns valid=true for \"trojan://EJjpAj02lg@127.0.0.1:11381?type=tcp&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=google.com#trojan-tcp-tls\"","status":"passed","title":"returns valid=true for \"trojan://EJjpAj02lg@127.0.0.1:11381?type=tcp&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=google.com#trojan-tcp-tls\"","duration":0.26739999999998076,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: tcp + tls + insecure"],"fullName":"validateTrojanUrl Valid URL: tcp + tls + insecure returns valid=true for \"trojan://ZP2Ik5sxN3@127.0.0.1:16247?type=tcp&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&allowInsecure=1&sni=google.com#trojan-tcp-tls-insecure\"","status":"passed","title":"returns valid=true for \"trojan://ZP2Ik5sxN3@127.0.0.1:16247?type=tcp&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&allowInsecure=1&sni=google.com#trojan-tcp-tls-insecure\"","duration":0.1728999999999985,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: tcp + tls + ech"],"fullName":"validateTrojanUrl Valid URL: tcp + tls + ech returns valid=true for \"trojan://90caP481ay@127.0.0.1:59708?type=tcp&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&ech=AF3%2BDQBZAAAgACC2y%2BAe4dqthLNpfvmtE6g%2BnaJ%2FciK6P%2BREbRLkR%2Fg%2FEgAkAAEAAQABAAIAAQADAAIAAQACAAIAAgADAAMAAQADAAIAAwADAApnb29nbGUuY29tAAA%3D&sni=google.com#trojan-tcp-tls-ech\"","status":"passed","title":"returns valid=true for \"trojan://90caP481ay@127.0.0.1:59708?type=tcp&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&ech=AF3%2BDQBZAAAgACC2y%2BAe4dqthLNpfvmtE6g%2BnaJ%2FciK6P%2BREbRLkR%2Fg%2FEgAkAAEAAQABAAIAAQADAAIAAQACAAIAAgADAAMAAQADAAIAAwADAApnb29nbGUuY29tAAA%3D&sni=google.com#trojan-tcp-tls-ech\"","duration":0.20180000000001996,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: mKCP + none"],"fullName":"validateTrojanUrl Valid URL: mKCP + none returns valid=true for \"trojan://N5v7iIOe9G@127.0.0.1:36319?type=kcp&headerType=none&seed=P91wFIfjzZ&security=none#trojan-mKCP\"","status":"passed","title":"returns valid=true for \"trojan://N5v7iIOe9G@127.0.0.1:36319?type=kcp&headerType=none&seed=P91wFIfjzZ&security=none#trojan-mKCP\"","duration":0.1272000000000162,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: ws + none"],"fullName":"validateTrojanUrl Valid URL: ws + none returns valid=true for \"trojan://G3cE9phv1g@127.0.0.1:57370?type=ws&path=%2Fwspath&host=google.com&security=none#trojan-websocket-none\"","status":"passed","title":"returns valid=true for \"trojan://G3cE9phv1g@127.0.0.1:57370?type=ws&path=%2Fwspath&host=google.com&security=none#trojan-websocket-none\"","duration":0.18059999999999832,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: ws + tls"],"fullName":"validateTrojanUrl Valid URL: ws + tls returns valid=true for \"trojan://FBok41WczO@127.0.0.1:59919?type=ws&path=%2Fwspath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=google.com#trojan-websocket-tls\"","status":"passed","title":"returns valid=true for \"trojan://FBok41WczO@127.0.0.1:59919?type=ws&path=%2Fwspath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=google.com#trojan-websocket-tls\"","duration":0.152499999999975,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: ws + tls + insecure"],"fullName":"validateTrojanUrl Valid URL: ws + tls + insecure returns valid=true for \"trojan://bhwvndUBPA@127.0.0.1:22969?type=ws&path=%2Fwspath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&allowInsecure=1&sni=google.com#trojan-websocket-tls-insecure\"","status":"passed","title":"returns valid=true for \"trojan://bhwvndUBPA@127.0.0.1:22969?type=ws&path=%2Fwspath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&allowInsecure=1&sni=google.com#trojan-websocket-tls-insecure\"","duration":0.6825000000000045,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: ws + tls + ech"],"fullName":"validateTrojanUrl Valid URL: ws + tls + ech returns valid=true for \"trojan://pwiduqFUWO@127.0.0.1:46765?type=ws&path=%2Fwspath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&ech=AF3%2BDQBZAAAgACCFcQYEtwrFOidJJLYHvSiN%2BljRgaAIrNHoVnio3uXAOwAkAAEAAQABAAIAAQADAAIAAQACAAIAAgADAAMAAQADAAIAAwADAApnb29nbGUuY29tAAA%3D&sni=google.com#trojan-websocket-tls-ech\"","status":"passed","title":"returns valid=true for \"trojan://pwiduqFUWO@127.0.0.1:46765?type=ws&path=%2Fwspath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&ech=AF3%2BDQBZAAAgACCFcQYEtwrFOidJJLYHvSiN%2BljRgaAIrNHoVnio3uXAOwAkAAEAAQABAAIAAQADAAIAAQACAAIAAgADAAMAAQADAAIAAwADAApnb29nbGUuY29tAAA%3D&sni=google.com#trojan-websocket-tls-ech\"","duration":0.23570000000000846,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: grpc + none"],"fullName":"validateTrojanUrl Valid URL: grpc + none returns valid=true for \"trojan://WMR7qkKhsV@127.0.0.1:27897?type=grpc&serviceName=TunService&authority=authority&security=none#trojan-gRPC-none\"","status":"passed","title":"returns valid=true for \"trojan://WMR7qkKhsV@127.0.0.1:27897?type=grpc&serviceName=TunService&authority=authority&security=none#trojan-gRPC-none\"","duration":0.1904999999999859,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: grpc + reality"],"fullName":"validateTrojanUrl Valid URL: grpc + reality returns valid=true for \"trojan://KVuRNsu6KG@127.0.0.1:46077?type=grpc&serviceName=TunService&authority=authority&security=reality&pbk=Xn59i4gum3ppCICS6-_NuywrhHIVVAH54b2mjd5CFkE&fp=chrome&sni=google.com&sid=e5be&spx=%2F#trojan-gRPC-reality\"","status":"passed","title":"returns valid=true for \"trojan://KVuRNsu6KG@127.0.0.1:46077?type=grpc&serviceName=TunService&authority=authority&security=reality&pbk=Xn59i4gum3ppCICS6-_NuywrhHIVVAH54b2mjd5CFkE&fp=chrome&sni=google.com&sid=e5be&spx=%2F#trojan-gRPC-reality\"","duration":0.08680000000001087,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: grpc + tls"],"fullName":"validateTrojanUrl Valid URL: grpc + tls returns valid=true for \"trojan://7BJtbywy8h@127.0.0.1:10627?type=grpc&serviceName=TunService&authority=authority&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=google.com#trojan-gRPC-tls\"","status":"passed","title":"returns valid=true for \"trojan://7BJtbywy8h@127.0.0.1:10627?type=grpc&serviceName=TunService&authority=authority&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=google.com#trojan-gRPC-tls\"","duration":0.07220000000000937,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: grpc + tls + insecure"],"fullName":"validateTrojanUrl Valid URL: grpc + tls + insecure returns valid=true for \"trojan://TI3PakvtP4@127.0.0.1:10435?type=grpc&serviceName=TunService&authority=authority&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&allowInsecure=1&sni=google.com#trojan-gRPC-tls-insecure\"","status":"passed","title":"returns valid=true for \"trojan://TI3PakvtP4@127.0.0.1:10435?type=grpc&serviceName=TunService&authority=authority&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&allowInsecure=1&sni=google.com#trojan-gRPC-tls-insecure\"","duration":0.06690000000000396,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: grpc + tls + ech"],"fullName":"validateTrojanUrl Valid URL: grpc + tls + ech returns valid=true for \"trojan://mbzoVKL27h@127.0.0.1:38681?type=grpc&serviceName=TunService&authority=authority&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&ech=AF3%2BDQBZAAAgACCq72Ru3VbFlDpKttl3LccmInu8R2oAsCr8wzyxB0vZZQAkAAEAAQABAAIAAQADAAIAAQACAAIAAgADAAMAAQADAAIAAwADAApnb29nbGUuY29tAAA%3D&sni=google.com#trojan-gRPC-tls-ech\"","status":"passed","title":"returns valid=true for \"trojan://mbzoVKL27h@127.0.0.1:38681?type=grpc&serviceName=TunService&authority=authority&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&ech=AF3%2BDQBZAAAgACCq72Ru3VbFlDpKttl3LccmInu8R2oAsCr8wzyxB0vZZQAkAAEAAQABAAIAAQADAAIAAQACAAIAAgADAAMAAQADAAIAAwADAApnb29nbGUuY29tAAA%3D&sni=google.com#trojan-gRPC-tls-ech\"","duration":0.06430000000000291,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: httpupgrade + none"],"fullName":"validateTrojanUrl Valid URL: httpupgrade + none returns valid=true for \"trojan://uc44gBwOKQ@127.0.0.1:29085?type=httpupgrade&path=%2Fhttpupgradepath&host=google.com&security=none#trojan-httpupgrade-none\"","status":"passed","title":"returns valid=true for \"trojan://uc44gBwOKQ@127.0.0.1:29085?type=httpupgrade&path=%2Fhttpupgradepath&host=google.com&security=none#trojan-httpupgrade-none\"","duration":0.06560000000001764,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: httpupgrade + tls"],"fullName":"validateTrojanUrl Valid URL: httpupgrade + tls returns valid=true for \"trojan://MhNxbcVB14@127.0.0.1:32700?type=httpupgrade&path=%2Fhttpupgradepath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=google.com#trojan-httpupgrade-tls\"","status":"passed","title":"returns valid=true for \"trojan://MhNxbcVB14@127.0.0.1:32700?type=httpupgrade&path=%2Fhttpupgradepath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=google.com#trojan-httpupgrade-tls\"","duration":0.0660000000000025,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: httpupgrade + tls + insecure"],"fullName":"validateTrojanUrl Valid URL: httpupgrade + tls + insecure returns valid=true for \"trojan://7SOQFUpLob@127.0.0.1:28474?type=httpupgrade&path=%2Fhttpupgradepath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&allowInsecure=1&sni=google.com#trojan-httpupgrade-tls-insecure\"","status":"passed","title":"returns valid=true for \"trojan://7SOQFUpLob@127.0.0.1:28474?type=httpupgrade&path=%2Fhttpupgradepath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&allowInsecure=1&sni=google.com#trojan-httpupgrade-tls-insecure\"","duration":0.06310000000001992,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: httpupgrade + tls + ech"],"fullName":"validateTrojanUrl Valid URL: httpupgrade + tls + ech returns valid=true for \"trojan://ou8pLSyx9N@127.0.0.1:17737?type=httpupgrade&path=%2Fhttpupgradepath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&ech=AF3%2BDQBZAAAgACB%2FlkIkit%2BblFzE7PtbYDVF3NXK8olXJ5a7YwY%2Biy9QQwAkAAEAAQABAAIAAQADAAIAAQACAAIAAgADAAMAAQADAAIAAwADAApnb29nbGUuY29tAAA%3D&sni=google.com#trojan-httpupgrade-tls-ech\"","status":"passed","title":"returns valid=true for \"trojan://ou8pLSyx9N@127.0.0.1:17737?type=httpupgrade&path=%2Fhttpupgradepath&host=google.com&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&ech=AF3%2BDQBZAAAgACB%2FlkIkit%2BblFzE7PtbYDVF3NXK8olXJ5a7YwY%2Biy9QQwAkAAEAAQABAAIAAQADAAIAAQACAAIAAgADAAMAAQADAAIAAwADAApnb29nbGUuY29tAAA%3D&sni=google.com#trojan-httpupgrade-tls-ech\"","duration":0.06299999999998818,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: xhttp + none"],"fullName":"validateTrojanUrl Valid URL: xhttp + none returns valid=true for \"trojan://VEetltxLtw@127.0.0.1:59072?type=xhttp&path=%2Fxhttppath&host=google.com&mode=auto&security=none#trojan-xhttp\"","status":"passed","title":"returns valid=true for \"trojan://VEetltxLtw@127.0.0.1:59072?type=xhttp&path=%2Fxhttppath&host=google.com&mode=auto&security=none#trojan-xhttp\"","duration":0.06279999999998154,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Valid URL: tcp + ipv6"],"fullName":"validateTrojanUrl Valid URL: tcp + ipv6 returns valid=true for \"trojan://04agAQapcl@[2001:db8::1]:33641?type=tcp&security=none#trojan-ipv6\"","status":"passed","title":"returns valid=true for \"trojan://04agAQapcl@[2001:db8::1]:33641?type=tcp&security=none#trojan-ipv6\"","duration":0.14430000000001542,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Invalid URL: No prefix"],"fullName":"validateTrojanUrl Invalid URL: No prefix returns valid=false for \"uuid@host:443?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"uuid@host:443?type=tcp&security=tls\"","duration":0.11019999999999186,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Invalid URL: No password"],"fullName":"validateTrojanUrl Invalid URL: No password returns valid=false for \"trojan://@127.0.0.1:443?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"trojan://@127.0.0.1:443?type=tcp&security=tls\"","duration":0.10349999999999682,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Invalid URL: No host"],"fullName":"validateTrojanUrl Invalid URL: No host returns valid=false for \"trojan://pass@:443?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"trojan://pass@:443?type=tcp&security=tls\"","duration":0.2831000000000188,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Invalid URL: No port"],"fullName":"validateTrojanUrl Invalid URL: No port returns valid=false for \"trojan://pass@127.0.0.1?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"trojan://pass@127.0.0.1?type=tcp&security=tls\"","duration":0.10609999999999786,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Invalid URL: Invalid host"],"fullName":"validateTrojanUrl Invalid URL: Invalid host returns valid=false for \"trojan://pass@bad_host:443?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"trojan://pass@bad_host:443?type=tcp&security=tls\"","duration":0.3002999999999929,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Invalid URL: Invalid port"],"fullName":"validateTrojanUrl Invalid URL: Invalid port returns valid=false for \"trojan://pass@127.0.0.1:abc?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"trojan://pass@127.0.0.1:abc?type=tcp&security=tls\"","duration":0.09099999999997976,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Invalid URL: Unbracketed IPv6 with port"],"fullName":"validateTrojanUrl Invalid URL: Unbracketed IPv6 with port returns valid=false for \"trojan://pass@2001:db8::1:443?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"trojan://pass@2001:db8::1:443?type=tcp&security=tls\"","duration":0.08789999999999054,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl","Invalid URL: tcp + reality + unexpected spaces"],"fullName":"validateTrojanUrl Invalid URL: tcp + reality + unexpected spaces returns valid=false for \"trojan://cME3ZlUrYF@127.0.0.1:43772?type=tcp&security=reality&pbk=DckTwU6p6pTX9QxFXOi6vH4Vzt_RCE1vMCnj2c6hvjw&fp=chrome&sni= google.com&sid=221a80cf94&spx=%2F#trojan-tcp-reality\"","status":"passed","title":"returns valid=false for \"trojan://cME3ZlUrYF@127.0.0.1:43772?type=tcp&security=reality&pbk=DckTwU6p6pTX9QxFXOi6vH4Vzt_RCE1vMCnj2c6hvjw&fp=chrome&sni= google.com&sid=221a80cf94&spx=%2F#trojan-tcp-reality\"","duration":0.08429999999998472,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateTrojanUrl"],"fullName":"validateTrojanUrl detects invalid port range","status":"passed","title":"detects invalid port range","duration":0.13880000000000337,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886542,"endTime":1789128886551.139,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateTrojanUrl.test.js"},{"assertionResults":[{"ancestorTitles":["validateUrl","Valid URL: Simple HTTP"],"fullName":"validateUrl Valid URL: Simple HTTP returns valid=true for \"http://example.com\"","status":"passed","title":"returns valid=true for \"http://example.com\"","duration":3.0615999999999985,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Valid URL: Simple HTTPS"],"fullName":"validateUrl Valid URL: Simple HTTPS returns valid=true for \"https://example.com\"","status":"passed","title":"returns valid=true for \"https://example.com\"","duration":0.3527999999999736,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Valid URL: With path"],"fullName":"validateUrl Valid URL: With path returns valid=true for \"https://example.com/path/to/page\"","status":"passed","title":"returns valid=true for \"https://example.com/path/to/page\"","duration":0.28890000000001237,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Valid URL: With query"],"fullName":"validateUrl Valid URL: With query returns valid=true for \"https://example.com/?q=test\"","status":"passed","title":"returns valid=true for \"https://example.com/?q=test\"","duration":0.25370000000000914,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Valid URL: With port"],"fullName":"validateUrl Valid URL: With port returns valid=true for \"http://example.com:8080\"","status":"passed","title":"returns valid=true for \"http://example.com:8080\"","duration":0.32390000000000896,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Valid URL: With subdomain"],"fullName":"validateUrl Valid URL: With subdomain returns valid=true for \"https://sub.example.com\"","status":"passed","title":"returns valid=true for \"https://sub.example.com\"","duration":0.1897999999999911,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Valid URL: IPv4 host"],"fullName":"validateUrl Valid URL: IPv4 host returns valid=true for \"http://127.0.0.1/tachyon-subscription-test.json\"","status":"passed","title":"returns valid=true for \"http://127.0.0.1/tachyon-subscription-test.json\"","duration":0.23580000000001178,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Valid URL: IPv4 host with port"],"fullName":"validateUrl Valid URL: IPv4 host with port returns valid=true for \"http://192.168.1.1:8080/sub\"","status":"passed","title":"returns valid=true for \"http://192.168.1.1:8080/sub\"","duration":0.21000000000000796,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Valid URL: IPv6 host"],"fullName":"validateUrl Valid URL: IPv6 host returns valid=true for \"https://[2001:db8::1]/sub\"","status":"passed","title":"returns valid=true for \"https://[2001:db8::1]/sub\"","duration":0.7331999999999823,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Valid URL: IPv6 host with port"],"fullName":"validateUrl Valid URL: IPv6 host with port returns valid=true for \"https://[2001:db8::1]:8443/sub\"","status":"passed","title":"returns valid=true for \"https://[2001:db8::1]:8443/sub\"","duration":0.33960000000001855,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Valid URL: localhost host"],"fullName":"validateUrl Valid URL: localhost host returns valid=true for \"http://localhost/sub\"","status":"passed","title":"returns valid=true for \"http://localhost/sub\"","duration":0.23519999999999186,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Invalid URL: Invalid format"],"fullName":"validateUrl Invalid URL: Invalid format returns valid=false for \"not a url\"","status":"passed","title":"returns valid=false for \"not a url\"","duration":0.1636999999999773,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Invalid URL: Missing protocol"],"fullName":"validateUrl Invalid URL: Missing protocol returns valid=false for \"example.com\"","status":"passed","title":"returns valid=false for \"example.com\"","duration":0.09270000000000778,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Invalid URL: Unsupported protocol (ftp)"],"fullName":"validateUrl Invalid URL: Unsupported protocol (ftp) returns valid=false for \"ftp://example.com\"","status":"passed","title":"returns valid=false for \"ftp://example.com\"","duration":0.08759999999998058,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Invalid URL: Unsupported protocol (ws)"],"fullName":"validateUrl Invalid URL: Unsupported protocol (ws) returns valid=false for \"ws://example.com\"","status":"passed","title":"returns valid=false for \"ws://example.com\"","duration":0.07119999999997617,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Invalid URL: Empty string"],"fullName":"validateUrl Invalid URL: Empty string returns valid=false for \"\"","status":"passed","title":"returns valid=false for \"\"","duration":0.09239999999999782,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Invalid URL: Without tld"],"fullName":"validateUrl Invalid URL: Without tld returns valid=false for \"https://google\"","status":"passed","title":"returns valid=false for \"https://google\"","duration":0.10050000000001091,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Invalid URL: Invalid IPv4 host"],"fullName":"validateUrl Invalid URL: Invalid IPv4 host returns valid=false for \"http://999.0.0.1/sub\"","status":"passed","title":"returns valid=false for \"http://999.0.0.1/sub\"","duration":0.126199999999983,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl","Invalid URL: Unbracketed IPv6 host with port"],"fullName":"validateUrl Invalid URL: Unbracketed IPv6 host with port returns valid=false for \"http://2001:db8::1:8080/sub\"","status":"passed","title":"returns valid=false for \"http://2001:db8::1:8080/sub\"","duration":0.09569999999999368,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateUrl"],"fullName":"validateUrl allows custom protocol list (ftp)","status":"passed","title":"allows custom protocol list (ftp)","duration":0.9034999999999798,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886977,"endTime":1789128886986.9036,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateUrl.test.js"},{"assertionResults":[{"ancestorTitles":["validateVlessUrl","Valid URL: tcp + none"],"fullName":"validateVlessUrl Valid URL: tcp + none returns valid=true for \"vless://94792286-7bbe-4f33-8b36-18d1bbf70723@127.0.0.1:34520?type=tcp&encryption=none&security=none#vless-tcp-none\"","status":"passed","title":"returns valid=true for \"vless://94792286-7bbe-4f33-8b36-18d1bbf70723@127.0.0.1:34520?type=tcp&encryption=none&security=none#vless-tcp-none\"","duration":3.2151000000000067,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: tcp + reality"],"fullName":"validateVlessUrl Valid URL: tcp + reality returns valid=true for \"vless://e95163dc-905e-480a-afe5-20b146288679@127.0.0.1:16399?type=tcp&encryption=none&security=reality&pbk=tqhSkeDR6jsqC-BYCnZWBrdL33g705ba8tV5-ZboWTM&fp=chrome&sni=google.com&sid=f6&spx=%2F#vless-tcp-reality\"","status":"passed","title":"returns valid=true for \"vless://e95163dc-905e-480a-afe5-20b146288679@127.0.0.1:16399?type=tcp&encryption=none&security=reality&pbk=tqhSkeDR6jsqC-BYCnZWBrdL33g705ba8tV5-ZboWTM&fp=chrome&sni=google.com&sid=f6&spx=%2F#vless-tcp-reality\"","duration":0.3947000000000003,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: tcp implied + Amnezia reality"],"fullName":"validateVlessUrl Valid URL: tcp implied + Amnezia reality returns valid=true for \"vless://2b173dc1-e7e7-4824-aadc-d072dcefeaca@127.0.0.1:443?encryption=none&security=reality&flow=xtls-rprx-vision&sni=www.googletagmanager.com&fp=chrome&pbk=R3BKE4AvPMYy_JPKB2mB1cLEL8jX-qXR1hYE3Iarsmk&sid=92ca63541ff03a57#AmneziaVPN\"","status":"passed","title":"returns valid=true for \"vless://2b173dc1-e7e7-4824-aadc-d072dcefeaca@127.0.0.1:443?encryption=none&security=reality&flow=xtls-rprx-vision&sni=www.googletagmanager.com&fp=chrome&pbk=R3BKE4AvPMYy_JPKB2mB1cLEL8jX-qXR1hYE3Iarsmk&sid=92ca63541ff03a57#AmneziaVPN\"","duration":0.2464999999999975,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: tcp + tls"],"fullName":"validateVlessUrl Valid URL: tcp + tls returns valid=true for \"vless://2e9e8288-060e-4da2-8b9f-a1c81826feb7@127.0.0.1:19316?type=tcp&encryption=none&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=google.com#vless-tcp-tls\"","status":"passed","title":"returns valid=true for \"vless://2e9e8288-060e-4da2-8b9f-a1c81826feb7@127.0.0.1:19316?type=tcp&encryption=none&security=tls&fp=chrome&alpn=h2%2Chttp%2F1.1&sni=google.com#vless-tcp-tls\"","duration":0.32289999999997576,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: mKCP + none"],"fullName":"validateVlessUrl Valid URL: mKCP + none returns valid=true for \"vless://72e201d7-7841-4a32-b266-4aa3eb776d51@127.0.0.1:17270?type=kcp&encryption=none&headerType=none&seed=AirziWi4ng&security=none#vless-mKCP\"","status":"passed","title":"returns valid=true for \"vless://72e201d7-7841-4a32-b266-4aa3eb776d51@127.0.0.1:17270?type=kcp&encryption=none&headerType=none&seed=AirziWi4ng&security=none#vless-mKCP\"","duration":0.32220000000000937,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: ws + none"],"fullName":"validateVlessUrl Valid URL: ws + none returns valid=true for \"vless://d86daef7-565b-4ecd-a9ee-bac847ad38e6@127.0.0.1:12928?type=ws&encryption=none&path=%2Fwspath&host=google.com&security=none#vless-websocket-none\"","status":"passed","title":"returns valid=true for \"vless://d86daef7-565b-4ecd-a9ee-bac847ad38e6@127.0.0.1:12928?type=ws&encryption=none&path=%2Fwspath&host=google.com&security=none#vless-websocket-none\"","duration":0.23540000000002692,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: ws + tls"],"fullName":"validateVlessUrl Valid URL: ws + tls returns valid=true for \"vless://fe0f0941-09a9-4e46-bc69-e00190d7bb9c@127.0.0.1:10156?type=ws&encryption=none&path=%2Fwspath&host=google.com&security=tls&fp=chrome&sni=google.com#vless-websocket-tls\"","status":"passed","title":"returns valid=true for \"vless://fe0f0941-09a9-4e46-bc69-e00190d7bb9c@127.0.0.1:10156?type=ws&encryption=none&path=%2Fwspath&host=google.com&security=tls&fp=chrome&sni=google.com#vless-websocket-tls\"","duration":0.29549999999997567,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: grpc + none"],"fullName":"validateVlessUrl Valid URL: grpc + none returns valid=true for \"vless://974b39e3-f7bf-42b9-933c-16699c635e77@127.0.0.1:15633?type=grpc&encryption=none&serviceName=TunService&security=none#vless-gRPC-none\"","status":"passed","title":"returns valid=true for \"vless://974b39e3-f7bf-42b9-933c-16699c635e77@127.0.0.1:15633?type=grpc&encryption=none&serviceName=TunService&security=none#vless-gRPC-none\"","duration":0.2324999999999875,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: grpc + reality"],"fullName":"validateVlessUrl Valid URL: grpc + reality returns valid=true for \"vless://651e7eca-5152-46f1-baf2-d502e0af7b27@127.0.0.1:28535?type=grpc&encryption=none&serviceName=TunService&security=reality&pbk=nhZ7NiKfcqESa5ZeBFfsq9o18W-OWOAHLln9UmuVXSk&fp=chrome&sni=google.com&sid=11cbaeaa&spx=%2F#vless-gRPC-reality\"","status":"passed","title":"returns valid=true for \"vless://651e7eca-5152-46f1-baf2-d502e0af7b27@127.0.0.1:28535?type=grpc&encryption=none&serviceName=TunService&security=reality&pbk=nhZ7NiKfcqESa5ZeBFfsq9o18W-OWOAHLln9UmuVXSk&fp=chrome&sni=google.com&sid=11cbaeaa&spx=%2F#vless-gRPC-reality\"","duration":0.9517999999999915,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: httpupgrade + none"],"fullName":"validateVlessUrl Valid URL: httpupgrade + none returns valid=true for \"vless://2b98f144-847f-42f7-8798-e1a32d27bdc7@127.0.0.1:47154?type=httpupgrade&encryption=none&path=%2Fhttpupgradepath&host=google.com&security=none#vless-httpupgrade-none\"","status":"passed","title":"returns valid=true for \"vless://2b98f144-847f-42f7-8798-e1a32d27bdc7@127.0.0.1:47154?type=httpupgrade&encryption=none&path=%2Fhttpupgradepath&host=google.com&security=none#vless-httpupgrade-none\"","duration":0.3897000000000048,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: httpupgrade + tls"],"fullName":"validateVlessUrl Valid URL: httpupgrade + tls returns valid=true for \"vless://76dbd0ff-1a35-4f0c-a9ba-3c5890b7dea6@127.0.0.1:50639?type=httpupgrade&encryption=none&path=%2Fhttpupgradepath&host=google.com&security=tls&sni=google.com#vless-httpupgrade-tls\"","status":"passed","title":"returns valid=true for \"vless://76dbd0ff-1a35-4f0c-a9ba-3c5890b7dea6@127.0.0.1:50639?type=httpupgrade&encryption=none&path=%2Fhttpupgradepath&host=google.com&security=tls&sni=google.com#vless-httpupgrade-tls\"","duration":0.27840000000000487,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: xhttp + none"],"fullName":"validateVlessUrl Valid URL: xhttp + none returns valid=true for \"vless://c2841505-ec32-4b8d-b6dd-3e19d648c321@127.0.0.1:45507?type=xhttp&encryption=none&path=%2Fxhttppath&host=xhttp&mode=auto&security=none#vless-xhttp\"","status":"passed","title":"returns valid=true for \"vless://c2841505-ec32-4b8d-b6dd-3e19d648c321@127.0.0.1:45507?type=xhttp&encryption=none&path=%2Fxhttppath&host=xhttp&mode=auto&security=none#vless-xhttp\"","duration":0.17130000000000223,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Valid URL: tcp + ipv6"],"fullName":"validateVlessUrl Valid URL: tcp + ipv6 returns valid=true for \"vless://94792286-7bbe-4f33-8b36-18d1bbf70723@[2001:db8::1]:34520?type=tcp&encryption=none&security=none#vless-ipv6\"","status":"passed","title":"returns valid=true for \"vless://94792286-7bbe-4f33-8b36-18d1bbf70723@[2001:db8::1]:34520?type=tcp&encryption=none&security=none#vless-ipv6\"","duration":0.20849999999998658,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: No prefix"],"fullName":"validateVlessUrl Invalid URL: No prefix returns valid=false for \"uuid@host:443?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"uuid@host:443?type=tcp&security=tls\"","duration":0.1383999999999901,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: No uuid"],"fullName":"validateVlessUrl Invalid URL: No uuid returns valid=false for \"vless://@127.0.0.1:443?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"vless://@127.0.0.1:443?type=tcp&security=tls\"","duration":0.11240000000000805,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: No host"],"fullName":"validateVlessUrl Invalid URL: No host returns valid=false for \"vless://uuid@:443?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"vless://uuid@:443?type=tcp&security=tls\"","duration":0.27129999999999654,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: No port"],"fullName":"validateVlessUrl Invalid URL: No port returns valid=false for \"vless://uuid@127.0.0.1?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"vless://uuid@127.0.0.1?type=tcp&security=tls\"","duration":0.09759999999999991,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: Invalid host"],"fullName":"validateVlessUrl Invalid URL: Invalid host returns valid=false for \"vless://uuid@bad_host:443?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"vless://uuid@bad_host:443?type=tcp&security=tls\"","duration":0.2560999999999751,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: Invalid port"],"fullName":"validateVlessUrl Invalid URL: Invalid port returns valid=false for \"vless://uuid@127.0.0.1:abc?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"vless://uuid@127.0.0.1:abc?type=tcp&security=tls\"","duration":0.1027000000000271,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: Unbracketed IPv6 with port"],"fullName":"validateVlessUrl Invalid URL: Unbracketed IPv6 with port returns valid=false for \"vless://uuid@2001:db8::1:443?type=tcp&security=tls\"","status":"passed","title":"returns valid=false for \"vless://uuid@2001:db8::1:443?type=tcp&security=tls\"","duration":0.09560000000001878,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: Unsupported type"],"fullName":"validateVlessUrl Invalid URL: Unsupported type returns valid=false for \"vless://uuid@127.0.0.1:443?type=quic&security=tls\"","status":"passed","title":"returns valid=false for \"vless://uuid@127.0.0.1:443?type=quic&security=tls\"","duration":0.11840000000000828,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: Missing security"],"fullName":"validateVlessUrl Invalid URL: Missing security returns valid=false for \"vless://uuid@127.0.0.1:443?type=tcp\"","status":"passed","title":"returns valid=false for \"vless://uuid@127.0.0.1:443?type=tcp\"","duration":0.10770000000002256,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: reality without pbk"],"fullName":"validateVlessUrl Invalid URL: reality without pbk returns valid=false for \"vless://uuid@127.0.0.1:443?type=tcp&security=reality&fp=chrome\"","status":"passed","title":"returns valid=false for \"vless://uuid@127.0.0.1:443?type=tcp&security=reality&fp=chrome\"","duration":0.11410000000000764,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: reality without fp"],"fullName":"validateVlessUrl Invalid URL: reality without fp returns valid=false for \"vless://uuid@127.0.0.1:443?type=tcp&security=reality&pbk=abc\"","status":"passed","title":"returns valid=false for \"vless://uuid@127.0.0.1:443?type=tcp&security=reality&pbk=abc\"","duration":0.11259999999998627,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl","Invalid URL: tcp + reality + unexpected spaces"],"fullName":"validateVlessUrl Invalid URL: tcp + reality + unexpected spaces returns valid=false for \"vless://e95163dc-905e-480a-afe5-20b146288679@127.0.0.1:16399?type=tcp&encryption=none&security=reality&pbk=tqhSkeDR6jsqC-BYCnZWBrdL33g705ba8tV5-ZboWTM&fp=chrome&sni= google.com&sid=f6&spx=%2F#vless-tcp-reality\"","status":"passed","title":"returns valid=false for \"vless://e95163dc-905e-480a-afe5-20b146288679@127.0.0.1:16399?type=tcp&encryption=none&security=reality&pbk=tqhSkeDR6jsqC-BYCnZWBrdL33g705ba8tV5-ZboWTM&fp=chrome&sni= google.com&sid=f6&spx=%2F#vless-tcp-reality\"","duration":0.10200000000000387,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["validateVlessUrl"],"fullName":"validateVlessUrl detects invalid port range","status":"passed","title":"detects invalid port range","duration":0.1530999999999949,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886414,"endTime":1789128886425.153,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/validators/tests/validateVlessUrl.test.js"},{"assertionResults":[{"ancestorTitles":["fetchNetworkInterfaces"],"fullName":"fetchNetworkInterfaces returns empty array when rpc and network are not available","status":"passed","title":"returns empty array when rpc and network are not available","duration":3.349400000000003,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887436,"endTime":1789128887439.3494,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/fetchers/tests/fetchNetworkInterfaces.test.ts"},{"assertionResults":[{"ancestorTitles":["fetchServicesInfo"],"fullName":"fetchServicesInfo returns the fast UI state after applying it to the shared store","status":"passed","title":"returns the fast UI state after applying it to the shared store","duration":7.148599999999988,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["fetchServicesInfo"],"fullName":"fetchServicesInfo keeps the previous service state when the fallback status fetch fails","status":"passed","title":"keeps the previous service state when the fallback status fetch fails","duration":3.125699999999995,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886666,"endTime":1789128886676.1257,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/fetchers/tests/fetchServicesInfo.test.ts"},{"assertionResults":[{"ancestorTitles":["formatServiceStatusMessage"],"fullName":"formatServiceStatusMessage formats normal provider status","status":"passed","title":"formats normal provider status","duration":2.9647999999999968,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["formatServiceStatusMessage"],"fullName":"formatServiceStatusMessage formats action not ready with details","status":"passed","title":"formats action not ready with details","duration":0.3459000000000003,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["formatServiceStatusMessage"],"fullName":"formatServiceStatusMessage formats missing binary path","status":"passed","title":"formats missing binary path","duration":0.35410000000001673,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["formatServiceStatusMessage"],"fullName":"formatServiceStatusMessage formats empty or unknown string","status":"passed","title":"formats empty or unknown string","duration":0.5701000000000249,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887267,"endTime":1789128887271.57,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/helpers/tests/formatServiceStatusMessage.test.ts"},{"assertionResults":[{"ancestorTitles":["isTransientRpcError"],"fullName":"isTransientRpcError detects LuCI RPC reply races caused by interrupted page requests","status":"passed","title":"detects LuCI RPC reply races caused by interrupted page requests","duration":2.566100000000006,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["isTransientRpcError"],"fullName":"isTransientRpcError does not treat backend action failures as transient transport errors","status":"passed","title":"does not treat backend action failures as transient transport errors","duration":0.33789999999999054,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887392,"endTime":1789128887395.338,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/helpers/tests/isTransientRpcError.test.ts"},{"assertionResults":[{"ancestorTitles":["restored action loading"],"fullName":"restored action loading shows loading only for actions that are still running","status":"passed","title":"shows loading only for actions that are still running","duration":2.2156000000000233,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887405,"endTime":1789128887407.2156,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/helpers/tests/restoredActionLoading.test.ts"},{"assertionResults":[{"ancestorTitles":["getServiceAvailability"],"fullName":"getServiceAvailability does not treat an unresolved service status as stopped","status":"passed","title":"does not treat an unresolved service status as stopped","duration":2.085800000000006,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getServiceAvailability"],"fullName":"getServiceAvailability distinguishes a stopped service from an unavailable status request","status":"passed","title":"distinguishes a stopped service from an unavailable status request","duration":0.29699999999999704,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getServiceAvailability"],"fullName":"getServiceAvailability accepts the numeric running flag returned by the backend","status":"passed","title":"accepts the numeric running flag returned by the backend","duration":0.20120000000000005,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887367,"endTime":1789128887369.297,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/helpers/tests/serviceAvailability.test.ts"},{"assertionResults":[{"ancestorTitles":["LogNotificationDeduper"],"fullName":"LogNotificationDeduper accepts error, fatal, and component update log lines","status":"passed","title":"accepts error, fatal, and component update log lines","duration":3.9802999999999997,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["LogNotificationDeduper"],"fullName":"LogNotificationDeduper suppresses transient/expected error patterns","status":"passed","title":"suppresses transient/expected error patterns","duration":0.4381999999999948,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["LogNotificationDeduper"],"fullName":"LogNotificationDeduper dedupes already shown log lines through session storage","status":"passed","title":"dedupes already shown log lines through session storage","duration":0.6097000000000037,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["LogNotificationDeduper"],"fullName":"LogNotificationDeduper keeps the full log line as the replay key","status":"passed","title":"keeps the full log line as the replay key","duration":0.2863999999999862,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887151,"endTime":1789128887156.2864,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/services/tests/logNotificationDeduper.service.test.ts"},{"assertionResults":[{"ancestorTitles":["refreshRuntimeUiState"],"fullName":"refreshRuntimeUiState applies current UI state to the shared store","status":"passed","title":"applies current UI state to the shared store","duration":7.673999999999978,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["refreshRuntimeUiState"],"fullName":"refreshRuntimeUiState coalesces concurrent refreshes into one RPC call","status":"passed","title":"coalesces concurrent refreshes into one RPC call","duration":2.2210000000000036,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["refreshRuntimeUiState"],"fullName":"refreshRuntimeUiState notifies subscribers after applying fresh state","status":"passed","title":"notifies subscribers after applying fresh state","duration":2.5207000000000335,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["refreshRuntimeUiState"],"fullName":"refreshRuntimeUiState replays cached state to a new subscriber without another RPC","status":"passed","title":"replays cached state to a new subscriber without another RPC","duration":1.7595999999999776,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["refreshRuntimeUiState"],"fullName":"refreshRuntimeUiState exposes the cached state without another RPC","status":"passed","title":"exposes the cached state without another RPC","duration":2.61850000000004,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886379,"endTime":1789128886395.6184,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/services/tests/runtimeUiState.service.test.ts"},{"assertionResults":[{"ancestorTitles":["socket service"],"fullName":"socket service keeps the initial subscriber when the first connection fails","status":"passed","title":"keeps the initial subscriber when the first connection fails","duration":30.38549999999998,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886242,"endTime":1789128886272.3855,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/services/tests/socket.service.test.ts"},{"assertionResults":[{"ancestorTitles":["StoreService"],"fullName":"StoreService diffs only keys provided to set","status":"passed","title":"diffs only keys provided to set","duration":4.631299999999982,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["StoreService"],"fullName":"StoreService does not notify when provided values are unchanged","status":"passed","title":"does not notify when provided values are unchanged","duration":0.729299999999995,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887222,"endTime":1789128887227.7292,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/services/tests/store.service.test.ts"},{"assertionResults":[{"ancestorTitles":["TachyonLogWatcher"],"fullName":"TachyonLogWatcher emits the initial logread snapshot","status":"passed","title":"emits the initial logread snapshot","duration":5.163700000000006,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonLogWatcher"],"fullName":"TachyonLogWatcher does not emit the same log line twice","status":"passed","title":"does not emit the same log line twice","duration":0.8716999999999757,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonLogWatcher"],"fullName":"TachyonLogWatcher forgets old tracked lines only after the tracked window is exceeded","status":"passed","title":"forgets old tracked lines only after the tracked window is exceeded","duration":0.8556999999999846,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887174,"endTime":1789128887180.8557,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/services/tests/tachyonLogWatcher.service.test.ts"},{"assertionResults":[{"ancestorTitles":["UiActionNotificationTracker"],"fullName":"UiActionNotificationTracker does not notify jobs that were not started by this UI session","status":"passed","title":"does not notify jobs that were not started by this UI session","duration":2.8821000000000083,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["UiActionNotificationTracker"],"fullName":"UiActionNotificationTracker notifies an owned job exactly once","status":"passed","title":"notifies an owned job exactly once","duration":0.6129000000000246,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["UiActionNotificationTracker"],"fullName":"UiActionNotificationTracker keeps ownership and notification state across reloads","status":"passed","title":"keeps ownership and notification state across reloads","duration":0.4111999999999796,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887333,"endTime":1789128887336.6128,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/services/tests/uiActionNotification.service.test.ts"},{"assertionResults":[{"ancestorTitles":["applyUiStateToStore"],"fullName":"applyUiStateToStore applies service, capability, and running action state before first render","status":"passed","title":"applies service, capability, and running action state before first render","duration":6.997799999999984,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["applyUiStateToStore"],"fullName":"applyUiStateToStore clears finished persisted action flags while preserving local enable actions","status":"passed","title":"clears finished persisted action flags while preserving local enable actions","duration":1.6402000000000498,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["applyUiStateToStore"],"fullName":"applyUiStateToStore keeps locally started actions loading until their owner clears them","status":"passed","title":"keeps locally started actions loading until their owner clears them","duration":1.7980000000000018,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["applyUiStateToStore"],"fullName":"applyUiStateToStore preserves local latency progress while waiting for runtime progress","status":"passed","title":"preserves local latency progress while waiting for runtime progress","duration":1.4233000000000402,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["applyUiStateToStore"],"fullName":"applyUiStateToStore preserves latency progress for running runtime actions without progress","status":"passed","title":"preserves latency progress for running runtime actions without progress","duration":1.264099999999985,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["applyUiStateToStore"],"fullName":"applyUiStateToStore maps a running reload action to the restart control","status":"passed","title":"maps a running reload action to the restart control","duration":1.0399999999999636,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["applyUiStateToStore"],"fullName":"applyUiStateToStore does not combine a stale extended version with tiny capabilities","status":"passed","title":"does not combine a stale extended version with tiny capabilities","duration":1.5684999999999718,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["applyUiStateToStore"],"fullName":"applyUiStateToStore keeps current sing-box variant while a different sing-box install action is running","status":"passed","title":"keeps current sing-box variant while a different sing-box install action is running","duration":2.448199999999929,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["applyUiStateToStore"],"fullName":"applyUiStateToStore marks the running sing-box install action without pretending it is installed","status":"passed","title":"marks the running sing-box install action without pretending it is installed","duration":1.7234999999999445,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886269,"endTime":1789128886288.7234,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/services/tests/uiState.service.test.ts"},{"assertionResults":[{"ancestorTitles":["callBaseMethod"],"fullName":"callBaseMethod fails on non-zero exit code even when stdout is present by default","status":"passed","title":"fails on non-zero exit code even when stdout is present by default","duration":3.9793999999999983,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["callBaseMethod"],"fullName":"callBaseMethod can return stdout for diagnostic commands with non-zero exit code","status":"passed","title":"can return stdout for diagnostic commands with non-zero exit code","duration":0.8295999999999992,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["callBaseMethod"],"fullName":"callBaseMethod passes a custom timeout to long-running commands","status":"passed","title":"passes a custom timeout to long-running commands","duration":0.7840999999999951,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887271,"endTime":1789128887276.7842,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/methods/shell/tests/callBaseMethod.test.ts"},{"assertionResults":[{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction does not fail Tachyon self-update when status polling disappears after package replacement","status":"passed","title":"does not fail Tachyon self-update when status polling disappears after package replacement","duration":12.051500000000033,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction returns the backend component action start error message","status":"passed","title":"returns the backend component action start error message","duration":1.276200000000017,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction keeps following a component job after the former browser-side wait timeout while the backend reports it running","status":"passed","title":"keeps following a component job after the former browser-side wait timeout while the backend reports it running","duration":16.44279999999992,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction keeps waiting when status polling briefly fails but UI state still reports the job running","status":"passed","title":"keeps waiting when status polling briefly fails but UI state still reports the job running","duration":1.6369999999999436,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction keeps waiting through a transient RPC reply loss until the action state settles","status":"passed","title":"keeps waiting through a transient RPC reply loss until the action state settles","duration":0.8713999999999942,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction completes a Tachyon self-update when the backend is stuck reporting the job running (worker pid recycled, RPC eventually fails)","status":"passed","title":"completes a Tachyon self-update when the backend is stuck reporting the job running (worker pid recycled, RPC eventually fails)","duration":1.1224999999999454,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction treats a stale job state as success for a Tachyon self-update when the installed version matches","status":"passed","title":"treats a stale job state as success for a Tachyon self-update when the installed version matches","duration":1.3473000000000184,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction keeps reporting the stale error when the installed version did not change","status":"passed","title":"keeps reporting the stale error when the installed version did not change","duration":0.8452000000000908,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction completes a same-version Tachyon reinstall as success when the target version is unknown and the job is stale","status":"passed","title":"completes a same-version Tachyon reinstall as success when the target version is unknown and the job is stale","duration":1.6228999999999587,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction completes a same-version Tachyon install as success when target version matches baseline and job is stale","status":"passed","title":"completes a same-version Tachyon install as success when target version matches baseline and job is stale","duration":1.1340000000000146,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction closes the modal with success when a self-update never confirms and the hard timeout is reached","status":"passed","title":"closes the modal with success when a self-update never confirms and the hard timeout is reached","duration":0.8957000000000335,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction fails a self-update on the hard timeout when the target version is known but never reached","status":"passed","title":"fails a self-update on the hard timeout when the target version is known but never reached","duration":4.506899999999973,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.componentAction"],"fullName":"TachyonShellMethods.componentAction does not prematurely confirm same-release Tachyon update while the background job is still running","status":"passed","title":"does not prematurely confirm same-release Tachyon update while the background job is still running","duration":1.3052999999999884,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886259,"endTime":1789128886304.3054,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/methods/shell/tests/componentAction.test.ts"},{"assertionResults":[{"ancestorTitles":["TachyonShellMethods DNS Benchmark Actions"],"fullName":"TachyonShellMethods DNS Benchmark Actions starts DNS benchmark asynchronously","status":"passed","title":"starts DNS benchmark asynchronously","duration":4.982100000000003,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods DNS Benchmark Actions"],"fullName":"TachyonShellMethods DNS Benchmark Actions handles start DNS benchmark failure","status":"passed","title":"handles start DNS benchmark failure","duration":0.6479999999999961,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods DNS Benchmark Actions"],"fullName":"TachyonShellMethods DNS Benchmark Actions retrieves DNS benchmark status and results","status":"passed","title":"retrieves DNS benchmark status and results","duration":2.0637999999999863,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods DNS Benchmark Actions"],"fullName":"TachyonShellMethods DNS Benchmark Actions stops running DNS benchmark","status":"passed","title":"stops running DNS benchmark","duration":0.5819999999999936,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods DNS Benchmark Actions"],"fullName":"TachyonShellMethods DNS Benchmark Actions applies DNS benchmark recommendation","status":"passed","title":"applies DNS benchmark recommendation","duration":0.9979999999999905,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886902,"endTime":1789128886911.998,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/methods/shell/tests/dnsBenchmarkAction.test.ts"},{"assertionResults":[{"ancestorTitles":["TachyonShellMethods Fuzzer Actions"],"fullName":"TachyonShellMethods Fuzzer Actions starts fuzzer with specified engine and target","status":"passed","title":"starts fuzzer with specified engine and target","duration":4.32140000000004,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods Fuzzer Actions"],"fullName":"TachyonShellMethods Fuzzer Actions starts fuzzer with combinatorial mode","status":"passed","title":"starts fuzzer with combinatorial mode","duration":0.772899999999936,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods Fuzzer Actions"],"fullName":"TachyonShellMethods Fuzzer Actions gets fuzzer status and results","status":"passed","title":"gets fuzzer status and results","duration":1.7916999999999916,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods Fuzzer Actions"],"fullName":"TachyonShellMethods Fuzzer Actions applies winning strategy","status":"passed","title":"applies winning strategy","duration":0.7264000000000124,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods Fuzzer Actions"],"fullName":"TachyonShellMethods Fuzzer Actions synthesizes AI strategies","status":"passed","title":"synthesizes AI strategies","duration":0.7142000000000053,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods Fuzzer Actions"],"fullName":"TachyonShellMethods Fuzzer Actions gets fuzzer patterns configuration","status":"passed","title":"gets fuzzer patterns configuration","duration":0.5475000000000136,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods Fuzzer Actions"],"fullName":"TachyonShellMethods Fuzzer Actions saves fuzzer patterns configuration","status":"passed","title":"saves fuzzer patterns configuration","duration":0.5855000000000246,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods Fuzzer Actions"],"fullName":"TachyonShellMethods Fuzzer Actions resets fuzzer patterns configuration","status":"passed","title":"resets fuzzer patterns configuration","duration":0.39430000000004384,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods Fuzzer Actions"],"fullName":"TachyonShellMethods Fuzzer Actions stops running fuzzer","status":"passed","title":"stops running fuzzer","duration":1.0966999999999416,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886259,"endTime":1789128886270.0967,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/methods/shell/tests/fuzzerAction.test.ts"},{"assertionResults":[{"ancestorTitles":["TachyonShellMethods.latencyAction"],"fullName":"TachyonShellMethods.latencyAction keeps waiting through a transient RPC reply loss","status":"passed","title":"keeps waiting through a transient RPC reply loss","duration":9.036699999999996,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.latencyAction"],"fullName":"TachyonShellMethods.latencyAction passes an optional timeout to latency jobs","status":"passed","title":"passes an optional timeout to latency jobs","duration":1.3626000000000147,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886515,"endTime":1789128886525.3625,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/methods/shell/tests/latencyAction.test.ts"},{"assertionResults":[{"ancestorTitles":["TachyonShellMethods.serviceAction"],"fullName":"TachyonShellMethods.serviceAction keeps failed finished service state available to low-level waiters","status":"passed","title":"keeps failed finished service state available to low-level waiters","duration":9.903199999999998,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.serviceAction"],"fullName":"TachyonShellMethods.serviceAction returns the backend service action start error message","status":"passed","title":"returns the backend service action start error message","duration":1.2295999999999765,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886781,"endTime":1789128886792.2295,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/methods/shell/tests/serviceAction.test.ts"},{"assertionResults":[{"ancestorTitles":["TachyonShellMethods.subscriptionUpdate"],"fullName":"TachyonShellMethods.subscriptionUpdate starts a targeted background subscription update and waits for its state","status":"passed","title":"starts a targeted background subscription update and waits for its state","duration":9.04320000000007,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.subscriptionUpdate"],"fullName":"TachyonShellMethods.subscriptionUpdate returns the backend subscription start error message","status":"passed","title":"returns the backend subscription start error message","duration":1.3260999999999967,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.subscriptionUpdate"],"fullName":"TachyonShellMethods.subscriptionUpdate returns failed finished job state from the low-level waiter for UI restoration","status":"passed","title":"returns failed finished job state from the low-level waiter for UI restoration","duration":2.207899999999995,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.subscriptionUpdate"],"fullName":"TachyonShellMethods.subscriptionUpdate keeps following a subscription job after the former browser-side wait timeout while the backend reports it running","status":"passed","title":"keeps following a subscription job after the former browser-side wait timeout while the backend reports it running","duration":11.856800000000021,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["TachyonShellMethods.subscriptionUpdate"],"fullName":"TachyonShellMethods.subscriptionUpdate keeps waiting through a transient RPC reply loss","status":"passed","title":"keeps waiting through a transient RPC reply loss","duration":0.9316000000000031,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886257,"endTime":1789128886282.9316,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/methods/shell/tests/subscriptionUpdate.test.ts"},{"assertionResults":[{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections shows the full selector group by default","status":"passed","title":"shows the full selector group by default","duration":6.99129999999991,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections hydrates URLTest details from the section cache and Clash API","status":"passed","title":"hydrates URLTest details from the section cache and Clash API","duration":2.5386000000000877,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections marks URLTest group as manually selected when a hidden child is active in the selector","status":"passed","title":"marks URLTest group as manually selected when a hidden child is active in the selector","duration":1.1065000000000964,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections keeps an empty configured URLTest visible when sing-box skipped the group","status":"passed","title":"keeps an empty configured URLTest visible when sing-box skipped the group","duration":1.1145999999999958,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections hydrates Priority dashboard details from config, cache and Clash API","status":"passed","title":"hydrates Priority dashboard details from config, cache and Clash API","duration":2.6112999999999147,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections keeps an empty Priority group visible when sing-box skipped the selector","status":"passed","title":"keeps an empty Priority group visible when sing-box skipped the selector","duration":0.7921000000000049,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections keeps legacy URLTest sections compatible before migration","status":"passed","title":"keeps legacy URLTest sections compatible before migration","duration":1.6516000000000304,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections supports multiple configured URLTest groups","status":"passed","title":"supports multiple configured URLTest groups","duration":0.9850000000000136,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections keeps non-built-in URLTest groups in selector order when latency sorting is disabled","status":"passed","title":"keeps non-built-in URLTest groups in selector order when latency sorting is disabled","duration":1.3464999999999918,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections sorts outbounds by latency only when enabled and does not prioritize URLTest groups except Fastest","status":"passed","title":"sorts outbounds by latency only when enabled and does not prioritize URLTest groups except Fastest","duration":0.8858000000000175,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections sorts an unpinned configured URLTest group by latency","status":"passed","title":"sorts an unpinned configured URLTest group by latency","duration":0.6208999999998923,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections does not expose flag-emoji detected countries on dashboard outbounds","status":"passed","title":"does not expose flag-emoji detected countries on dashboard outbounds","duration":0.48509999999998854,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections exposes country.is detected countries on dashboard outbounds","status":"passed","title":"exposes country.is detected countries on dashboard outbounds","duration":0.4311000000000149,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections ignores legacy link refs without a resolved proxy link","status":"passed","title":"ignores legacy link refs without a resolved proxy link","duration":0.9844000000000506,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections uses cached subscription links without a click-time backend lookup","status":"passed","title":"uses cached subscription links without a click-time backend lookup","duration":0.5444999999999709,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections does not expose countries when URLTest filtering is set to all servers","status":"passed","title":"does not expose countries when URLTest filtering is set to all servers","duration":1.408900000000017,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections uses allocated tags for section names that collide with system tags","status":"passed","title":"uses allocated tags for section names that collide with system tags","duration":0.5032999999999674,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections shows legacy VPN interface sections as a Connection selector group","status":"passed","title":"shows legacy VPN interface sections as a Connection selector group","duration":0.6750000000000682,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections hydrates migrated interface children into the Connection selector group","status":"passed","title":"hydrates migrated interface children into the Connection selector group","duration":0.5729000000000042,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections exposes ByeDPI sections on the dashboard as service cards","status":"passed","title":"exposes ByeDPI sections on the dashboard as service cards","duration":0.7234999999999445,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections exposes single-endpoint protocol sections (Mieru, Sudoku, AnyTLS, Snell, MASQUE, OpenVPN) on the dashboard","status":"passed","title":"exposes single-endpoint protocol sections (Mieru, Sudoku, AnyTLS, Snell, MASQUE, OpenVPN) on the dashboard","duration":1.0061999999999216,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections fetches Clash API proxies directly in the browser to avoid rpcd output limits","status":"passed","title":"fetches Clash API proxies directly in the browser to avoid rpcd output limits","duration":1.5497000000000298,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections uses rpcd fallback when direct Clash API access times out","status":"passed","title":"uses rpcd fallback when direct Clash API access times out","duration":4.786399999999958,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDashboardSections"],"fullName":"getDashboardSections uses rpcd fallback when direct Clash API access is unsafe","status":"passed","title":"uses rpcd fallback when direct Clash API access is unsafe","duration":0.6327999999999747,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886236,"endTime":1789128886271.7864,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/methods/custom/tests/getDashboardSections.test.ts"},{"assertionResults":[{"ancestorTitles":["dashboard initController"],"fullName":"dashboard initController should export initController function","status":"passed","title":"should export initController function","duration":1063.3658,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886017,"endTime":1789128887080.3657,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/dashboard/tests/initController.test.ts"},{"assertionResults":[{"ancestorTitles":["diagnostic run persistence"],"fullName":"diagnostic run persistence stores and restores a running diagnostic snapshot","status":"passed","title":"stores and restores a running diagnostic snapshot","duration":4.264700000000005,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic run persistence"],"fullName":"diagnostic run persistence removes expired snapshots","status":"passed","title":"removes expired snapshots","duration":3.050799999999981,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic run persistence"],"fullName":"diagnostic run persistence removes invalid snapshots","status":"passed","title":"removes invalid snapshots","duration":0.28589999999999804,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic run persistence"],"fullName":"diagnostic run persistence clears persisted snapshots","status":"passed","title":"clears persisted snapshots","duration":0.3609000000000151,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic run persistence"],"fullName":"diagnostic run persistence removes snapshots with unsupported check shape","status":"passed","title":"removes snapshots with unsupported check shape","duration":0.3348000000000013,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic run persistence"],"fullName":"diagnostic run persistence removes snapshots with invalid numeric fields","status":"passed","title":"removes snapshots with invalid numeric fields","duration":0.4941000000000031,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886566,"endTime":1789128886574.4941,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/diagnosticRunPersistence.test.ts"},{"assertionResults":[{"ancestorTitles":["diagnostic store provider checks"],"fullName":"diagnostic store provider checks adds Zapret2 as a separate provider check between Zapret and ByeDPI","status":"passed","title":"adds Zapret2 as a separate provider check between Zapret and ByeDPI","duration":3.274499999999989,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic store provider checks"],"fullName":"diagnostic store provider checks keeps Zapret2 hidden when the provider is not available","status":"passed","title":"keeps Zapret2 hidden when the provider is not available","duration":1.2226,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic store provider checks"],"fullName":"diagnostic store provider checks keeps Inbounds hidden until enabled inbounds are confirmed","status":"passed","title":"keeps Inbounds hidden until enabled inbounds are confirmed","duration":0.32670000000001664,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic store provider checks"],"fullName":"diagnostic store provider checks shows Inbounds when enabled inbounds are confirmed","status":"passed","title":"shows Inbounds when enabled inbounds are confirmed","duration":0.37579999999999814,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887160,"endTime":1789128887165.3757,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/diagnosticStoreZapret2.test.ts"},{"assertionResults":[{"ancestorTitles":["renderLeakCheckModal"],"fullName":"renderLeakCheckModal renders and displays the IP & DNS Leak Detection modal","status":"passed","title":"renders and displays the IP & DNS Leak Detection modal","duration":6.504000000000019,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderLeakCheckModal"],"fullName":"renderLeakCheckModal calls TachyonShellMethods.leakCheck on start","status":"passed","title":"calls TachyonShellMethods.leakCheck on start","duration":1.1170000000000755,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderLeakCheckModal"],"fullName":"renderLeakCheckModal handles leak detection when IP is leaked","status":"passed","title":"handles leak detection when IP is leaked","duration":0.8581000000000358,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderLeakCheckModal"],"fullName":"renderLeakCheckModal handles offline proxy gracefully","status":"passed","title":"handles offline proxy gracefully","duration":1.2726999999999862,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887089,"endTime":1789128887098.2727,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/leakCheckModal.test.ts"},{"assertionResults":[{"ancestorTitles":["diagnostic masking"],"fullName":"diagnostic masking masks sensitive sing-box keys without mutating the original config","status":"passed","title":"masks sensitive sing-box keys without mutating the original config","duration":3.602000000000004,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic masking"],"fullName":"diagnostic masking formats masked sing-box config from a raw JSON string","status":"passed","title":"formats masked sing-box config from a raw JSON string","duration":0.5865000000000009,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic masking"],"fullName":"diagnostic masking masks sensitive global check UCI values while keeping visible structure stable","status":"passed","title":"masks sensitive global check UCI values while keeping visible structure stable","duration":2.087100000000021,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887033,"endTime":1789128887039.0872,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/maskDiagnostics.test.ts"},{"assertionResults":[{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions treats service transition status as a UI transition","status":"passed","title":"treats service transition status as a UI transition","duration":2.852499999999992,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions maps reload to the restart/reload control state","status":"passed","title":"maps reload to the restart/reload control state","duration":1.078300000000013,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions detects only local button loading as local mutation","status":"passed","title":"detects only local button loading as local mutation","duration":0.29879999999999995,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions does not let backend transition status block polling forever","status":"passed","title":"does not let backend transition status block polling forever","duration":0.2400000000000091,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions does not reset diagnostics checks while a run is active","status":"passed","title":"does not reset diagnostics checks while a run is active","duration":0.4977999999999838,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions still lets local button actions suppress non-forced polling","status":"passed","title":"still lets local button actions suppress non-forced polling","duration":0.25970000000000937,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions shows restart while the service is running even when autostart is disabled","status":"passed","title":"shows restart while the service is running even when autostart is disabled","duration":0.37579999999999814,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions does not show restart from transient running state while start or stop is active","status":"passed","title":"does not show restart from transient running state while start or stop is active","duration":0.26019999999999754,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions allows diagnostics while the service is running even when autostart is disabled","status":"passed","title":"allows diagnostics while the service is running even when autostart is disabled","duration":0.8487999999999829,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions detects running component actions","status":"passed","title":"detects running component actions","duration":0.3918999999999926,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions blocks mutating available actions while component actions are running","status":"passed","title":"blocks mutating available actions while component actions are running","duration":0.34199999999998454,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions keeps logs available during service-only mutations","status":"passed","title":"keeps logs available during service-only mutations","duration":0.179300000000012,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions keeps the lower service action visible while restart is running","status":"passed","title":"keeps the lower service action visible while restart is running","duration":0.20640000000000214,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["diagnostic service transitions"],"fullName":"diagnostic service transitions keeps the normal start and stop visibility outside restart","status":"passed","title":"keeps the normal start and stop visibility outside restart","duration":0.1741000000000099,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886727,"endTime":1789128886735.342,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/serviceTransition.test.ts"},{"assertionResults":[{"ancestorTitles":["renderStrategyFuzzerModal"],"fullName":"renderStrategyFuzzerModal renders and displays the Strategy Fuzzer modal","status":"passed","title":"renders and displays the Strategy Fuzzer modal","duration":7.311899999999923,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderStrategyFuzzerModal"],"fullName":"renderStrategyFuzzerModal handles fuzzer status with successful probe results and best badge","status":"passed","title":"handles fuzzer status with successful probe results and best badge","duration":21.536699999999882,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887090,"endTime":1789128887118.5366,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/diagnostic/tests/strategyFuzzerModal.test.ts"},{"assertionResults":[{"ancestorTitles":["monitoring initController"],"fullName":"monitoring initController should export initController function","status":"passed","title":"should export initController function","duration":1040.1535,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["monitoring initController"],"fullName":"monitoring initController should resolve route display names correctly for built-in and section tags","status":"passed","title":"should resolve route display names correctly for built-in and section tags","duration":2.241600000000062,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886039,"endTime":1789128887081.2417,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/monitoring/tests/initController.test.ts"},{"assertionResults":[{"ancestorTitles":["updates check result lifecycle"],"fullName":"updates check result lifecycle preserves a check result that completed while the Components tab was hidden","status":"passed","title":"preserves a check result that completed while the Components tab was hidden","duration":2.7220000000000084,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["updates check result lifecycle"],"fullName":"updates check result lifecycle resets check results on the next ordinary reopen","status":"passed","title":"resets check results on the next ordinary reopen","duration":0.2994000000000199,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["updates check result lifecycle"],"fullName":"updates check result lifecycle does not reset while an action is still loading","status":"passed","title":"does not reset while an action is still loading","duration":0.238900000000001,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["updates check result lifecycle"],"fullName":"updates check result lifecycle keeps cached results on every reopen when automatic checks are enabled","status":"passed","title":"keeps cached results on every reopen when automatic checks are enabled","duration":0.3007000000000062,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["updates check result lifecycle"],"fullName":"updates check result lifecycle requires a fresh state read before rendering cached running component actions","status":"passed","title":"requires a fresh state read before rendering cached running component actions","duration":0.3125,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["updates check result lifecycle"],"fullName":"updates check result lifecycle exposes check results immediately on remount once cache state is resolved","status":"passed","title":"exposes check results immediately on remount once cache state is resolved","duration":0.5098000000000127,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887304,"endTime":1789128887308.5098,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/updates/tests/checkResultLifecycle.test.ts"},{"assertionResults":[{"ancestorTitles":["shouldApplyCompletedComponentActionResult"],"fullName":"shouldApplyCompletedComponentActionResult does not restore completed check results that were already handled before reload","status":"passed","title":"does not restore completed check results that were already handled before reload","duration":2.5160999999999945,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["shouldApplyCompletedComponentActionResult"],"fullName":"shouldApplyCompletedComponentActionResult applies completed check results when this UI still owns the pending notification","status":"passed","title":"applies completed check results when this UI still owns the pending notification","duration":0.28759999999999764,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["shouldApplyCompletedComponentActionResult"],"fullName":"shouldApplyCompletedComponentActionResult always applies completed mutating actions because they reflect real system state","status":"passed","title":"always applies completed mutating actions because they reflect real system state","duration":0.20680000000001542,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887353,"endTime":1789128887356.2876,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/updates/tests/componentActionCompletion.test.ts"},{"assertionResults":[{"ancestorTitles":["same-release build description"],"fullName":"same-release build description shows a truncated transition when both builds are identified","status":"passed","title":"shows a truncated transition when both builds are identified","duration":3.886099999999999,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["same-release build description"],"fullName":"same-release build description shows the single known build when only one side has a sha","status":"passed","title":"shows the single known build when only one side has a sha","duration":0.511400000000009,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["same-release build description"],"fullName":"same-release build description falls back when the release carries no sha at all","status":"passed","title":"falls back when the release carries no sha at all","duration":0.4549000000000092,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887332,"endTime":1789128887337.4548,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/updates/tests/sameReleaseBuild.test.ts"},{"assertionResults":[{"ancestorTitles":["sessionJobs"],"fullName":"sessionJobs saves and loads handled jobs from session storage","status":"passed","title":"saves and loads handled jobs from session storage","duration":5.115800000000007,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["sessionJobs"],"fullName":"sessionJobs loads legacy tachyon_post_update_job if present","status":"passed","title":"loads legacy tachyon_post_update_job if present","duration":0.9240999999999815,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["sessionJobs"],"fullName":"sessionJobs does not duplicate job IDs in session storage","status":"passed","title":"does not duplicate job IDs in session storage","duration":1.1336000000000013,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["sessionJobs"],"fullName":"sessionJobs safeReloadPage calls window.location.reload only once","status":"passed","title":"safeReloadPage calls window.location.reload only once","duration":0.7819999999999823,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887010,"endTime":1789128887017.782,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/updates/tests/sessionJobs.test.ts"},{"assertionResults":[{"ancestorTitles":["renderUpdateProgressModal"],"fullName":"renderUpdateProgressModal renders install button and does not auto-close when onInstall is provided","status":"passed","title":"renders install button and does not auto-close when onInstall is provided","duration":1099.0711000000001,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderUpdateProgressModal"],"fullName":"renderUpdateProgressModal keeps completed installation open until user closes or autoCloseMs is explicit","status":"passed","title":"keeps completed installation open until user closes or autoCloseMs is explicit","duration":1.4265000000000327,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderUpdateProgressModal"],"fullName":"renderUpdateProgressModal polls the operation log while the job runs and stops after completion","status":"passed","title":"polls the operation log while the job runs and stops after completion","duration":4.644399999999905,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderUpdateProgressModal"],"fullName":"renderUpdateProgressModal does not poll the log when no job id was provided","status":"passed","title":"does not poll the log when no job id was provided","duration":1.1626999999998588,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886027,"endTime":1789128887133.1626,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/updates/tests/updateProgressModal.test.ts"},{"assertionResults":[{"ancestorTitles":["renderSections"],"fullName":"renderSections renders service section without serviceStatus as a clean service card without latency button","status":"passed","title":"renders service section without serviceStatus as a clean service card without latency button","duration":4.968600000000151,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderSections"],"fullName":"renderSections renders service section with serviceStatus as a service card without latency button","status":"passed","title":"renders service section with serviceStatus as a service card without latency button","duration":1.2349999999999,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderSections"],"fullName":"renderSections renders zapret and byedpi service sections without latency button","status":"passed","title":"renders zapret and byedpi service sections without latency button","duration":0.9308000000000902,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderSections"],"fullName":"renderSections renders latency test button for proxy outbound sections with outbounds","status":"passed","title":"renders latency test button for proxy outbound sections with outbounds","duration":1.944800000000214,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderSections"],"fullName":"renderSections does not render latency test button for empty proxy section","status":"passed","title":"does not render latency test button for empty proxy section","duration":0.7111999999999625,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["renderSections"],"fullName":"renderSections renders latency test button and connection node item for Mieru section","status":"passed","title":"renders latency test button and connection node item for Mieru section","duration":0.9035000000001219,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887124,"endTime":1789128887134.9036,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/dashboard/partials/tests/renderSections.test.ts"},{"assertionResults":[{"ancestorTitles":["getDnsCheckPresentation"],"fullName":"getDnsCheckPresentation keeps manual DHCP mode as a warning instead of a DNS failure","status":"passed","title":"keeps manual DHCP mode as a warning instead of a DNS failure","duration":4.021899999999988,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["getDnsCheckPresentation"],"fullName":"getDnsCheckPresentation keeps a mismatched managed DHCP config as an error item","status":"passed","title":"keeps a mismatched managed DHCP config as an error item","duration":0.5407000000000153,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128887226,"endTime":1789128887230.5408,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/getDnsCheckPresentation.test.ts"},{"assertionResults":[{"ancestorTitles":["provider diagnostics checks"],"fullName":"provider diagnostics checks shows Zapret provider path and does not fail on hidden route status","status":"passed","title":"shows Zapret provider path and does not fail on hidden route status","duration":6.439099999999996,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["provider diagnostics checks"],"fullName":"provider diagnostics checks keeps Zapret outbound failures visible and red","status":"passed","title":"keeps Zapret outbound failures visible and red","duration":0.9512999999999465,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["provider diagnostics checks"],"fullName":"provider diagnostics checks shows Zapret2 route rules check and keeps provider path visible","status":"passed","title":"shows Zapret2 route rules check and keeps provider path visible","duration":1.1609000000000265,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["provider diagnostics checks"],"fullName":"provider diagnostics checks shows Zapret2 route rules failure when routes_configured is false","status":"passed","title":"shows Zapret2 route rules failure when routes_configured is false","duration":0.8599000000000387,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["provider diagnostics checks"],"fullName":"provider diagnostics checks removes ByeDPI route checks from the visible and aggregate status","status":"passed","title":"removes ByeDPI route checks from the visible and aggregate status","duration":0.919399999999996,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886714,"endTime":1789128886723.9194,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/runProviderChecks.test.ts"},{"assertionResults":[{"ancestorTitles":["runSectionsCheck"],"fullName":"runSectionsCheck keeps VPN interface probe failures as warnings when the runtime outbound exists","status":"passed","title":"keeps VPN interface probe failures as warnings when the runtime outbound exists","duration":6.122100000000017,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["runSectionsCheck"],"fullName":"runSectionsCheck checks only the selected concrete outbound for selectable proxy sections","status":"passed","title":"checks only the selected concrete outbound for selectable proxy sections","duration":1.2521000000000129,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]},{"ancestorTitles":["runSectionsCheck"],"fullName":"runSectionsCheck checks the selected URLTest outbound directly","status":"passed","title":"checks the selected URLTest outbound directly","duration":0.7852000000000032,"failureMessages":[],"meta":{},"tags":[],"benchmarks":[]}],"startTime":1789128886923,"endTime":1789128886930.7852,"status":"passed","message":"","name":"G:/tachyon/fe-app-tachyon/src/tachyon/tabs/diagnostic/checks/tests/runSectionsCheck.test.ts"}]} |