1 // Copyright (c) 2012 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 "base/bind.h"
6 #include "base/message_loop/message_loop.h"
7 #include "base/run_loop.h"
8 #include "base/values.h"
9 #include "google_apis/drive/dummy_auth_service.h"
10 #include "google_apis/drive/gdata_wapi_parser.h"
11 #include "google_apis/drive/gdata_wapi_requests.h"
12 #include "google_apis/drive/gdata_wapi_url_generator.h"
13 #include "google_apis/drive/request_sender.h"
14 #include "google_apis/drive/test_util.h"
15 #include "net/base/escape.h"
16 #include "net/test/embedded_test_server/embedded_test_server.h"
17 #include "net/test/embedded_test_server/http_request.h"
18 #include "net/test/embedded_test_server/http_response.h"
19 #include "net/url_request/url_request_test_util.h"
20 #include "testing/gtest/include/gtest/gtest.h"
21
22 namespace google_apis {
23
24 namespace {
25
26 const char kTestUserAgent[] = "test-user-agent";
27
28 class GDataWapiRequestsTest : public testing::Test {
29 public:
SetUp()30 virtual void SetUp() OVERRIDE {
31 request_context_getter_ = new net::TestURLRequestContextGetter(
32 message_loop_.message_loop_proxy());
33
34 request_sender_.reset(new RequestSender(new DummyAuthService,
35 request_context_getter_.get(),
36 message_loop_.message_loop_proxy(),
37 kTestUserAgent));
38
39 ASSERT_TRUE(test_server_.InitializeAndWaitUntilReady());
40 test_server_.RegisterRequestHandler(
41 base::Bind(&GDataWapiRequestsTest::HandleResourceFeedRequest,
42 base::Unretained(this)));
43
44 GURL test_base_url = test_util::GetBaseUrlForTesting(test_server_.port());
45 url_generator_.reset(new GDataWapiUrlGenerator(test_base_url));
46 }
47
48 protected:
49 // Handles a request for fetching a resource feed.
HandleResourceFeedRequest(const net::test_server::HttpRequest & request)50 scoped_ptr<net::test_server::HttpResponse> HandleResourceFeedRequest(
51 const net::test_server::HttpRequest& request) {
52 http_request_ = request;
53
54 const GURL absolute_url = test_server_.GetURL(request.relative_url);
55 std::string remaining_path;
56
57 if (!test_util::RemovePrefix(absolute_url.path(),
58 "/feeds/default/private/full",
59 &remaining_path)) {
60 return scoped_ptr<net::test_server::HttpResponse>();
61 }
62
63 // Process a feed for a single resource ID.
64 const std::string resource_id = net::UnescapeURLComponent(
65 remaining_path.substr(1), net::UnescapeRule::URL_SPECIAL_CHARS);
66 if (resource_id == "file:2_file_resource_id") {
67 scoped_ptr<net::test_server::BasicHttpResponse> result(
68 test_util::CreateHttpResponseFromFile(
69 test_util::GetTestFilePath("gdata/file_entry.json")));
70 return result.PassAs<net::test_server::HttpResponse>();
71 } else if (resource_id == "invalid_resource_id") {
72 // Check if this is an authorization request for an app.
73 // This emulates to return invalid formatted result from the server.
74 if (request.method == net::test_server::METHOD_PUT &&
75 request.content.find("<docs:authorizedApp>") != std::string::npos) {
76 scoped_ptr<net::test_server::BasicHttpResponse> result(
77 test_util::CreateHttpResponseFromFile(
78 test_util::GetTestFilePath("gdata/testfile.txt")));
79 return result.PassAs<net::test_server::HttpResponse>();
80 }
81 }
82
83 return scoped_ptr<net::test_server::HttpResponse>();
84 }
85
86 base::MessageLoopForIO message_loop_; // Test server needs IO thread.
87 net::test_server::EmbeddedTestServer test_server_;
88 scoped_ptr<RequestSender> request_sender_;
89 scoped_ptr<GDataWapiUrlGenerator> url_generator_;
90 scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
91
92 // The incoming HTTP request is saved so tests can verify the request
93 // parameters like HTTP method (ex. some requests should use DELETE
94 // instead of GET).
95 net::test_server::HttpRequest http_request_;
96 };
97
98 } // namespace
99
TEST_F(GDataWapiRequestsTest,GetResourceEntryRequest_ValidResourceId)100 TEST_F(GDataWapiRequestsTest, GetResourceEntryRequest_ValidResourceId) {
101 GDataErrorCode result_code = GDATA_OTHER_ERROR;
102 scoped_ptr<base::Value> result_data;
103
104 {
105 base::RunLoop run_loop;
106 GetResourceEntryRequest* request = new GetResourceEntryRequest(
107 request_sender_.get(),
108 *url_generator_,
109 "file:2_file_resource_id", // resource ID
110 GURL(), // embed origin
111 test_util::CreateQuitCallback(
112 &run_loop,
113 test_util::CreateCopyResultCallback(&result_code, &result_data)));
114 request_sender_->StartRequestWithRetry(request);
115 run_loop.Run();
116 }
117
118 EXPECT_EQ(HTTP_SUCCESS, result_code);
119 EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
120 EXPECT_EQ("/feeds/default/private/full/file%3A2_file_resource_id"
121 "?v=3&alt=json&showroot=true",
122 http_request_.relative_url);
123 scoped_ptr<base::Value> expected_json =
124 test_util::LoadJSONFile("gdata/file_entry.json");
125 ASSERT_TRUE(expected_json);
126 EXPECT_TRUE(result_data);
127 EXPECT_TRUE(base::Value::Equals(expected_json.get(), result_data.get()));
128 }
129
TEST_F(GDataWapiRequestsTest,GetResourceEntryRequest_InvalidResourceId)130 TEST_F(GDataWapiRequestsTest, GetResourceEntryRequest_InvalidResourceId) {
131 GDataErrorCode result_code = GDATA_OTHER_ERROR;
132 scoped_ptr<base::Value> result_data;
133
134 {
135 base::RunLoop run_loop;
136 GetResourceEntryRequest* request = new GetResourceEntryRequest(
137 request_sender_.get(),
138 *url_generator_,
139 "<invalid>", // resource ID
140 GURL(), // embed origin
141 test_util::CreateQuitCallback(
142 &run_loop,
143 test_util::CreateCopyResultCallback(&result_code, &result_data)));
144 request_sender_->StartRequestWithRetry(request);
145 run_loop.Run();
146 }
147
148 EXPECT_EQ(HTTP_NOT_FOUND, result_code);
149 EXPECT_EQ(net::test_server::METHOD_GET, http_request_.method);
150 EXPECT_EQ("/feeds/default/private/full/%3Cinvalid%3E?v=3&alt=json"
151 "&showroot=true",
152 http_request_.relative_url);
153 ASSERT_FALSE(result_data);
154 }
155
156 } // namespace google_apis
157