Skip to content
This repository has been archived by the owner on Sep 26, 2023. It is now read-only.

Server-side builds (version 0.1.0) #416

Merged
merged 258 commits into from
Sep 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
258 commits
Select commit Hold shift + click to select a range
ad38d4f
Hook up test endpoints
queengooborg Sep 4, 2020
f30041d
Cleanup code
queengooborg Sep 4, 2020
6397cba
Update ESLint's max-len rule to ignore strings and string-like objects
queengooborg Sep 4, 2020
b7c525f
Remove unreachable code
queengooborg Sep 4, 2020
1c4b31c
Separate buildIDL and buildIDLTests
queengooborg Sep 4, 2020
f96bf89
Update tests for build.js
queengooborg Sep 4, 2020
fc24e82
Rename writeText to writeFile and make async
queengooborg Sep 4, 2020
448bc9c
Reorder functions
queengooborg Sep 4, 2020
5fef975
Overhaul tests.js to accommodate to new database format
queengooborg Sep 4, 2020
d86e950
Make sure an endpoint is selected when building
queengooborg Sep 4, 2020
591339b
Prevent duplicate tests in endpoints
queengooborg Sep 4, 2020
f68dd8b
Add DedicatedWorker scope for endpoints
queengooborg Sep 4, 2020
682b3fb
Generate URLs from endpoints
queengooborg Sep 4, 2020
010ddcd
Connect getTests to obtain actual tests
queengooborg Sep 4, 2020
56e4313
Rename finishIndividual to finishAndDisplay
queengooborg Sep 4, 2020
3ded9a9
Generate test pages
queengooborg Sep 4, 2020
5113b83
Add support for scope
queengooborg Sep 4, 2020
c7c1759
Add support for HTTPS-only tests (like service workers)
queengooborg Sep 4, 2020
05afad5
Ignore major categories when generating individual test endpoints
queengooborg Sep 4, 2020
15f1f1e
Fix scope generation for CSS
queengooborg Sep 4, 2020
0904f88
Fix individual tests
queengooborg Sep 4, 2020
1534048
Fix ESLint issues
queengooborg Sep 4, 2020
107ee66
Account for name change of Reffy-Reports to Webref
queengooborg Sep 4, 2020
80a78ad
Add test for buildCSS
queengooborg Sep 4, 2020
a89826b
Fix tests + ESLint issues
queengooborg Sep 4, 2020
f2170fe
Move test code compilation to server-side
queengooborg Sep 4, 2020
22f1639
Fix typo
queengooborg Sep 4, 2020
524d57b
Restore old test() function for historical purposes (remove later)
queengooborg Sep 4, 2020
00ee03e
Remove unused code
queengooborg Sep 4, 2020
1e83249
Don't use unneeded polyfill
queengooborg Sep 4, 2020
45b9b64
Fix ESLint issues
queengooborg Sep 4, 2020
0a1cfc2
Fix test iteration
queengooborg Sep 4, 2020
7638c2c
Re-add constructor testing
queengooborg Sep 4, 2020
e28822c
Restore old code bits
queengooborg Sep 4, 2020
9e49954
Fix tests
queengooborg Sep 4, 2020
9e2e209
Fix ESLint issues
queengooborg Sep 4, 2020
19914dd
Bump to version 0.1.0
queengooborg Sep 4, 2020
8ea1526
Move test code compilation into build script
queengooborg Sep 4, 2020
20cbcd6
Add additional constructor error message catch
queengooborg Sep 4, 2020
093ea28
Fix HTTPS skipping
queengooborg Sep 4, 2020
6b47a5e
Change /api/ to /backend/ for all backend
queengooborg Sep 4, 2020
3c6097b
Fix ESLint issues
queengooborg Sep 4, 2020
2e581e5
Fix tests to accommodate for build-time compilation of code
queengooborg Sep 4, 2020
6ba9b0e
Don't include combinator in compiled tests
queengooborg Sep 4, 2020
6f2cde9
Remove Prettier
queengooborg Sep 4, 2020
18eac00
Revert "Change /api/ to /backend/ for all backend"
queengooborg Sep 4, 2020
ce91c53
Place all tests under /tests/
queengooborg Sep 4, 2020
33d2b3f
Move /test/ to /unittest/
queengooborg Sep 4, 2020
435c73d
Move Selenium file to root
queengooborg Sep 4, 2020
f2ea990
Make npm run test perform lint and unit tests
queengooborg Sep 4, 2020
8d71cc0
Finish moving /test/ to /unittest/
queengooborg Sep 4, 2020
f0dde30
Remove Prettier from ESLint
queengooborg Sep 4, 2020
580a4ea
Don't include copyright in generated test files
queengooborg Sep 4, 2020
1715f91
Add .nycrc
queengooborg Sep 4, 2020
048930a
Include harness.js coverage in nyc reports
queengooborg Sep 4, 2020
e5bd910
Merge npm run coverage && npm run puppeteer into npm run unittest
queengooborg Sep 4, 2020
4ba1beb
Fix ESLint issues
queengooborg Sep 4, 2020
82a6d54
Move test page generation to Tests class
queengooborg Sep 4, 2020
f518398
Simplify endpoint generation
queengooborg Sep 4, 2020
ae904dc
Consolidate app.js tests
queengooborg Sep 4, 2020
b2eabcf
Account for reffy->webref rename in tests
queengooborg Sep 4, 2020
be1cf71
Stringify dictionaries in writeFile()
queengooborg Sep 4, 2020
56c83ef
Remove redundant writeManifest function
queengooborg Sep 4, 2020
2d11403
Fix issues in writeFile
queengooborg Sep 4, 2020
4cad78e
Make copyResources() asynchronous
queengooborg Sep 4, 2020
990e66d
Add additional tests/coverage ignore statements
queengooborg Sep 4, 2020
415b9fc
Separate manifest building into separate function
queengooborg Sep 5, 2020
594ad50
Add additional tests for build.js
queengooborg Sep 5, 2020
27c99da
Use filesystem mocking for writeFile tests
queengooborg Sep 5, 2020
214fc39
Add disabled copyResources tests
queengooborg Sep 5, 2020
b6d0fb9
Add more test coverage
queengooborg Sep 5, 2020
0d7c996
Add HTML-format coverage command
queengooborg Sep 5, 2020
6244aef
Fix ESLint issues
queengooborg Sep 5, 2020
00da20b
Don't include HTML coverage reports in nyc
queengooborg Sep 5, 2020
077dccc
Rename harness.js mocha tests
queengooborg Sep 5, 2020
daa6271
Extend coverage to all of static folder
queengooborg Sep 5, 2020
afe5f74
Properly link static folder in test coverage reports
queengooborg Sep 5, 2020
76d9041
Add clean command
queengooborg Sep 5, 2020
b26298d
Update readme
queengooborg Sep 5, 2020
35a5d3c
Add text to homepage, including list of known caveats
queengooborg Sep 5, 2020
fb16ffb
Prepare for prefix building
queengooborg Sep 5, 2020
2884b01
Simplify constructor tests
queengooborg Sep 5, 2020
04379fb
Simplify test combinator property
queengooborg Sep 5, 2020
15997c9
Simplify @@iterator tests
queengooborg Sep 5, 2020
3747b9a
Fix constructor/@@iterator test generation
queengooborg Sep 5, 2020
557b861
Add prefix testing support
queengooborg Sep 5, 2020
6ba6ea0
Prevent test duplication (in the case of custom tests)
queengooborg Sep 5, 2020
0bdf178
Remove deprecated test
queengooborg Sep 5, 2020
facc267
Fix prefix generation
queengooborg Sep 5, 2020
07a3f19
Fix @@iterator test generation
queengooborg Sep 5, 2020
0387356
Fix unittests
queengooborg Sep 5, 2020
54b9857
Separate manifest and move to generated folder
queengooborg Sep 5, 2020
fd8e4b0
Fix unittests
queengooborg Sep 5, 2020
7a4e397
Fix capitalization in unittest
queengooborg Sep 5, 2020
6ca7589
Show if tests failed to load
queengooborg Sep 5, 2020
4ad5f84
Fix test compilation for CSS custom tests
queengooborg Sep 5, 2020
f6934bf
Add styling to pages
queengooborg Sep 5, 2020
4485fad
Load custom CSS after test completion
queengooborg Sep 5, 2020
a1a0402
Add find-missing script to find what's covered in BCD but not here
queengooborg Sep 6, 2020
46c78a4
Fix ESLint issues
queengooborg Sep 6, 2020
8f4e075
Ignore if CSS doesn't load properly after tests
queengooborg Sep 6, 2020
401080f
Fix ESLint issues
queengooborg Sep 6, 2020
64db80a
Map api.console to api.Console
queengooborg Sep 6, 2020
8bb2911
Don't pre-generate /tests prefix
queengooborg Sep 6, 2020
bdffea3
Only send one array for /api/tests
queengooborg Sep 6, 2020
1e27124
Improve Tests.next()
queengooborg Sep 6, 2020
a4bfcaa
Fix unittests
queengooborg Sep 6, 2020
665ecaf
Add a little bit of extra logging on non-found tests
queengooborg Sep 6, 2020
006ace6
Add toString when [Serializable] is present
queengooborg Sep 6, 2020
36e6002
Fix a typo in non-standard.idl
queengooborg Sep 6, 2020
b498c97
Add subtest support
queengooborg Sep 7, 2020
d57c068
Reduce prefixes used in unittests
queengooborg Sep 7, 2020
8ef18ea
Add no-else-return as ESLint error
queengooborg Sep 7, 2020
28cc387
Remove redundant else statements after return statements
queengooborg Sep 7, 2020
62987c9
Improve unittest for collectExtraIDL()
queengooborg Sep 7, 2020
f02e4a5
Fix prefix capitalization for string tests
queengooborg Sep 7, 2020
0d40d58
Improve compiled code de-duping
queengooborg Sep 7, 2020
a8af5ba
Add unittests for compileTest[Code]()
queengooborg Sep 7, 2020
ba7da9e
Add quote-props ESLint rule (and fix)
queengooborg Sep 7, 2020
bd95266
Sort ESLint rules
queengooborg Sep 7, 2020
2e75255
Prefer arrow functions
queengooborg Sep 7, 2020
e275172
Upgrade subtest structure to allow for non-members
queengooborg Sep 7, 2020
7fb0be2
Limit find-missing to CSS properties
queengooborg Sep 7, 2020
83df42a
Fix find-missing
queengooborg Sep 7, 2020
6129d16
Add additional non-standard IDL
queengooborg Sep 7, 2020
be3913f
Simplify max-len rule
queengooborg Sep 7, 2020
6f2cd26
Address issues in code review
queengooborg Sep 7, 2020
90e9371
Move manifest files to their own folder
queengooborg Sep 7, 2020
fc8c27f
Move "All Tests" back to index.html
queengooborg Sep 7, 2020
1e53e5b
Fix callbacks/promises in copyResources
queengooborg Sep 7, 2020
dfb6171
Address review comments
queengooborg Sep 7, 2020
1f4409d
Merge remote-tracking branch 'origin/main' into server-side-builds
queengooborg Sep 8, 2020
554f6c0
Delete redundant file
queengooborg Sep 8, 2020
5dd8ba7
Merge branch 'main' into server-side-builds
queengooborg Sep 8, 2020
f4ca563
Merge branch 'main' into server-side-builds
queengooborg Sep 8, 2020
228fee9
Merge branch 'main' into server-side-builds
queengooborg Sep 8, 2020
3b82738
Merge branch 'main' into server-side-builds
queengooborg Sep 8, 2020
5211ae8
Fix toString tests
queengooborg Sep 8, 2020
6db60a9
Simplify manifest (remove "individual" points, leave only main)
queengooborg Sep 8, 2020
5237492
Fix Tests.next()
queengooborg Sep 8, 2020
4bc3b03
Simplify endpoint listing functions
queengooborg Sep 8, 2020
bb2f51c
Rename buildManifest to buildEndpoints
queengooborg Sep 8, 2020
da94ee5
Fix ESLint issues
queengooborg Sep 8, 2020
f70877e
Update unittests
queengooborg Sep 8, 2020
93bdfd3
Run all scopes each test
queengooborg Sep 8, 2020
f4f2ca9
Display scope when showing results
queengooborg Sep 8, 2020
65cb6a2
Update unittests
queengooborg Sep 8, 2020
b6d5e51
Simplify code
queengooborg Sep 8, 2020
e0e55c5
Add additional istanbul ignore statements
queengooborg Sep 8, 2020
b20b14d
Remove redundant if clause
queengooborg Sep 8, 2020
92f132e
Add "use HTTPS" checkbox for individual tests
queengooborg Sep 8, 2020
f5d5141
Use Nodemon to auto-reload server on file changes
queengooborg Sep 8, 2020
4e3db82
Add Nodemon config
queengooborg Sep 8, 2020
1560873
Update package.json
queengooborg Sep 8, 2020
a5e37b3
Allow limitation of scope via scope argument
queengooborg Sep 8, 2020
c9bfdb0
Add scope limitation dropdown
queengooborg Sep 8, 2020
48a65c0
Add custom test for api.DOMTokenList.remove_whitespace_and_duplicates
queengooborg Sep 8, 2020
a8e1c07
Update example for additional tests in DESIGN.md
queengooborg Sep 8, 2020
7cc2f65
Merge remote-tracking branch 'origin/main' into server-side-builds
queengooborg Sep 8, 2020
f8de6e2
Move buildEndpoints to Tests class
queengooborg Sep 8, 2020
af4282f
Increase timeout for buildIDL
queengooborg Sep 8, 2020
1f438b2
Fix unittests
queengooborg Sep 8, 2020
3be7715
Merge remote-tracking branch 'origin/main' into server-side-builds
queengooborg Sep 8, 2020
f62a391
Fix ESLint issues
queengooborg Sep 8, 2020
b9d91c5
Move tests.json to root
queengooborg Sep 8, 2020
23a3b02
Fix import
queengooborg Sep 8, 2020
9ec89c5
Merge branch 'main' into server-side-builds
queengooborg Sep 8, 2020
338c22d
Remove unused variable
queengooborg Sep 8, 2020
5f3e289
Update comment
queengooborg Sep 8, 2020
4414c6b
Address comments in code review
queengooborg Sep 8, 2020
079e4bb
Apply suggestions from code review
queengooborg Sep 8, 2020
3069ffb
Update static/index.html
queengooborg Sep 8, 2020
fd7da60
Fix dependency version numbers
queengooborg Sep 8, 2020
eb4a87b
Use Nodemon strictly for dev server (add npm run start-dev)
queengooborg Sep 8, 2020
3bfcaf2
Fix Nodemon config
queengooborg Sep 8, 2020
79d6c6a
Rename "scope" to owner/exposure accordingly
queengooborg Sep 8, 2020
8d4fe3a
Add more unit tests
queengooborg Sep 9, 2020
a7e50a3
Remove redundant if clause
queengooborg Sep 9, 2020
d8dd2b7
Link to issue on index.html
queengooborg Sep 9, 2020
84249a8
Render pages server-side with templating
queengooborg Sep 9, 2020
9846342
Render options server-side
queengooborg Sep 9, 2020
c199f52
Remove redundant API endpoint
queengooborg Sep 9, 2020
4058383
Update unittests
queengooborg Sep 9, 2020
ae9e72f
Combine getTests and generateTestPage; generate test page via EJS
queengooborg Sep 9, 2020
d899dda
Update unittests
queengooborg Sep 9, 2020
7038b73
Improve updateStatus() calls
queengooborg Sep 9, 2020
5078de0
Add comment for clarity
queengooborg Sep 9, 2020
b1f5c43
Don't generate prefix variations if the property already has a prefix
queengooborg Sep 9, 2020
90260f6
Fix ESLint issues
queengooborg Sep 9, 2020
c04adf1
Add additional unittests
queengooborg Sep 9, 2020
4db181c
Update Nodemon config
queengooborg Sep 9, 2020
f8934be
Implement reportToServer search param (for main tests)
queengooborg Sep 9, 2020
759c65a
Merge remote-tracking branch 'origin/main' into server-side-builds
queengooborg Sep 9, 2020
69c58f8
Update dependencies
queengooborg Sep 9, 2020
1b99878
Apply suggestions from code review
queengooborg Sep 9, 2020
7210f56
Fix rest of code to apply suggestions from code review
queengooborg Sep 10, 2020
2769bbf
Fix CSS choice selection
queengooborg Sep 10, 2020
94b2e90
Remove secure context checkbox (use host's protocol)
queengooborg Sep 10, 2020
dd4fe34
Remove copyright from test pages
queengooborg Sep 10, 2020
cd6e0a2
Add Todo comment
queengooborg Sep 10, 2020
60c3ebd
Fix unittests
queengooborg Sep 10, 2020
ace2768
Remove "CSS" exposure
queengooborg Sep 10, 2020
a130b0d
Add "category" to tests (replaces "CSS" exposure)
queengooborg Sep 10, 2020
445c917
Fix switch case
queengooborg Sep 10, 2020
30cb0dc
Update unittests
queengooborg Sep 10, 2020
ae602d3
Merge branch 'main' into server-side-builds
queengooborg Sep 10, 2020
77f7e17
Merge branch 'main' into server-side-builds
queengooborg Sep 10, 2020
79db84d
writeFile(): don't generate whitespace for JSON
queengooborg Sep 10, 2020
b249a9e
Fix indentation
queengooborg Sep 10, 2020
2150416
Add "report to server" checkbox
queengooborg Sep 10, 2020
079d0d2
Move main endpoints to /tests/main and redirect `/tests/` to first main
queengooborg Sep 10, 2020
1044043
Generate endpoints for all individual
queengooborg Sep 10, 2020
b659b11
Fix ESLint issues
queengooborg Sep 10, 2020
ecd9d3d
Fix unittests
queengooborg Sep 10, 2020
a5b00df
Rename tests.listIndividual to listIndividualEndpoints
queengooborg Sep 10, 2020
a09a6a8
Eliminate main endpoints; all tests both display AND report to server
queengooborg Sep 10, 2020
6028f1e
Remove always-true if clauses
queengooborg Sep 10, 2020
8b2072c
Simplify endpoints database (remove httpsOnly parameter)
queengooborg Sep 10, 2020
84eb610
Update Selenium tests
queengooborg Sep 10, 2020
4dec016
Fix callback for bcd.run
queengooborg Sep 10, 2020
d728f87
Add ID to GitHub submit link (for Selenium)
queengooborg Sep 10, 2020
b0e1b3d
Display "All Tests" for title if no identifier
queengooborg Sep 10, 2020
6981f44
Make Selenium independent from Mocha
queengooborg Sep 10, 2020
eb00e0b
Fix ESLint issues
queengooborg Sep 10, 2020
9ba1cfc
Update unittests
queengooborg Sep 10, 2020
74360cb
Remove need for promises in harness.js
queengooborg Sep 10, 2020
76db053
Remove core-js as a dependency
queengooborg Sep 10, 2020
45978d5
Add exposure to pending if nonexistent
queengooborg Sep 10, 2020
0c81c07
Account for scope limitation
queengooborg Sep 10, 2020
def0e34
Remove redundant variables
queengooborg Sep 10, 2020
2ee8720
Ignore selenium.js in coverage reports (can't be unittested effectively)
queengooborg Sep 10, 2020
4f02285
Update unittests
queengooborg Sep 10, 2020
09f16de
Add 404 error handler
queengooborg Sep 11, 2020
909b830
Switch to datalist for test dropdown
queengooborg Sep 11, 2020
9c920ff
Simplify endpoints
queengooborg Sep 11, 2020
6d97aee
Update unittests
queengooborg Sep 11, 2020
d7513ae
Stylize input
queengooborg Sep 11, 2020
b8c97cb
Update meta tags
queengooborg Sep 11, 2020
24b078b
Remove unneeded istanbul ignore
queengooborg Sep 11, 2020
42958bf
Don't submit a PR if there are no results
queengooborg Sep 11, 2020
239f63c
Fix ESLint issues
queengooborg Sep 11, 2020
84bc74c
Update nodemon rules
queengooborg Sep 11, 2020
8ef3879
Merge branch 'main' into server-side-builds
queengooborg Sep 11, 2020
7b3bed0
Merge branch 'main' into server-side-builds
foolip Sep 11, 2020
e18fbdd
Merge branch 'main' into server-side-builds
queengooborg Sep 11, 2020
b1596e6
Merge branch 'main' into server-side-builds
foolip Sep 11, 2020
975fb83
Remove prefix generation; prepare for selective prefix testing
queengooborg Sep 11, 2020
c4fc85e
Update unittests
queengooborg Sep 11, 2020
83c012c
Fix whitespace
foolip Sep 11, 2020
5921b6f
Fix lint and test
foolip Sep 11, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
.nyc_output/
MANIFEST.json
coverage.lcov
coverage/
generated/
node_modules/
secrets.json
tests.json
.testtmp
3 changes: 2 additions & 1 deletion .nycrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"**/generated/**",
"**/unittest/**",
"**/coverage/**",
"**/json3.min.js"
"**/json3.min.js",
"selenium.js"
]
}
21 changes: 17 additions & 4 deletions DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@ Each API interface is written in the following structure:
"INTERFACE_NAME": {
"__base": "CODE_TO_REPEAT_FOR_EVERY_TEST",
"__test": "CODE_SPECIFIC_TO_TEST_THE_INTERFACE",
"MEMBER": "CODE_TO_TEST_THE_MEMBER"
"MEMBER": "CODE_TO_TEST_THE_MEMBER",
"__additional": {
"SUBFEATURE": "CODE_TO_TEST_SUBFEATURE"
}
}
```

Expand All @@ -34,7 +37,9 @@ You can define a custom method to test the interface instance itself via `__test

