github.com/web-platform-tests/wpt.fyi@v0.0.0-20240530210107-70cf978996f1/shared/manifest_test.go (about) 1 // +build small 2 3 // Copyright 2018 The WPT Dashboard Project. All rights reserved. 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 7 package shared 8 9 import ( 10 "encoding/json" 11 "testing" 12 13 "github.com/stretchr/testify/assert" 14 ) 15 16 var testManifest = []byte(`{ 17 "items": { 18 "testharness": { 19 "foo": { 20 "bar": { 21 "test.html": [ 22 "1d3166465cc6f2e8f9f18f53e499ca61e12d59bd", 23 [null, {}] 24 ] 25 26 } 27 }, 28 "foobar": { 29 "mytest.html": [ 30 "2d3166465cc6f2e8f9f18f53e499ca61e12d59bd", 31 [null, {}] 32 ] 33 }, 34 "variants": { 35 "test.any.js": [ 36 "0d3166465cc6f2e8f9f18f53e499ca61e12d59bd", 37 ["variants/test.any.html", {}], 38 ["variants/test.any.worker.html?test", {}] 39 ] 40 } 41 }, 42 "manual": { 43 "foobar": { 44 "test-manual.html": [ 45 "3d3166465cc6f2e8f9f18f53e499ca61e12d59bd", 46 [null, {}] 47 ] 48 } 49 } 50 }, 51 "version": 8, 52 "url_base": "/" 53 }`) 54 55 func TestManifestFilterByPath(t *testing.T) { 56 var m Manifest 57 err := json.Unmarshal(testManifest, &m) 58 assert.Nil(t, err) 59 60 t.Run("empty match", func(t *testing.T) { 61 res, err := m.FilterByPath("/non-existent") 62 assert.Nil(t, err) 63 assert.Equal(t, 0, len(res.Items)) 64 assert.Equal(t, 8, res.Version) 65 }) 66 67 t.Run("match nested", func(t *testing.T) { 68 res, err := m.FilterByPath("/foo/bar") 69 assert.Nil(t, err) 70 assert.Equal(t, `{"foo":{"bar":{"test.html":["1d3166465cc6f2e8f9f18f53e499ca61e12d59bd",[null,{}]]}}}`, string(res.Items["testharness"])) 71 _, ok := res.Items["manual"] 72 assert.False(t, ok) 73 assert.Equal(t, 8, res.Version) 74 }) 75 76 t.Run("match single", func(t *testing.T) { 77 res, err := m.FilterByPath("/foo") 78 assert.Nil(t, err) 79 assert.Equal(t, `{"foo":{"bar":{"test.html":["1d3166465cc6f2e8f9f18f53e499ca61e12d59bd",[null,{}]]}}}`, string(res.Items["testharness"])) 80 _, ok := res.Items["manual"] 81 assert.False(t, ok) 82 assert.Equal(t, 8, res.Version) 83 }) 84 85 t.Run("match multiple", func(t *testing.T) { 86 res, err := m.FilterByPath("/foobar") 87 assert.Nil(t, err) 88 assert.Equal(t, `{"foobar":{"mytest.html":["2d3166465cc6f2e8f9f18f53e499ca61e12d59bd",[null,{}]]}}`, string(res.Items["testharness"])) 89 assert.Equal(t, `{"foobar":{"test-manual.html":["3d3166465cc6f2e8f9f18f53e499ca61e12d59bd",[null,{}]]}}`, string(res.Items["manual"])) 90 assert.Equal(t, 8, res.Version) 91 }) 92 } 93 94 func TestExplodePossibleFilename_AnyJS(t *testing.T) { 95 filename := "/test/file.any.js" 96 exploded := []string{ 97 "/test/file.any.html", 98 "/test/file.any.worker.html", 99 "/test/file.any.serviceworker.html", 100 "/test/file.any.sharedworker.html", 101 } 102 assert.Equal(t, ExplodePossibleFilenames(filename), exploded) 103 } 104 105 func TestExplodePossibleFilename_WindowJS(t *testing.T) { 106 filename := "/test/file.window.js" 107 exploded := []string{ 108 "/test/file.window.html", 109 } 110 assert.Equal(t, ExplodePossibleFilenames(filename), exploded) 111 } 112 113 func TestExplodePossibleFilename_Standard(t *testing.T) { 114 filename := "/test/file.html" 115 assert.Nil(t, ExplodePossibleFilenames(filename)) 116 } 117 118 func TestExplodePossibleRenames_AnyJS(t *testing.T) { 119 before, after := "/test/file.any.js", "/test/file.https.any.js" 120 renames := map[string]string{ 121 before: after, 122 "/test/file.any.html": "/test/file.https.any.html", 123 "/test/file.any.worker.html": "/test/file.https.any.worker.html", 124 "/test/file.any.serviceworker.html": "/test/file.https.any.serviceworker.html", 125 "/test/file.any.sharedworker.html": "/test/file.https.any.sharedworker.html", 126 } 127 assert.Equal(t, ExplodePossibleRenames(before, after), renames) 128 } 129 130 func TestExplodePossibleRenames_WindowJS(t *testing.T) { 131 before, after := "/test/file.window.js", "/test/file.https.window.js" 132 renames := map[string]string{ 133 before: after, 134 "/test/file.window.html": "/test/file.https.window.html", 135 } 136 assert.Equal(t, ExplodePossibleRenames(before, after), renames) 137 } 138 139 func TestExplodePossibleRenames_WorkerJS(t *testing.T) { 140 before, after := "/test/file.worker.js", "/test/file.https.worker.js" 141 renames := map[string]string{ 142 before: after, 143 "/test/file.worker.html": "/test/file.https.worker.html", 144 } 145 assert.Equal(t, ExplodePossibleRenames(before, after), renames) 146 } 147 148 func TestParseTestURL(t *testing.T) { 149 t.Run("normal/file.html", func(t *testing.T) { 150 p, q := ParseTestURL("normal/file.html") 151 assert.Equal(t, "normal/file.html", p) 152 assert.Equal(t, "", q) 153 }) 154 t.Run("test/file.any.html", func(t *testing.T) { 155 p, q := ParseTestURL("test/file.any.html") 156 assert.Equal(t, "test/file.any.js", p) 157 assert.Equal(t, "", q) 158 159 }) 160 t.Run("test/file.any.worker.html?variant", func(t *testing.T) { 161 p, q := ParseTestURL("test/file.any.worker.html?variant") 162 assert.Equal(t, "test/file.any.js", p) 163 assert.Equal(t, "?variant", q) 164 165 }) 166 t.Run("file.worker.html?t=1/2", func(t *testing.T) { 167 p, q := ParseTestURL("file.worker.html?t=1/2") 168 assert.Equal(t, "file.worker.js", p) 169 assert.Equal(t, "?t=1/2", q) 170 171 }) 172 } 173 174 func TestManifestContainsFile(t *testing.T) { 175 var m Manifest 176 err := json.Unmarshal(testManifest, &m) 177 assert.Nil(t, err) 178 assert.Nil(t, m.imap) 179 180 var ok bool 181 ok, err = m.ContainsFile("/") 182 addr := &m.imap 183 assert.True(t, ok) 184 assert.Nil(t, err) 185 ok, err = m.ContainsFile("") 186 assert.True(t, ok) 187 assert.Nil(t, err) 188 ok, err = m.ContainsFile("/foo") 189 assert.True(t, ok) 190 assert.Nil(t, err) 191 ok, err = m.ContainsFile("foo/bar") 192 assert.True(t, ok) 193 assert.Nil(t, err) 194 ok, err = m.ContainsFile("/foo/bar/test.html") 195 assert.True(t, ok) 196 assert.Nil(t, err) 197 ok, err = m.ContainsFile("/foobar/mytest.html") 198 assert.True(t, ok) 199 assert.Nil(t, err) 200 ok, err = m.ContainsFile("foobar/test-manual.html") 201 assert.True(t, ok) 202 assert.Nil(t, err) 203 204 ok, err = m.ContainsFile("/foobar/non-existent.html") 205 assert.False(t, ok) 206 assert.Nil(t, err) 207 ok, err = m.ContainsFile("nonexistent/non-existent.html") 208 assert.False(t, ok) 209 assert.Nil(t, err) 210 211 assert.Equal(t, addr, &m.imap, "Cache should only be initialized once.") 212 } 213 214 func TestManifestContainsTest(t *testing.T) { 215 var m Manifest 216 err := json.Unmarshal(testManifest, &m) 217 assert.Nil(t, err) 218 assert.Nil(t, m.imap) 219 220 var ok bool 221 ok, err = m.ContainsTest("foo/bar/test.html") 222 addr := &m.imap 223 assert.True(t, ok) 224 assert.Nil(t, err) 225 ok, err = m.ContainsTest("variants/test.any.html") 226 assert.True(t, ok) 227 assert.Nil(t, err) 228 ok, err = m.ContainsTest("/variants/test.any.worker.html?test") 229 assert.True(t, ok) 230 assert.Nil(t, err) 231 232 ok, err = m.ContainsTest("/foo") 233 assert.False(t, ok) 234 assert.Nil(t, err, "A directory is not a test.") 235 ok, err = m.ContainsTest("/variants/test.any.js") 236 assert.False(t, ok) 237 assert.Nil(t, err) 238 ok, err = m.ContainsTest("/variants/test.any.worker.html?nonexistent") 239 assert.False(t, ok) 240 assert.Nil(t, err) 241 ok, err = m.ContainsTest("/variants/test.any.serviceworker.html") 242 assert.False(t, ok) 243 assert.Nil(t, err) 244 245 assert.Equal(t, addr, &m.imap, "Cache should only be initialized once.") 246 }