Skip to content

Commit 05d28ab

Browse files
authored
Merge branch 'master' into cleanup-tangerine-whistle
2 parents fd3afe3 + 51f8af0 commit 05d28ab

File tree

4 files changed

+190
-4
lines changed

4 files changed

+190
-4
lines changed

packages/vm/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
"level": "^6.0.0",
7777
"level-mem": "^3.0.1",
7878
"minimist": "^1.2.0",
79+
"node-dir": "^0.1.16",
7980
"nyc": "^12.0.0",
8081
"prettier": "^2.0.5",
8182
"rlp": "^2.2.3",

packages/vm/tests/state-test-run-test.sh

100644100755
File mode changed.

packages/vm/tests/testLoader.js

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
const fs = require('fs')
2+
const dir = require('node-dir')
3+
const path = require('path')
4+
5+
const falsePredicate = () => false
6+
// package.json -> always take the package root, remove filename, go to submodule
7+
const defaultTestsPath = path.join(path.dirname(require.resolve("ethereumjs-testing/package.json")), 'tests')
8+
9+
/**
10+
* Returns the list of test files matching the given parameters
11+
* @param {string} testType the test type (path segment)
12+
* @param {Function} onFile a callback for each file
13+
* @param {RegExp|Array<string>} fileFilter a {@code RegExp} or array to specify filenames to operate on
14+
* @param {Function<boolean>} skipPredicate a filtering function for test names
15+
* @param {string} testDir the directory inside the {@code tests/} directory to use
16+
* @param {RegExp|Array<string>} excludeDir a {@code RegExp} or array to specify directories to ignore
17+
* @param {string} testsPath the path to the {@code tests/} directory
18+
* @return {Promise<Array<string>>} the list of test files
19+
*/
20+
const getTests = exports.getTests = (
21+
testType,
22+
onFile,
23+
fileFilter = /.json$/,
24+
skipPredicate = falsePredicate,
25+
testDir = '',
26+
excludeDir = '',
27+
testsPath = defaultTestsPath
28+
) => {
29+
const directory = path.join(testsPath, testType, testDir)
30+
const options = {
31+
match: fileFilter,
32+
excludeDir: excludeDir
33+
}
34+
35+
return new Promise((resolve, reject) => {
36+
const finishedCallback = (err, files) => {
37+
if (err) {
38+
reject(err)
39+
return
40+
}
41+
42+
resolve(files)
43+
}
44+
45+
const fileCallback = async (err, content, fileName, next) => {
46+
if (err) {
47+
reject(err)
48+
return
49+
}
50+
51+
const parsedFileName = path.parse(fileName).name
52+
const testsByName = JSON.parse(content)
53+
const testNames = Object.keys(testsByName)
54+
for (const testName of testNames) {
55+
if (!skipPredicate(testName)) {
56+
await onFile(parsedFileName, testName, testsByName[testName])
57+
}
58+
}
59+
60+
next()
61+
}
62+
63+
dir.readFiles(directory, options, fileCallback, finishedCallback)
64+
})
65+
}
66+
67+
function skipTest (testName, skipList = []) {
68+
return skipList.map((skipName) => (new RegExp(`^${skipName}`)).test(testName)).some(isMatch => isMatch)
69+
}
70+
71+
/**
72+
* Loads a single test specified in a file
73+
* @method getTestFromSource
74+
* @param {String} file or path to load a single test from
75+
* @param {Function} Callback function which is invoked, and passed the contents of the specified file (or an error message)
76+
*/
77+
const getTestFromSource = exports.getTestFromSource = function (file, onFile) {
78+
let stream = fs.createReadStream(file)
79+
let contents = ''
80+
let test = null
81+
82+
stream.on('data', function (data) {
83+
contents += data
84+
}).on('error', function (err) {
85+
onFile(err)
86+
}).on('end', function () {
87+
try {
88+
test = JSON.parse(contents)
89+
} catch (e) {
90+
onFile(e)
91+
}
92+
93+
let testName = Object.keys(test)[0]
94+
let testData = test[testName]
95+
testData.testName = testName
96+
97+
onFile(null, testData)
98+
})
99+
}
100+
101+
exports.getTestsFromArgs = function (testType, onFile, args = {}) {
102+
let testsPath, testDir, fileFilter, excludeDir, skipFn
103+
104+
skipFn = (name) => {
105+
return skipTest(name, args.skipTests)
106+
}
107+
108+
if (testType === 'BlockchainTests') {
109+
const forkFilter = new RegExp(`${args.forkConfig}$`)
110+
skipFn = (name) => {
111+
return ((forkFilter.test(name) === false) || skipTest(name, args.skipTests))
112+
}
113+
}
114+
115+
if (testType === 'VMTests') {
116+
skipFn = (name) => {
117+
return skipTest(name, args.skipVM)
118+
}
119+
}
120+
121+
if (args.singleSource) {
122+
return getTestFromSource(args.singleSource, onFile)
123+
}
124+
125+
if (args.dir) {
126+
testDir = args.dir
127+
}
128+
129+
if (args.file) {
130+
fileFilter = new RegExp(args.file)
131+
}
132+
133+
if (args.excludeDir) {
134+
excludeDir = new RegExp(args.excludeDir)
135+
}
136+
137+
if (args.test) {
138+
skipFn = (testName) => {
139+
return testName !== args.test
140+
}
141+
}
142+
143+
if (args.testsPath) {
144+
testsPath = args.testsPath
145+
}
146+
147+
return getTests(testType, onFile, fileFilter, skipFn, testDir, excludeDir, testsPath)
148+
}
149+
150+
exports.getSingleFile = (file) => {
151+
return require(path.join(defaultTestsPath, file))
152+
}

