Fix test failures on Windows related to path separators

This commit is contained in:
Henry Mercer
2022-06-16 16:21:19 -07:00
parent 79ec03f3e5
commit 4792297702
9 changed files with 100 additions and 65 deletions

8
lib/config-utils.js generated
View File

@@ -728,7 +728,13 @@ function validatePacksSpecification(packStr, configFile) {
} }
} }
if (packPath && if (packPath &&
(path.isAbsolute(packPath) || path.normalize(packPath) !== packPath)) { (path.isAbsolute(packPath) ||
// Permit using "/" instead of "\" on Windows
// Use `x.split(y).join(z)` as a polyfill for `x.replaceAll(y, z)` since
// if we used a regex we'd need to escape the path separator on Windows
// which seems more awkward.
path.normalize(packPath).split(path.sep).join("/") !==
packPath.split(path.sep).join("/"))) {
throw new Error(getPacksStrInvalid(packStr, configFile)); throw new Error(getPacksStrInvalid(packStr, configFile));
} }
if (!packPath && pathStart) { if (!packPath && pathStart) {

File diff suppressed because one or more lines are too long

View File

@@ -308,12 +308,12 @@ function queriesToResolvedQueryForm(queries) {
// and once for `./foo` from the config file. // and once for `./foo` from the config file.
t.deepEqual(resolveQueriesArgs.length, 2); t.deepEqual(resolveQueriesArgs.length, 2);
t.deepEqual(resolveQueriesArgs[1].queries.length, 1); t.deepEqual(resolveQueriesArgs[1].queries.length, 1);
t.regex(resolveQueriesArgs[1].queries[0], /.*\/foo$/); t.true(resolveQueriesArgs[1].queries[0].endsWith(`${path.sep}foo`));
// Now check that the end result contains the default queries and the query from config // Now check that the end result contains the default queries and the query from config
t.deepEqual(config.queries["javascript"].builtin.length, 1); t.deepEqual(config.queries["javascript"].builtin.length, 1);
t.deepEqual(config.queries["javascript"].custom.length, 1); t.deepEqual(config.queries["javascript"].custom.length, 1);
t.regex(config.queries["javascript"].builtin[0], /javascript-code-scanning.qls$/); t.true(config.queries["javascript"].builtin[0].endsWith("javascript-code-scanning.qls"));
t.regex(config.queries["javascript"].custom[0].queries[0], /.*\/foo$/); t.true(config.queries["javascript"].custom[0].queries[0].endsWith(`${path.sep}foo`));
}); });
}); });
(0, ava_1.default)("Queries from config file can be overridden in workflow file", async (t) => { (0, ava_1.default)("Queries from config file can be overridden in workflow file", async (t) => {
@@ -341,12 +341,12 @@ function queriesToResolvedQueryForm(queries) {
// but won't be called for './foo' from the config file. // but won't be called for './foo' from the config file.
t.deepEqual(resolveQueriesArgs.length, 2); t.deepEqual(resolveQueriesArgs.length, 2);
t.deepEqual(resolveQueriesArgs[1].queries.length, 1); t.deepEqual(resolveQueriesArgs[1].queries.length, 1);
t.regex(resolveQueriesArgs[1].queries[0], /.*\/override$/); t.true(resolveQueriesArgs[1].queries[0].endsWith(`${path.sep}override`));
// Now check that the end result contains only the default queries and the override query // Now check that the end result contains only the default queries and the override query
t.deepEqual(config.queries["javascript"].builtin.length, 1); t.deepEqual(config.queries["javascript"].builtin.length, 1);
t.deepEqual(config.queries["javascript"].custom.length, 1); t.deepEqual(config.queries["javascript"].custom.length, 1);
t.regex(config.queries["javascript"].builtin[0], /javascript-code-scanning.qls$/); t.true(config.queries["javascript"].builtin[0].endsWith("javascript-code-scanning.qls"));
t.regex(config.queries["javascript"].custom[0].queries[0], /.*\/override$/); t.true(config.queries["javascript"].custom[0].queries[0].endsWith(`${path.sep}override`));
}); });
}); });
(0, ava_1.default)("Queries in workflow file can be used in tandem with the 'disable default queries' option", async (t) => { (0, ava_1.default)("Queries in workflow file can be used in tandem with the 'disable default queries' option", async (t) => {
@@ -373,11 +373,11 @@ function queriesToResolvedQueryForm(queries) {
// but won't be called for the default one since that was disabled // but won't be called for the default one since that was disabled
t.deepEqual(resolveQueriesArgs.length, 1); t.deepEqual(resolveQueriesArgs.length, 1);
t.deepEqual(resolveQueriesArgs[0].queries.length, 1); t.deepEqual(resolveQueriesArgs[0].queries.length, 1);
t.regex(resolveQueriesArgs[0].queries[0], /.*\/workflow-query$/); t.true(resolveQueriesArgs[0].queries[0].endsWith(`${path.sep}workflow-query`));
// Now check that the end result contains only the workflow query, and not the default one // Now check that the end result contains only the workflow query, and not the default one
t.deepEqual(config.queries["javascript"].builtin.length, 0); t.deepEqual(config.queries["javascript"].builtin.length, 0);
t.deepEqual(config.queries["javascript"].custom.length, 1); t.deepEqual(config.queries["javascript"].custom.length, 1);
t.regex(config.queries["javascript"].custom[0].queries[0], /.*\/workflow-query$/); t.true(config.queries["javascript"].custom[0].queries[0].endsWith(`${path.sep}workflow-query`));
}); });
}); });
(0, ava_1.default)("Multiple queries can be specified in workflow file, no config file required", async (t) => { (0, ava_1.default)("Multiple queries can be specified in workflow file, no config file required", async (t) => {
@@ -400,14 +400,14 @@ function queriesToResolvedQueryForm(queries) {
t.deepEqual(resolveQueriesArgs.length, 3); t.deepEqual(resolveQueriesArgs.length, 3);
t.deepEqual(resolveQueriesArgs[1].queries.length, 1); t.deepEqual(resolveQueriesArgs[1].queries.length, 1);
t.deepEqual(resolveQueriesArgs[2].queries.length, 1); t.deepEqual(resolveQueriesArgs[2].queries.length, 1);
t.regex(resolveQueriesArgs[1].queries[0], /.*\/override1$/); t.true(resolveQueriesArgs[1].queries[0].endsWith(`${path.sep}override1`));
t.regex(resolveQueriesArgs[2].queries[0], /.*\/override2$/); t.true(resolveQueriesArgs[2].queries[0].endsWith(`${path.sep}override2`));
// Now check that the end result contains both the queries from the workflow, as well as the defaults // Now check that the end result contains both the queries from the workflow, as well as the defaults
t.deepEqual(config.queries["javascript"].builtin.length, 1); t.deepEqual(config.queries["javascript"].builtin.length, 1);
t.deepEqual(config.queries["javascript"].custom.length, 2); t.deepEqual(config.queries["javascript"].custom.length, 2);
t.regex(config.queries["javascript"].builtin[0], /javascript-code-scanning.qls$/); t.true(config.queries["javascript"].builtin[0].endsWith("javascript-code-scanning.qls"));
t.regex(config.queries["javascript"].custom[0].queries[0], /.*\/override1$/); t.true(config.queries["javascript"].custom[0].queries[0].endsWith(`${path.sep}override1`));
t.regex(config.queries["javascript"].custom[1].queries[0], /.*\/override2$/); t.true(config.queries["javascript"].custom[1].queries[0].endsWith(`${path.sep}override2`));
}); });
}); });
(0, ava_1.default)("Queries in workflow file can be added to the set of queries without overriding config file", async (t) => { (0, ava_1.default)("Queries in workflow file can be added to the set of queries without overriding config file", async (t) => {
@@ -439,18 +439,18 @@ function queriesToResolvedQueryForm(queries) {
// and once for './foo' from the config file // and once for './foo' from the config file
t.deepEqual(resolveQueriesArgs.length, 4); t.deepEqual(resolveQueriesArgs.length, 4);
t.deepEqual(resolveQueriesArgs[1].queries.length, 1); t.deepEqual(resolveQueriesArgs[1].queries.length, 1);
t.regex(resolveQueriesArgs[1].queries[0], /.*\/additional1$/); t.true(resolveQueriesArgs[1].queries[0].endsWith(`${path.sep}additional1`));
t.deepEqual(resolveQueriesArgs[2].queries.length, 1); t.deepEqual(resolveQueriesArgs[2].queries.length, 1);
t.regex(resolveQueriesArgs[2].queries[0], /.*\/additional2$/); t.true(resolveQueriesArgs[2].queries[0].endsWith(`${path.sep}additional2`));
t.deepEqual(resolveQueriesArgs[3].queries.length, 1); t.deepEqual(resolveQueriesArgs[3].queries.length, 1);
t.regex(resolveQueriesArgs[3].queries[0], /.*\/foo$/); t.true(resolveQueriesArgs[3].queries[0].endsWith(`${path.sep}foo`));
// Now check that the end result contains all the queries // Now check that the end result contains all the queries
t.deepEqual(config.queries["javascript"].builtin.length, 1); t.deepEqual(config.queries["javascript"].builtin.length, 1);
t.deepEqual(config.queries["javascript"].custom.length, 3); t.deepEqual(config.queries["javascript"].custom.length, 3);
t.regex(config.queries["javascript"].builtin[0], /javascript-code-scanning.qls$/); t.true(config.queries["javascript"].builtin[0].endsWith("javascript-code-scanning.qls"));
t.regex(config.queries["javascript"].custom[0].queries[0], /.*\/additional1$/); t.true(config.queries["javascript"].custom[0].queries[0].endsWith(`${path.sep}additional1`));
t.regex(config.queries["javascript"].custom[1].queries[0], /.*\/additional2$/); t.true(config.queries["javascript"].custom[1].queries[0].endsWith(`${path.sep}additional2`));
t.regex(config.queries["javascript"].custom[2].queries[0], /.*\/foo$/); t.true(config.queries["javascript"].custom[2].queries[0].endsWith(`${path.sep}foo`));
}); });
}); });
(0, ava_1.default)("Invalid queries in workflow file handled correctly", async (t) => { (0, ava_1.default)("Invalid queries in workflow file handled correctly", async (t) => {

File diff suppressed because one or more lines are too long

View File

@@ -137,7 +137,7 @@ function testResolveUriToFile(uri, index, artifactsURIs) {
// should generally always be the case so this is fine. // should generally always be the case so this is fine.
const cwd = process.cwd(); const cwd = process.cwd();
const filepath = __filename; const filepath = __filename;
t.true(filepath.startsWith(`${cwd}/`)); t.true(filepath.startsWith(cwd + path.sep));
const relativeFilepath = filepath.substring(cwd.length + 1); const relativeFilepath = filepath.substring(cwd.length + 1);
// Absolute paths are unmodified // Absolute paths are unmodified
t.is(testResolveUriToFile(filepath, undefined, []), filepath); t.is(testResolveUriToFile(filepath, undefined, []), filepath);

File diff suppressed because one or more lines are too long

View File

@@ -519,16 +519,21 @@ test("Queries can be specified in config file", async (t) => {
// and once for `./foo` from the config file. // and once for `./foo` from the config file.
t.deepEqual(resolveQueriesArgs.length, 2); t.deepEqual(resolveQueriesArgs.length, 2);
t.deepEqual(resolveQueriesArgs[1].queries.length, 1); t.deepEqual(resolveQueriesArgs[1].queries.length, 1);
t.regex(resolveQueriesArgs[1].queries[0], /.*\/foo$/); t.true(resolveQueriesArgs[1].queries[0].endsWith(`${path.sep}foo`));
// Now check that the end result contains the default queries and the query from config // Now check that the end result contains the default queries and the query from config
t.deepEqual(config.queries["javascript"].builtin.length, 1); t.deepEqual(config.queries["javascript"].builtin.length, 1);
t.deepEqual(config.queries["javascript"].custom.length, 1); t.deepEqual(config.queries["javascript"].custom.length, 1);
t.regex( t.true(
config.queries["javascript"].builtin[0], config.queries["javascript"].builtin[0].endsWith(
/javascript-code-scanning.qls$/ "javascript-code-scanning.qls"
)
);
t.true(
config.queries["javascript"].custom[0].queries[0].endsWith(
`${path.sep}foo`
)
); );
t.regex(config.queries["javascript"].custom[0].queries[0], /.*\/foo$/);
}); });
}); });
@@ -587,16 +592,21 @@ test("Queries from config file can be overridden in workflow file", async (t) =>
// but won't be called for './foo' from the config file. // but won't be called for './foo' from the config file.
t.deepEqual(resolveQueriesArgs.length, 2); t.deepEqual(resolveQueriesArgs.length, 2);
t.deepEqual(resolveQueriesArgs[1].queries.length, 1); t.deepEqual(resolveQueriesArgs[1].queries.length, 1);
t.regex(resolveQueriesArgs[1].queries[0], /.*\/override$/); t.true(resolveQueriesArgs[1].queries[0].endsWith(`${path.sep}override`));
// Now check that the end result contains only the default queries and the override query // Now check that the end result contains only the default queries and the override query
t.deepEqual(config.queries["javascript"].builtin.length, 1); t.deepEqual(config.queries["javascript"].builtin.length, 1);
t.deepEqual(config.queries["javascript"].custom.length, 1); t.deepEqual(config.queries["javascript"].custom.length, 1);
t.regex( t.true(
config.queries["javascript"].builtin[0], config.queries["javascript"].builtin[0].endsWith(
/javascript-code-scanning.qls$/ "javascript-code-scanning.qls"
)
);
t.true(
config.queries["javascript"].custom[0].queries[0].endsWith(
`${path.sep}override`
)
); );
t.regex(config.queries["javascript"].custom[0].queries[0], /.*\/override$/);
}); });
}); });
@@ -653,14 +663,17 @@ test("Queries in workflow file can be used in tandem with the 'disable default q
// but won't be called for the default one since that was disabled // but won't be called for the default one since that was disabled
t.deepEqual(resolveQueriesArgs.length, 1); t.deepEqual(resolveQueriesArgs.length, 1);
t.deepEqual(resolveQueriesArgs[0].queries.length, 1); t.deepEqual(resolveQueriesArgs[0].queries.length, 1);
t.regex(resolveQueriesArgs[0].queries[0], /.*\/workflow-query$/); t.true(
resolveQueriesArgs[0].queries[0].endsWith(`${path.sep}workflow-query`)
);
// Now check that the end result contains only the workflow query, and not the default one // Now check that the end result contains only the workflow query, and not the default one
t.deepEqual(config.queries["javascript"].builtin.length, 0); t.deepEqual(config.queries["javascript"].builtin.length, 0);
t.deepEqual(config.queries["javascript"].custom.length, 1); t.deepEqual(config.queries["javascript"].custom.length, 1);
t.regex( t.true(
config.queries["javascript"].custom[0].queries[0], config.queries["javascript"].custom[0].queries[0].endsWith(
/.*\/workflow-query$/ `${path.sep}workflow-query`
)
); );
}); });
}); });
@@ -713,23 +726,26 @@ test("Multiple queries can be specified in workflow file, no config file require
t.deepEqual(resolveQueriesArgs.length, 3); t.deepEqual(resolveQueriesArgs.length, 3);
t.deepEqual(resolveQueriesArgs[1].queries.length, 1); t.deepEqual(resolveQueriesArgs[1].queries.length, 1);
t.deepEqual(resolveQueriesArgs[2].queries.length, 1); t.deepEqual(resolveQueriesArgs[2].queries.length, 1);
t.regex(resolveQueriesArgs[1].queries[0], /.*\/override1$/); t.true(resolveQueriesArgs[1].queries[0].endsWith(`${path.sep}override1`));
t.regex(resolveQueriesArgs[2].queries[0], /.*\/override2$/); t.true(resolveQueriesArgs[2].queries[0].endsWith(`${path.sep}override2`));
// Now check that the end result contains both the queries from the workflow, as well as the defaults // Now check that the end result contains both the queries from the workflow, as well as the defaults
t.deepEqual(config.queries["javascript"].builtin.length, 1); t.deepEqual(config.queries["javascript"].builtin.length, 1);
t.deepEqual(config.queries["javascript"].custom.length, 2); t.deepEqual(config.queries["javascript"].custom.length, 2);
t.regex( t.true(
config.queries["javascript"].builtin[0], config.queries["javascript"].builtin[0].endsWith(
/javascript-code-scanning.qls$/ "javascript-code-scanning.qls"
)
); );
t.regex( t.true(
config.queries["javascript"].custom[0].queries[0], config.queries["javascript"].custom[0].queries[0].endsWith(
/.*\/override1$/ `${path.sep}override1`
)
); );
t.regex( t.true(
config.queries["javascript"].custom[1].queries[0], config.queries["javascript"].custom[1].queries[0].endsWith(
/.*\/override2$/ `${path.sep}override2`
)
); );
}); });
}); });
@@ -793,28 +809,35 @@ test("Queries in workflow file can be added to the set of queries without overri
// and once for './foo' from the config file // and once for './foo' from the config file
t.deepEqual(resolveQueriesArgs.length, 4); t.deepEqual(resolveQueriesArgs.length, 4);
t.deepEqual(resolveQueriesArgs[1].queries.length, 1); t.deepEqual(resolveQueriesArgs[1].queries.length, 1);
t.regex(resolveQueriesArgs[1].queries[0], /.*\/additional1$/); t.true(resolveQueriesArgs[1].queries[0].endsWith(`${path.sep}additional1`));
t.deepEqual(resolveQueriesArgs[2].queries.length, 1); t.deepEqual(resolveQueriesArgs[2].queries.length, 1);
t.regex(resolveQueriesArgs[2].queries[0], /.*\/additional2$/); t.true(resolveQueriesArgs[2].queries[0].endsWith(`${path.sep}additional2`));
t.deepEqual(resolveQueriesArgs[3].queries.length, 1); t.deepEqual(resolveQueriesArgs[3].queries.length, 1);
t.regex(resolveQueriesArgs[3].queries[0], /.*\/foo$/); t.true(resolveQueriesArgs[3].queries[0].endsWith(`${path.sep}foo`));
// Now check that the end result contains all the queries // Now check that the end result contains all the queries
t.deepEqual(config.queries["javascript"].builtin.length, 1); t.deepEqual(config.queries["javascript"].builtin.length, 1);
t.deepEqual(config.queries["javascript"].custom.length, 3); t.deepEqual(config.queries["javascript"].custom.length, 3);
t.regex( t.true(
config.queries["javascript"].builtin[0], config.queries["javascript"].builtin[0].endsWith(
/javascript-code-scanning.qls$/ "javascript-code-scanning.qls"
)
); );
t.regex( t.true(
config.queries["javascript"].custom[0].queries[0], config.queries["javascript"].custom[0].queries[0].endsWith(
/.*\/additional1$/ `${path.sep}additional1`
)
); );
t.regex( t.true(
config.queries["javascript"].custom[1].queries[0], config.queries["javascript"].custom[1].queries[0].endsWith(
/.*\/additional2$/ `${path.sep}additional2`
)
);
t.true(
config.queries["javascript"].custom[2].queries[0].endsWith(
`${path.sep}foo`
)
); );
t.regex(config.queries["javascript"].custom[2].queries[0], /.*\/foo$/);
}); });
}); });

