| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 #include <map> | 6 #include <map> |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 const net::test_server::HttpRequest& request) { | 102 const net::test_server::HttpRequest& request) { |
| 103 http_request_ = request; | 103 http_request_ = request; |
| 104 | 104 |
| 105 const GURL absolute_url = test_server_.GetURL(request.relative_url); | 105 const GURL absolute_url = test_server_.GetURL(request.relative_url); |
| 106 std::string remaining_path; | 106 std::string remaining_path; |
| 107 if (absolute_url.path() == "/feeds/default/private/full" && | 107 if (absolute_url.path() == "/feeds/default/private/full" && |
| 108 request.method == net::test_server::METHOD_POST) { | 108 request.method == net::test_server::METHOD_POST) { |
| 109 // This is a request for copying a document. | 109 // This is a request for copying a document. |
| 110 // TODO(satorux): we should generate valid JSON data for the newly | 110 // TODO(satorux): we should generate valid JSON data for the newly |
| 111 // copied document but for now, just return "file_entry.json" | 111 // copied document but for now, just return "file_entry.json" |
| 112 return test_util::CreateHttpResponseFromFile( | 112 scoped_ptr<net::test_server::BasicHttpResponse> result( |
| 113 test_util::GetTestFilePath("chromeos/gdata/file_entry.json")); | 113 test_util::CreateHttpResponseFromFile( |
| 114 test_util::GetTestFilePath("chromeos/gdata/file_entry.json"))); |
| 115 return result.PassAs<net::test_server::HttpResponse>(); |
| 114 } | 116 } |
| 115 | 117 |
| 116 if (!test_util::RemovePrefix(absolute_url.path(), | 118 if (!test_util::RemovePrefix(absolute_url.path(), |
| 117 "/feeds/default/private/full", | 119 "/feeds/default/private/full", |
| 118 &remaining_path)) { | 120 &remaining_path)) { |
| 119 return scoped_ptr<net::test_server::HttpResponse>(); | 121 return scoped_ptr<net::test_server::HttpResponse>(); |
| 120 } | 122 } |
| 121 | 123 |
| 122 if (remaining_path.empty()) { | 124 if (remaining_path.empty()) { |
| 123 // Process the default feed. | 125 // Process the default feed. |
| 124 return test_util::CreateHttpResponseFromFile( | 126 scoped_ptr<net::test_server::BasicHttpResponse> result( |
| 125 test_util::GetTestFilePath("chromeos/gdata/root_feed.json")); | 127 test_util::CreateHttpResponseFromFile( |
| 128 test_util::GetTestFilePath("chromeos/gdata/root_feed.json"))); |
| 129 return result.PassAs<net::test_server::HttpResponse>(); |
| 126 } else { | 130 } else { |
| 127 // Process a feed for a single resource ID. | 131 // Process a feed for a single resource ID. |
| 128 const std::string resource_id = net::UnescapeURLComponent( | 132 const std::string resource_id = net::UnescapeURLComponent( |
| 129 remaining_path.substr(1), net::UnescapeRule::URL_SPECIAL_CHARS); | 133 remaining_path.substr(1), net::UnescapeRule::URL_SPECIAL_CHARS); |
| 130 if (resource_id == "file:2_file_resource_id") { | 134 if (resource_id == "file:2_file_resource_id") { |
| 131 return test_util::CreateHttpResponseFromFile( | 135 scoped_ptr<net::test_server::BasicHttpResponse> result( |
| 132 test_util::GetTestFilePath("chromeos/gdata/file_entry.json")); | 136 test_util::CreateHttpResponseFromFile( |
| 137 test_util::GetTestFilePath("chromeos/gdata/file_entry.json"))); |
| 138 return result.PassAs<net::test_server::HttpResponse>(); |
| 133 } else if (resource_id == "folder:root/contents" && | 139 } else if (resource_id == "folder:root/contents" && |
| 134 request.method == net::test_server::METHOD_POST) { | 140 request.method == net::test_server::METHOD_POST) { |
| 135 // This is a request for creating a directory in the root directory. | 141 // This is a request for creating a directory in the root directory. |
| 136 // TODO(satorux): we should generate valid JSON data for the newly | 142 // TODO(satorux): we should generate valid JSON data for the newly |
| 137 // created directory but for now, just return "directory_entry.json" | 143 // created directory but for now, just return "directory_entry.json" |
| 138 return test_util::CreateHttpResponseFromFile( | 144 scoped_ptr<net::test_server::BasicHttpResponse> result( |
| 139 test_util::GetTestFilePath("chromeos/gdata/directory_entry.json")); | 145 test_util::CreateHttpResponseFromFile( |
| 146 test_util::GetTestFilePath( |
| 147 "chromeos/gdata/directory_entry.json"))); |
| 148 return result.PassAs<net::test_server::HttpResponse>(); |
| 140 } else if (resource_id == | 149 } else if (resource_id == |
| 141 "folder:root/contents/file:2_file_resource_id" && | 150 "folder:root/contents/file:2_file_resource_id" && |
| 142 request.method == net::test_server::METHOD_DELETE) { | 151 request.method == net::test_server::METHOD_DELETE) { |
| 143 // This is a request for deleting a file from the root directory. | 152 // This is a request for deleting a file from the root directory. |
| 144 // TODO(satorux): Investigate what's returned from the server, and | 153 // TODO(satorux): Investigate what's returned from the server, and |
| 145 // copy it. For now, just return a random file, as the contents don't | 154 // copy it. For now, just return a random file, as the contents don't |
| 146 // matter. | 155 // matter. |
| 147 return test_util::CreateHttpResponseFromFile( | 156 scoped_ptr<net::test_server::BasicHttpResponse> result( |
| 148 test_util::GetTestFilePath("chromeos/gdata/testfile.txt")); | 157 test_util::CreateHttpResponseFromFile( |
| 158 test_util::GetTestFilePath("chromeos/gdata/testfile.txt"))); |
| 159 return result.PassAs<net::test_server::HttpResponse>(); |
| 149 } else if (resource_id == "invalid_resource_id") { | 160 } else if (resource_id == "invalid_resource_id") { |
| 150 // Check if this is an authorization request for an app. | 161 // Check if this is an authorization request for an app. |
| 151 // This emulates to return invalid formatted result from the server. | 162 // This emulates to return invalid formatted result from the server. |
| 152 if (request.method == net::test_server::METHOD_PUT && | 163 if (request.method == net::test_server::METHOD_PUT && |
| 153 request.content.find("<docs:authorizedApp>") != std::string::npos) { | 164 request.content.find("<docs:authorizedApp>") != std::string::npos) { |
| 154 return test_util::CreateHttpResponseFromFile( | 165 scoped_ptr<net::test_server::BasicHttpResponse> result( |
| 155 test_util::GetTestFilePath("chromeos/gdata/testfile.txt")); | 166 test_util::CreateHttpResponseFromFile( |
| 167 test_util::GetTestFilePath("chromeos/gdata/testfile.txt"))); |
| 168 return result.PassAs<net::test_server::HttpResponse>(); |
| 156 } | 169 } |
| 157 } | 170 } |
| 158 } | 171 } |
| 159 | 172 |
| 160 return scoped_ptr<net::test_server::HttpResponse>(); | 173 return scoped_ptr<net::test_server::HttpResponse>(); |
| 161 } | 174 } |
| 162 | 175 |
| 163 // Handles a request for fetching a metadata feed. | 176 // Handles a request for fetching a metadata feed. |
| 164 scoped_ptr<net::test_server::HttpResponse> HandleMetadataRequest( | 177 scoped_ptr<net::test_server::HttpResponse> HandleMetadataRequest( |
| 165 const net::test_server::HttpRequest& request) { | 178 const net::test_server::HttpRequest& request) { |
| 166 http_request_ = request; | 179 http_request_ = request; |
| 167 | 180 |
| 168 const GURL absolute_url = test_server_.GetURL(request.relative_url); | 181 const GURL absolute_url = test_server_.GetURL(request.relative_url); |
| 169 if (absolute_url.path() != "/feeds/metadata/default") | 182 if (absolute_url.path() != "/feeds/metadata/default") |
| 170 return scoped_ptr<net::test_server::HttpResponse>(); | 183 return scoped_ptr<net::test_server::HttpResponse>(); |
| 171 | 184 |
| 172 scoped_ptr<net::test_server::HttpResponse> result( | 185 scoped_ptr<net::test_server::BasicHttpResponse> result( |
| 173 test_util::CreateHttpResponseFromFile( | 186 test_util::CreateHttpResponseFromFile( |
| 174 test_util::GetTestFilePath( | 187 test_util::GetTestFilePath( |
| 175 "chromeos/gdata/account_metadata.json"))); | 188 "chromeos/gdata/account_metadata.json"))); |
| 176 if (absolute_url.query().find("include-installed-apps=true") == | 189 if (absolute_url.query().find("include-installed-apps=true") == |
| 177 string::npos) { | 190 string::npos) { |
| 178 // Exclude the list of installed apps. | 191 // Exclude the list of installed apps. |
| 179 scoped_ptr<base::Value> parsed_content( | 192 scoped_ptr<base::Value> parsed_content( |
| 180 base::JSONReader::Read(result->content(), base::JSON_PARSE_RFC)); | 193 base::JSONReader::Read(result->content(), base::JSON_PARSE_RFC)); |
| 181 CHECK(parsed_content); | 194 CHECK(parsed_content); |
| 182 | 195 |
| 183 // Remove the install apps node. | 196 // Remove the install apps node. |
| 184 base::DictionaryValue* dictionary_value; | 197 base::DictionaryValue* dictionary_value; |
| 185 CHECK(parsed_content->GetAsDictionary(&dictionary_value)); | 198 CHECK(parsed_content->GetAsDictionary(&dictionary_value)); |
| 186 dictionary_value->Remove("entry.docs$installedApp", NULL); | 199 dictionary_value->Remove("entry.docs$installedApp", NULL); |
| 187 | 200 |
| 188 // Write back it as the content of the result. | 201 // Write back it as the content of the result. |
| 189 std::string content; | 202 std::string content; |
| 190 base::JSONWriter::Write(parsed_content.get(), &content); | 203 base::JSONWriter::Write(parsed_content.get(), &content); |
| 191 result->set_content(content); | 204 result->set_content(content); |
| 192 } | 205 } |
| 193 | 206 |
| 194 return result.Pass(); | 207 return result.PassAs<net::test_server::HttpResponse>(); |
| 195 } | 208 } |
| 196 | 209 |
| 197 // Handles a request for creating a session for uploading. | 210 // Handles a request for creating a session for uploading. |
| 198 scoped_ptr<net::test_server::HttpResponse> HandleCreateSessionRequest( | 211 scoped_ptr<net::test_server::HttpResponse> HandleCreateSessionRequest( |
| 199 const net::test_server::HttpRequest& request) { | 212 const net::test_server::HttpRequest& request) { |
| 200 http_request_ = request; | 213 http_request_ = request; |
| 201 | 214 |
| 202 const GURL absolute_url = test_server_.GetURL(request.relative_url); | 215 const GURL absolute_url = test_server_.GetURL(request.relative_url); |
| 203 if (StartsWithASCII(absolute_url.path(), | 216 if (StartsWithASCII(absolute_url.path(), |
| 204 "/feeds/upload/create-session/default/private/full", | 217 "/feeds/upload/create-session/default/private/full", |
| 205 true)) { // case sensitive | 218 true)) { // case sensitive |
| 206 // This is an initiating upload URL. | 219 // This is an initiating upload URL. |
| 207 scoped_ptr<net::test_server::HttpResponse> http_response( | 220 scoped_ptr<net::test_server::BasicHttpResponse> http_response( |
| 208 new net::test_server::HttpResponse); | 221 new net::test_server::BasicHttpResponse); |
| 209 | 222 |
| 210 // Check an ETag. | 223 // Check an ETag. |
| 211 std::map<std::string, std::string>::const_iterator found = | 224 std::map<std::string, std::string>::const_iterator found = |
| 212 request.headers.find("If-Match"); | 225 request.headers.find("If-Match"); |
| 213 if (found != request.headers.end() && | 226 if (found != request.headers.end() && |
| 214 found->second != "*" && | 227 found->second != "*" && |
| 215 found->second != kTestETag) { | 228 found->second != kTestETag) { |
| 216 http_response->set_code(net::test_server::PRECONDITION); | 229 http_response->set_code(net::test_server::PRECONDITION); |
| 217 return http_response.Pass(); | 230 return http_response.PassAs<net::test_server::HttpResponse>(); |
| 218 } | 231 } |
| 219 | 232 |
| 220 // Check if the X-Upload-Content-Length is present. If yes, store the | 233 // Check if the X-Upload-Content-Length is present. If yes, store the |
| 221 // length of the file. | 234 // length of the file. |
| 222 found = request.headers.find("X-Upload-Content-Length"); | 235 found = request.headers.find("X-Upload-Content-Length"); |
| 223 if (found == request.headers.end() || | 236 if (found == request.headers.end() || |
| 224 !base::StringToInt64(found->second, &content_length_)) { | 237 !base::StringToInt64(found->second, &content_length_)) { |
| 225 return scoped_ptr<net::test_server::HttpResponse>(); | 238 return scoped_ptr<net::test_server::HttpResponse>(); |
| 226 } | 239 } |
| 227 received_bytes_ = 0; | 240 received_bytes_ = 0; |
| 228 | 241 |
| 229 http_response->set_code(net::test_server::SUCCESS); | 242 http_response->set_code(net::test_server::SUCCESS); |
| 230 GURL upload_url; | 243 GURL upload_url; |
| 231 // POST is used for a new file, and PUT is used for an existing file. | 244 // POST is used for a new file, and PUT is used for an existing file. |
| 232 if (request.method == net::test_server::METHOD_POST) { | 245 if (request.method == net::test_server::METHOD_POST) { |
| 233 upload_url = test_server_.GetURL("/upload_new_file"); | 246 upload_url = test_server_.GetURL("/upload_new_file"); |
| 234 } else if (request.method == net::test_server::METHOD_PUT) { | 247 } else if (request.method == net::test_server::METHOD_PUT) { |
| 235 upload_url = test_server_.GetURL("/upload_existing_file"); | 248 upload_url = test_server_.GetURL("/upload_existing_file"); |
| 236 } else { | 249 } else { |
| 237 return scoped_ptr<net::test_server::HttpResponse>(); | 250 return scoped_ptr<net::test_server::HttpResponse>(); |
| 238 } | 251 } |
| 239 http_response->AddCustomHeader("Location", upload_url.spec()); | 252 http_response->AddCustomHeader("Location", upload_url.spec()); |
| 240 return http_response.Pass(); | 253 return http_response.PassAs<net::test_server::HttpResponse>(); |
| 241 } | 254 } |
| 242 | 255 |
| 243 return scoped_ptr<net::test_server::HttpResponse>(); | 256 return scoped_ptr<net::test_server::HttpResponse>(); |
| 244 } | 257 } |
| 245 | 258 |
| 246 // Handles a request for uploading content. | 259 // Handles a request for uploading content. |
| 247 scoped_ptr<net::test_server::HttpResponse> HandleUploadRequest( | 260 scoped_ptr<net::test_server::HttpResponse> HandleUploadRequest( |
| 248 const net::test_server::HttpRequest& request) { | 261 const net::test_server::HttpRequest& request) { |
| 249 http_request_ = request; | 262 http_request_ = request; |
| 250 | 263 |
| 251 const GURL absolute_url = test_server_.GetURL(request.relative_url); | 264 const GURL absolute_url = test_server_.GetURL(request.relative_url); |
| 252 if (absolute_url.path() != "/upload_new_file" && | 265 if (absolute_url.path() != "/upload_new_file" && |
| 253 absolute_url.path() != "/upload_existing_file") { | 266 absolute_url.path() != "/upload_existing_file") { |
| 254 return scoped_ptr<net::test_server::HttpResponse>(); | 267 return scoped_ptr<net::test_server::HttpResponse>(); |
| 255 } | 268 } |
| 256 | 269 |
| 257 // TODO(satorux): We should create a correct JSON data for the uploaded | 270 // TODO(satorux): We should create a correct JSON data for the uploaded |
| 258 // file, but for now, just return file_entry.json. | 271 // file, but for now, just return file_entry.json. |
| 259 scoped_ptr<net::test_server::HttpResponse> response = | 272 scoped_ptr<net::test_server::BasicHttpResponse> response = |
| 260 test_util::CreateHttpResponseFromFile( | 273 test_util::CreateHttpResponseFromFile( |
| 261 test_util::GetTestFilePath("chromeos/gdata/file_entry.json")); | 274 test_util::GetTestFilePath("chromeos/gdata/file_entry.json")); |
| 262 // response.code() is set to SUCCESS. Change it to CREATED if it's a new | 275 // response.code() is set to SUCCESS. Change it to CREATED if it's a new |
| 263 // file. | 276 // file. |
| 264 if (absolute_url.path() == "/upload_new_file") | 277 if (absolute_url.path() == "/upload_new_file") |
| 265 response->set_code(net::test_server::CREATED); | 278 response->set_code(net::test_server::CREATED); |
| 266 | 279 |
| 267 // Check if the Content-Range header is present. This must be present if | 280 // Check if the Content-Range header is present. This must be present if |
| 268 // the request body is not empty. | 281 // the request body is not empty. |
| 269 if (!request.content.empty()) { | 282 if (!request.content.empty()) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 292 if (received_bytes_ > 0) { | 305 if (received_bytes_ > 0) { |
| 293 response->AddCustomHeader( | 306 response->AddCustomHeader( |
| 294 "Range", | 307 "Range", |
| 295 "bytes=0-" + base::Int64ToString(received_bytes_ - 1)); | 308 "bytes=0-" + base::Int64ToString(received_bytes_ - 1)); |
| 296 } | 309 } |
| 297 | 310 |
| 298 // Change the code to RESUME_INCOMPLETE if upload is not complete. | 311 // Change the code to RESUME_INCOMPLETE if upload is not complete. |
| 299 if (received_bytes_ < content_length_) | 312 if (received_bytes_ < content_length_) |
| 300 response->set_code(net::test_server::RESUME_INCOMPLETE); | 313 response->set_code(net::test_server::RESUME_INCOMPLETE); |
| 301 | 314 |
| 302 return response.Pass(); | 315 return response.PassAs<net::test_server::HttpResponse>(); |
| 303 } | 316 } |
| 304 | 317 |
| 305 MessageLoopForUI message_loop_; | 318 MessageLoopForUI message_loop_; |
| 306 content::TestBrowserThread ui_thread_; | 319 content::TestBrowserThread ui_thread_; |
| 307 content::TestBrowserThread file_thread_; | 320 content::TestBrowserThread file_thread_; |
| 308 content::TestBrowserThread io_thread_; | 321 content::TestBrowserThread io_thread_; |
| 309 net::test_server::EmbeddedTestServer test_server_; | 322 net::test_server::EmbeddedTestServer test_server_; |
| 310 scoped_ptr<TestingProfile> profile_; | 323 scoped_ptr<TestingProfile> profile_; |
| 311 scoped_ptr<OperationRunner> operation_runner_; | 324 scoped_ptr<OperationRunner> operation_runner_; |
| 312 scoped_ptr<GDataWapiUrlGenerator> url_generator_; | 325 scoped_ptr<GDataWapiUrlGenerator> url_generator_; |
| (...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1495 EXPECT_EQ(base::Int64ToString(kUploadContent.size()), | 1508 EXPECT_EQ(base::Int64ToString(kUploadContent.size()), |
| 1496 http_request_.headers["X-Upload-Content-Length"]); | 1509 http_request_.headers["X-Upload-Content-Length"]); |
| 1497 // For updating an existing file, an empty body should be attached (PUT | 1510 // For updating an existing file, an empty body should be attached (PUT |
| 1498 // requires a body) | 1511 // requires a body) |
| 1499 EXPECT_TRUE(http_request_.has_content); | 1512 EXPECT_TRUE(http_request_.has_content); |
| 1500 EXPECT_EQ("", http_request_.content); | 1513 EXPECT_EQ("", http_request_.content); |
| 1501 EXPECT_EQ(kWrongETag, http_request_.headers["If-Match"]); | 1514 EXPECT_EQ(kWrongETag, http_request_.headers["If-Match"]); |
| 1502 } | 1515 } |
| 1503 | 1516 |
| 1504 } // namespace google_apis | 1517 } // namespace google_apis |
| OLD | NEW |