Skip to content

Commit b33e781

Browse files
Added unit tests for ApiManager and RequestHandler (istio#356)
* Added unit tests for ApiManager and RequestHandler * Fixed code formatting * Simplified duplicated variables * Removed unused constant variables * Added more comments
1 parent ffcc6cd commit b33e781

File tree

3 files changed

+611
-22
lines changed

3 files changed

+611
-22
lines changed

contrib/endpoints/src/api_manager/BUILD

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,20 @@ cc_test(
205205
],
206206
)
207207

208+
cc_test(
209+
name = "request_handler_test",
210+
size = "small",
211+
srcs = [
212+
"request_handler_test.cc",
213+
],
214+
linkstatic = 1,
215+
deps = [
216+
":api_manager",
217+
":mock_api_manager_environment",
218+
"//external:googletest_main",
219+
],
220+
)
221+
208222
cc_test(
209223
name = "config_manager_test",
210224
size = "small",

contrib/endpoints/src/api_manager/api_manager_test.cc

Lines changed: 135 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,22 @@ const char kServiceConfig1[] = R"(
4646
{
4747
"name": "bookstore.test.appspot.com",
4848
"title": "Bookstore",
49+
"http": {
50+
"rules": [
51+
{
52+
"selector": "EchoGetMessage",
53+
"get": "/echo"
54+
}
55+
]
56+
},
57+
"usage": {
58+
"rules": [
59+
{
60+
"selector": "EchoGetMessage",
61+
"allowUnregisteredCalls": true
62+
}
63+
]
64+
},
4965
"control": {
5066
"environment": "servicecontrol.googleapis.com"
5167
},
@@ -64,20 +80,6 @@ const char kServiceConfig2[] = R"(
6480
}
6581
)";
6682

67-
const char kGceMetadataWithServiceNameAndConfigId[] = R"(
68-
{
69-
"project": {
70-
"projectId": "test-project"
71-
},
72-
"instance": {
73-
"attributes":{
74-
"endpoints-service-name": "service_name_from_metadata",
75-
"endpoints-service-config-id":"2017-05-01r1"
76-
}
77-
}
78-
}
79-
)";
80-
8183
const char kServiceForStatistics[] =
8284
"name: \"service-name\"\n"
8385
"control: {\n"
@@ -86,12 +88,22 @@ const char kServiceForStatistics[] =
8688

8789
class ApiManagerTest : public ::testing::Test {
8890
protected:
91+
ApiManagerTest() : callback_run_count_(0) {}
8992
std::shared_ptr<ApiManager> MakeApiManager(
9093
std::unique_ptr<ApiManagerEnvInterface> env, const char *service_config);
9194
std::shared_ptr<ApiManager> MakeApiManager(
9295
std::unique_ptr<ApiManagerEnvInterface> env, const char *service_config,
9396
const char *server_config);
9497

98+
void SetUp() {
99+
callback_run_count_ = 0;
100+
call_history_.clear();
101+
}
102+
103+
protected:
104+
std::vector<std::string> call_history_;
105+
int callback_run_count_;
106+
95107
private:
96108
ApiManagerFactory factory_;
97109
};
@@ -147,32 +159,37 @@ TEST_F(ApiManagerTest, CorrectStatistics) {
147159
EXPECT_EQ(0, service_control_stat.send_report_operations);
148160
}
149161

150-
// ApiManager instance should be initialized on ApiManager instance creation
151162
TEST_F(ApiManagerTest, InitializedOnApiManagerInstanceCreation) {
152163
std::unique_ptr<MockApiManagerEnvironment> env(
153164
new ::testing::NiceMock<MockApiManagerEnvironment>());
154165

155-
// ServiceManagement service should not be called
156166
EXPECT_CALL(*(env.get()), DoRunHTTPRequest(_)).Times(0);
157167

158168
std::shared_ptr<ApiManagerImpl> api_manager(
159169
std::dynamic_pointer_cast<ApiManagerImpl>(
160170
MakeApiManager(std::move(env), kServiceConfig1,
161171
kServerConfigWithServiceNameConfigId)));
162172

163-
// Already initialized
164173
EXPECT_TRUE(api_manager);
165174
EXPECT_EQ("OK", api_manager->ConfigLoadingStatus().ToString());
166175

176+
auto service = api_manager->SelectService();
177+
EXPECT_TRUE(service);
178+
EXPECT_EQ("bookstore.test.appspot.com", service->service_name());
179+
EXPECT_EQ("2017-05-01r0", service->service().id());
180+
167181
api_manager->Init();
168182

169-
// No change is expected
170183
EXPECT_EQ("OK", api_manager->ConfigLoadingStatus().ToString());
171184
EXPECT_TRUE(api_manager->Enabled());
172185
EXPECT_EQ("2017-05-01r0", api_manager->service("2017-05-01r0").id());
186+
187+
service = api_manager->SelectService();
188+
EXPECT_TRUE(service);
189+
EXPECT_EQ("bookstore.test.appspot.com", service->service_name());
190+
EXPECT_EQ("2017-05-01r0", service->service().id());
173191
}
174192

