skip to Main Content

grpc fails to connect even when I set my jest test() async function to a 100000ms cap before it times out.

// terminal, after running jest --watch
● creates new record

    14 UNAVAILABLE: failed to connect to all addresses

      at Object.<anonymous>.exports.createStatusError (node_modules/grpc/src/common.js:91:15)
      at Object.onReceiveStatus (node_modules/grpc/src/client_interceptors.js:1209:28)
      at InterceptingListener.Object.<anonymous>.InterceptingListener._callNext (node_modules/grpc/src/client_interceptors.js:568:42)
      at InterceptingListener.Object.<anonymous>.InterceptingListener.onReceiveStatus (node_modules/grpc/src/client_interceptors.js:618:8)
      at callback (node_modules/grpc/src/client_interceptors.js:847:24)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 skipped, 2 total
Snapshots:   0 total
Time:        106.03s, estimated 116s
Ran all test suites related to changed files.

Watch Usage: Press w to show more.
owner@G700:~/PhpstormProjects/shopify/bu
 FAIL  functions/src/classes/__tests__/FirestoreConnection.test.ts (108.991s)
  ✕ creates new record (100029ms)
  ○ skipped 

  ● creates new record

    : Timeout - Async callback was not invoked within the 100000ms timeout specified by jest.setTimeout.Timeout - Async callback was not invoked within the 100000ms timeout specified by jest.setTimeout.Error:

      51 | 
      52 | 
    > 53 | test("creates new record", async () => {
         | ^
      54 |   const addedDocument = await db
      55 |     .createNew(RecordTypes.globalRule, {
      56 |       storeId : "dummyStoreId"

      at new Spec (node_modules/jest-jasmine2/build/jasmine/Spec.js:116:22)
      at Object.<anonymous> (functions/src/classes/__tests__/FirestoreConnection.test.ts:53:1)

  ● creates new record

    14 UNAVAILABLE: failed to connect to all addresses

      at Object.<anonymous>.exports.createStatusError (node_modules/grpc/src/common.js:91:15)
      at Object.onReceiveStatus (node_modules/grpc/src/client_interceptors.js:1209:28)
      at InterceptingListener.Object.<anonymous>.InterceptingListener._callNext (node_modules/grpc/src/client_interceptors.js:568:42)
      at InterceptingListener.Object.<anonymous>.InterceptingListener.onReceiveStatus (node_modules/grpc/src/client_interceptors.js:618:8)
      at callback (node_modules/grpc/src/client_interceptors.js:847:24)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 skipped, 2 total
Snapshots:   0 total
Time:        111.16s
Ran all test suites related to changed files.


// FirebaseConnection.ts, inside the class

  protected async addDocument(collectionName: string, documentData: object): Promise<firestore.DocumentSnapshot|null> {
    try {
      const newlyAddedDocument = await this.database
        .collection(collectionName)
        .add(documentData);

      return await newlyAddedDocument.get();
    }
    catch (e) {
      console.log(e, `=====error=====`);
      return null;
    }
  }

  // --------------- Public Methods

  public async createNew(type: RecordTypes, documentData: object): Promise<firestore.DocumentSnapshot|null> {
    this.verifySchemaIsCorrect(type, documentData);
    const collectionName = this.getCollectionName(type);

    return await this.addDocument(collectionName, documentData);
  }

// FirebaseConnection.test.ts
import * as firebaseTesting from "@firebase/testing";
import {RecordTypes} from "../../../../shared";

import FirestoreConnection from "../FirestoreConnection";

/* * * * * * * * * * * * * * * * * * * * *
                  Setup
* * * * * * * * * * * * * * * * * * * * */

const createTestDatabase = (credentials): any => {
  return firebaseTesting
    .initializeTestApp({
      projectId: 'testProject',
      auth: credentials
    })
    .firestore();
};

const nullAllApps = firebaseTesting
  .apps().map(app => app.delete());

const db = new FirestoreConnection('testShopDomain', createTestDatabase(null));


/* * * * * * * * * * * * * * * * * * * * *
                  Tests
* * * * * * * * * * * * * * * * * * * * */

test("creates new record", async () => {
  const addedDocument = await db
    .createNew(RecordTypes.globalRule, {
      storeId : "dummyStoreId"
      , globalPercent : 40
    });

  expect(addedDocument).toEqual({
    storeId : "dummyStoreId"
    , globalPercent : 40
    , badProp : 0
  });
}, 100000);

Is anyone able to tell why this is happening? Looking at the documentation this appears to be a lower level library: https://grpc.github.io/grpc/node/

Update

After it was suggested that the server/emulator was not found by gRPC, I ran firebase serve --only functions,firestore. Terminal showed emulators running on different ports for both services. Rerunning jest --watch now produces a slightly different error:

 2 UNKNOWN:

      at Object.<anonymous>.exports.createStatusError (node_modules/grpc/src/common.js:91:15)
      at Object.onReceiveStatus (node_modules/grpc/src/client_interceptors.js:1209:28)
      at InterceptingListener.Object.<anonymous>.InterceptingListener._callNext (node_modules/grpc/src/client_interceptors.js:568:42)
      at InterceptingListener.Object.<anonymous>.InterceptingListener.onReceiveStatus (node_modules/grpc/src/client_interceptors.js:618:8)
      at callback (node_modules/grpc/src/client_interceptors.js:847:24)

3

Answers


  1. Chosen as BEST ANSWER

    Firebase functions was hiding the underlying error. This was solved in 2 steps:

    1. enabling logging in the the admin SDK with firestore.setLogFunction()
    2. projectId testProject was invalid. Changing the projectId to testproject with all lowercase letters cleared this error.

  2. That gRPC error means that no server is running at the address you are trying to connect to, or a connection to that server cannot be established for some reason. If you are trying to connect to a local Firestore emulator, you should verify that it is running and that you can connect to it outside of a test.

    Login or Signup to reply.
  3. unset your proxy
    unset https_proxy;unset http_proxy

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search