99 lines
3.6 KiB
C#
99 lines
3.6 KiB
C#
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);
|
|
}
|
|
}
|