Skip to content

Commit

Permalink
detect publishing builds with mismatching commit hashes
Browse files Browse the repository at this point in the history
  • Loading branch information
Techatrix committed May 21, 2024
1 parent 35a2edc commit bc668e0
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 40 deletions.
22 changes: 22 additions & 0 deletions src/publish.ts
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,28 @@ export async function handlePublish(
testedZigVersion: {},
};

if (!zlsVersion.isRelease && zlsVersion.commitHeight !== undefined) {
const result = await env.ZIGTOOLS_DB.prepare(
"SELECT ZLSVersion FROM ZLSReleases WHERE IsRelease = 0 AND ZLSVersionMajor = ?1 AND ZLSVersionMinor = ?2 AND ZLSVersionPatch = ?3 AND ZLSVersionBuildID = ?4",
)
.bind(
zlsVersion.major,
zlsVersion.minor,
zlsVersion.patch,
zlsVersion.commitHeight,
)
.first<{ ZLSVersion: string; JsonData: string }>();

if (result !== null && zlsVersionString !== result.ZLSVersion) {
return new Response(
`ZLS version is '${zlsVersionString}' can't be published because ZLS '${result.ZLSVersion}' has already been published!`,
{
status: 400, // Bad Request
},
);
}
}

await env.ZIGTOOLS_DB.batch([
env.ZIGTOOLS_DB.prepare(
"INSERT OR IGNORE INTO ZLSReleases VALUES (?1, ?2, ?3, ?4, ?5, ?6, json(?7))",
Expand Down
129 changes: 89 additions & 40 deletions test/publish.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { vi, describe, test, expect, beforeEach, afterEach } from "vitest";
import {
D2JsonData,
searchZLSRelease,
SQLiteQueryPlanRow,
xzMagicNumber,
zipMagicNumber,
} from "../src/shared";
Expand Down Expand Up @@ -515,14 +516,14 @@ describe("/v1/publish", () => {
expect(response.status).toBe(400);
});

test.todo("publish builds with mismatching commit hashes", async () => {
test("publish builds with mismatching commit hashes", async () => {
{
const response = await sendPublish({
zlsVersion: "0.11.0",
zigVersion: "0.11.0",
zlsVersion: "0.13.0-dev.1+aaaaaaa",
zigVersion: "0.12.0",
artifacts: [
[
"zls-linux-x86_64-0.11.0.tar.xz",
"zls-linux-x86_64-0.13.0-dev.1+aaaaaaa.tar.xz",
new Blob([xzMagicNumber, "binary1"]),
],
],
Expand All @@ -532,52 +533,35 @@ describe("/v1/publish", () => {
}

{
// different Zig version but same file
const response = await sendPublish({
zlsVersion: "0.11.0",
zigVersion: "0.11.1",
zlsVersion: "0.13.0-dev.1+bbbbbbb",
zigVersion: "0.12.0",
artifacts: [
[
"zls-linux-x86_64-0.11.0.tar.xz",
"zls-linux-x86_64-0.13.0-dev.1+bbbbbbb.tar.xz",
new Blob([xzMagicNumber, "binary1"]),
],
],
});
expect(await response.text()).toBe("");
expect(response.status).toBe(200);
expect(await response.text()).toBe(
"ZLS version is '0.13.0-dev.1+bbbbbbb' can't be published because ZLS '0.13.0-dev.1+aaaaaaa' has already been published!",
);
expect(response.status).toBe(400);
}
});

{
// same Zig version and same file
const response = await sendPublish({
zlsVersion: "0.11.0",
zigVersion: "0.11.0",
artifacts: [
[
"zls-linux-x86_64-0.11.0.tar.xz",
new Blob([xzMagicNumber, "binary1"]),
],
],
});
expect(await response.text()).toBe("");
expect(response.status).toBe(200);
}
test("explain query plan when searching for ZLS Version with different commit hash", async () => {
const response = await env.ZIGTOOLS_DB.prepare(
"EXPLAIN QUERY PLAN SELECT ZLSVersion FROM ZLSReleases WHERE IsRelease = 0 AND ZLSVersionMajor = 0 AND ZLSVersionMinor = 13 AND ZLSVersionPatch = 0 AND ZLSVersionBuildID = 1",
).all<SQLiteQueryPlanRow>();

{
// same Zig version but different file
const response = await sendPublish({
zlsVersion: "0.11.0",
zigVersion: "0.11.0",
artifacts: [
[
"zls-linux-x86_64-0.11.0.tar.xz",
new Blob([xzMagicNumber, "binary2"]),
],
],
});
expect(await response.text()).toBe("TODO");
expect(response.status).toBe(400);
}
expect(response.results).toMatchObject([
{
notused: 0,
detail:
"SEARCH ZLSReleases USING INDEX idx_zls_releases_is_release_major_minor_patch (IsRelease=? AND ZLSVersionMajor=? AND ZLSVersionMinor=? AND ZLSVersionPatch=?)",
},
]);
});

test("publish new successfull build then add failures", async () => {
Expand Down Expand Up @@ -673,4 +657,69 @@ describe("/v1/publish", () => {
],
});
});

test("publish new successfull build with different Zig versions", async () => {
const date = Date.now();
vi.setSystemTime(date);

{
const response = await sendPublish({
zlsVersion: "0.11.0",
zigVersion: "0.11.0",
artifacts: [
[
"zls-linux-x86_64-0.11.0.tar.xz",
new Blob([xzMagicNumber, "binary1"]),
],
],
});
expect(await response.text()).toBe("");
expect(response.status).toBe(200);
}

{
const response = await sendPublish({
zlsVersion: "0.11.0",
zigVersion: "0.11.1",
artifacts: [
[
"zls-linux-x86_64-0.11.0.tar.xz",
new Blob([xzMagicNumber, "binary2"]),
],
[
"zls-windows-aarch64-0.11.0.zip",
new Blob([zipMagicNumber, "binary2"]),
],
],
});
expect(await response.text()).toBe("");
expect(response.status).toBe(200);
}

const jsonData = await searchZLSRelease(env, "0.11.0");
expect(jsonData).toStrictEqual<D2JsonData>({
date: date,
zlsVersion: "0.11.0",
zigVersion: "0.11.0",
minimumBuildZigVersion: "0.11.0",
minimumRuntimeZigVersion: "0.11.0",
testedZigVersion: {
"0.11.0": true,
"0.11.1": true,
},
artifacts: [
{
arch: "x86_64",
os: "linux",
version: "0.11.0",
extension: "tar.xz",
file_shasum: createHash("sha256")
.update(xzMagicNumber)
.update("binary1")
.digest("hex"),
file_size: xzMagicNumber.byteLength + 7,
},
],
});
});
});
1 change: 1 addition & 0 deletions test/select-zls-version.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ describe("/v1/select-zls-version", () => {
["0.12.0-dev.15+aaaaaaaaa", "0.12.0-dev.3+aaaaaaaaa"],
["0.12.0-dev.17+aaaaaaaaa", "0.12.0-dev.3+aaaaaaaaa"],
["0.12.0-dev.18+aaaaaaaaa", "0.12.0-dev.3+aaaaaaaaa"],
["0.15.0", null],
])("Zig %s -> ZLS %s", async (zigVersion, expectedZLSVersion) => {
const response = await selectZLSVersion(zigVersion);
expect(response?.version ?? null).toBe(expectedZLSVersion);
Expand Down

0 comments on commit bc668e0

Please sign in to comment.