Files
gopeed/pkg/download/engine/wpt_fetch_test.go

121 lines
3.7 KiB
Go

package engine_test
import (
"embed"
"fmt"
"net/http"
"net/http/httptest"
"path"
"testing"
"github.com/GopeedLab/gopeed/pkg/download/engine"
)
//go:embed testdata/wpt_harness.js
var wptHarness string
//go:embed testdata/wpt/fetch/api/resources/utils.js
var wptFetchUtils string
//go:embed testdata/wpt/fetch/api/request/request-error.js
var wptRequestError string
//go:embed testdata/wpt/fetch/api/cors/resources/not-cors-safelisted.json
var wptNoCORSSafelistedHeaders []byte
//go:embed testdata/wpt/fetch/api/headers/*.any.js
var wptHeaders embed.FS
//go:embed testdata/wpt/fetch/api/request/*.any.js testdata/wpt/fetch/api/response/*.any.js
var wptRequestResponse embed.FS
func TestWPTHeaders(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, _ *http.Request) {
response.Header().Set("Content-Type", "application/json")
_, _ = response.Write(wptNoCORSSafelistedHeaders)
}))
t.Cleanup(server.Close)
tests := []string{
"header-setcookie.any.js",
"headers-basic.any.js",
"headers-casing.any.js",
"headers-combine.any.js",
"headers-errors.any.js",
"headers-forbidden-override.any.js",
"headers-normalize.any.js",
"headers-no-cors.any.js",
"headers-record.any.js",
"headers-structure.any.js",
}
for _, name := range tests {
t.Run(name, func(t *testing.T) {
setup := ""
if name == "headers-no-cors.any.js" {
setup = fmt.Sprintf("globalThis.location = new URL(%q);", server.URL+"/fetch/api/headers/test.any.js")
}
runWPTFile(t, wptHeaders, path.Join("testdata/wpt/fetch/api/headers", name), setup)
})
}
}
func TestWPTRequestResponse(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, _ *http.Request) {
response.Header().Set("Content-Type", "application/json")
_, _ = response.Write([]byte("{}"))
}))
t.Cleanup(server.Close)
setup := fmt.Sprintf("globalThis.location = new URL(%q);", server.URL+"/fetch/api/response/test.any.js")
tests := []string{
"request/forbidden-method.any.js",
"request/request-constructor-init-body-override.any.js",
"request/request-consume.any.js",
"request/request-consume-empty.any.js",
"request/request-disturbed.any.js",
"request/request-error.any.js",
"request/request-headers.any.js",
"request/request-init-002.any.js",
"request/request-init-contenttype.any.js",
"request/request-init-priority.any.js",
"request/request-init-stream.any.js",
"request/request-keepalive.any.js",
"request/request-clone-readable-stream-body.any.js",
"request/request-structure.any.js",
"response/response-consume-empty.any.js",
"response/response-consume-stream.any.js",
"response/response-init-001.any.js",
"response/response-init-002.any.js",
"response/response-init-contenttype.any.js",
"response/response-from-stream.any.js",
"response/response-headers-guard.any.js",
"response/response-error.any.js",
"response/response-stream-bad-chunk.any.js",
"response/response-static-error.any.js",
"response/response-static-json.any.js",
"response/response-static-redirect.any.js",
}
for _, name := range tests {
t.Run(name, func(t *testing.T) {
runWPTFile(t, wptRequestResponse, path.Join("testdata/wpt/fetch/api", name), setup)
})
}
}
func runWPTFile(t *testing.T, files embed.FS, name, setup string) {
t.Helper()
source, err := files.ReadFile(name)
if err != nil {
t.Fatal(err)
}
runtime := engine.NewEngine(nil)
t.Cleanup(runtime.Close)
value, err := runtime.RunString(setup + "\n" + wptHarness + "\n" + wptFetchUtils + "\n" + wptRequestError + "\n" + string(source) + "\n__wptFinish();")
if err != nil {
t.Fatal(err)
}
if value == nil {
t.Fatal("WPT harness returned no result")
}
}