using System.Linq; using Paca.Browser.Downloads; using Xunit; namespace Paca.Tests.Browser; public class ChromeDownloadShelfSecurityTests { [Fact] public void AutoOpenFilePolicy_Strictly_Blocks_Dangerous_Executable_Extensions() { var policy = new ChromeAutoOpenFilePolicy(); // Must reject common executable and script types string[] dangerous = { ".exe", ".bat", ".cmd", ".ps1", ".vbs", ".js", ".msi", ".scr", ".jar", ".pif", ".cpl", ".hta" }; foreach (var ext in dangerous) { bool setSuccess = policy.SetAutoOpen(ext, true); Assert.False(setSuccess); Assert.False(policy.IsAutoOpenEnabled(ext)); Assert.False(policy.CanAutoOpen($"payload{ext}")); Assert.False(policy.CanAutoOpen($"PAYLOAD{ext.ToUpperInvariant()}")); } } [Fact] public void AutoOpenFilePolicy_Allows_Safe_Extensions_And_Toggles_State() { var policy = new ChromeAutoOpenFilePolicy(); Assert.False(policy.CanAutoOpen("document.pdf")); bool setPdf = policy.SetAutoOpen(".pdf", true); Assert.True(setPdf); Assert.True(policy.IsAutoOpenEnabled(".pdf")); Assert.True(policy.CanAutoOpen("document.pdf")); Assert.True(policy.CanAutoOpen("REPORT.PDF")); // Disable policy.SetAutoOpen("pdf", false); Assert.False(policy.IsAutoOpenEnabled(".pdf")); Assert.False(policy.CanAutoOpen("document.pdf")); } [Fact] public void DownloadShelfCoordinator_Tracks_Items_And_Enforces_Capacity() { var coordinator = new ChromeDownloadShelfCoordinator(maxItems: 3); Assert.Empty(coordinator.Items); Assert.False(coordinator.IsVisible); var it1 = coordinator.AddOrUpdate("1", "video1.mp4", 1000); var it2 = coordinator.AddOrUpdate("2", "video2.mp4", 2000); var it3 = coordinator.AddOrUpdate("3", "video3.mp4", 3000); Assert.Equal(3, coordinator.Items.Count); Assert.True(coordinator.IsVisible); // Adding 4th item evicts oldest (it1) var it4 = coordinator.AddOrUpdate("4", "video4.mp4", 4000); Assert.Equal(3, coordinator.Items.Count); Assert.DoesNotContain(coordinator.Items, x => x.Id == "1"); Assert.Contains(coordinator.Items, x => x.Id == "4"); // Update progress coordinator.UpdateProgress("4", bytesReceived: 2000, speedBytesPerSec: 500000, isComplete: false); var item4 = coordinator.Items.First(x => x.Id == "4"); Assert.Equal(2000, item4.BytesReceived); Assert.Equal(50, item4.Percent); Assert.False(item4.IsComplete); // Mark complete coordinator.UpdateProgress("4", bytesReceived: 4000, speedBytesPerSec: 0, isComplete: true, filePath: @"C:\downloads\video4.mp4"); item4 = coordinator.Items.First(x => x.Id == "4"); Assert.Equal(100, item4.Percent); Assert.True(item4.IsComplete); Assert.Equal(@"C:\downloads\video4.mp4", item4.FilePath); } [Fact] public void DownloadShelfCoordinator_Dismiss_And_Clear() { var coordinator = new ChromeDownloadShelfCoordinator(); coordinator.AddOrUpdate("1", "doc.pdf", 500); coordinator.AddOrUpdate("2", "music.mp3", 1500); Assert.Equal(2, coordinator.Items.Count); Assert.True(coordinator.IsVisible); coordinator.DismissItem("1"); Assert.Single(coordinator.Items); Assert.Equal("2", coordinator.Items[0].Id); Assert.True(coordinator.IsVisible); coordinator.DismissAll(); Assert.Empty(coordinator.Items); Assert.False(coordinator.IsVisible); } }