From a7eb87e54a07004846c113645130d3500b89b3ee Mon Sep 17 00:00:00 2001 From: Cole Rogers Date: Mon, 8 Nov 2021 18:36:16 -0800 Subject: [PATCH 1/7] added filtering --- src/emulator/functionsEmulator.ts | 13 ++++++++++--- src/emulator/storage/cloudFunctions.ts | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/emulator/functionsEmulator.ts b/src/emulator/functionsEmulator.ts index 93a007987ff..04783a2b078 100644 --- a/src/emulator/functionsEmulator.ts +++ b/src/emulator/functionsEmulator.ts @@ -272,14 +272,18 @@ export class FunctionsEmulator implements EmulatorInstance { let proto = JSON.parse(reqBody.toString()); let triggerKey: string; if (req.headers["content-type"]?.includes("cloudevent")) { - triggerKey = `${this.args.projectId}:${proto.type}`; + triggerKey = proto.source.startsWith("//storage.googleapis.com/projects/_/buckets/") + ? `${this.args.projectId}:${proto.type}:${proto.source.split("/")[6]}` + : `${this.args.projectId}:${proto.type}`; if (EventUtils.isBinaryCloudEvent(req)) { proto = EventUtils.extractBinaryCloudEventContext(req); proto.data = req.body; } } else { - triggerKey = `${this.args.projectId}:${proto.eventType}`; + triggerKey = proto.resource.name.startsWith("projects/_/buckets/") + ? `${this.args.projectId}:${proto.eventType}:${proto.resource.name.split("/")[3]}` + : `${this.args.projectId}:${proto.eventType}`; } const triggers = this.multicastTriggers[triggerKey] || []; @@ -706,7 +710,10 @@ export class FunctionsEmulator implements EmulatorInstance { addStorageTrigger(projectId: string, key: string, eventTrigger: EventTrigger): boolean { logger.debug(`addStorageTrigger`, JSON.stringify({ eventTrigger })); - const eventTriggerId = `${projectId}:${eventTrigger.eventType}`; + const bucket = eventTrigger.resource.startsWith("projects/_/buckets/") + ? eventTrigger.resource.split("/")[3] + : eventTrigger.resource; + const eventTriggerId = `${projectId}:${eventTrigger.eventType}:${bucket}`; const triggers = this.multicastTriggers[eventTriggerId] || []; triggers.push(key); this.multicastTriggers[eventTriggerId] = triggers; diff --git a/src/emulator/storage/cloudFunctions.ts b/src/emulator/storage/cloudFunctions.ts index d921da51606..071840362f7 100644 --- a/src/emulator/storage/cloudFunctions.ts +++ b/src/emulator/storage/cloudFunctions.ts @@ -99,7 +99,7 @@ export class StorageCloudFunctions { ): string { const ceAction = STORAGE_V2_ACTION_MAP[action]; if (!ceAction) { - throw new Error("Action is not definied as a CloudEvents action"); + throw new Error("Action is not defined as a CloudEvents action"); } const data = (objectMetadataPayload as unknown) as StorageObjectData; return JSON.stringify({ From 395a0c37f4ee0764437819f6defccfb4148b0c7e Mon Sep 17 00:00:00 2001 From: Cole Rogers Date: Tue, 9 Nov 2021 06:51:32 -0800 Subject: [PATCH 2/7] change to use headers --- src/emulator/functionsEmulator.ts | 11 +++++------ src/emulator/storage/cloudFunctions.ts | 9 +++++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/emulator/functionsEmulator.ts b/src/emulator/functionsEmulator.ts index 04783a2b078..af80ae3e060 100644 --- a/src/emulator/functionsEmulator.ts +++ b/src/emulator/functionsEmulator.ts @@ -272,18 +272,17 @@ export class FunctionsEmulator implements EmulatorInstance { let proto = JSON.parse(reqBody.toString()); let triggerKey: string; if (req.headers["content-type"]?.includes("cloudevent")) { - triggerKey = proto.source.startsWith("//storage.googleapis.com/projects/_/buckets/") - ? `${this.args.projectId}:${proto.type}:${proto.source.split("/")[6]}` - : `${this.args.projectId}:${proto.type}`; + triggerKey = `${this.args.projectId}:${proto.type}`; if (EventUtils.isBinaryCloudEvent(req)) { proto = EventUtils.extractBinaryCloudEventContext(req); proto.data = req.body; } } else { - triggerKey = proto.resource.name.startsWith("projects/_/buckets/") - ? `${this.args.projectId}:${proto.eventType}:${proto.resource.name.split("/")[3]}` - : `${this.args.projectId}:${proto.eventType}`; + triggerKey = `${this.args.projectId}:${proto.eventType}`; + } + if (req.headers["trigger-filter"]) { + triggerKey += `:${req.headers["trigger-filter"]}`; } const triggers = this.multicastTriggers[triggerKey] || []; diff --git a/src/emulator/storage/cloudFunctions.ts b/src/emulator/storage/cloudFunctions.ts index 071840362f7..4c3b6ab8a92 100644 --- a/src/emulator/storage/cloudFunctions.ts +++ b/src/emulator/storage/cloudFunctions.ts @@ -48,14 +48,19 @@ export class StorageCloudFunctions { try { /** Legacy Google Events */ const eventBody = this.createLegacyEventRequestBody(action, object); - const eventRes = await this.client!.post(this.multicastPath, eventBody); + const eventRes = await this.client!.post(this.multicastPath, eventBody, { + headers: { "Trigger-Filter": object.bucket }, + }); if (eventRes.status !== 200) { errStatus.push(eventRes.status); } /** Modern CloudEvents */ const cloudEventBody = this.createCloudEventRequestBody(action, object); const cloudEventRes = await this.client!.post(this.multicastPath, cloudEventBody, { - headers: { "Content-Type": "application/cloudevents+json; charset=UTF-8" }, + headers: { + "Content-Type": "application/cloudevents+json; charset=UTF-8", + "Trigger-Filter": object.bucket, + }, }); if (cloudEventRes.status !== 200) { errStatus.push(cloudEventRes.status); From 74c00489ce6e92d975744b87a2cd34c86a8ad31d Mon Sep 17 00:00:00 2001 From: Cole Rogers Date: Mon, 22 Nov 2021 14:36:32 -0800 Subject: [PATCH 3/7] using data attribute instead of header & adding integration tests --- scripts/integration-helpers/framework.ts | 56 ++++++++++ .../functions/index.js | 101 ++++++++++++++++++ scripts/triggers-end-to-end-tests/tests.ts | 48 +++++++++ src/emulator/functionsEmulator.ts | 4 +- src/emulator/storage/cloudFunctions.ts | 5 +- 5 files changed, 208 insertions(+), 6 deletions(-) diff --git a/scripts/integration-helpers/framework.ts b/scripts/integration-helpers/framework.ts index 82069f06b80..18e50e792dc 100644 --- a/scripts/integration-helpers/framework.ts +++ b/scripts/integration-helpers/framework.ts @@ -14,6 +14,14 @@ const STORAGE_FUNCTION_V2_ARCHIVED_LOG = "========== STORAGE V2 FUNCTION ARCHIVE const STORAGE_FUNCTION_V2_DELETED_LOG = "========== STORAGE V2 FUNCTION DELETED =========="; const STORAGE_FUNCTION_V2_FINALIZED_LOG = "========== STORAGE V2 FUNCTION FINALIZED =========="; const STORAGE_FUNCTION_V2_METADATA_LOG = "========== STORAGE V2 FUNCTION METADATA =========="; +const STORAGE_BUCKET_FUNCTION_V2_ARCHIVED_LOG = + "========== STORAGE BUCKET V2 FUNCTION ARCHIVED =========="; +const STORAGE_BUCKET_FUNCTION_V2_DELETED_LOG = + "========== STORAGE BUCKET V2 FUNCTION DELETED =========="; +const STORAGE_BUCKET_FUNCTION_V2_FINALIZED_LOG = + "========== STORAGE BUCKET V2 FUNCTION FINALIZED =========="; +const STORAGE_BUCKET_FUNCTION_V2_METADATA_LOG = + "========== STORAGE BUCKET V2 FUNCTION METADATA =========="; /* Functions V1 */ const RTDB_FUNCTION_LOG = "========== RTDB FUNCTION =========="; const FIRESTORE_FUNCTION_LOG = "========== FIRESTORE FUNCTION =========="; @@ -23,6 +31,13 @@ const STORAGE_FUNCTION_ARCHIVED_LOG = "========== STORAGE FUNCTION ARCHIVED ==== const STORAGE_FUNCTION_DELETED_LOG = "========== STORAGE FUNCTION DELETED =========="; const STORAGE_FUNCTION_FINALIZED_LOG = "========== STORAGE FUNCTION FINALIZED =========="; const STORAGE_FUNCTION_METADATA_LOG = "========== STORAGE FUNCTION METADATA =========="; +const STORAGE_BUCKET_FUNCTION_ARCHIVED_LOG = + "========== STORAGE BUCKET FUNCTION ARCHIVED =========="; +const STORAGE_BUCKET_FUNCTION_DELETED_LOG = "========== STORAGE BUCKET FUNCTION DELETED =========="; +const STORAGE_BUCKET_FUNCTION_FINALIZED_LOG = + "========== STORAGE BUCKET FUNCTION FINALIZED =========="; +const STORAGE_BUCKET_FUNCTION_METADATA_LOG = + "========== STORAGE BUCKET FUNCTION METADATA =========="; const ALL_EMULATORS_STARTED_LOG = "All emulators ready"; interface ConnectionInfo { @@ -65,6 +80,10 @@ export class TriggerEndToEndTest { storageDeletedTriggerCount = 0; storageFinalizedTriggerCount = 0; storageMetadataTriggerCount = 0; + storageBucketArchivedTriggerCount = 0; + storageBucketDeletedTriggerCount = 0; + storageBucketFinalizedTriggerCount = 0; + storageBucketMetadataTriggerCount = 0; /* Functions V2 */ pubsubV2TriggerCount = 0; @@ -72,6 +91,10 @@ export class TriggerEndToEndTest { storageV2DeletedTriggerCount = 0; storageV2FinalizedTriggerCount = 0; storageV2MetadataTriggerCount = 0; + storageBucketV2ArchivedTriggerCount = 0; + storageBucketV2DeletedTriggerCount = 0; + storageBucketV2FinalizedTriggerCount = 0; + storageBucketV2MetadataTriggerCount = 0; rtdbFromFirestore = false; firestoreFromRtdb = false; @@ -138,6 +161,19 @@ export class TriggerEndToEndTest { if (data.includes(STORAGE_FUNCTION_METADATA_LOG)) { this.storageMetadataTriggerCount++; } + + if (data.includes(STORAGE_BUCKET_FUNCTION_ARCHIVED_LOG)) { + this.storageBucketArchivedTriggerCount++; + } + if (data.includes(STORAGE_BUCKET_FUNCTION_DELETED_LOG)) { + this.storageBucketDeletedTriggerCount++; + } + if (data.includes(STORAGE_BUCKET_FUNCTION_FINALIZED_LOG)) { + this.storageBucketFinalizedTriggerCount++; + } + if (data.includes(STORAGE_BUCKET_FUNCTION_METADATA_LOG)) { + this.storageBucketMetadataTriggerCount++; + } /* Functions V2 */ if (data.includes(PUBSUB_FUNCTION_V2_LOG)) { this.pubsubV2TriggerCount++; @@ -154,6 +190,18 @@ export class TriggerEndToEndTest { if (data.includes(STORAGE_FUNCTION_V2_METADATA_LOG)) { this.storageV2MetadataTriggerCount++; } + if (data.includes(STORAGE_BUCKET_FUNCTION_V2_ARCHIVED_LOG)) { + this.storageBucketV2ArchivedTriggerCount++; + } + if (data.includes(STORAGE_BUCKET_FUNCTION_V2_DELETED_LOG)) { + this.storageBucketV2DeletedTriggerCount++; + } + if (data.includes(STORAGE_BUCKET_FUNCTION_V2_FINALIZED_LOG)) { + this.storageBucketV2FinalizedTriggerCount++; + } + if (data.includes(STORAGE_BUCKET_FUNCTION_V2_METADATA_LOG)) { + this.storageBucketV2MetadataTriggerCount++; + } }); this.cliProcess = cli; @@ -217,6 +265,14 @@ export class TriggerEndToEndTest { return this.invokeHttpFunction("updateDeleteFromStorage"); } + writeToSpecificStorageBucket(): Promise { + return this.invokeHttpFunction("writeToSpecificStorageBucket"); + } + + updateDeleteFromSpecificStorageBucket(): Promise { + return this.invokeHttpFunction("updateDeleteFromSpecificStorageBucket"); + } + waitForCondition( conditionFn: () => boolean, timeout: number, diff --git a/scripts/triggers-end-to-end-tests/functions/index.js b/scripts/triggers-end-to-end-tests/functions/index.js index bb18ff9a3c4..d8e74a29b9d 100644 --- a/scripts/triggers-end-to-end-tests/functions/index.js +++ b/scripts/triggers-end-to-end-tests/functions/index.js @@ -23,12 +23,27 @@ const STORAGE_FUNCTION_ARCHIVED_LOG = "========== STORAGE FUNCTION ARCHIVED ==== const STORAGE_FUNCTION_DELETED_LOG = "========== STORAGE FUNCTION DELETED =========="; const STORAGE_FUNCTION_FINALIZED_LOG = "========== STORAGE FUNCTION FINALIZED =========="; const STORAGE_FUNCTION_METADATA_LOG = "========== STORAGE FUNCTION METADATA =========="; +const STORAGE_BUCKET_FUNCTION_ARCHIVED_LOG = + "========== STORAGE BUCKET FUNCTION ARCHIVED =========="; +const STORAGE_BUCKET_FUNCTION_DELETED_LOG = "========== STORAGE BUCKET FUNCTION DELETED =========="; +const STORAGE_BUCKET_FUNCTION_FINALIZED_LOG = + "========== STORAGE BUCKET FUNCTION FINALIZED =========="; +const STORAGE_BUCKET_FUNCTION_METADATA_LOG = + "========== STORAGE BUCKET FUNCTION METADATA =========="; /* Functions V2 */ const PUBSUB_FUNCTION_V2_LOG = "========== PUBSUB V2 FUNCTION =========="; const STORAGE_FUNCTION_V2_ARCHIVED_LOG = "========== STORAGE V2 FUNCTION ARCHIVED =========="; const STORAGE_FUNCTION_V2_DELETED_LOG = "========== STORAGE V2 FUNCTION DELETED =========="; const STORAGE_FUNCTION_V2_FINALIZED_LOG = "========== STORAGE V2 FUNCTION FINALIZED =========="; const STORAGE_FUNCTION_V2_METADATA_LOG = "========== STORAGE V2 FUNCTION METADATA =========="; +const STORAGE_BUCKET_FUNCTION_V2_ARCHIVED_LOG = + "========== STORAGE BUCKET V2 FUNCTION ARCHIVED =========="; +const STORAGE_BUCKET_FUNCTION_V2_DELETED_LOG = + "========== STORAGE BUCKET V2 FUNCTION DELETED =========="; +const STORAGE_BUCKET_FUNCTION_V2_FINALIZED_LOG = + "========== STORAGE BUCKET V2 FUNCTION FINALIZED =========="; +const STORAGE_BUCKET_FUNCTION_V2_METADATA_LOG = + "========== STORAGE BUCKET V2 FUNCTION METADATA =========="; /* * We install onWrite triggers for START_DOCUMENT_NAME in both the firestore and @@ -113,6 +128,20 @@ exports.updateDeleteFromStorage = functions.https.onRequest(async (req, res) => res.json({ done: "ok" }); }); +exports.writeToSpecificStorageBucket = functions.https.onRequest(async (req, res) => { + await admin.storage().bucket("test-bucket").file(STORAGE_FILE_NAME).save("hello world!"); + console.log("Wrote to a specific Storage bucket"); + res.json({ created: "ok" }); +}); + +exports.updateDeleteFromSpecificStorageBucket = functions.https.onRequest(async (req, res) => { + await admin.storage().bucket("test-bucket").file(STORAGE_FILE_NAME).save("something new!"); + console.log("Wrote to a specific Storage bucket"); + await admin.storage().bucket("test-bucket").file(STORAGE_FILE_NAME).delete(); + console.log("Deleted from a specific Storage bucket"); + res.json({ done: "ok" }); +}); + exports.firestoreReaction = functions.firestore .document(START_DOCUMENT_NAME) .onWrite(async (/* change, ctx */) => { @@ -222,3 +251,75 @@ exports.storagev2metadatareaction = functionsV2.storage.onObjectMetadataUpdated( console.log("Object", JSON.stringify(cloudevent.data)); return true; }); + +exports.storageArchiveReaction = functions.storage + .bucket("test-bucket") + .object() + .onArchive((object, context) => { + console.log(STORAGE_BUCKET_FUNCTION_ARCHIVED_LOG); + console.log("Object", JSON.stringify(object)); + return true; + }); + +exports.storageDeleteReaction = functions.storage + .bucket("test-bucket") + .object() + .onDelete((object, context) => { + console.log(STORAGE_BUCKET_FUNCTION_DELETED_LOG); + console.log("Object", JSON.stringify(object)); + return true; + }); + +exports.storageFinalizeReaction = functions.storage + .bucket("test-bucket") + .object() + .onFinalize((object, context) => { + console.log(STORAGE_BUCKET_FUNCTION_FINALIZED_LOG); + console.log("Object", JSON.stringify(object)); + return true; + }); + +exports.storageMetadataReaction = functions.storage + .bucket("test-bucket") + .object() + .onMetadataUpdate((object, context) => { + console.log(STORAGE_BUCKET_FUNCTION_METADATA_LOG); + console.log("Object", JSON.stringify(object)); + return true; + }); + +exports.storagev2archivedreaction = functionsV2.storage.onObjectArchived( + "test-bucket", + (cloudevent) => { + console.log(STORAGE_BUCKET_FUNCTION_V2_ARCHIVED_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; + } +); + +exports.storagev2deletedreaction = functionsV2.storage.onObjectDeleted( + "test-bucket", + (cloudevent) => { + console.log(STORAGE_BUCKET_FUNCTION_V2_DELETED_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; + } +); + +exports.storagev2finalizedreaction = functionsV2.storage.onObjectFinalized( + "test-bucket", + (cloudevent) => { + console.log(STORAGE_BUCKET_FUNCTION_V2_FINALIZED_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; + } +); + +exports.storagev2metadatareaction = functionsV2.storage.onObjectMetadataUpdated( + "test-bucket", + (cloudevent) => { + console.log(STORAGE_BUCKET_FUNCTION_V2_METADATA_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; + } +); diff --git a/scripts/triggers-end-to-end-tests/tests.ts b/scripts/triggers-end-to-end-tests/tests.ts index a5982812efb..3eb5cc2fbe6 100755 --- a/scripts/triggers-end-to-end-tests/tests.ts +++ b/scripts/triggers-end-to-end-tests/tests.ts @@ -295,6 +295,54 @@ describe("storage emulator function triggers", () => { expect(test.storageDeletedTriggerCount).to.equal(1); expect(test.storageV2DeletedTriggerCount).to.equal(1); }); + + it("should write to a specific bucket in the storage emulator", async function (this) { + this.timeout(EMULATOR_TEST_TIMEOUT); + + const response = await test.writeToSpecificStorageBucket(); + expect(response.status).to.equal(200); + await new Promise((resolve) => setTimeout(resolve, EMULATORS_WRITE_DELAY_MS)); + }); + + it("should have triggered cloud functions", () => { + // default bucket values + expect(test.storageFinalizedTriggerCount).to.equal(2); + expect(test.storageMetadataTriggerCount).to.equal(2); + expect(test.storageV2FinalizedTriggerCount).to.equal(2); + expect(test.storageV2MetadataTriggerCount).to.equal(2); + expect(test.storageDeletedTriggerCount).to.equal(1); + expect(test.storageV2DeletedTriggerCount).to.equal(1); + // specific bucket values + expect(test.storageBucketFinalizedTriggerCount).to.equal(1); + expect(test.storageBucketMetadataTriggerCount).to.equal(1); + expect(test.storageBucketV2FinalizedTriggerCount).to.equal(1); + expect(test.storageBucketV2MetadataTriggerCount).to.equal(1); + }); + + it("should write, update, and delete from a specific bucket in the storage emulator", async function (this) { + this.timeout(EMULATOR_TEST_TIMEOUT); + + const response = await test.updateDeleteFromSpecificStorageBucket(); + expect(response.status).to.equal(200); + await new Promise((resolve) => setTimeout(resolve, EMULATORS_WRITE_DELAY_MS)); + }); + + it("should have triggered cloud functions", () => { + // default bucket values + expect(test.storageFinalizedTriggerCount).to.equal(2); + expect(test.storageMetadataTriggerCount).to.equal(2); + expect(test.storageV2FinalizedTriggerCount).to.equal(2); + expect(test.storageV2MetadataTriggerCount).to.equal(2); + expect(test.storageDeletedTriggerCount).to.equal(1); + expect(test.storageV2DeletedTriggerCount).to.equal(1); + // specific bucket values + expect(test.storageBucketFinalizedTriggerCount).to.equal(2); + expect(test.storageBucketMetadataTriggerCount).to.equal(2); + expect(test.storageBucketV2FinalizedTriggerCount).to.equal(2); + expect(test.storageBucketV2MetadataTriggerCount).to.equal(2); + expect(test.storageBucketDeletedTriggerCount).to.equal(1); + expect(test.storageBucketV2DeletedTriggerCount).to.equal(1); + }); }); describe("import/export end to end", () => { diff --git a/src/emulator/functionsEmulator.ts b/src/emulator/functionsEmulator.ts index af80ae3e060..ec5fe17941d 100644 --- a/src/emulator/functionsEmulator.ts +++ b/src/emulator/functionsEmulator.ts @@ -281,8 +281,8 @@ export class FunctionsEmulator implements EmulatorInstance { } else { triggerKey = `${this.args.projectId}:${proto.eventType}`; } - if (req.headers["trigger-filter"]) { - triggerKey += `:${req.headers["trigger-filter"]}`; + if (proto.data.bucket) { + triggerKey += `:${proto.data.bucket}`; } const triggers = this.multicastTriggers[triggerKey] || []; diff --git a/src/emulator/storage/cloudFunctions.ts b/src/emulator/storage/cloudFunctions.ts index 4c3b6ab8a92..2b4618ecde0 100644 --- a/src/emulator/storage/cloudFunctions.ts +++ b/src/emulator/storage/cloudFunctions.ts @@ -48,9 +48,7 @@ export class StorageCloudFunctions { try { /** Legacy Google Events */ const eventBody = this.createLegacyEventRequestBody(action, object); - const eventRes = await this.client!.post(this.multicastPath, eventBody, { - headers: { "Trigger-Filter": object.bucket }, - }); + const eventRes = await this.client!.post(this.multicastPath, eventBody); if (eventRes.status !== 200) { errStatus.push(eventRes.status); } @@ -59,7 +57,6 @@ export class StorageCloudFunctions { const cloudEventRes = await this.client!.post(this.multicastPath, cloudEventBody, { headers: { "Content-Type": "application/cloudevents+json; charset=UTF-8", - "Trigger-Filter": object.bucket, }, }); if (cloudEventRes.status !== 200) { From 496e0904e261ced353da2ea306d6de69b2b80eb0 Mon Sep 17 00:00:00 2001 From: Cole Rogers Date: Mon, 22 Nov 2021 17:02:02 -0800 Subject: [PATCH 4/7] adding default-bucket into tests --- scripts/integration-helpers/framework.ts | 1 - .../functions/index.js | 112 +++++++++++------- src/emulator/storage/cloudFunctions.ts | 4 +- 3 files changed, 70 insertions(+), 47 deletions(-) diff --git a/scripts/integration-helpers/framework.ts b/scripts/integration-helpers/framework.ts index 18e50e792dc..c1fcecae4a3 100644 --- a/scripts/integration-helpers/framework.ts +++ b/scripts/integration-helpers/framework.ts @@ -161,7 +161,6 @@ export class TriggerEndToEndTest { if (data.includes(STORAGE_FUNCTION_METADATA_LOG)) { this.storageMetadataTriggerCount++; } - if (data.includes(STORAGE_BUCKET_FUNCTION_ARCHIVED_LOG)) { this.storageBucketArchivedTriggerCount++; } diff --git a/scripts/triggers-end-to-end-tests/functions/index.js b/scripts/triggers-end-to-end-tests/functions/index.js index d8e74a29b9d..88a5b36f690 100644 --- a/scripts/triggers-end-to-end-tests/functions/index.js +++ b/scripts/triggers-end-to-end-tests/functions/index.js @@ -115,15 +115,17 @@ exports.writeToAuth = functions.https.onRequest(async (req, res) => { }); exports.writeToStorage = functions.https.onRequest(async (req, res) => { - await admin.storage().bucket().file(STORAGE_FILE_NAME).save("hello world!"); + const file = admin.storage().bucket("default-bucket").file(STORAGE_FILE_NAME); + await file.save("hello world!"); + console.log(file); console.log("Wrote to Storage bucket"); res.json({ created: "ok" }); }); exports.updateDeleteFromStorage = functions.https.onRequest(async (req, res) => { - await admin.storage().bucket().file(STORAGE_FILE_NAME).save("something new!"); + await admin.storage().bucket("default-bucket").file(STORAGE_FILE_NAME).save("something new!"); console.log("Wrote to Storage bucket"); - await admin.storage().bucket().file(STORAGE_FILE_NAME).delete(); + await admin.storage().bucket("default-bucket").file(STORAGE_FILE_NAME).delete(); console.log("Deleted from Storage bucket"); res.json({ done: "ok" }); }); @@ -204,53 +206,77 @@ exports.authReaction = functions.auth.user().onCreate((user, ctx) => { return true; }); -exports.storageArchiveReaction = functions.storage.object().onArchive((object, context) => { - console.log(STORAGE_FUNCTION_ARCHIVED_LOG); - console.log("Object", JSON.stringify(object)); - return true; -}); +exports.storageArchiveReaction = functions.storage + .bucket("default-bucket") + .object() + .onArchive((object, context) => { + console.log(STORAGE_FUNCTION_ARCHIVED_LOG); + console.log("Object", JSON.stringify(object)); + return true; + }); -exports.storageDeleteReaction = functions.storage.object().onDelete((object, context) => { - console.log(STORAGE_FUNCTION_DELETED_LOG); - console.log("Object", JSON.stringify(object)); - return true; -}); +exports.storageDeleteReaction = functions.storage + .object() + .bucket("default-bucket") + .onDelete((object, context) => { + console.log(STORAGE_FUNCTION_DELETED_LOG); + console.log("Object", JSON.stringify(object)); + return true; + }); -exports.storageFinalizeReaction = functions.storage.object().onFinalize((object, context) => { - console.log(STORAGE_FUNCTION_FINALIZED_LOG); - console.log("Object", JSON.stringify(object)); - return true; -}); +exports.storageFinalizeReaction = functions.storage + .object() + .bucket("default-bucket") + .onFinalize((object, context) => { + console.log(STORAGE_FUNCTION_FINALIZED_LOG); + console.log("Object", JSON.stringify(object)); + return true; + }); -exports.storageMetadataReaction = functions.storage.object().onMetadataUpdate((object, context) => { - console.log(STORAGE_FUNCTION_METADATA_LOG); - console.log("Object", JSON.stringify(object)); - return true; -}); +exports.storageMetadataReaction = functions.storage + .object() + .bucket("default-bucket") + .onMetadataUpdate((object, context) => { + console.log(STORAGE_FUNCTION_METADATA_LOG); + console.log("Object", JSON.stringify(object)); + return true; + }); -exports.storagev2archivedreaction = functionsV2.storage.onObjectArchived((cloudevent) => { - console.log(STORAGE_FUNCTION_V2_ARCHIVED_LOG); - console.log("Object", JSON.stringify(cloudevent.data)); - return true; -}); +exports.storagev2archivedreaction = functionsV2.storage.onObjectArchived( + "default-bucket", + (cloudevent) => { + console.log(STORAGE_FUNCTION_V2_ARCHIVED_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; + } +); -exports.storagev2deletedreaction = functionsV2.storage.onObjectDeleted((cloudevent) => { - console.log(STORAGE_FUNCTION_V2_DELETED_LOG); - console.log("Object", JSON.stringify(cloudevent.data)); - return true; -}); +exports.storagev2deletedreaction = functionsV2.storage.onObjectDeleted( + "default-bucket", + (cloudevent) => { + console.log(STORAGE_FUNCTION_V2_DELETED_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; + } +); -exports.storagev2finalizedreaction = functionsV2.storage.onObjectFinalized((cloudevent) => { - console.log(STORAGE_FUNCTION_V2_FINALIZED_LOG); - console.log("Object", JSON.stringify(cloudevent.data)); - return true; -}); +exports.storagev2finalizedreaction = functionsV2.storage.onObjectFinalized( + "default-bucket", + (cloudevent) => { + console.log(STORAGE_FUNCTION_V2_FINALIZED_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; + } +); -exports.storagev2metadatareaction = functionsV2.storage.onObjectMetadataUpdated((cloudevent) => { - console.log(STORAGE_FUNCTION_V2_METADATA_LOG); - console.log("Object", JSON.stringify(cloudevent.data)); - return true; -}); +exports.storagev2metadatareaction = functionsV2.storage.onObjectMetadataUpdated( + "default-bucket", + (cloudevent) => { + console.log(STORAGE_FUNCTION_V2_METADATA_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; + } +); exports.storageArchiveReaction = functions.storage .bucket("test-bucket") diff --git a/src/emulator/storage/cloudFunctions.ts b/src/emulator/storage/cloudFunctions.ts index 2b4618ecde0..071840362f7 100644 --- a/src/emulator/storage/cloudFunctions.ts +++ b/src/emulator/storage/cloudFunctions.ts @@ -55,9 +55,7 @@ export class StorageCloudFunctions { /** Modern CloudEvents */ const cloudEventBody = this.createCloudEventRequestBody(action, object); const cloudEventRes = await this.client!.post(this.multicastPath, cloudEventBody, { - headers: { - "Content-Type": "application/cloudevents+json; charset=UTF-8", - }, + headers: { "Content-Type": "application/cloudevents+json; charset=UTF-8" }, }); if (cloudEventRes.status !== 200) { errStatus.push(cloudEventRes.status); From c714316448d1e445398fa0d5c7b23abb16db2cb7 Mon Sep 17 00:00:00 2001 From: Cole Rogers Date: Mon, 22 Nov 2021 17:46:40 -0800 Subject: [PATCH 5/7] local testing keeps failing, trying again on github workflows.... --- scripts/triggers-end-to-end-tests/functions/index.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/scripts/triggers-end-to-end-tests/functions/index.js b/scripts/triggers-end-to-end-tests/functions/index.js index 88a5b36f690..1feaac3d0e2 100644 --- a/scripts/triggers-end-to-end-tests/functions/index.js +++ b/scripts/triggers-end-to-end-tests/functions/index.js @@ -115,9 +115,7 @@ exports.writeToAuth = functions.https.onRequest(async (req, res) => { }); exports.writeToStorage = functions.https.onRequest(async (req, res) => { - const file = admin.storage().bucket("default-bucket").file(STORAGE_FILE_NAME); - await file.save("hello world!"); - console.log(file); + await admin.storage().bucket("default-bucket").file(STORAGE_FILE_NAME).save("hello world!"); console.log("Wrote to Storage bucket"); res.json({ created: "ok" }); }); @@ -216,8 +214,8 @@ exports.storageArchiveReaction = functions.storage }); exports.storageDeleteReaction = functions.storage - .object() .bucket("default-bucket") + .object() .onDelete((object, context) => { console.log(STORAGE_FUNCTION_DELETED_LOG); console.log("Object", JSON.stringify(object)); @@ -225,8 +223,8 @@ exports.storageDeleteReaction = functions.storage }); exports.storageFinalizeReaction = functions.storage - .object() .bucket("default-bucket") + .object() .onFinalize((object, context) => { console.log(STORAGE_FUNCTION_FINALIZED_LOG); console.log("Object", JSON.stringify(object)); @@ -234,8 +232,8 @@ exports.storageFinalizeReaction = functions.storage }); exports.storageMetadataReaction = functions.storage - .object() .bucket("default-bucket") + .object() .onMetadataUpdate((object, context) => { console.log(STORAGE_FUNCTION_METADATA_LOG); console.log("Object", JSON.stringify(object)); From e1f708522ce13bd6d899bdbdb32dfa3a76494950 Mon Sep 17 00:00:00 2001 From: Cole Rogers Date: Wed, 24 Nov 2021 15:01:29 -0800 Subject: [PATCH 6/7] removed 'default-bucket', added reset counter to framework, and finally fixed the tests --- scripts/integration-helpers/framework.ts | 39 ++++++- .../functions/index.js | 98 ++++++++--------- scripts/triggers-end-to-end-tests/tests.ts | 103 +++++++++++------- 3 files changed, 141 insertions(+), 99 deletions(-) diff --git a/scripts/integration-helpers/framework.ts b/scripts/integration-helpers/framework.ts index c1fcecae4a3..6afdda54c12 100644 --- a/scripts/integration-helpers/framework.ts +++ b/scripts/integration-helpers/framework.ts @@ -113,6 +113,33 @@ export class TriggerEndToEndTest { } } + resetCounts(): void { + /* Functions V1 */ + this.firestoreTriggerCount = 0; + this.rtdbTriggerCount = 0; + this.pubsubTriggerCount = 0; + this.authTriggerCount = 0; + this.storageArchivedTriggerCount = 0; + this.storageDeletedTriggerCount = 0; + this.storageFinalizedTriggerCount = 0; + this.storageMetadataTriggerCount = 0; + this.storageBucketArchivedTriggerCount = 0; + this.storageBucketDeletedTriggerCount = 0; + this.storageBucketFinalizedTriggerCount = 0; + this.storageBucketMetadataTriggerCount = 0; + + /* Functions V2 */ + this.pubsubV2TriggerCount = 0; + this.storageV2ArchivedTriggerCount = 0; + this.storageV2DeletedTriggerCount = 0; + this.storageV2FinalizedTriggerCount = 0; + this.storageV2MetadataTriggerCount = 0; + this.storageBucketV2ArchivedTriggerCount = 0; + this.storageBucketV2DeletedTriggerCount = 0; + this.storageBucketV2FinalizedTriggerCount = 0; + this.storageBucketV2MetadataTriggerCount = 0; + } + /* * Check that all directions of database <-> functions <-> firestore * worked. @@ -256,18 +283,18 @@ export class TriggerEndToEndTest { return this.invokeHttpFunction("writeToScheduledPubsub"); } - writeToStorage(): Promise { - return this.invokeHttpFunction("writeToStorage"); - } - - updateDeleteFromStorage(): Promise { - return this.invokeHttpFunction("updateDeleteFromStorage"); + writeToDefaultStorage(): Promise { + return this.invokeHttpFunction("writeToDefaultStorage"); } writeToSpecificStorageBucket(): Promise { return this.invokeHttpFunction("writeToSpecificStorageBucket"); } + updateDeleteFromDefaultStorage(): Promise { + return this.invokeHttpFunction("updateDeleteFromDefaultStorage"); + } + updateDeleteFromSpecificStorageBucket(): Promise { return this.invokeHttpFunction("updateDeleteFromSpecificStorageBucket"); } diff --git a/scripts/triggers-end-to-end-tests/functions/index.js b/scripts/triggers-end-to-end-tests/functions/index.js index 1feaac3d0e2..9778e546674 100644 --- a/scripts/triggers-end-to-end-tests/functions/index.js +++ b/scripts/triggers-end-to-end-tests/functions/index.js @@ -114,26 +114,26 @@ exports.writeToAuth = functions.https.onRequest(async (req, res) => { res.json({ created: "ok" }); }); -exports.writeToStorage = functions.https.onRequest(async (req, res) => { - await admin.storage().bucket("default-bucket").file(STORAGE_FILE_NAME).save("hello world!"); - console.log("Wrote to Storage bucket"); +exports.writeToDefaultStorage = functions.https.onRequest(async (req, res) => { + await admin.storage().bucket().file(STORAGE_FILE_NAME).save("hello world!"); + console.log("Wrote to default Storage bucket"); res.json({ created: "ok" }); }); -exports.updateDeleteFromStorage = functions.https.onRequest(async (req, res) => { - await admin.storage().bucket("default-bucket").file(STORAGE_FILE_NAME).save("something new!"); - console.log("Wrote to Storage bucket"); - await admin.storage().bucket("default-bucket").file(STORAGE_FILE_NAME).delete(); - console.log("Deleted from Storage bucket"); - res.json({ done: "ok" }); -}); - exports.writeToSpecificStorageBucket = functions.https.onRequest(async (req, res) => { await admin.storage().bucket("test-bucket").file(STORAGE_FILE_NAME).save("hello world!"); console.log("Wrote to a specific Storage bucket"); res.json({ created: "ok" }); }); +exports.updateDeleteFromDefaultStorage = functions.https.onRequest(async (req, res) => { + await admin.storage().bucket().file(STORAGE_FILE_NAME).save("something new!"); + console.log("Wrote to Storage bucket"); + await admin.storage().bucket().file(STORAGE_FILE_NAME).delete(); + console.log("Deleted from Storage bucket"); + res.json({ done: "ok" }); +}); + exports.updateDeleteFromSpecificStorageBucket = functions.https.onRequest(async (req, res) => { await admin.storage().bucket("test-bucket").file(STORAGE_FILE_NAME).save("something new!"); console.log("Wrote to a specific Storage bucket"); @@ -205,7 +205,7 @@ exports.authReaction = functions.auth.user().onCreate((user, ctx) => { }); exports.storageArchiveReaction = functions.storage - .bucket("default-bucket") + .bucket() .object() .onArchive((object, context) => { console.log(STORAGE_FUNCTION_ARCHIVED_LOG); @@ -214,7 +214,7 @@ exports.storageArchiveReaction = functions.storage }); exports.storageDeleteReaction = functions.storage - .bucket("default-bucket") + .bucket() .object() .onDelete((object, context) => { console.log(STORAGE_FUNCTION_DELETED_LOG); @@ -223,7 +223,7 @@ exports.storageDeleteReaction = functions.storage }); exports.storageFinalizeReaction = functions.storage - .bucket("default-bucket") + .bucket() .object() .onFinalize((object, context) => { console.log(STORAGE_FUNCTION_FINALIZED_LOG); @@ -232,7 +232,7 @@ exports.storageFinalizeReaction = functions.storage }); exports.storageMetadataReaction = functions.storage - .bucket("default-bucket") + .bucket() .object() .onMetadataUpdate((object, context) => { console.log(STORAGE_FUNCTION_METADATA_LOG); @@ -240,43 +240,31 @@ exports.storageMetadataReaction = functions.storage return true; }); -exports.storagev2archivedreaction = functionsV2.storage.onObjectArchived( - "default-bucket", - (cloudevent) => { - console.log(STORAGE_FUNCTION_V2_ARCHIVED_LOG); - console.log("Object", JSON.stringify(cloudevent.data)); - return true; - } -); +exports.storagev2archivedreaction = functionsV2.storage.onObjectArchived((cloudevent) => { + console.log(STORAGE_FUNCTION_V2_ARCHIVED_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; +}); -exports.storagev2deletedreaction = functionsV2.storage.onObjectDeleted( - "default-bucket", - (cloudevent) => { - console.log(STORAGE_FUNCTION_V2_DELETED_LOG); - console.log("Object", JSON.stringify(cloudevent.data)); - return true; - } -); +exports.storagev2deletedreaction = functionsV2.storage.onObjectDeleted((cloudevent) => { + console.log(STORAGE_FUNCTION_V2_DELETED_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; +}); -exports.storagev2finalizedreaction = functionsV2.storage.onObjectFinalized( - "default-bucket", - (cloudevent) => { - console.log(STORAGE_FUNCTION_V2_FINALIZED_LOG); - console.log("Object", JSON.stringify(cloudevent.data)); - return true; - } -); +exports.storagev2finalizedreaction = functionsV2.storage.onObjectFinalized((cloudevent) => { + console.log(STORAGE_FUNCTION_V2_FINALIZED_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; +}); -exports.storagev2metadatareaction = functionsV2.storage.onObjectMetadataUpdated( - "default-bucket", - (cloudevent) => { - console.log(STORAGE_FUNCTION_V2_METADATA_LOG); - console.log("Object", JSON.stringify(cloudevent.data)); - return true; - } -); +exports.storagev2metadatareaction = functionsV2.storage.onObjectMetadataUpdated((cloudevent) => { + console.log(STORAGE_FUNCTION_V2_METADATA_LOG); + console.log("Object", JSON.stringify(cloudevent.data)); + return true; +}); -exports.storageArchiveReaction = functions.storage +exports.storageBucketArchiveReaction = functions.storage .bucket("test-bucket") .object() .onArchive((object, context) => { @@ -285,7 +273,7 @@ exports.storageArchiveReaction = functions.storage return true; }); -exports.storageDeleteReaction = functions.storage +exports.storageBucketDeleteReaction = functions.storage .bucket("test-bucket") .object() .onDelete((object, context) => { @@ -294,7 +282,7 @@ exports.storageDeleteReaction = functions.storage return true; }); -exports.storageFinalizeReaction = functions.storage +exports.storageBucketFinalizeReaction = functions.storage .bucket("test-bucket") .object() .onFinalize((object, context) => { @@ -303,7 +291,7 @@ exports.storageFinalizeReaction = functions.storage return true; }); -exports.storageMetadataReaction = functions.storage +exports.storageBucketMetadataReaction = functions.storage .bucket("test-bucket") .object() .onMetadataUpdate((object, context) => { @@ -312,7 +300,7 @@ exports.storageMetadataReaction = functions.storage return true; }); -exports.storagev2archivedreaction = functionsV2.storage.onObjectArchived( +exports.storagebucketv2archivedreaction = functionsV2.storage.onObjectArchived( "test-bucket", (cloudevent) => { console.log(STORAGE_BUCKET_FUNCTION_V2_ARCHIVED_LOG); @@ -321,7 +309,7 @@ exports.storagev2archivedreaction = functionsV2.storage.onObjectArchived( } ); -exports.storagev2deletedreaction = functionsV2.storage.onObjectDeleted( +exports.storagebucketv2deletedreaction = functionsV2.storage.onObjectDeleted( "test-bucket", (cloudevent) => { console.log(STORAGE_BUCKET_FUNCTION_V2_DELETED_LOG); @@ -330,7 +318,7 @@ exports.storagev2deletedreaction = functionsV2.storage.onObjectDeleted( } ); -exports.storagev2finalizedreaction = functionsV2.storage.onObjectFinalized( +exports.storagebucketv2finalizedreaction = functionsV2.storage.onObjectFinalized( "test-bucket", (cloudevent) => { console.log(STORAGE_BUCKET_FUNCTION_V2_FINALIZED_LOG); @@ -339,7 +327,7 @@ exports.storagev2finalizedreaction = functionsV2.storage.onObjectFinalized( } ); -exports.storagev2metadatareaction = functionsV2.storage.onObjectMetadataUpdated( +exports.storagebucketv2metadatareaction = functionsV2.storage.onObjectMetadataUpdated( "test-bucket", (cloudevent) => { console.log(STORAGE_BUCKET_FUNCTION_V2_METADATA_LOG); diff --git a/scripts/triggers-end-to-end-tests/tests.ts b/scripts/triggers-end-to-end-tests/tests.ts index 3eb5cc2fbe6..8063f98f20f 100755 --- a/scripts/triggers-end-to-end-tests/tests.ts +++ b/scripts/triggers-end-to-end-tests/tests.ts @@ -261,65 +261,89 @@ describe("storage emulator function triggers", () => { await test.stopEmulators(); }); - it("should write to the storage emulator", async function (this) { + it("should write to the default bucket of storage emulator", async function (this) { this.timeout(EMULATOR_TEST_TIMEOUT); - const response = await test.writeToStorage(); + const response = await test.writeToDefaultStorage(); expect(response.status).to.equal(200); await new Promise((resolve) => setTimeout(resolve, EMULATORS_WRITE_DELAY_MS)); }); it("should have triggered cloud functions", () => { - // on object create two events fire (finalize & metadata update) + /* on object create two events fire (finalize & metadata update) */ + // default bucket expect(test.storageFinalizedTriggerCount).to.equal(1); expect(test.storageMetadataTriggerCount).to.equal(1); expect(test.storageV2FinalizedTriggerCount).to.equal(1); expect(test.storageV2MetadataTriggerCount).to.equal(1); + expect(test.storageDeletedTriggerCount).to.equal(0); + expect(test.storageV2DeletedTriggerCount).to.equal(0); + // specific bucket + expect(test.storageBucketFinalizedTriggerCount).to.equal(0); + expect(test.storageBucketMetadataTriggerCount).to.equal(0); + expect(test.storageBucketV2FinalizedTriggerCount).to.equal(0); + expect(test.storageBucketV2MetadataTriggerCount).to.equal(0); + expect(test.storageBucketDeletedTriggerCount).to.equal(0); + expect(test.storageBucketV2DeletedTriggerCount).to.equal(0); + test.resetCounts(); }); - it("should write, update, and delete from the storage emulator", async function (this) { + it("should write to a specific bucket of storage emulator", async function (this) { this.timeout(EMULATOR_TEST_TIMEOUT); - const response = await test.updateDeleteFromStorage(); + const response = await test.writeToSpecificStorageBucket(); expect(response.status).to.equal(200); await new Promise((resolve) => setTimeout(resolve, EMULATORS_WRITE_DELAY_MS)); }); it("should have triggered cloud functions", () => { - // on update two events fire (finalize & metadata update) - expect(test.storageFinalizedTriggerCount).to.equal(2); - expect(test.storageMetadataTriggerCount).to.equal(2); - expect(test.storageV2FinalizedTriggerCount).to.equal(2); - expect(test.storageV2MetadataTriggerCount).to.equal(2); - // on delete one event fires (delete) - expect(test.storageDeletedTriggerCount).to.equal(1); - expect(test.storageV2DeletedTriggerCount).to.equal(1); + /* on object create two events fire (finalize & metadata update) */ + // default bucket + expect(test.storageFinalizedTriggerCount).to.equal(0); + expect(test.storageMetadataTriggerCount).to.equal(0); + expect(test.storageV2FinalizedTriggerCount).to.equal(0); + expect(test.storageV2MetadataTriggerCount).to.equal(0); + expect(test.storageDeletedTriggerCount).to.equal(0); + expect(test.storageV2DeletedTriggerCount).to.equal(0); + // specific bucket + expect(test.storageBucketFinalizedTriggerCount).to.equal(1); + expect(test.storageBucketMetadataTriggerCount).to.equal(1); + expect(test.storageBucketV2FinalizedTriggerCount).to.equal(1); + expect(test.storageBucketV2MetadataTriggerCount).to.equal(1); + expect(test.storageBucketDeletedTriggerCount).to.equal(0); + expect(test.storageBucketV2DeletedTriggerCount).to.equal(0); + test.resetCounts(); }); - it("should write to a specific bucket in the storage emulator", async function (this) { + it("should write, update, and delete from the default bucket of the storage emulator", async function (this) { this.timeout(EMULATOR_TEST_TIMEOUT); - const response = await test.writeToSpecificStorageBucket(); + const response = await test.updateDeleteFromDefaultStorage(); expect(response.status).to.equal(200); await new Promise((resolve) => setTimeout(resolve, EMULATORS_WRITE_DELAY_MS)); }); it("should have triggered cloud functions", () => { - // default bucket values - expect(test.storageFinalizedTriggerCount).to.equal(2); - expect(test.storageMetadataTriggerCount).to.equal(2); - expect(test.storageV2FinalizedTriggerCount).to.equal(2); - expect(test.storageV2MetadataTriggerCount).to.equal(2); + /* on update two events fire (finalize & metadata update) */ + /* on delete one event fires (delete) */ + // default bucket + expect(test.storageFinalizedTriggerCount).to.equal(1); + expect(test.storageMetadataTriggerCount).to.equal(1); + expect(test.storageV2FinalizedTriggerCount).to.equal(1); + expect(test.storageV2MetadataTriggerCount).to.equal(1); expect(test.storageDeletedTriggerCount).to.equal(1); expect(test.storageV2DeletedTriggerCount).to.equal(1); - // specific bucket values - expect(test.storageBucketFinalizedTriggerCount).to.equal(1); - expect(test.storageBucketMetadataTriggerCount).to.equal(1); - expect(test.storageBucketV2FinalizedTriggerCount).to.equal(1); - expect(test.storageBucketV2MetadataTriggerCount).to.equal(1); + // specific bucket + expect(test.storageBucketFinalizedTriggerCount).to.equal(0); + expect(test.storageBucketMetadataTriggerCount).to.equal(0); + expect(test.storageBucketV2FinalizedTriggerCount).to.equal(0); + expect(test.storageBucketV2MetadataTriggerCount).to.equal(0); + expect(test.storageBucketDeletedTriggerCount).to.equal(0); + expect(test.storageBucketV2DeletedTriggerCount).to.equal(0); + test.resetCounts(); }); - it("should write, update, and delete from a specific bucket in the storage emulator", async function (this) { + it("should write, update, and delete from a specific bucket of the storage emulator", async function (this) { this.timeout(EMULATOR_TEST_TIMEOUT); const response = await test.updateDeleteFromSpecificStorageBucket(); @@ -328,20 +352,23 @@ describe("storage emulator function triggers", () => { }); it("should have triggered cloud functions", () => { - // default bucket values - expect(test.storageFinalizedTriggerCount).to.equal(2); - expect(test.storageMetadataTriggerCount).to.equal(2); - expect(test.storageV2FinalizedTriggerCount).to.equal(2); - expect(test.storageV2MetadataTriggerCount).to.equal(2); - expect(test.storageDeletedTriggerCount).to.equal(1); - expect(test.storageV2DeletedTriggerCount).to.equal(1); - // specific bucket values - expect(test.storageBucketFinalizedTriggerCount).to.equal(2); - expect(test.storageBucketMetadataTriggerCount).to.equal(2); - expect(test.storageBucketV2FinalizedTriggerCount).to.equal(2); - expect(test.storageBucketV2MetadataTriggerCount).to.equal(2); + /* on update two events fire (finalize & metadata update) */ + /* on delete one event fires (delete) */ + // default bucket + expect(test.storageFinalizedTriggerCount).to.equal(0); + expect(test.storageMetadataTriggerCount).to.equal(0); + expect(test.storageV2FinalizedTriggerCount).to.equal(0); + expect(test.storageV2MetadataTriggerCount).to.equal(0); + expect(test.storageDeletedTriggerCount).to.equal(0); + expect(test.storageV2DeletedTriggerCount).to.equal(0); + // specific bucket + expect(test.storageBucketFinalizedTriggerCount).to.equal(1); + expect(test.storageBucketMetadataTriggerCount).to.equal(1); + expect(test.storageBucketV2FinalizedTriggerCount).to.equal(1); + expect(test.storageBucketV2MetadataTriggerCount).to.equal(1); expect(test.storageBucketDeletedTriggerCount).to.equal(1); expect(test.storageBucketV2DeletedTriggerCount).to.equal(1); + test.resetCounts(); }); }); From 62a3d5781d495ad5f6fcbf8a45e0b5ef0818605f Mon Sep 17 00:00:00 2001 From: Cole Rogers Date: Wed, 8 Dec 2021 10:26:20 -0800 Subject: [PATCH 7/7] add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3bb2b35239..dbc08b72dde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,3 +3,4 @@ - Fixes issue with setting memory limits for some functions (#3924) - New HTTPS functions only allow secure traffic. (#3923) - No longer default-enable AR and don't send builds to AR unless an experiment is enabled (#3935) +- Fixes issue with filtering on a specific storage bucket using functions in the emulator (#3893)