diff --git a/scripts/lib/extension-test-plan.mjs b/scripts/lib/extension-test-plan.mjs index 1369b06df5c..8b9d74589ca 100644 --- a/scripts/lib/extension-test-plan.mjs +++ b/scripts/lib/extension-test-plan.mjs @@ -30,8 +30,28 @@ import { listAvailableExtensionIds } from "./changed-extensions.mjs"; const repoRoot = path.resolve(import.meta.dirname, "..", ".."); export const DEFAULT_EXTENSION_TEST_SHARD_COUNT = 6; const EXTENSION_TEST_COST_MULTIPLIERS = { - "test/vitest/vitest.extension-feishu.config.ts": 1.6, - "test/vitest/vitest.extension-msteams.config.ts": 1.6, + // CI shard planning uses measured wall time rather than raw file count. + // Import-heavy channel suites vary widely: Slack/Mattermost are much more + // expensive per file than Matrix/Discord/MSTeams. + "test/vitest/vitest.extension-bluebubbles.config.ts": 0.8, + "test/vitest/vitest.extension-browser.config.ts": 0.55, + "test/vitest/vitest.extension-discord.config.ts": 0.3, + "test/vitest/vitest.extension-feishu.config.ts": 0.6, + "test/vitest/vitest.extension-imessage.config.ts": 0.9, + "test/vitest/vitest.extension-matrix.config.ts": 0.25, + "test/vitest/vitest.extension-mattermost.config.ts": 1.05, + "test/vitest/vitest.extension-media.config.ts": 0.7, + "test/vitest/vitest.extension-memory.config.ts": 0.3, + "test/vitest/vitest.extension-messaging.config.ts": 0.4, + "test/vitest/vitest.extension-misc.config.ts": 0.7, + "test/vitest/vitest.extension-msteams.config.ts": 0.3, + "test/vitest/vitest.extension-providers.config.ts": 0.5, + "test/vitest/vitest.extension-qa.config.ts": 0.4, + "test/vitest/vitest.extension-slack.config.ts": 0.7, + "test/vitest/vitest.extension-telegram.config.ts": 0.4, + "test/vitest/vitest.extension-voice-call.config.ts": 0.25, + "test/vitest/vitest.extension-whatsapp.config.ts": 0.6, + "test/vitest/vitest.extension-zalo.config.ts": 0.7, // This shared config is comparatively cheap per file, so raw file count // overstates its real wall-clock cost during CI shard planning. "test/vitest/vitest.extensions.config.ts": 0.45, diff --git a/test/scripts/test-extension.test.ts b/test/scripts/test-extension.test.ts index 0853c97eaf0..6ed409aee7f 100644 --- a/test/scripts/test-extension.test.ts +++ b/test/scripts/test-extension.test.ts @@ -476,10 +476,22 @@ describe("scripts/test-extension.mjs", () => { const msTeamsShardIndex = shards.findIndex((shard) => shard.extensionIds.includes("msteams")); const feishuShardIndex = shards.findIndex((shard) => shard.extensionIds.includes("feishu")); + const browserShardIndex = shards.findIndex((shard) => shard.extensionIds.includes("browser")); + const slackShardIndex = shards.findIndex((shard) => shard.extensionIds.includes("slack")); + const matrixShardIndex = shards.findIndex((shard) => shard.extensionIds.includes("matrix")); + const mattermostShardIndex = shards.findIndex((shard) => + shard.extensionIds.includes("mattermost"), + ); expect(msTeamsShardIndex).toBeGreaterThanOrEqual(0); expect(feishuShardIndex).toBeGreaterThanOrEqual(0); expect(msTeamsShardIndex).not.toBe(feishuShardIndex); + expect(browserShardIndex).toBeGreaterThanOrEqual(0); + expect(slackShardIndex).toBeGreaterThanOrEqual(0); + expect(browserShardIndex).not.toBe(slackShardIndex); + expect(matrixShardIndex).toBeGreaterThanOrEqual(0); + expect(mattermostShardIndex).toBeGreaterThanOrEqual(0); + expect(matrixShardIndex).not.toBe(mattermostShardIndex); }); it("runs extension batch config groups concurrently when requested", async () => {