mirror of https://github.com/grpc/grpc.git
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
4.5 KiB
146 lines
4.5 KiB
// |
|
// |
|
// Copyright 2023 gRPC authors. |
|
// |
|
// Licensed under the Apache License, Version 2.0 (the "License"); |
|
// you may not use this file except in compliance with the License. |
|
// You may obtain a copy of the License at |
|
// |
|
// http://www.apache.org/licenses/LICENSE-2.0 |
|
// |
|
// Unless required by applicable law or agreed to in writing, software |
|
// distributed under the License is distributed on an "AS IS" BASIS, |
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
// See the License for the specific language governing permissions and |
|
// limitations under the License. |
|
// |
|
// |
|
|
|
#include "src/cpp/ext/gcp/environment_autodetect.h" |
|
|
|
#include <string> |
|
#include <thread> // NOLINT |
|
#include <vector> |
|
|
|
#include "absl/strings/string_view.h" |
|
#include "absl/synchronization/notification.h" |
|
#include "gmock/gmock.h" |
|
#include "gtest/gtest.h" |
|
|
|
#include <grpc/grpc.h> |
|
|
|
#include "src/core/lib/gprpp/env.h" |
|
#include "src/core/lib/gprpp/notification.h" |
|
#include "test/core/util/test_config.h" |
|
|
|
namespace grpc { |
|
namespace testing { |
|
|
|
namespace { |
|
|
|
class EnvironmentAutoDetectTest : public ::testing::Test { |
|
protected: |
|
void GetNotifiedOnEnvironmentDetection( |
|
grpc::internal::EnvironmentAutoDetect* env, |
|
grpc_core::Notification* notify) { |
|
env->NotifyOnDone([notify]() { notify->Notify(); }); |
|
} |
|
}; |
|
|
|
// TODO(yashykt): We could create a mock MetadataServer to test this more end to |
|
// end, but given that that should be covered by our integration testing so |
|
// deferring to that. |
|
|
|
TEST_F(EnvironmentAutoDetectTest, Basic) { |
|
grpc::internal::EnvironmentAutoDetect env("project"); |
|
|
|
grpc_core::Notification notify; |
|
GetNotifiedOnEnvironmentDetection(&env, ¬ify); |
|
notify.WaitForNotification(); |
|
|
|
// Unless we test in a specific GCP resource, we should get "global" here. |
|
// EXPECT_EQ(env.resource()->resource_type, "global"); |
|
EXPECT_EQ((env.resource()->labels).at("project_id"), "project"); |
|
} |
|
|
|
TEST_F(EnvironmentAutoDetectTest, GkeEnvironment) { |
|
grpc_core::SetEnv("KUBERNETES_SERVICE_HOST", "k8s_service_host"); |
|
grpc::internal::EnvironmentAutoDetect env("project"); |
|
|
|
grpc_core::Notification notify; |
|
GetNotifiedOnEnvironmentDetection(&env, ¬ify); |
|
notify.WaitForNotification(); |
|
|
|
EXPECT_EQ(env.resource()->resource_type, "k8s_container"); |
|
EXPECT_EQ((env.resource()->labels).at("project_id"), "project"); |
|
grpc_core::UnsetEnv("KUBERNETES_SERVICE_HOST"); |
|
} |
|
|
|
TEST_F(EnvironmentAutoDetectTest, CloudFunctions) { |
|
grpc_core::SetEnv("FUNCTION_NAME", "function_name"); |
|
grpc::internal::EnvironmentAutoDetect env("project"); |
|
|
|
grpc_core::Notification notify; |
|
GetNotifiedOnEnvironmentDetection(&env, ¬ify); |
|
notify.WaitForNotification(); |
|
|
|
EXPECT_EQ(env.resource()->resource_type, "cloud_function"); |
|
EXPECT_EQ((env.resource()->labels).at("project_id"), "project"); |
|
grpc_core::UnsetEnv("FUNCTION_NAME"); |
|
} |
|
|
|
TEST_F(EnvironmentAutoDetectTest, CloudRun) { |
|
grpc_core::SetEnv("K_CONFIGURATION", "config"); |
|
grpc::internal::EnvironmentAutoDetect env("project"); |
|
|
|
grpc_core::Notification notify; |
|
GetNotifiedOnEnvironmentDetection(&env, ¬ify); |
|
notify.WaitForNotification(); |
|
|
|
EXPECT_EQ(env.resource()->resource_type, "cloud_run_revision"); |
|
EXPECT_EQ((env.resource()->labels).at("project_id"), "project"); |
|
grpc_core::UnsetEnv("K_CONFIGURATION"); |
|
} |
|
|
|
TEST_F(EnvironmentAutoDetectTest, AppEngine) { |
|
grpc_core::SetEnv("K_CONFIGURATION", "config"); |
|
grpc::internal::EnvironmentAutoDetect env("project"); |
|
|
|
grpc_core::Notification notify; |
|
GetNotifiedOnEnvironmentDetection(&env, ¬ify); |
|
notify.WaitForNotification(); |
|
|
|
EXPECT_EQ(env.resource()->resource_type, "cloud_run_revision"); |
|
EXPECT_EQ((env.resource()->labels).at("project_id"), "project"); |
|
grpc_core::UnsetEnv("K_CONFIGURATION"); |
|
} |
|
|
|
TEST_F(EnvironmentAutoDetectTest, MultipleNotifyWaiters) { |
|
grpc::internal::EnvironmentAutoDetect env("project"); |
|
|
|
grpc_core::Notification notify[10]; |
|
for (int i = 0; i < 10; ++i) { |
|
GetNotifiedOnEnvironmentDetection(&env, ¬ify[i]); |
|
} |
|
for (int i = 0; i < 10; ++i) { |
|
notify[i].WaitForNotification(); |
|
} |
|
|
|
// Unless we test in a specific GCP resource, we should get "global" here. |
|
// EXPECT_EQ(env.resource()->resource_type, "global"); |
|
EXPECT_EQ((env.resource()->labels).at("project_id"), "project"); |
|
} |
|
|
|
} // namespace |
|
|
|
} // namespace testing |
|
} // namespace grpc |
|
|
|
int main(int argc, char** argv) { |
|
grpc::testing::TestEnvironment env(&argc, argv); |
|
::testing::InitGoogleTest(&argc, argv); |
|
grpc_init(); |
|
int ret_val = RUN_ALL_TESTS(); |
|
grpc_shutdown(); |
|
return ret_val; |
|
}
|
|
|