Each member can have a custom test by defining a property as the member name. Like `__test`, it should be a return statement that returns `true` or `false`. If no custom test is defined, it will default to `return instance && 'MEMBER' in instance`.

Each test will compile into a function as follows: `function() {__base + __test/MEMBER}`
Additional members and submembers can be defined using the `__additional` property. If there is a subfeature to an API or one of its members, such as "api.AudioContext.AudioContext.latencyHint", that simply cannot be defined within IDL, you can include this object and specify tests for such subfeatures.

Each test will compile into a function as follows: `function() {__base + __test/MEMBER/SUBFEATURE}`

Example:

Expand All @@ -47,7 +52,12 @@ The following JSON...
"__base": "var canvas = document.createElement('canvas'); var gl = canvas.getContext('webgl'); var instance = gl.getExtension('ANGLE_instanced_arrays');",
"__test": "return canvas && instance;",
"drawArraysInstancedANGLE": "return true && instance && 'drawArraysInstancedANGLE' in instance;"
}
},
"DOMTokenList": {
"__additional": {
"remove_whitespace_and_duplicates": "var elm = document.createElement('b'); elm.className = ' foo bar foo '; elm.classList.remove('bar'); return elm.className === 'foo';"
}
},
},
"css": {

Expand All @@ -63,7 +73,10 @@ bcd.addTest('api.ANGLE_instanced_arrays.drawArraysInstancedANGLE', "(function()
bcd.addTest('api.ANGLE_instanced_arrays.drawElementsInstancedANGLE', "(function() {var canvas = document.createElement('canvas'); var gl = canvas.getContext('webgl'); var instance = gl.getExtension('ANGLE_instanced_arrays');return instance && 'drawElementsInstancedANGLE' in instance;})()", 'Window');
bcd.addTest('api.ANGLE_instanced_arrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE', "(function() {var canvas = document.createElement('canvas'); var gl = canvas.getContext('webgl'); var instance = gl.getExtension('ANGLE_instanced_arrays');return instance && 'VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE' in instance;})()", 'Window');
bcd.addTest('api.ANGLE_instanced_arrays.vertexAttribDivisorANGLE', "(function() {var canvas = document.createElement('canvas'); var gl = canvas.getContext('webgl'); var instance = gl.getExtension('ANGLE_instanced_arrays');return instance && 'vertexAttribDivisorANGLE' in instance;})()", 'Window');
bcd.addTest('api.Animation', {"property":"Animation","scope":"self"}, 'Window');
bcd.addTest('api.Animation', {"property":"Animation","owner":"self"}, 'Window');
...
bcd.addTest('api.DOMTokenList', {"property":"DOMTokenList","owner":"self"}, 'Window');
bcd.addTest('api.DOMTokenList.remove_whitespace_and_duplicates', "(function() {var elm = document.createElement('b'); elm.className = ' foo bar foo '; elm.classList.remove('bar'); return elm.className === 'foo';})()", 'Window');
```

Tips: make sure to implement thorough feature checking as to not raise exceptions.
Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@ Before you can run or deploy, copy `secrets.sample.json` to `secrets.json`.
## Running locally

```sh
npm start
npm run start-dev
```

(`start-dev` as opposed to `start` will automatically reload the server on file changes.)

## Deploying to App Engine

```sh
Expand Down
98 changes: 71 additions & 27 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,23 @@

'use strict';

const path = require('path');
const express = require('express');
const cookieParser = require('cookie-parser');
const uniqueString = require('unique-string');
const expressLayouts = require('express-ejs-layouts');

const logger = require('./logger');

const appversion = require('./package.json').version;

const PORT = process.env.PORT || 8080;

/* istanbul ignore next */
const secrets = process.env.NODE_ENV === 'test' ?
require('./secrets.sample.json') :
require('./secrets.json');

const getHost = () => {
const project = process.env.GOOGLE_CLOUD_PROJECT;
if (project) {
Expand All @@ -37,14 +44,12 @@ const getHost = () => {
};

const {CloudStorage, MemoryStorage} = require('./storage');
/* istanbul ignore next */
const storage = process.env.NODE_ENV === 'production' ?
new CloudStorage(process.env.GOOGLE_CLOUD_PROJECT) :
new MemoryStorage;

const secrets = process.env.NODE_ENV === 'test' ?
require('./secrets.sample.json') :
require('./secrets.json');

/* istanbul ignore next */
const github = require('./github')(
secrets.github.token ?
{auth: `token ${secrets.github.token}`} :
Expand All @@ -53,7 +58,7 @@ const github = require('./github')(

const Tests = require('./tests');
const tests = new Tests({
manifest: require('./MANIFEST.json'),
tests: require('./tests.json'),
host: getHost(),
httpOnly: process.env.NODE_ENV !== 'production'
});
Expand All @@ -74,18 +79,21 @@ const catchError = (err, res) => {
};

const app = express();

// Layout config
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(expressLayouts);
app.set('layout extractScripts', true);

// Additional config
app.use(cookieParser());
app.use(cookieSession);
app.use(express.json({limit: '32mb'}));
app.use(express.static('static'));
app.use(express.static('generated'));

app.get('/api/tests', (req, res) => {
const {after, limit} = req.query;
const list = tests.list(after, limit ? +limit : 0);
const individualList = tests.listIndividual(after, limit ? +limit : 0);
res.json([list, individualList]);
});
// Backend API

app.post('/api/results', (req, res) => {
if (!req.is('json')) {
Expand All @@ -103,24 +111,12 @@ app.post('/api/results', (req, res) => {

const response = {};

// Include next test in response as a convenience.
try {
const next = tests.list(forURL, 1)[0];
if (next) {
response.next = next;
}
} catch (err) {
logger.warn(`Results submitted for URL not in manifest: ${forURL}`);
// note: indistinguishable from finishing last test to client
}

Promise.all([
storage.put(req.sessionID, '__version', appversion),
storage.put(req.sessionID, forURL, req.body)
]).then(() => {
res.status(201).json(response);
})
.catch(/* istanbul ignore next */ (err) => catchError(err, res));
}).catch(/* istanbul ignore next */ (err) => catchError(err, res));
});

app.get('/api/results', (req, res) => {
Expand All @@ -131,22 +127,66 @@ app.get('/api/results', (req, res) => {
.catch(/* istanbul ignore next */ (err) => catchError(err, res));
});

/* istanbul ignore next: we don't want to create lots of dummy PRs */
app.post('/api/results/export/github', (req, res) => {
storage.getAll(req.sessionID)
.then(async (results) => {
if (Object.entries(results).length === 0) {
res.json({error: 'No results to export'});
}

const userAgent = req.get('User-Agent');
const report = {results, userAgent};
const response = await github.exportAsPR(report);
if (response) {
res.json(response);
} else {
res.status(500).end();
res.status(500).json({error: 'Server error'});
}
})
.catch(/* istanbul ignore next */ (err) => catchError(err, res));
});

// Views

app.get('/', (req, res) => {
res.render('index', {
tests: tests.listEndpoints('/tests')
});
});

app.get('/results', (req, res) => {
res.render('results', {
title: 'Test Results'
});
});

app.all('/tests/*', (req, res) => {
const ident = req.params['0'].replace(/\//g, '.');
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that with this string replacement, a URL like /tests/api.HTMLMediaElement.addTextTrack will also work. The URLs will show up in the reports, but that seems OK.

What we could do is normalize the URL and redirect if it's not the same. But not now.


if (tests.listEndpoints().some((item) => (item === ident))) {
res.render('tests', {
title: `${ident || 'All Tests'}`,
layout: false,
tests: tests.getTests(ident, req.query.exposure)
});
} else {
res.status(404).render('error', {
title: `Tests Not Found`,
message: `Could not find tests for ${ident}.`,
url: req.url
});
}
});

// Page Not Found Handler
app.use((req, res) => {
res.status(404).render('error', {
title: `Page Not Found`,
message: 'The requested page was not found.',
url: req.url
});
});

/* istanbul ignore if */
if (require.main === module) {
// Start the server
Expand All @@ -156,5 +196,9 @@ if (require.main === module) {
});
} else {
// Export for testing
module.exports = {app: app, version: appversion};
module.exports = {
app: app,
version: appversion,
getHost: getHost
};
}
Loading