Skip to content

Commit 7492e1f

Browse files
authored
add conformance test driver (#792)
Signed-off-by: Brian DeHamer <[email protected]>
1 parent 0c68729 commit 7492e1f

File tree

3 files changed

+104
-0
lines changed

3 files changed

+104
-0
lines changed

.changeset/slimy-pears-jam.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

.github/scripts/tuf-conformance

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#!/usr/bin/env node
2+
const fs = require('fs')
3+
const path = require('path')
4+
const { Updater } = require('tuf-js')
5+
const yargs = require('yargs/yargs')
6+
const { hideBin } = require('yargs/helpers')
7+
8+
yargs(hideBin(process.argv))
9+
.version(false)
10+
11+
// init command
12+
.command('init <trusted-root>', 'init cache', {
13+
'metadata-dir': { type: 'string' },
14+
}, (argv) => {
15+
if (!fs.existsSync(argv.metadataDir)) {
16+
fs.mkdirSync(argv.metadataDir, {
17+
recursive: true
18+
});
19+
}
20+
21+
fs.copyFileSync(argv.trustedRoot, path.join(argv.metadataDir, 'root.json'));
22+
})
23+
24+
// refresh command
25+
.command('refresh', 'refresh metadata from tuf repo', {
26+
'metadata-url': { type: 'string' },
27+
'metadata-dir': { type: 'string' },
28+
}, async (argv) => {
29+
const updater = new Updater({
30+
metadataBaseUrl: argv.metadataUrl,
31+
metadataDir: argv.metadataDir,
32+
})
33+
34+
return updater.refresh()
35+
})
36+
37+
// download command
38+
.command('download', 'retrieve target', {
39+
'metadata-url': { type: 'string' },
40+
'metadata-dir': { type: 'string' },
41+
'target-name': { type: 'string' },
42+
'target-base-url': { type: 'string' },
43+
'target-dir': { type: 'string' }
44+
}, async (argv) => {
45+
if (!fs.existsSync(argv.targetDir)) {
46+
fs.mkdirSync(argv.targetDir, {
47+
recursive: true
48+
});
49+
}
50+
51+
const updater = new Updater({
52+
metadataBaseUrl: argv.metadataUrl,
53+
metadataDir: argv.metadataDir,
54+
targetBaseUrl: argv.targetBaseUrl,
55+
targetDir: argv.targetDir
56+
})
57+
58+
const targetInfo = await updater.getTargetInfo(argv.targetName)
59+
if (!targetInfo) {
60+
throw new Error(`Target ${argv.targetPath} not found`);
61+
}
62+
63+
return updater.downloadTarget(targetInfo)
64+
})
65+
.parse()

.github/workflows/conformance.yml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
name: Conformance
3+
4+
"on":
5+
push:
6+
branches: ['main']
7+
pull_request:
8+
branches: ['main']
9+
workflow_dispatch:
10+
11+
permissions:
12+
contents: read
13+
14+
jobs:
15+
tuf-conformance:
16+
name: TUF Conformance Test
17+
runs-on: ubuntu-latest
18+
steps:
19+
- name: Checkout source
20+
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1
21+
22+
- name: Setup node
23+
uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4
24+
with:
25+
node-version: 22
26+
cache: npm
27+
28+
- name: Install dependencies
29+
run: npm ci
30+
31+
- name: Run build
32+
run: npm run build
33+
34+
- name: Run conformance suite
35+
uses: theupdateframework/tuf-conformance@3a8726362e0440ddcf5156ab06aa385f3728558c # TODO: Pin to a released version
36+
with:
37+
entrypoint: ".github/scripts/tuf-conformance"

0 commit comments

Comments
 (0)