175-
// ApiManager was initialized by ConfigManager
176193
TEST_F(ApiManagerTest, InitializedByConfigManager) {
177194
std::unique_ptr<MockApiManagerEnvironment> env(
178195
new ::testing::NiceMock<MockApiManagerEnvironment>());
@@ -196,16 +213,112 @@ TEST_F(ApiManagerTest, InitializedByConfigManager) {
196213
EXPECT_EQ("bookstore.test.appspot.com", api_manager->service_name());
197214
EXPECT_EQ("", api_manager->service("2017-05-01r0").id());
198215

216+
EXPECT_TRUE(api_manager->IsConfigLoadingInProgress());
217+
EXPECT_FALSE(api_manager->IsConfigLoadingSucceeded());
218+
199219
api_manager->Init();
200220

201-
// Successfully initialized by ConfigManager
221+
EXPECT_FALSE(api_manager->IsConfigLoadingInProgress());
222+
EXPECT_TRUE(api_manager->IsConfigLoadingSucceeded());
223+
202224
EXPECT_EQ("OK", api_manager->ConfigLoadingStatus().ToString());
203225
EXPECT_TRUE(api_manager->Enabled());
204226
EXPECT_EQ("2017-05-01r0", api_manager->service("2017-05-01r0").id());
227+
228+
auto service = api_manager->SelectService();
229+
EXPECT_TRUE(service);
230+
EXPECT_EQ("bookstore.test.appspot.com", service->service_name());
231+
EXPECT_EQ("2017-05-01r0", service->service().id());
232+
}
233+
234+
TEST_F(ApiManagerTest, ConfigManagerInitializationFailed) {
235+
std::unique_ptr<MockApiManagerEnvironment> env(
236+
new ::testing::NiceMock<MockApiManagerEnvironment>());
237+
238+
EXPECT_CALL(*(env.get()), DoRunHTTPRequest(_))
239+
.WillOnce(Invoke([this](HTTPRequest *req) {
240+
EXPECT_EQ(
241+
"https://servicemanagement.googleapis.com/v1/services/"
242+
"bookstore.test.appspot.com/configs/2017-05-01r0",
243+
req->url());
244+
req->OnComplete(utils::Status(Code::NOT_FOUND, "Not Found"), {},
245+
std::move(kServiceConfig1));
246+
}));
247+
248+
std::shared_ptr<ApiManagerImpl> api_manager(
249+
std::dynamic_pointer_cast<ApiManagerImpl>(MakeApiManager(
250+
std::move(env), "", kServerConfigWithServiceNameConfigId)));
251+
252+
EXPECT_TRUE(api_manager);
253+
EXPECT_TRUE(api_manager->IsConfigLoadingInProgress());
254+
EXPECT_FALSE(api_manager->IsConfigLoadingSucceeded());
255+
256+
EXPECT_EQ("UNAVAILABLE: Not initialized yet",
257+
api_manager->ConfigLoadingStatus().ToString());
258+
EXPECT_EQ("bookstore.test.appspot.com", api_manager->service_name());
259+
EXPECT_EQ("", api_manager->service("2017-05-01r0").id());
260+
261+
api_manager->Init();
262+
263+
EXPECT_FALSE(api_manager->IsConfigLoadingInProgress());
264+
EXPECT_FALSE(api_manager->IsConfigLoadingSucceeded());
265+
266+
EXPECT_EQ("ABORTED: Failed to download the service config",
267+
api_manager->ConfigLoadingStatus().ToString());
268+
269+
auto service = api_manager->SelectService();
270+
EXPECT_FALSE(service);
271+
}
272+
273+
TEST_F(ApiManagerTest, AddPendingCallbackThenInitializationSucceeded) {
274+
std::unique_ptr<MockApiManagerEnvironment> env(
275+
new ::testing::NiceMock<MockApiManagerEnvironment>());
276+
277+
EXPECT_CALL(*(env.get()), DoRunHTTPRequest(_))
278+
.WillOnce(Invoke([this](HTTPRequest *req) {
279+
EXPECT_EQ(
280+
"https://servicemanagement.googleapis.com/v1/services/"
281+
"bookstore.test.appspot.com/configs/2017-05-01r0",
282+
req->url());
283+
req->OnComplete(Status::OK, {}, std::move(kServiceConfig1));
284+
}));
285+
286+
std::shared_ptr<ApiManagerImpl> api_manager(
287+
std::dynamic_pointer_cast<ApiManagerImpl>(MakeApiManager(
288+
std::move(env), "", kServerConfigWithServiceNameConfigId)));
289+
290+
EXPECT_TRUE(api_manager);
291+
EXPECT_EQ("UNAVAILABLE: Not initialized yet",
292+
api_manager->ConfigLoadingStatus().ToString());
293+
EXPECT_EQ("bookstore.test.appspot.com", api_manager->service_name());
294+
EXPECT_EQ("", api_manager->service("2017-05-01r0").id());
295+
296+
EXPECT_TRUE(api_manager->IsConfigLoadingInProgress());
297+
EXPECT_FALSE(api_manager->IsConfigLoadingSucceeded());
298+
299+
api_manager->AddPendingRequestCallback([this](utils::Status status) {
300+
callback_run_count_++;
301+
EXPECT_OK(status);
302+
});
303+
EXPECT_EQ(0, callback_run_count_);
304+
305+
api_manager->Init();
306+
307+
EXPECT_EQ(1, callback_run_count_);
308+
309+
EXPECT_FALSE(api_manager->IsConfigLoadingInProgress());
310+
EXPECT_TRUE(api_manager->IsConfigLoadingSucceeded());
311+
312+
EXPECT_OK(api_manager->ConfigLoadingStatus());
313+
EXPECT_TRUE(api_manager->Enabled());
314+
EXPECT_EQ("2017-05-01r0", api_manager->service("2017-05-01r0").id());
315+
316+
auto service = api_manager->SelectService();
317+
EXPECT_TRUE(service);
318+
EXPECT_EQ("bookstore.test.appspot.com", service->service_name());
319+
EXPECT_EQ("2017-05-01r0", service->service().id());
205320
}
206321

207-
// ApiManager initialization was failed by ConfigManager because of different
208-
// service name
209322
TEST_F(ApiManagerTest,
210323
InitializationFailedByConfigManagerWithDifferentServiceName) {
211324
std::unique_ptr<MockApiManagerEnvironment> env(

0 commit comments

Comments
 (0)