Skip to content

Commit f5596e0

Browse files
authored
fix: try to install browser version when user will not install ChromeDriver (#551)
Installing ChromeDriver (#548) resolves a version which includes both the Chrome browser and ChromeDriver download URLs from [known-good-versions-with-downloads.json](https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json). Before this change, user was able to install a version which includes only chrome download URL. The action should be able to download chrome browser if the user does specifies "install-chromedriver: false" and matched version does not include ChromeDriver. This PR enables to install browser if the version does not include ChromeDriver on "install-chromedriver: false". Close #550
1 parent d28371d commit f5596e0

File tree

5 files changed

+118
-18
lines changed

5 files changed

+118
-18
lines changed

__test__/chrome_for_testing.test.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ describe("KnownGoodVersionResolver", () => {
4141
os: "linux",
4242
arch: "amd64",
4343
});
44-
const resolved = await resolver.resolve(spec);
44+
const resolved = await resolver.resolveBrowserAndDriver(spec);
4545
expect(resolved?.version).toEqual(version);
4646
expect(resolved?.browserDownloadURL).toEqual(browserURL);
4747
expect(resolved?.driverDownloadURL).toEqual(driverURL);
@@ -53,11 +53,27 @@ describe("KnownGoodVersionResolver", () => {
5353
os: "linux",
5454
arch: "amd64",
5555
});
56-
await resolver.resolve("120.0.6099.5");
57-
await resolver.resolve("120.0.6099.18");
56+
await resolver.resolveBrowserAndDriver("120.0.6099.5");
57+
await resolver.resolveBrowserAndDriver("120.0.6099.18");
5858
expect(getJsonSpy).toHaveBeenCalledTimes(1);
5959
});
6060