View File

@@ -1275,7 +1275,13 @@ export function validatePacksSpecification(
if ( if (
packPath && packPath &&
(path.isAbsolute(packPath) || path.normalize(packPath) !== packPath) (path.isAbsolute(packPath) ||
// Permit using "/" instead of "\" on Windows
// Use `x.split(y).join(z)` as a polyfill for `x.replaceAll(y, z)` since
// if we used a regex we'd need to escape the path separator on Windows
// which seems more awkward.
path.normalize(packPath).split(path.sep).join("/") !==
packPath.split(path.sep).join("/"))
) { ) {
throw new Error(getPacksStrInvalid(packStr, configFile)); throw new Error(getPacksStrInvalid(packStr, configFile));
} }

View File

@@ -141,7 +141,7 @@ test("resolveUriToFile", (t) => {
// should generally always be the case so this is fine. // should generally always be the case so this is fine.
const cwd = process.cwd(); const cwd = process.cwd();
const filepath = __filename; const filepath = __filename;
t.true(filepath.startsWith(`${cwd}/`)); t.true(filepath.startsWith(cwd + path.sep));
const relativeFilepath = filepath.substring(cwd.length + 1); const relativeFilepath = filepath.substring(cwd.length + 1);
// Absolute paths are unmodified // Absolute paths are unmodified