OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/copresence/rpc/http_post.h" | |
6 | |
7 #include "base/test/test_simple_task_runner.h" | |
8 #include "components/copresence/proto/data.pb.h" | |
9 #include "net/base/url_util.h" | |
10 #include "net/http/http_status_code.h" | |
11 #include "net/url_request/test_url_fetcher_factory.h" | |
12 #include "net/url_request/url_request_test_util.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 #include "url/gurl.h" | |
15 | |
16 namespace { | |
17 | |
18 const char kFakeServerHost[] = "test.server.google.com"; | |
19 const char kRPCName[] = "testRpc"; | |
20 const char kTracingToken[] = "trace me!"; | |
21 const char kApiKey[] = "unlock ALL the APIz"; | |
22 const char kAuthToken[] = "oogabooga"; | |
23 | |
24 } // namespace | |
25 | |
26 using google::protobuf::MessageLite; | |
27 | |
28 namespace copresence { | |
29 | |
30 class HttpPostTest : public testing::Test { | |
31 public: | |
32 HttpPostTest() { | |
33 context_getter_ = new net::TestURLRequestContextGetter( | |
34 make_scoped_refptr(new base::TestSimpleTaskRunner)); | |
35 proto_.set_client("test_client"); | |
36 proto_.set_version_code(123); | |
37 } | |
38 ~HttpPostTest() override {} | |
39 | |
40 // Check that the correct response was sent. | |
41 void TestResponseCallback(int expected_response_code, | |
42 const std::string& expected_response, | |
43 int actual_response_code, | |
44 const std::string& actual_response) { | |
45 CHECK_EQ(expected_response_code, actual_response_code); | |
46 CHECK_EQ(expected_response, actual_response); | |
47 } | |
48 | |
49 protected: | |
50 void CheckPassthrough(int response_code, const std::string& response) { | |
51 HttpPost* post = new HttpPost( | |
52 context_getter_.get(), std::string("http://") + kFakeServerHost, | |
53 kRPCName, kApiKey, | |
54 "", // auth token | |
55 "", // tracing token | |
56 proto_); | |
57 post->Start(base::Bind(&HttpPostTest::TestResponseCallback, | |
58 base::Unretained(this), | |
59 response_code, | |
60 response)); | |
61 | |
62 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID( | |
63 HttpPost::kUrlFetcherId); | |
64 fetcher->set_response_code(response_code); | |
65 fetcher->SetResponseString(response); | |
66 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
67 } | |
68 | |
69 net::TestURLFetcher* GetFetcher() { | |
70 return fetcher_factory_.GetFetcherByID(HttpPost::kUrlFetcherId); | |
71 } | |
72 | |
73 const std::string GetApiKeySent() { | |
74 std::string api_key_sent; | |
75 net::GetValueForKeyInQuery(GetFetcher()->GetOriginalURL(), | |
76 HttpPost::kApiKeyField, | |
77 &api_key_sent); | |
78 return api_key_sent; | |
79 } | |
80 | |
81 const std::string GetAuthHeaderSent() { | |
82 net::HttpRequestHeaders headers; | |
83 std::string header; | |
84 GetFetcher()->GetExtraRequestHeaders(&headers); | |
85 return headers.GetHeader("Authorization", &header) ? header : ""; | |
86 } | |
87 | |
88 const std::string GetTracingTokenSent() { | |
89 std::string tracing_token_sent; | |
90 net::GetValueForKeyInQuery(GetFetcher()->GetOriginalURL(), | |
91 HttpPost::kTracingField, | |
92 &tracing_token_sent); | |
93 return tracing_token_sent; | |
94 } | |
95 | |
96 net::TestURLFetcherFactory fetcher_factory_; | |
97 scoped_refptr<net::TestURLRequestContextGetter> context_getter_; | |
98 | |
99 ClientVersion proto_; | |
100 }; | |
101 | |
102 TEST_F(HttpPostTest, OKResponse) { | |
103 // "Send" the proto to the "server". | |
104 HttpPost* post = new HttpPost(context_getter_.get(), | |
105 std::string("http://") + kFakeServerHost, | |
106 kRPCName, | |
107 kApiKey, | |
108 kAuthToken, | |
109 kTracingToken, | |
110 proto_); | |
111 post->Start(base::Bind(&HttpPostTest::TestResponseCallback, | |
112 base::Unretained(this), | |
113 net::HTTP_OK, | |
114 "Hello World!")); | |
115 | |
116 // Verify that the data was sent to the right place. | |
117 GURL requested_url = GetFetcher()->GetOriginalURL(); | |
118 EXPECT_EQ(kFakeServerHost, requested_url.host()); | |
119 EXPECT_EQ(std::string("/") + kRPCName, requested_url.path()); | |
120 | |
121 // Check parameters. | |
122 EXPECT_EQ("", GetApiKeySent()); // No API key when using an auth token. | |
123 EXPECT_EQ(std::string("Bearer ") + kAuthToken, GetAuthHeaderSent()); | |
124 EXPECT_EQ(std::string("token:") + kTracingToken, GetTracingTokenSent()); | |
125 | |
126 // Verify that the right data was sent. | |
127 std::string upload_data; | |
128 ASSERT_TRUE(proto_.SerializeToString(&upload_data)); | |
129 EXPECT_EQ(upload_data, GetFetcher()->upload_data()); | |
130 | |
131 // Send a response and check that it's passed along correctly. | |
132 GetFetcher()->set_response_code(net::HTTP_OK); | |
133 GetFetcher()->SetResponseString("Hello World!"); | |
134 GetFetcher()->delegate()->OnURLFetchComplete(GetFetcher()); | |
135 } | |
136 | |
137 TEST_F(HttpPostTest, ErrorResponse) { | |
138 CheckPassthrough(net::HTTP_BAD_REQUEST, "Bad client. Shame on you."); | |
139 CheckPassthrough(net::HTTP_INTERNAL_SERVER_ERROR, "I'm dying. Forgive me."); | |
140 CheckPassthrough(-1, ""); | |
141 } | |
142 | |
143 } // namespace copresence | |
OLD | NEW |