Skip to content

Commit dea10eb

Browse files
authored
Make it possible to run firestore tests against emulator (#488)
* Desktop and Android works with env variable and extra * Format and remove GTEST_FILTER for now * Add deletelocalref * Feedback. * More tweaks.
1 parent b0a9062 commit dea10eb

File tree

3 files changed

+66
-24
lines changed

3 files changed

+66
-24
lines changed

firestore/integration_test_internal/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717
-->
1818
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
19-
package="com.google.firebase.cpp.database.testapp"
19+
package="com.google.firebase.cpp.firestore.testapp"
2020
android:versionCode="1"
2121
android:versionName="1.0">
2222
<uses-permission android:name="android.permission.INTERNET" />

firestore/integration_test_internal/src/firestore_integration_test.cc

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,32 +20,35 @@ namespace {
2020
// non-default app to avoid data ending up in the cache before tests run.
2121
static const char* kBootstrapAppName = "bootstrap";
2222

23-
// Set Firestore up to use Firestore Emulator if it can be found.
23+
// Set Firestore up to use Firestore Emulator via USE_FIRESTORE_EMULATOR
2424
void LocateEmulator(Firestore* db) {
25-
// iOS and Android pass emulator address differently, iOS writes it to a
26-
// temp file, but there is no equivalent to `/tmp/` for Android, so it
27-
// uses an environment variable instead.
28-
// TODO(wuandy): See if we can use environment variable for iOS as well?
29-
std::ifstream ifs("/tmp/emulator_address");
30-
std::stringstream buffer;
31-
buffer << ifs.rdbuf();
32-
std::string address;
33-
if (ifs.good()) {
34-
address = buffer.str();
35-
} else if (std::getenv("FIRESTORE_EMULATOR_HOST")) {
36-
address = std::getenv("FIRESTORE_EMULATOR_HOST");
25+
// Use emulator as long as this env variable is set, regardless its value.
26+
if (std::getenv("USE_FIRESTORE_EMULATOR") == nullptr) {
27+
LogDebug("Using Firestore Prod for testing.");
28+
return;
3729
}
3830

39-
#if !defined(__ANDROID__)
40-
absl::StripAsciiWhitespace(&address);
41-
#endif // !defined(__ANDROID__)
42-
if (!address.empty()) {
43-
auto settings = db->settings();
44-
settings.set_host(address);
45-
// Emulator does not support ssl yet.
46-
settings.set_ssl_enabled(false);
47-
db->set_settings(settings);
48-
}
31+
#if defined(__ANDROID__)
32+
// Special IP to access the hosting OS from Android Emulator.
33+
std::string local_host = "10.0.2.2";
34+
#else
35+
std::string local_host = "localhost";
36+
#endif // defined(__ANDROID__)
37+
38+
// Use FIRESTORE_EMULATOR_PORT if it is set to non empty string,
39+
// otherwise use the default port.
40+
std::string port = std::getenv("FIRESTORE_EMULATOR_PORT")
41+
? std::getenv("FIRESTORE_EMULATOR_PORT")
42+
: "8080";
43+
std::string address =
44+
port.empty() ? (local_host + ":8080") : (local_host + ":" + port);
45+
46+
LogInfo("Using Firestore Emulator (%s) for testing.", address.c_str());
47+
auto settings = db->settings();
48+
settings.set_host(address);
49+
// Emulator does not support ssl yet.
50+
settings.set_ssl_enabled(false);
51+
db->set_settings(settings);
4952
}
5053

5154
} // namespace

testing/sample_framework/src/android/android_app_framework.cc

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,43 @@ std::string ReadTextInput(const char* title, const char* message,
478478
return g_text_entry_field_data->ReadText(title, message, placeholder);
479479
}
480480

481+
void SetEnvironmentVariableFromStringExtra(JNIEnv* env, const char* extra_name,
482+
jobject intent) {
483+
jclass intent_class = env->GetObjectClass(intent);
484+
jmethodID get_string_extra = env->GetMethodID(
485+
intent_class, "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
486+
env->DeleteLocalRef(intent_class);
487+
488+
jstring extra_name_jstring = env->NewStringUTF(extra_name);
489+
jstring extra_value_jstring = (jstring)env->CallObjectMethod(
490+
intent, get_string_extra, extra_name_jstring);
491+
env->DeleteLocalRef(extra_name_jstring);
492+
493+
if (extra_value_jstring != nullptr) {
494+
const char* extra_value =
495+
env->GetStringUTFChars(extra_value_jstring, nullptr);
496+
setenv(extra_name, extra_value, /*overwrite=*/1);
497+
env->ReleaseStringUTFChars(extra_value_jstring, extra_value);
498+
env->DeleteLocalRef(extra_value_jstring);
499+
}
500+
}
501+
502+
void SetExtrasAsEnvironmentVariables() {
503+
JNIEnv* env = app_framework::GetJniEnv();
504+
jobject activity = app_framework::GetActivity();
505+
506+
jclass activity_class = env->GetObjectClass(activity);
507+
jmethodID get_intent = env->GetMethodID(activity_class, "getIntent",
508+
"()Landroid/content/Intent;");
509+
env->DeleteLocalRef(activity_class);
510+
511+
jobject intent = env->CallObjectMethod(activity, get_intent);
512+
SetEnvironmentVariableFromStringExtra(env, "USE_FIRESTORE_EMULATOR", intent);
513+
SetEnvironmentVariableFromStringExtra(env, "FIRESTORE_EMULATOR_PORT", intent);
514+
515+
env->DeleteLocalRef(intent);
516+
}
517+
481518
} // namespace app_framework
482519

483520
// Execute common_main(), flush pending events and finish the activity.
@@ -520,6 +557,8 @@ extern "C" void android_main(struct android_app* state) {
520557
pthread_create(&thread, nullptr, app_framework::stdout_logger,
521558
reinterpret_cast<void*>(filedes));
522559

560+
app_framework::SetExtrasAsEnvironmentVariables();
561+
523562
// Execute cross platform entry point.
524563
// Copy the app name into a non-const array, as googletest requires that
525564
// main() take non-const char* argv[] so it can modify the arguments.

0 commit comments

Comments
 (0)