Skip to content

How to use firebase emulator to test storage and firestore triggers? #104

Description

@manuganji

I have a python function that runs on firestore document changes. How do I emulate and test integration with storage locally?

Activity

  1. di commented on Jan 12, 2021

    @di
    Member

    Install firebase-tools:

    $ npm install -g firebase-tools
    

    Install the firestore emulator:

    $ firebase setup:emulators:firestore
    

    Write a basic "background" function:

    def hello(data, context):
        print(data, context)

    Install the Functions Framework:

    $ pip install functions-framework
    

    In one terminal, start the Functions Framework (by default this will be on localhost:8080):

    $ functions-framework --target hello --signature-type event
    

    In a second terminal, start the emulator (on a different port, localhost:8081) and tell it which host/port to use for the functions emulator:

    $ java -jar ~/.cache/firebase/emulators/cloud-firestore-emulator-v1.11.11.jar --functions_emulator localhost:8080 --port 8081
    

    Register a trigger with the firestore emulator:

    $ curl --location --request PUT 'http://localhost:8081/emulator/v1/projects/my-project/triggers/Test' \
    --header 'Content-Type: application/json' \
    --data-raw '{
       "eventTrigger": {
           "resource": "projects/my-project/databases/(default)/documents/my-collection/{id}",
           "eventType": "providers/cloud.firestore/eventTypes/document.write",
           "service": "firestore.googleapis.com"
       }
    }'
    

    Install the Firestore client library (using Python here but it can be any client library):

    $ pip install google-cloud-firestore
    

    Write a script to trigger a write:

    from google.cloud import firestore
    
    client = firestore.Client(project="my-project")
    client.collection("my-collection").add(document_data={"foo": "bar"})

    In a third terminal, trigger a write:

    $ export FIRESTORE_EMULATOR_HOST=localhost:8081 && python test.py
    

    Observe the function being triggered by the emulator in the first terminal:

    $ functions-framework --target hello --signature-type event
    [2021-01-12 13:31:33 -0600] [22783] [INFO] Starting gunicorn 20.0.4
    [2021-01-12 13:31:33 -0600] [22783] [INFO] Listening at: http://0.0.0.0:8080 (22783)
    [2021-01-12 13:31:33 -0600] [22783] [INFO] Using worker: threads
    [2021-01-12 13:31:33 -0600] [22800] [INFO] Booting worker with pid: 22800
    {'value': {'name': 'projects/my-project/databases/(default)/documents/my-collection/LDtrTcJpPiy0V5TIg4p9', 'fields': {'foo': {'stringValue': 'bar'}}, 'createTime': '2021-01-12T20:35:29.425788Z', 'updateTime': '2021-01-12T20:35:29.425788Z'}, 'updateMask': {}} {event_id: 3299c6a0-3efa-4893-ad87-3dc59c78b084, timestamp: 2021-01-12T20:35:29.425Z, event_type: providers/cloud.firestore/eventTypes/document.write, resource: {'name': 'projects/my-project/databases/(default)/documents/my-collection/LDtrTcJpPiy0V5TIg4p9', 'service': 'firestore.googleapis.com'}}
    
  2. added
    documentationImprovements or additions to documentation
    on Jan 12, 2021
  3. manuganji commented on Jan 12, 2021

    @manuganji
    Author

    This is such a detailed reply. Thank you very much @di ! :)

  4. manuganji commented on Jan 12, 2021

    @manuganji
    Author

    I have 2 more questions.

    1. I can't currently test storage triggers, correct?
    2. Can I start the emulator with firebase emulators:start and still register the python function? My hope is to test both my nodejs and python functions at the same time.
  5. di commented on Jan 12, 2021

    @di
    Member

    Happy to help!

    I can't currently test storage triggers, correct?

    If you mean Cloud Storage for Firebase, correct. From https://firebase.google.com/docs/emulator-suite#feature-matrix:

    the Cloud Functions emulator does not support background functions triggered by Auth or Cloud Storage for Firebase.

    There's a feature request for this here: firebase/firebase-tools#1738

    Can I start the emulator with firebase emulators:start and still register the python function? My hope is to test both my nodejs and python functions at the same time.

    I'm not very familiar with the firebase emulator, but it seems like it's not possible to start the emulator via firebase emulators:start and specify --functions_emulator. In addition I think the emulated functions would all need to run on the same host/port.

    This might be a good question for the firebase-tools tag on Stack Overflow instead -- it doesn't really have anything to do with the Functions Framework at this point.

  6. lfpazmino commented on Mar 8, 2021

    @lfpazmino

    Hi @di
    Thanks for guidelines, quite useful. However, I am facing an issue and I hope you can help me out

    I followed your step-by-step instructions, but it is not working. When I checked the firebase-debug.log I find these logs:

    [debug] [2021-03-08T23:18:40.086Z] Accepted request POST /functions/projects/{project Id}/triggers/Test --> Test {"metadata":{"emulator":{"name":"functions"},"message":"Accepted request POST /functions/projects/{project id}/triggers/Test --> Test"}}
    [debug] [2021-03-08T23:18:40.086Z] Could not find key=Test in {}
    [debug] [2021-03-08T23:18:40.088Z] RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: undefined {"metadata":{"emulator":{"name":"functions"},"message":{"code":"ERR_HTTP_INVALID_STATUS_CODE"}}}
    [debug] [2021-03-08T23:18:40.088Z] [work-queue] {"queueLength":0,"workRunningCount":0}

    I think I am missing something about registering the trigger "Test" somewhere, the one is referring to in the PUT endpoint:
    http://localhost:8081/emulator/v1/projects/my-project/triggers/Test

    Is there any configuration missing?

    Thanks in advance!

  7. di commented on Mar 9, 2021

    @di
    Member

    @lfpazmino Sorry, I can't really help with the Firebase emulator here. This might be a good issue for the https://github.com/firebase/firebase-tools/ repo or a question for the firebase-tools tag on Stack Overflow instead.

  8. locked and limited conversation to collaborators on Mar 9, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions