We want this to be fast enough that this benchmark doesn't take a long time, but part of the effort of making it faster will be running the benchmark repeatedly, and if it takes a long time then it will take longer for us to make it faster. This commit reduces the benchmark size for stat_intensive and write_intensive so that they don't take several minutes to complete.
API Tester
A test framework for testing the puter HTTP API and puterjs API.
Table of Contents
How to use
Workflow
All commands below should be run from the root directory of puter.
-
(Optional) Start a backend server:
npm start -
Copy
example_config.ymland add the correct values:cp ./tools/api-tester/example_config.yml ./tools/api-tester/config.ymlFields:
- url: The endpoint of the backend server. (default: http://api.puter.localhost:4100/)
- username: The username of the user to test. (e.g.
admin) - token: The token of the user. (can be obtained by logging in on the webpage and typing
puter.authTokenin Developer Tools's console) - mountpoints: The mountpoints to test. (default config includes 2 mountpoints:
/for "puter fs provider" and/admin/tmpfor "memory fs provider")
-
Run tests against the HTTP API (unit tests and benchmarks):
node ./tools/api-tester/apitest.js -
(experimental) Run tests against the puter-js client:
node ./tools/api-tester/apitest.js --puterjs
Shorthands
-
Run tests against the HTTP API (unit tests and benchmarks):
node ./tools/api-tester/apitest.js -
Run unit tests against the HTTP API:
node ./tools/api-tester/apitest.js --unit -
Run benchmarks against the HTTP API:
node ./tools/api-tester/apitest.js --bench -
Filter tests by suite name:
node ./tools/api-tester/apitest.js --unit --suite=mkdir -
Filter benchmarks by name:
node ./tools/api-tester/apitest.js --bench --suite=stat_intensive_1 -
Stop on first failure:
node ./tools/api-tester/apitest.js --unit --stop-on-failure -
(unimplemented) Filter tests by test name:
# (wildcard matching) Run tests containing "memoryfs" in the name node ./tools/api-tester/apitest.js --unit --test='*memoryfs*' # (exact matching) Run the test "mkdir in memoryfs" node ./tools/api-tester/apitest.js --unit --test='mkdir in memoryfs' -
(unimplemented) Rerun failed tests in the last run:
node ./tools/api-tester/apitest.js --rerun-failed
Basic Concepts
A test case is a function that tests a specific behavior of the backend API. Test cases can be nested:
await t.case('normal mkdir', async () => {
const result = await t.mkdir_v2('foo');
expect(result.name).equal('foo');
await t.case('can stat the created directory', async () => {
const stat = await t.stat('foo');
expect(stat.name).equal('foo');
});
});
A test suite is a collection of test cases. A .js file should contain exactly one test suite.
module.exports = {
name: 'mkdir',
do: async t => {
await t.case('normal mkdir', async () => {
...
});
await t.case('recursive mkdir', async () => {
...
});
}
};
Behaviors
Working directory (t.cwd)
- The working directory is stored in
t.cwd. - All filesystem operations are performed relative to the working directory, if the given path is not absolute. (e.g.,
t.mkdir('foo'),t.cd('foo'),t.stat('foo'), etc.) - Tests will be run under all mountpoints. The default working directory for a mountpoint is
${mountpoint.path}/{username}/api_test. (This is subject to change in the future, the reason we includeadminin the path is to ensure the test useradminhas write access, see Permission Documentation for details.) - The working directory is reset at the beginning of each test suite, since a test suite usually doesn't want to be affected by other test suites.
- The working directory will be inherited from the cases in the same test suite, since a leaf case might want to share the context with its parent/sibling cases.
module.exports = {
name: 'readdir',
do: async t => {
// t.cwd is reset to /admin/api_test
await t.case('normal mkdir', async () => {
// inherits cwd from parent/sibling cases
await t.case('mkdir in subdir', async () => {
// inherits cwd from parent/sibling cases
});
});
}
};
Implementation
- Test suites are registered in
tools/api-tester/tests/__entry__.js.
TODO
- Reset
t.cwdif a test case fails. Currently,t.cwdis not reset if a test case fails. - Integrate apitest into CI, optionally running it only in specific scenarios (e.g., when backend code changes).