1package webutil
2
3import (
4 "testing"
5 "testing/fstest"
6
7 "github.com/stretchr/testify/assert"
8 "github.com/stretchr/testify/require"
9)
10
11func TestSystemviewTrustAllows(t *testing.T) {
12 trusted := func(raw string) bool { return raw == "dumb://history" }
13 webkit := SystemviewTrust{IsTrustedURL: trusted, OpaqueOriginUsesReferrer: true}
14 cef := SystemviewTrust{IsTrustedURL: trusted}
15
16 tests := []struct {
17 name string
18 origin, referrer string
19 webkit, cef bool
20 }{
21 {name: "trusted origin", origin: "dumb://history", webkit: true, cef: true},
22 {name: "untrusted origin wins over trusted referrer", origin: "https://evil.example", referrer: "dumb://history"},
23 {name: "missing origin uses referrer", referrer: "dumb://history", webkit: true, cef: true},
24 {name: "opaque origin uses referrer only when allowed", origin: "null", referrer: "dumb://history", webkit: true},
25 {name: "nothing is untrusted"},
26 }
27 for _, tt := range tests {
28 t.Run(tt.name, func(t *testing.T) {
29 assert.Equal(t, tt.webkit, webkit.Allows(tt.origin, tt.referrer), "webkit")
30 assert.Equal(t, tt.cef, cef.Allows(tt.origin, tt.referrer), "cef")
31 })
32 }
33 assert.False(t, SystemviewTrust{}.Allows("dumb://history", ""), "nil matcher denies")
34}
35
36func TestDumbURLHost(t *testing.T) {
37 for raw, want := range map[string]string{
38 "dumb://history": "history",
39 "dumb:config": "config",
40 "DUMB://favorites/x?y=1": "favorites",
41 } {
42 host, ok := DumbURLHost(raw)
43 require.True(t, ok, raw)
44 assert.Equal(t, want, host, raw)
45 }
46 _, ok := DumbURLHost("https://history")
47 assert.False(t, ok)
48}
49
50func TestParseSystemviewFaviconRequest(t *testing.T) {
51 domain, size, err := ParseSystemviewFaviconRequest("dumb://history/api/favicon?domain=%20example.com%20&size=32")
52 require.NoError(t, err)
53 assert.Equal(t, "example.com", domain)
54 assert.Equal(t, SystemviewFaviconSize, size)
55
56 _, _, err = ParseSystemviewFaviconRequest("dumb://history/api/favicon")
57 require.ErrorIs(t, err, ErrFaviconMissingDomain)
58
59 _, _, err = ParseSystemviewFaviconRequest("dumb://history/api/favicon?domain=a&size=64")
60 require.ErrorIs(t, err, ErrFaviconUnsupportedSize)
61
62 _, _, err = ParseSystemviewFaviconRequest("://bad")
63 require.ErrorIs(t, err, ErrFaviconInvalidRequestURL)
64}
65
66func TestReadSystemviewAssetCorruptCompressedIsAnError(t *testing.T) {
67 fsys := fstest.MapFS{
68 "systemviews/systemviews.wasm.br": {Data: []byte("not-brotli")},
69 "systemviews/systemviews.wasm": {Data: []byte("\x00asm")},
70 }
71
72 _, err := ReadSystemviewAsset(fsys, "systemviews/systemviews.wasm", "systemviews.wasm")
73
74 require.Error(t, err)
75}
76
77func TestSafeSystemviewsAssetPathRejectsTraversal(t *testing.T) {
78 _, _, ok := SafeSystemviewsAssetPath(SystemviewsAssetDir, "../secret")
79 assert.False(t, ok)
80
81 full, rel, ok := SafeSystemviewsAssetPath(SystemviewsAssetDir, "a/../index.html")
82 require.True(t, ok)
83 assert.Equal(t, "systemviews/index.html", full)
84 assert.Equal(t, "index.html", rel)
85}