using System; using System.IO; using System.Net; using Paca.Mobile.Core; using Paca.Tests.Infrastructure; using Xunit; namespace Paca.Tests.Core; /// /// Gate 183 ~ 186: 스마트 WAN 연결성 진단 및 CGNAT 자동 판정 엔진 기계적 검증 /// public class WanReachabilityProberGateTests { [Theory] [InlineData("192.168.0.15", true)] [InlineData("10.0.1.20", true)] [InlineData("172.20.5.1", true)] [InlineData("127.0.0.1", true)] [InlineData("8.8.8.8", false)] [InlineData("1.1.1.1", false)] public void Gate183_WanReachabilityProber_Detects_PrivateIp(string ipString, bool expectedPrivate) { var ip = IPAddress.Parse(ipString); var isPrivate = WanReachabilityProber.IsPrivateOrLoopback(ip); Assert.Equal(expectedPrivate, isPrivate); } [Theory] [InlineData("100.64.0.1", true)] [InlineData("100.127.255.254", true)] [InlineData("100.128.0.1", false)] [InlineData("192.168.1.1", false)] public void Gate184_WanReachabilityProber_Detects_Cgnat(string ipString, bool expectedCgnat) { var ip = IPAddress.Parse(ipString); var isCgnat = WanReachabilityProber.IsCgnatAddress(ip); Assert.Equal(expectedCgnat, isCgnat); } [Fact] public void Gate185_WanReachabilityProber_Generates_Actionable_Advice() { // CGNAT 환경이고 UPnP 미지원인 환경 시뮬레이션 var report = WanReachabilityProber.Diagnose( localIp: IPAddress.Parse("100.64.5.10"), upnpSuccess: false, tunnelActive: true ); Assert.Equal(ReachabilityLevel.RelayTunnelRequired, report.Level); Assert.Contains("CGNAT", report.AdviceMessage); Assert.Contains("ConnectCode", report.AdviceMessage); } [Fact] public void Gate186_PairingWindow_WanBadge_Integration() { var pairingWindowPath = Path.Combine(SourceTree.Root, "src", "Paca.App", "Browser", "PairingWindow.cs"); Assert.True(File.Exists(pairingWindowPath), "PairingWindow.cs must exist"); var code = File.ReadAllText(pairingWindowPath); // 3G/4G/5G WAN 배지 및 ConnectCode UI 확인 Assert.Contains("3G / 4G / 5G", code); Assert.Contains("ConnectCode", code); } }