61+
test("should resolve only browser download URL", async () => {
62+
const resolver = new KnownGoodVersionResolver({
63+
os: "linux",
64+
arch: "amd64",
65+
});
66+
67+
const resolved1 = await resolver.resolveBrowserAndDriver("113.0.5672.0");
68+
expect(resolved1).toBeUndefined();
69+
70+
const resolved2 = await resolver.resolveBrowserOnly("113.0.5672.0");
71+
expect(resolved2?.version).toEqual("113.0.5672.0");
72+
expect(resolved2?.browserDownloadURL).toEqual(
73+
"https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/113.0.5672.0/linux64/chrome-linux64.zip",
74+
);
75+
});
76+
6177
test("unsupported platform", async () => {
6278
expect(() => {
6379
new LastKnownGoodVersionResolver({

__test__/version_installer.test.ts

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@ afterEach(() => {
3232
});
3333

3434
describe("KnownGoodVersionInstaller", () => {
35-
const installer = new KnownGoodVersionInstaller({
36-
os: "linux",
37-
arch: "amd64",
38-
});
35+
const installer = new KnownGoodVersionInstaller(
36+
{
37+
os: "linux",
38+
arch: "amd64",
39+
},
40+
{ resolveBrowserVersionOnly: false },
41+
);
3942

4043
test("checkInstalledBrowser should return installed path if installed", async () => {
4144
cacheFindSpy.mockResolvedValue(
@@ -100,6 +103,19 @@ describe("KnownGoodVersionInstaller", () => {
100103
expect(tcDownloadToolSpy).toHaveBeenCalled();
101104
});
102105

106+
test("downloadDriver should throw an error when browser only mode", async () => {
107+
const installer = new KnownGoodVersionInstaller(
108+
{
109+
os: "linux",
110+
arch: "amd64",
111+
},
112+
{ resolveBrowserVersionOnly: true },
113+
);
114+
expect(installer.downloadDriver("120.0.6099.x")).rejects.toThrowError(
115+
"Unexpectedly trying to download chromedriver",
116+
);
117+
});
118+
103119
test("installDriver should install driver", async () => {
104120
tcExtractZipSpy.mockImplementation(async () => "/tmp/extracted");
105121
cacheCacheDirSpy.mockImplementation(async () => "/path/to/chromedriver");
@@ -118,4 +134,17 @@ describe("KnownGoodVersionInstaller", () => {
118134
"120.0.6099.56",
119135
);
120136
});
137+
138+
test("installDriver should throw an error when browser only mode", async () => {
139+
const installer = new KnownGoodVersionInstaller(
140+
{
141+
os: "linux",
142+
arch: "amd64",
143+
},
144+
{ resolveBrowserVersionOnly: true },
145+
);
146+
expect(
147+
installer.installDriver("120.0.6099.x", "/tmp/chromedriver.zip"),
148+
).rejects.toThrowError("Unexpectedly trying to install chromedriver");
149+
});
121150
});

src/chrome_for_testing.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ const platformString = (platform: Platform): PlatformString => {
7676
throw new Error(`Unsupported platform: ${platform.os} ${platform.arch}`);
7777
};
7878

79+
type BrowserOnlyResolvedVersion = {
80+
version: string;
81+
browserDownloadURL: string;
82+
};
83+
7984
type ResolvedVersion = {
8085
version: string;
8186
browserDownloadURL: string;
@@ -93,9 +98,32 @@ export class KnownGoodVersionResolver {
9398
this.platformString = platformString(platform);
9499
}
95100

96-
async resolve(version: string): Promise<ResolvedVersion | undefined> {
101+
async resolveBrowserOnly(
102+
version: string,
103+
): Promise<BrowserOnlyResolvedVersion | undefined> {
97104
const spec = parse(version);
105+
const knownGoodVersions = await this.getKnownGoodVersions();
106+
for (const version of knownGoodVersions) {
107+
if (!spec.satisfies(version.version)) {
108+
continue;
109+
}
110+
const browser = version.downloads.chrome?.find(
111+
({ platform }) => platform === this.platformString,
112+
);
98113

114+
if (browser) {
115+
return {
116+
version: version.version,
117+
browserDownloadURL: browser.url,
118+
};
119+
}
120+
}
121+
}
122+
123+
async resolveBrowserAndDriver(
124+
version: string,
125+
): Promise<ResolvedVersion | undefined> {
126+
const spec = parse(version);
99127
const knownGoodVersions = await this.getKnownGoodVersions();
100128
for (const version of knownGoodVersions) {
101129
if (!spec.satisfies(version.version)) {

src/index.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ const hasErrorMessage = (e: unknown): e is { message: string | Error } => {
1616
return typeof e === "object" && e !== null && "message" in e;
1717
};
1818

19-
const getInstaller = (platform: Platform, version: string) => {
19+
const getInstaller = (
20+
platform: Platform,
21+
version: string,
22+
{ resolveBrowserVersionOnly }: { resolveBrowserVersionOnly: boolean },
23+
) => {
2024
const spec = parse(version);
2125
switch (spec.value.type) {
2226
case "latest":
@@ -34,7 +38,9 @@ const getInstaller = (platform: Platform, version: string) => {
3438
case "snapshot":
3539
return new SnapshotInstaller(platform);
3640
case "four-parts":
37-
return new KnownGoodVersionInstaller(platform);
41+
return new KnownGoodVersionInstaller(platform, {
42+
resolveBrowserVersionOnly,
43+
});
3844
}
3945
};
4046

@@ -136,7 +142,10 @@ async function run(): Promise<void> {
136142

137143
core.info(`Setup chrome ${version}`);
138144

139-
const installer = getInstaller(platform, version);
145+
const resolveBrowserVersionOnly = !flgInstallChromedriver;
146+
const installer = getInstaller(platform, version, {
147+
resolveBrowserVersionOnly,
148+
});
140149
const browserBinPath = await installBrowser(installer, version);
141150
const actualBrowserVersion = await testVersion(platform, browserBinPath);
142151

src/version_installer.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@ import type { DownloadResult, InstallResult, Installer } from "./installer";
77
import { OS, type Platform } from "./platform";
88

99
export class KnownGoodVersionInstaller implements Installer {
10-
private readonly versionResolver: KnownGoodVersionResolver;
1110
private readonly platform: Platform;
11+
private readonly resolveBrowserVersionOnly: boolean;
12+
private readonly versionResolver: KnownGoodVersionResolver;
1213

13-
constructor(platform: Platform) {
14+
constructor(
15+
platform: Platform,
16+
{ resolveBrowserVersionOnly }: { resolveBrowserVersionOnly: boolean },
17+
) {
1418
this.platform = platform;
15-
19+
this.resolveBrowserVersionOnly = resolveBrowserVersionOnly;
1620
this.versionResolver = new KnownGoodVersionResolver(this.platform);
1721
}
1822

@@ -26,7 +30,9 @@ export class KnownGoodVersionInstaller implements Installer {
2630
}
2731

2832
async downloadBrowser(version: string): Promise<DownloadResult> {
29-
const resolved = await this.versionResolver.resolve(version);
33+
const resolved = this.resolveBrowserVersionOnly
34+
? await this.versionResolver.resolveBrowserOnly(version)
35+
: await this.versionResolver.resolveBrowserAndDriver(version);
3036
if (!resolved) {
3137
throw new Error(`Version ${version} not found in known good versions`);
3238
}
@@ -42,7 +48,9 @@ export class KnownGoodVersionInstaller implements Installer {
4248
version: string,
4349
archive: string,
4450
): Promise<InstallResult> {
45-
const resolved = await this.versionResolver.resolve(version);
51+
const resolved = this.resolveBrowserVersionOnly
52+
? await this.versionResolver.resolveBrowserOnly(version)
53+
: await this.versionResolver.resolveBrowserAndDriver(version);
4654
if (!resolved) {
4755
throw new Error(`Version ${version} not found in known good versions`);
4856
}
@@ -77,7 +85,12 @@ export class KnownGoodVersionInstaller implements Installer {
7785
}
7886

7987
async downloadDriver(version: string): Promise<DownloadResult> {
80-
const resolved = await this.versionResolver.resolve(version);
88+
if (this.resolveBrowserVersionOnly) {
89+
throw new Error("Unexpectedly trying to download chromedriver");
90+
}
91+
92+
const resolved =
93+
await this.versionResolver.resolveBrowserAndDriver(version);
8194
if (!resolved) {
8295
throw new Error(`Version ${version} not found in known good versions`);
8396
}
@@ -93,7 +106,12 @@ export class KnownGoodVersionInstaller implements Installer {
93106
version: string,
94107
archive: string,
95108
): Promise<InstallResult> {
96-
const resolved = await this.versionResolver.resolve(version);
109+
if (this.resolveBrowserVersionOnly) {
110+
throw new Error("Unexpectedly trying to install chromedriver");
111+
}
112+
113+
const resolved =
114+
await this.versionResolver.resolveBrowserAndDriver(version);
97115
if (!resolved) {
98116
throw new Error(`Version ${version} not found in known good versions`);
99117
}

0 commit comments

Comments
 (0)