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  }