using System; using System.Collections.Generic; using System.IO; using System.Linq; using Paca.Core.Browser; using Xunit; namespace Paca.Tests.Browser; /// /// 웹뷰 비디오 재생, 캐시 저장, 로그인/세션 유지 게이트 (Gate 169 ~ Gate 176) /// public class WebViewMediaAndSessionGateTests { private static readonly string MobileProjectDir = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", "..", "src", "Paca.Mobile")); [Fact] public void Gate169_BrowserMediaPlaybackConfig_Audit() { var config = BrowserMediaPlaybackConfig.Default; // 비디오 자동 및 스크립트 재생 보장 Assert.False(config.RequiresUserGestureForMedia); // HTTPS 사이트 내 HTTP 미디어 스트림 재생 보장 (Mixed Content) Assert.True(config.AllowMixedContent); // 비디오 하드웨어 가속 디코딩 보장 Assert.True(config.EnableHardwareAcceleration); // 최신 Chrome 정규 모바일 User-Agent 스푸핑 Assert.Contains("Chrome", config.CustomUserAgent); Assert.Contains("Mobile Safari", config.CustomUserAgent); Assert.DoesNotContain("wv", config.CustomUserAgent); // 웹뷰 서명 제거 } [Fact] public void Gate170_BrowserSessionAndCookiePersistence_Audit() { var cookiePolicy = new BrowserCookieSessionPolicy(); Assert.True(cookiePolicy.AcceptCookies); // 소셜 로그인(Google, Naver, Kakao)에 필수적인 써드파티 쿠키 허용 Assert.True(cookiePolicy.AcceptThirdPartyCookies); // 쿠키 디스크 플러시 스케줄러 검증 Assert.True(cookiePolicy.RequiresDiskFlushOnNavigation); Assert.True(cookiePolicy.RequiresDiskFlushOnBackground); var tracker = new BrowserSessionTracker(); tracker.UpdateCookie("accounts.google.com", "SID=abcd1234efgh; Secure; HttpOnly"); tracker.UpdateCookie("youtube.com", "LOGIN_INFO=xyz987; Secure"); // 세션 유지 검증 Assert.True(tracker.HasActiveSession("youtube.com")); Assert.True(tracker.HasActiveSession("accounts.google.com")); } [Fact] public void Gate171_BrowserCacheAndStoragePolicy_Audit() { var storagePolicy = BrowserCacheAndStoragePolicy.Default; // 최신 비디오 플레이어(LocalStorage/IndexedDB) 필수 저장소 보장 Assert.True(storagePolicy.DomStorageEnabled); Assert.True(storagePolicy.DatabaseEnabled); // HTTP 캐시 정책 Assert.Equal(BrowserCacheMode.DefaultWithCache, storagePolicy.CacheMode); Assert.True(storagePolicy.CacheSizeBytes >= 100 * 1024 * 1024); // 최소 100MB 이상 캐시 할당 } [Fact] public void Gate172_OAuthPopupAndMultiWindowPolicy_Audit() { var oauthPolicy = new OAuthPopupPolicy(); // 팝업 허용 및 윈도우 생성 정책 Assert.True(oauthPolicy.SupportMultipleWindows); Assert.True(oauthPolicy.JavaScriptCanOpenWindowsAutomatically); // OAuth 로그인 URL인지 감지 Assert.True(oauthPolicy.IsOAuthLoginUrl("https://accounts.google.com/o/oauth2/v2/auth?client_id=123")); Assert.True(oauthPolicy.IsOAuthLoginUrl("https://nid.naver.com/oauth2.0/authorize?client_id=abc")); Assert.True(oauthPolicy.IsOAuthLoginUrl("https://kauth.kakao.com/oauth/authorize?client_id=xyz")); Assert.False(oauthPolicy.IsOAuthLoginUrl("https://m.youtube.com/watch?v=123")); } [Fact] public void Gate173_Html5VideoFullscreenController_Audit() { var fsController = new Html5VideoFullscreenController(); Assert.False(fsController.IsCustomViewShowing); // 비디오 전체화면 요청 fsController.EnterFullscreen("custom_video_view_123"); Assert.True(fsController.IsCustomViewShowing); Assert.Equal("custom_video_view_123", fsController.ActiveCustomViewId); // 비디오 전체화면 해제 (백버튼 또는 축소) fsController.ExitFullscreen(); Assert.False(fsController.IsCustomViewShowing); Assert.Null(fsController.ActiveCustomViewId); } [Fact] public void Gate174_DesktopWebView2ParityConfig_Audit() { // 데스크톱 Paca WebView2 환경 설정 검증 var desktopConfig = DesktopWebView2ParityConfig.Default; Assert.True(desktopConfig.PersistUserDataFolder); Assert.Contains("PacaUserData", desktopConfig.UserDataSubdirectory); Assert.True(desktopConfig.AutoplayPolicyNoUserGestureRequired); Assert.True(desktopConfig.EnableMixedContent); } [Fact] public void Gate175_SiteCompatibilityRegistry_Audit() { var registry = new SiteCompatibilityRegistry(); // YouTube 전용 호환 설정 var yt = registry.GetOptimizationFor("https://m.youtube.com/watch?v=999"); Assert.True(yt.ForceDesktopVideoPlayer || yt.BypassInAppBrowserCheck); // 치지직 / SOOP 전용 호환 설정 var chzzk = registry.GetOptimizationFor("https://chzzk.naver.com/live/12345"); Assert.True(chzzk.EnableLowLatencyStreaming); } [Fact] public void Gate176_ComprehensiveMediaAndSessionJourneyAudit() { // 전체 복합 시나리오: 사용자 브라우징 ➔ 소셜 로그인 ➔ 비디오 스트림 재생 ➔ 캐시 저장 ➔ 세션 영속화 var mediaConfig = BrowserMediaPlaybackConfig.Default; var sessionTracker = new BrowserSessionTracker(); var storagePolicy = BrowserCacheAndStoragePolicy.Default; var fsController = new Html5VideoFullscreenController(); // 1. 구글 로그인 및 세션 쿠키 수신 sessionTracker.UpdateCookie("youtube.com", "LOGIN_INFO=Token12345; Path=/; Domain=.youtube.com; Secure"); Assert.True(sessionTracker.HasActiveSession("youtube.com")); // 2. 비디오 재생 시 Mixed Content 및 User Gesture 우회 확인 Assert.True(mediaConfig.AllowMixedContent); Assert.False(mediaConfig.RequiresUserGestureForMedia); // 3. LocalStorage 및 HTTP 캐시 활성화 상태 확인 Assert.True(storagePolicy.DomStorageEnabled); // 4. 비디오 재생 후 전체화면 제어 fsController.EnterFullscreen("yt_player_container"); Assert.True(fsController.IsCustomViewShowing); fsController.ExitFullscreen(); Assert.False(fsController.IsCustomViewShowing); // 5. 백그라운드 전환 시 쿠키 영속화 플러시 요청 bool flushed = sessionTracker.FlushToDisk(); Assert.True(flushed); } }