packages/vm/tests/tester.js

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
const argv = require('minimist')(process.argv.slice(2))
44
const tape = require('tape')
5-
const testing = require('ethereumjs-testing')
65
const config = require('./config')
6+
const testLoader = require('./testLoader')
77

88
function runTests() {
99
let name
@@ -35,20 +35,53 @@ function runTests() {
3535
/**
3636
* Run-time configuration
3737
*/
38-
let runnerArgs = argv
38+
let runnerArgs = {}
3939
runnerArgs.forkConfigVM = FORK_CONFIG_VM
4040
runnerArgs.forkConfigTestSuite = FORK_CONFIG_TEST_SUITE
4141
runnerArgs.jsontrace = argv.jsontrace
42+
runnerArgs.dist = argv.dist
4243
runnerArgs.data = argv.data // GeneralStateTests
4344
runnerArgs.gasLimit = argv.gas // GeneralStateTests
4445
runnerArgs.value = argv.value // GeneralStateTests
4546
runnerArgs.debug = argv.debug // BlockchainTests
4647

48+
/**
49+
* Initialization output to console
50+
*/
51+
const width = 50
52+
const fillWidth = width
53+
const fillParam = 20
54+
const delimiter = `| `.padEnd(fillWidth) + ' |'
55+
const formatArgs = (args) => {
56+
return Object.assign({}, ...
57+
Object.entries(args)
58+
.filter(([k,v]) => v && v.length !== 0)
59+
.map(([k,v]) => ({[k]:typeof(v) !== 'string' && v.length ? v.length : v}))
60+
)
61+
}
62+
const formattedGetterArgs = formatArgs(testGetterArgs)
63+
const formattedRunnerArgs = formatArgs(runnerArgs)
64+
65+
console.log(`+${'-'.repeat(width)}+`)
66+
console.log(`| VM -> ${name} `.padEnd(fillWidth) + ' |')
67+
console.log(delimiter)
68+
console.log(`| TestGetterArgs`.padEnd(fillWidth) + ' |')
69+
for (const [key, value] of Object.entries(formattedGetterArgs)) {
70+
console.log(`| ${key.padEnd(fillParam)}: ${value}`.padEnd(fillWidth) + ' |')
71+
}
72+
console.log(delimiter)
73+
console.log(`| RunnerArgs`.padEnd(fillWidth) + ' |')
74+
for (const [key, value] of Object.entries(formattedRunnerArgs)) {
75+
console.log(`| ${key.padEnd(fillParam)}: ${value}`.padEnd(fillWidth) + ' |')
76+
}
77+
console.log(`+${'-'.repeat(width)}+`)
78+
console.log()
79+
4780
if (argv.customStateTest) {
4881
const stateTestRunner = require('./GeneralStateTestsRunner.js')
4982
let fileName = argv.customStateTest
5083
tape(name, t => {
51-
testing.getTestFromSource(fileName, async (err, test) => {
84+
testLoader.getTestFromSource(fileName, async (err, test) => {
5285
if (err) {
5386
return t.fail(err)
5487
}
@@ -67,7 +100,7 @@ function runTests() {
67100
if (testGetterArgs.forkConfig !== 'Istanbul') {
68101
name = 'LegacyTests/Constantinople/'.concat(name)
69102
}
70-
testing.getTestsFromArgs(
103+
testLoader.getTestsFromArgs(
71104
name,
72105
async (fileName, testName, test) => {
73106
let runSkipped = testGetterArgs.runSkipped

0 commit comments

Comments
 (0)