Skip to content

[java-firestore] Ability to set emulator host/port from .setHost rather than env var #13143

Open

Description

@saturnism

Environment details

  1. OSX, Java

Steps to reproduce

  1. To use Testcontainer + Firestore emulator is extremely difficult.

Code example

Firestore client library can only connect to a firestore emulator by using an env var. This is not idiomatic for Java unit tests.

it's impossible to set the emulator host/port simply from .setHost(..)

FirestoreOptions firestoreOptions =
   FirestoreOptions.newBuilder().setHost(...).

The real code is this:

// duplicate the FakeCredentials class because it's package protected and not publicly accessible.
static class FakeCredentials extends Credentials {
 private final Map<String, List<String>> HEADERS =
     ImmutableMap.of("Authorization", Arrays.asList("Bearer owner"));
...
}

// then, duplicate the code that otherwise executes from an env var:
FirestoreOptions firestoreOptions =
   FirestoreOptions.newBuilder()
       .setProjectId(FIRESTORE_PROJECT_ID)
       .setChannelProvider(
           InstantiatingGrpcChannelProvider.newBuilder()
               .setEndpoint(
                   String.format(
                       "%s:%d",
                       FIRESTORE_CONTAINER.getContainerIpAddress(),
                       FIRESTORE_CONTAINER.getMappedPort(8080)))
               .setChannelConfigurator(
                   (managedChannelBuilder -> managedChannelBuilder.usePlaintext()))
               .build())
       .setCredentialsProvider(FixedCredentialsProvider.create(new FakeCredentials()))
       .build();

Any additional information below

It'd be MUCH easier if emulator host/port can simply be set via .setHost(...), OR, a convenience method, such as .useEmulator(host, port)

Activity

  1. saturnism commented on May 8, 2020

    @saturnism
    Author

    /cc @eddumelendez who's also working with TestContainer integration for GCP. https://github.com/eddumelendez/testcontainers-java/tree/gcloud

  2. added
    type: feature request‘Nice-to-have’ improvement, new feature or different behavior or design.
    and removed
    triage meI really want to be triaged.
    on May 11, 2020
  3. BenWhitehead commented on May 11, 2020

    @BenWhitehead
    Contributor

    In the same vein of googleapis/java-firestore#190.

    Something I'm hoping to have time for soon, but no specific estimate.

  4. saturnism commented on May 12, 2020

    @saturnism
    Author

    looks like the same issue. shared an internal friction log. thnx!

  5. schmidt-sebastian commented on May 12, 2020

    @schmidt-sebastian
    Contributor

    @BenWhitehead I am not opposed to this, but there seems to be a much more generic problem here: It is very difficult (even for me) to figure out which of the sheer endless options I have to enable to get change even simple settings.

    If we add a setHost here (and not in the main settings provider), how should we deal with conflicting settings?

  6. saturnism commented on May 12, 2020

    @saturnism
    Author

    I don't think that'll be any worse than now? Which is exposing all of these surfaces anyways. I feel that's a different set of problems - we need to minimize the surface, identify what's really necessary, and expose them via proper API surface. But setHost should just work. It's already there.

  7. schmidt-sebastian commented on May 13, 2020

    @schmidt-sebastian
    Contributor

    What you really need is a setHost(String hostname, boolean ssl, boolean useFakeCredentials). A single setHost does not help, since it still leaves a bunch of settings unset. If we need a short term fix, we could add a setEmulatorHost that does most of this for you.

  8. BenWhitehead commented on May 13, 2020

    @BenWhitehead
    Contributor

    I don't think a short term setEmulatorHost would necessarily be better for us maintenance wise. There is also the question about how difficult it is to bootstrap the emulator for use in java code. In datastore there is an emulator runner which allows the emulator to be started from java code, I think there is a desire to have the same thing for Firestore. With that in mind I think it'd be better for us to figure out how those will work together and then provide a good api for all emulator functionality rather than having two related but disconnected things our users have to figure out how to connect.

    If we're wanting to push out a fix to help out the fact that env variables can't be modified in process, we could add a fallback java property firestore.emulator.host and try reading that. This would allow in-process configuration of that flag for users.

        String envVar = System.getenv("FIRESTORE_EMULATOR_HOST");
        String sysProp = System.getProperty("firestore.emulator.host");
        String emulatorHost = envVar != null ? envVar : sysProp;
        
        if (emulatorHost != null) {
          // use fake creds
          // no ssl
        }
  9. saturnism commented on May 13, 2020

    @saturnism
    Author

    why do we expose setHost if it's not to be used to set it to any arbitrary hosts?

    does setHost take in a protocol? it actually does respect the dns:// protocol. tbh; ideally the api should've accepted a full url prefix, e.g. https://.... or http://.... emulators would only be using http

    the system property would work, but no one would find that in the api or .setHost javadoc popup. we should add it to the java doc.

  10. added a commit that references this issue on Sep 15, 2020
  11. changed the title [-]Ability to set emulator host/port from .setHost rather than env var[/-] on May 8, 2026
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

    api: firestoreIssues related to the Firestore API.type: feature request‘Nice-to-have’ improvement, new feature or different behavior or design.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions