diff --git a/scripts/emulator-testing/emulators/database-emulator.ts b/scripts/emulator-testing/emulators/database-emulator.ts index ddd126e7698..d252f87c727 100644 --- a/scripts/emulator-testing/emulators/database-emulator.ts +++ b/scripts/emulator-testing/emulators/database-emulator.ts @@ -24,7 +24,7 @@ export class DatabaseEmulator extends Emulator { constructor(port = 8088, namespace = 'test-emulator') { super( - 'database-emulator.jar', + 'firebase-database-emulator-v4.4.1.jar', // Use locked version of emulator for test to be deterministic. // The latest version can be found from database emulator doc: // https://firebase.google.com/docs/database/security/test-rules-emulator diff --git a/scripts/emulator-testing/emulators/emulator.ts b/scripts/emulator-testing/emulators/emulator.ts index e5d49433c2b..bea75d39dc4 100644 --- a/scripts/emulator-testing/emulators/emulator.ts +++ b/scripts/emulator-testing/emulators/emulator.ts @@ -19,6 +19,7 @@ import { spawn } from 'child-process-promise'; import { ChildProcess } from 'child_process'; import * as fs from 'fs'; +import * as os from 'os'; import * as path from 'path'; import * as request from 'request'; // @ts-ignore @@ -28,13 +29,25 @@ export abstract class Emulator { binaryPath: string | null = null; emulator: ChildProcess | null = null; + cacheDirectory: string; + cacheBinaryPath: string; + constructor( private binaryName: string, private binaryUrl: string, public port: number - ) {} + ) { + this.cacheDirectory = path.join(os.homedir(), `.cache/firebase-js-sdk`); + this.cacheBinaryPath = path.join(this.cacheDirectory, binaryName); + } download(): Promise { + if (fs.existsSync(this.cacheBinaryPath)) { + console.log(`Emulator found in cache: ${this.cacheBinaryPath}`); + this.binaryPath = this.cacheBinaryPath; + return Promise.resolve(); + } + return new Promise((resolve, reject) => { tmp.dir((err: Error | null, dir: string) => { if (err) reject(err); @@ -55,6 +68,10 @@ export abstract class Emulator { if (err) reject(err); console.log(`Changed emulator file permissions to 'rwxr-xr-x'.`); this.binaryPath = filepath; + + if (this.copyToCache()) { + console.log(`Cached emulator at ${this.cacheBinaryPath}`); + } resolve(); }); }) @@ -129,4 +146,23 @@ export abstract class Emulator { fs.unlinkSync(this.binaryPath); } } + + private copyToCache(): boolean { + if (!this.binaryPath) { + return false; + } + + try { + if (!fs.existsSync(this.cacheDirectory)) { + fs.mkdirSync(this.cacheDirectory, { recursive: true }); + } + fs.copyFileSync(this.binaryPath, this.cacheBinaryPath); + + return true; + } catch (e) { + console.warn(`Unable to cache ${this.binaryName}`, e); + } + + return false; + } } diff --git a/scripts/emulator-testing/emulators/firestore-emulator.ts b/scripts/emulator-testing/emulators/firestore-emulator.ts index 84cd23d2eeb..3752a61c203 100644 --- a/scripts/emulator-testing/emulators/firestore-emulator.ts +++ b/scripts/emulator-testing/emulators/firestore-emulator.ts @@ -22,7 +22,7 @@ export class FirestoreEmulator extends Emulator { constructor(port: number, projectId = 'test-emulator') { super( - 'firestore-emulator.jar', + 'cloud-firestore-emulator-v1.11.7.jar', // Use locked version of emulator for test to be deterministic. // The latest version can be found from firestore emulator doc: // https://firebase.google.com/docs/firestore/security/test-rules-emulator