1 // Copyright (c) 2013 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.
6 #include "base/files/file_path.h"
7 #include "base/files/file_util.h"
8 #include "base/files/scoped_temp_dir.h"
9 #include "base/json/json_reader.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h"
12 #include "base/strings/string_number_conversions.h"
13 #include "base/values.h"
14 #include "google_apis/drive/drive_api_parser.h"
15 #include "google_apis/drive/drive_api_requests.h"
16 #include "google_apis/drive/drive_api_url_generator.h"
17 #include "google_apis/drive/dummy_auth_service.h"
18 #include "google_apis/drive/request_sender.h"
19 #include "google_apis/drive/test_util.h"
20 #include "net/test/embedded_test_server/embedded_test_server.h"
21 #include "net/test/embedded_test_server/http_request.h"
22 #include "net/test/embedded_test_server/http_response.h"
23 #include "net/url_request/url_request_test_util.h"
24 #include "testing/gtest/include/gtest/gtest.h"
26 namespace google_apis
{
30 const char kTestETag
[] = "test_etag";
31 const char kTestUserAgent
[] = "test-user-agent";
33 const char kTestChildrenResponse
[] =
35 "\"kind\": \"drive#childReference\",\n"
36 "\"id\": \"resource_id\",\n"
37 "\"selfLink\": \"self_link\",\n"
38 "\"childLink\": \"child_link\",\n"
41 const char kTestPermissionResponse
[] =
43 "\"kind\": \"drive#permission\",\n"
44 "\"id\": \"resource_id\",\n"
45 "\"selfLink\": \"self_link\",\n"
48 const char kTestUploadExistingFilePath
[] = "/upload/existingfile/path";
49 const char kTestUploadNewFilePath
[] = "/upload/newfile/path";
50 const char kTestDownloadPathPrefix
[] = "/download/";
52 // Used as a GetContentCallback.
53 void AppendContent(std::string
* out
,
55 scoped_ptr
<std::string
> content
) {
56 EXPECT_EQ(HTTP_SUCCESS
, error
);
57 out
->append(*content
);
62 class DriveApiRequestsTest
: public testing::Test
{
64 DriveApiRequestsTest() {
67 void SetUp() override
{
68 request_context_getter_
= new net::TestURLRequestContextGetter(
69 message_loop_
.message_loop_proxy());
71 request_sender_
.reset(new RequestSender(new DummyAuthService
,
72 request_context_getter_
.get(),
73 message_loop_
.message_loop_proxy(),
76 ASSERT_TRUE(temp_dir_
.CreateUniqueTempDir());
78 ASSERT_TRUE(test_server_
.InitializeAndWaitUntilReady());
79 test_server_
.RegisterRequestHandler(
80 base::Bind(&DriveApiRequestsTest::HandleChildrenDeleteRequest
,
81 base::Unretained(this)));
82 test_server_
.RegisterRequestHandler(
83 base::Bind(&DriveApiRequestsTest::HandleDataFileRequest
,
84 base::Unretained(this)));
85 test_server_
.RegisterRequestHandler(
86 base::Bind(&DriveApiRequestsTest::HandleDeleteRequest
,
87 base::Unretained(this)));
88 test_server_
.RegisterRequestHandler(
89 base::Bind(&DriveApiRequestsTest::HandlePreconditionFailedRequest
,
90 base::Unretained(this)));
91 test_server_
.RegisterRequestHandler(
92 base::Bind(&DriveApiRequestsTest::HandleResumeUploadRequest
,
93 base::Unretained(this)));
94 test_server_
.RegisterRequestHandler(
95 base::Bind(&DriveApiRequestsTest::HandleInitiateUploadRequest
,
96 base::Unretained(this)));
97 test_server_
.RegisterRequestHandler(
98 base::Bind(&DriveApiRequestsTest::HandleContentResponse
,
99 base::Unretained(this)));
100 test_server_
.RegisterRequestHandler(
101 base::Bind(&DriveApiRequestsTest::HandleDownloadRequest
,
102 base::Unretained(this)));
104 GURL test_base_url
= test_util::GetBaseUrlForTesting(test_server_
.port());
105 url_generator_
.reset(new DriveApiUrlGenerator(
106 test_base_url
, test_base_url
.Resolve(kTestDownloadPathPrefix
)));
108 // Reset the server's expected behavior just in case.
109 ResetExpectedResponse();
114 base::MessageLoopForIO message_loop_
; // Test server needs IO thread.
115 net::test_server::EmbeddedTestServer test_server_
;
116 scoped_ptr
<RequestSender
> request_sender_
;
117 scoped_ptr
<DriveApiUrlGenerator
> url_generator_
;
118 scoped_refptr
<net::TestURLRequestContextGetter
> request_context_getter_
;
119 base::ScopedTempDir temp_dir_
;
121 // This is a path to the file which contains expected response from
122 // the server. See also HandleDataFileRequest below.
123 base::FilePath expected_data_file_path_
;
125 // This is a path string in the expected response header from the server
126 // for initiating file uploading.
127 std::string expected_upload_path_
;
129 // This is a path to the file which contains expected response for
130 // PRECONDITION_FAILED response.
131 base::FilePath expected_precondition_failed_file_path_
;
133 // These are content and its type in the expected response from the server.
134 // See also HandleContentResponse below.
135 std::string expected_content_type_
;
136 std::string expected_content_
;
138 // The incoming HTTP request is saved so tests can verify the request
139 // parameters like HTTP method (ex. some requests should use DELETE
141 net::test_server::HttpRequest http_request_
;
144 void ResetExpectedResponse() {
145 expected_data_file_path_
.clear();
146 expected_upload_path_
.clear();
147 expected_content_type_
.clear();
148 expected_content_
.clear();
151 // For "Children: delete" request, the server will return "204 No Content"
152 // response meaning "success".
153 scoped_ptr
<net::test_server::HttpResponse
> HandleChildrenDeleteRequest(
154 const net::test_server::HttpRequest
& request
) {
155 if (request
.method
!= net::test_server::METHOD_DELETE
||
156 request
.relative_url
.find("/children/") == std::string::npos
) {
157 // The request is not the "Children: delete" request. Delegate the
158 // processing to the next handler.
159 return scoped_ptr
<net::test_server::HttpResponse
>();
162 http_request_
= request
;
164 // Return the response with just "204 No Content" status code.
165 scoped_ptr
<net::test_server::BasicHttpResponse
> http_response(
166 new net::test_server::BasicHttpResponse
);
167 http_response
->set_code(net::HTTP_NO_CONTENT
);
168 return http_response
.Pass();
171 // Reads the data file of |expected_data_file_path_| and returns its content
173 // To use this method, it is necessary to set |expected_data_file_path_|
174 // to the appropriate file path before sending the request to the server.
175 scoped_ptr
<net::test_server::HttpResponse
> HandleDataFileRequest(
176 const net::test_server::HttpRequest
& request
) {
177 if (expected_data_file_path_
.empty()) {
178 // The file is not specified. Delegate the processing to the next
180 return scoped_ptr
<net::test_server::HttpResponse
>();
183 http_request_
= request
;
185 // Return the response from the data file.
186 return test_util::CreateHttpResponseFromFile(expected_data_file_path_
);
189 // Deletes the resource and returns no content with HTTP_NO_CONTENT status
191 scoped_ptr
<net::test_server::HttpResponse
> HandleDeleteRequest(
192 const net::test_server::HttpRequest
& request
) {
193 if (request
.method
!= net::test_server::METHOD_DELETE
||
194 request
.relative_url
.find("/files/") == std::string::npos
) {
195 // The file is not file deletion request. Delegate the processing to the
197 return scoped_ptr
<net::test_server::HttpResponse
>();
200 http_request_
= request
;
202 scoped_ptr
<net::test_server::BasicHttpResponse
> response(
203 new net::test_server::BasicHttpResponse
);
204 response
->set_code(net::HTTP_NO_CONTENT
);
206 return response
.Pass();
209 // Returns PRECONDITION_FAILED response for ETag mismatching with error JSON
210 // content specified by |expected_precondition_failed_file_path_|.
211 // To use this method, it is necessary to set the variable to the appropriate
212 // file path before sending the request to the server.
213 scoped_ptr
<net::test_server::HttpResponse
> HandlePreconditionFailedRequest(
214 const net::test_server::HttpRequest
& request
) {
215 if (expected_precondition_failed_file_path_
.empty()) {
216 // The file is not specified. Delegate the process to the next handler.
217 return scoped_ptr
<net::test_server::HttpResponse
>();
220 http_request_
= request
;
222 scoped_ptr
<net::test_server::BasicHttpResponse
> response(
223 new net::test_server::BasicHttpResponse
);
224 response
->set_code(net::HTTP_PRECONDITION_FAILED
);
227 if (base::ReadFileToString(expected_precondition_failed_file_path_
,
229 response
->set_content(content
);
230 response
->set_content_type("application/json");
233 return response
.Pass();
236 // Returns the response based on set expected upload url.
237 // The response contains the url in its "Location: " header. Also, it doesn't
239 // To use this method, it is necessary to set |expected_upload_path_|
240 // to the string representation of the url to be returned.
241 scoped_ptr
<net::test_server::HttpResponse
> HandleInitiateUploadRequest(
242 const net::test_server::HttpRequest
& request
) {
243 if (request
.relative_url
== expected_upload_path_
||
244 expected_upload_path_
.empty()) {
245 // The request is for resume uploading or the expected upload url is not
246 // set. Delegate the processing to the next handler.
247 return scoped_ptr
<net::test_server::HttpResponse
>();
250 http_request_
= request
;
252 scoped_ptr
<net::test_server::BasicHttpResponse
> response(
253 new net::test_server::BasicHttpResponse
);
255 // Check if the X-Upload-Content-Length is present. If yes, store the
256 // length of the file.
257 std::map
<std::string
, std::string
>::const_iterator found
=
258 request
.headers
.find("X-Upload-Content-Length");
259 if (found
== request
.headers
.end() ||
260 !base::StringToInt64(found
->second
, &content_length_
)) {
261 return scoped_ptr
<net::test_server::HttpResponse
>();
265 response
->set_code(net::HTTP_OK
);
266 response
->AddCustomHeader(
268 test_server_
.base_url().Resolve(expected_upload_path_
).spec());
269 return response
.Pass();
272 scoped_ptr
<net::test_server::HttpResponse
> HandleResumeUploadRequest(
273 const net::test_server::HttpRequest
& request
) {
274 if (request
.relative_url
!= expected_upload_path_
) {
275 // The request path is different from the expected path for uploading.
276 // Delegate the processing to the next handler.
277 return scoped_ptr
<net::test_server::HttpResponse
>();
280 http_request_
= request
;
282 if (!request
.content
.empty()) {
283 std::map
<std::string
, std::string
>::const_iterator iter
=
284 request
.headers
.find("Content-Range");
285 if (iter
== request
.headers
.end()) {
286 // The range must be set.
287 return scoped_ptr
<net::test_server::HttpResponse
>();
291 int64 start_position
= 0;
292 int64 end_position
= 0;
293 if (!test_util::ParseContentRangeHeader(
294 iter
->second
, &start_position
, &end_position
, &length
)) {
295 // Invalid "Content-Range" value.
296 return scoped_ptr
<net::test_server::HttpResponse
>();
299 EXPECT_EQ(start_position
, received_bytes_
);
300 EXPECT_EQ(length
, content_length_
);
302 // end_position is inclusive, but so +1 to change the range to byte size.
303 received_bytes_
= end_position
+ 1;
306 if (received_bytes_
< content_length_
) {
307 scoped_ptr
<net::test_server::BasicHttpResponse
> response(
308 new net::test_server::BasicHttpResponse
);
309 // Set RESUME INCOMPLETE (308) status code.
310 response
->set_code(static_cast<net::HttpStatusCode
>(308));
312 // Add Range header to the response, based on the values of
313 // Content-Range header in the request.
314 // The header is annotated only when at least one byte is received.
315 if (received_bytes_
> 0) {
316 response
->AddCustomHeader(
317 "Range", "bytes=0-" + base::Int64ToString(received_bytes_
- 1));
320 return response
.Pass();
323 // All bytes are received. Return the "success" response with the file's
325 scoped_ptr
<net::test_server::BasicHttpResponse
> response
=
326 test_util::CreateHttpResponseFromFile(
327 test_util::GetTestFilePath("drive/file_entry.json"));
329 // The response code is CREATED if it is new file uploading.
330 if (http_request_
.relative_url
== kTestUploadNewFilePath
) {
331 response
->set_code(net::HTTP_CREATED
);
334 return response
.Pass();
337 // Returns the response based on set expected content and its type.
338 // To use this method, both |expected_content_type_| and |expected_content_|
339 // must be set in advance.
340 scoped_ptr
<net::test_server::HttpResponse
> HandleContentResponse(
341 const net::test_server::HttpRequest
& request
) {
342 if (expected_content_type_
.empty() || expected_content_
.empty()) {
343 // Expected content is not set. Delegate the processing to the next
345 return scoped_ptr
<net::test_server::HttpResponse
>();
348 http_request_
= request
;
350 scoped_ptr
<net::test_server::BasicHttpResponse
> response(
351 new net::test_server::BasicHttpResponse
);
352 response
->set_code(net::HTTP_OK
);
353 response
->set_content_type(expected_content_type_
);
354 response
->set_content(expected_content_
);
355 return response
.Pass();
358 // Handles a request for downloading a file.
359 scoped_ptr
<net::test_server::HttpResponse
> HandleDownloadRequest(
360 const net::test_server::HttpRequest
& request
) {
361 http_request_
= request
;
363 const GURL absolute_url
= test_server_
.GetURL(request
.relative_url
);
365 if (!test_util::RemovePrefix(absolute_url
.path(),
366 kTestDownloadPathPrefix
,
368 return scoped_ptr
<net::test_server::HttpResponse
>();
371 // For testing, returns a text with |id| repeated 3 times.
372 scoped_ptr
<net::test_server::BasicHttpResponse
> response(
373 new net::test_server::BasicHttpResponse
);
374 response
->set_code(net::HTTP_OK
);
375 response
->set_content(id
+ id
+ id
);
376 response
->set_content_type("text/plain");
377 return response
.Pass();
380 // These are for the current upload file status.
381 int64 received_bytes_
;
382 int64 content_length_
;
385 TEST_F(DriveApiRequestsTest
, DriveApiDataRequest_Fields
) {
386 // Make sure that "fields" query param is supported by using its subclass,
389 // Set an expected data file containing valid result.
390 expected_data_file_path_
= test_util::GetTestFilePath(
393 GDataErrorCode error
= GDATA_OTHER_ERROR
;
394 scoped_ptr
<AboutResource
> about_resource
;
397 base::RunLoop run_loop
;
398 drive::AboutGetRequest
* request
= new drive::AboutGetRequest(
399 request_sender_
.get(),
401 test_util::CreateQuitCallback(
403 test_util::CreateCopyResultCallback(&error
, &about_resource
)));
405 "kind,quotaBytesTotal,quotaBytesUsed,largestChangeId,rootFolderId");
406 request_sender_
->StartRequestWithRetry(request
);
410 EXPECT_EQ(HTTP_SUCCESS
, error
);
411 EXPECT_EQ(net::test_server::METHOD_GET
, http_request_
.method
);
412 EXPECT_EQ("/drive/v2/about?"
413 "fields=kind%2CquotaBytesTotal%2CquotaBytesUsed%2C"
414 "largestChangeId%2CrootFolderId",
415 http_request_
.relative_url
);
417 scoped_ptr
<AboutResource
> expected(
418 AboutResource::CreateFrom(
419 *test_util::LoadJSONFile("drive/about.json")));
420 ASSERT_TRUE(about_resource
.get());
421 EXPECT_EQ(expected
->largest_change_id(), about_resource
->largest_change_id());
422 EXPECT_EQ(expected
->quota_bytes_total(), about_resource
->quota_bytes_total());
423 EXPECT_EQ(expected
->quota_bytes_used(), about_resource
->quota_bytes_used());
424 EXPECT_EQ(expected
->root_folder_id(), about_resource
->root_folder_id());
427 TEST_F(DriveApiRequestsTest
, FilesInsertRequest
) {
428 const base::Time::Exploded kModifiedDate
= {2012, 7, 0, 19, 15, 59, 13, 123};
429 const base::Time::Exploded kLastViewedByMeDate
=
430 {2013, 7, 0, 19, 15, 59, 13, 123};
432 // Set an expected data file containing the directory's entry data.
433 expected_data_file_path_
=
434 test_util::GetTestFilePath("drive/directory_entry.json");
436 GDataErrorCode error
= GDATA_OTHER_ERROR
;
437 scoped_ptr
<FileResource
> file_resource
;
439 // Create "new directory" in the root directory.
441 base::RunLoop run_loop
;
442 drive::FilesInsertRequest
* request
= new drive::FilesInsertRequest(
443 request_sender_
.get(),
445 test_util::CreateQuitCallback(
447 test_util::CreateCopyResultCallback(&error
, &file_resource
)));
448 request
->set_last_viewed_by_me_date(
449 base::Time::FromUTCExploded(kLastViewedByMeDate
));
450 request
->set_mime_type("application/vnd.google-apps.folder");
451 request
->set_modified_date(base::Time::FromUTCExploded(kModifiedDate
));
452 request
->add_parent("root");
453 request
->set_title("new directory");
454 request_sender_
->StartRequestWithRetry(request
);
458 EXPECT_EQ(HTTP_SUCCESS
, error
);
459 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
460 EXPECT_EQ("/drive/v2/files", http_request_
.relative_url
);
461 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
463 EXPECT_TRUE(http_request_
.has_content
);
464 EXPECT_EQ("{\"lastViewedByMeDate\":\"2013-07-19T15:59:13.123Z\","
465 "\"mimeType\":\"application/vnd.google-apps.folder\","
466 "\"modifiedDate\":\"2012-07-19T15:59:13.123Z\","
467 "\"parents\":[{\"id\":\"root\"}],"
468 "\"title\":\"new directory\"}",
469 http_request_
.content
);
471 scoped_ptr
<FileResource
> expected(
472 FileResource::CreateFrom(
473 *test_util::LoadJSONFile("drive/directory_entry.json")));
476 ASSERT_TRUE(file_resource
.get());
478 EXPECT_EQ(expected
->file_id(), file_resource
->file_id());
479 EXPECT_EQ(expected
->title(), file_resource
->title());
480 EXPECT_EQ(expected
->mime_type(), file_resource
->mime_type());
481 EXPECT_EQ(expected
->parents().size(), file_resource
->parents().size());
484 TEST_F(DriveApiRequestsTest
, FilesPatchRequest
) {
485 const base::Time::Exploded kModifiedDate
= {2012, 7, 0, 19, 15, 59, 13, 123};
486 const base::Time::Exploded kLastViewedByMeDate
=
487 {2013, 7, 0, 19, 15, 59, 13, 123};
489 // Set an expected data file containing valid result.
490 expected_data_file_path_
=
491 test_util::GetTestFilePath("drive/file_entry.json");
493 GDataErrorCode error
= GDATA_OTHER_ERROR
;
494 scoped_ptr
<FileResource
> file_resource
;
497 base::RunLoop run_loop
;
498 drive::FilesPatchRequest
* request
= new drive::FilesPatchRequest(
499 request_sender_
.get(),
501 test_util::CreateQuitCallback(
503 test_util::CreateCopyResultCallback(&error
, &file_resource
)));
504 request
->set_file_id("resource_id");
505 request
->set_set_modified_date(true);
506 request
->set_update_viewed_date(false);
508 request
->set_title("new title");
509 request
->set_modified_date(base::Time::FromUTCExploded(kModifiedDate
));
510 request
->set_last_viewed_by_me_date(
511 base::Time::FromUTCExploded(kLastViewedByMeDate
));
512 request
->add_parent("parent_resource_id");
514 request_sender_
->StartRequestWithRetry(request
);
518 EXPECT_EQ(HTTP_SUCCESS
, error
);
519 EXPECT_EQ(net::test_server::METHOD_PATCH
, http_request_
.method
);
520 EXPECT_EQ("/drive/v2/files/resource_id"
521 "?setModifiedDate=true&updateViewedDate=false",
522 http_request_
.relative_url
);
524 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
525 EXPECT_TRUE(http_request_
.has_content
);
526 EXPECT_EQ("{\"lastViewedByMeDate\":\"2013-07-19T15:59:13.123Z\","
527 "\"modifiedDate\":\"2012-07-19T15:59:13.123Z\","
528 "\"parents\":[{\"id\":\"parent_resource_id\"}],"
529 "\"title\":\"new title\"}",
530 http_request_
.content
);
531 EXPECT_TRUE(file_resource
);
534 TEST_F(DriveApiRequestsTest
, AboutGetRequest_ValidJson
) {
535 // Set an expected data file containing valid result.
536 expected_data_file_path_
= test_util::GetTestFilePath(
539 GDataErrorCode error
= GDATA_OTHER_ERROR
;
540 scoped_ptr
<AboutResource
> about_resource
;
543 base::RunLoop run_loop
;
544 drive::AboutGetRequest
* request
= new drive::AboutGetRequest(
545 request_sender_
.get(),
547 test_util::CreateQuitCallback(
549 test_util::CreateCopyResultCallback(&error
, &about_resource
)));
550 request_sender_
->StartRequestWithRetry(request
);
554 EXPECT_EQ(HTTP_SUCCESS
, error
);
555 EXPECT_EQ(net::test_server::METHOD_GET
, http_request_
.method
);
556 EXPECT_EQ("/drive/v2/about", http_request_
.relative_url
);
558 scoped_ptr
<AboutResource
> expected(
559 AboutResource::CreateFrom(
560 *test_util::LoadJSONFile("drive/about.json")));
561 ASSERT_TRUE(about_resource
.get());
562 EXPECT_EQ(expected
->largest_change_id(), about_resource
->largest_change_id());
563 EXPECT_EQ(expected
->quota_bytes_total(), about_resource
->quota_bytes_total());
564 EXPECT_EQ(expected
->quota_bytes_used(), about_resource
->quota_bytes_used());
565 EXPECT_EQ(expected
->root_folder_id(), about_resource
->root_folder_id());
568 TEST_F(DriveApiRequestsTest
, AboutGetRequest_InvalidJson
) {
569 // Set an expected data file containing invalid result.
570 expected_data_file_path_
= test_util::GetTestFilePath(
571 "drive/testfile.txt");
573 GDataErrorCode error
= GDATA_OTHER_ERROR
;
574 scoped_ptr
<AboutResource
> about_resource
;
577 base::RunLoop run_loop
;
578 drive::AboutGetRequest
* request
= new drive::AboutGetRequest(
579 request_sender_
.get(),
581 test_util::CreateQuitCallback(
583 test_util::CreateCopyResultCallback(&error
, &about_resource
)));
584 request_sender_
->StartRequestWithRetry(request
);
588 // "parse error" should be returned, and the about resource should be NULL.
589 EXPECT_EQ(GDATA_PARSE_ERROR
, error
);
590 EXPECT_EQ(net::test_server::METHOD_GET
, http_request_
.method
);
591 EXPECT_EQ("/drive/v2/about", http_request_
.relative_url
);
592 EXPECT_FALSE(about_resource
);
595 TEST_F(DriveApiRequestsTest
, AppsListRequest
) {
596 // Set an expected data file containing valid result.
597 expected_data_file_path_
= test_util::GetTestFilePath(
598 "drive/applist.json");
600 GDataErrorCode error
= GDATA_OTHER_ERROR
;
601 scoped_ptr
<AppList
> app_list
;
604 base::RunLoop run_loop
;
605 drive::AppsListRequest
* request
= new drive::AppsListRequest(
606 request_sender_
.get(),
608 false, // use_internal_endpoint
609 test_util::CreateQuitCallback(
611 test_util::CreateCopyResultCallback(&error
, &app_list
)));
612 request_sender_
->StartRequestWithRetry(request
);
616 EXPECT_EQ(HTTP_SUCCESS
, error
);
617 EXPECT_EQ(net::test_server::METHOD_GET
, http_request_
.method
);
618 EXPECT_EQ("/drive/v2/apps", http_request_
.relative_url
);
619 EXPECT_TRUE(app_list
);
622 TEST_F(DriveApiRequestsTest
, ChangesListRequest
) {
623 // Set an expected data file containing valid result.
624 expected_data_file_path_
= test_util::GetTestFilePath(
625 "drive/changelist.json");
627 GDataErrorCode error
= GDATA_OTHER_ERROR
;
628 scoped_ptr
<ChangeList
> result
;
631 base::RunLoop run_loop
;
632 drive::ChangesListRequest
* request
= new drive::ChangesListRequest(
633 request_sender_
.get(), *url_generator_
,
634 test_util::CreateQuitCallback(
636 test_util::CreateCopyResultCallback(&error
, &result
)));
637 request
->set_include_deleted(true);
638 request
->set_start_change_id(100);
639 request
->set_max_results(500);
640 request_sender_
->StartRequestWithRetry(request
);
644 EXPECT_EQ(HTTP_SUCCESS
, error
);
645 EXPECT_EQ(net::test_server::METHOD_GET
, http_request_
.method
);
646 EXPECT_EQ("/drive/v2/changes?maxResults=500&startChangeId=100",
647 http_request_
.relative_url
);
651 TEST_F(DriveApiRequestsTest
, ChangesListNextPageRequest
) {
652 // Set an expected data file containing valid result.
653 expected_data_file_path_
= test_util::GetTestFilePath(
654 "drive/changelist.json");
656 GDataErrorCode error
= GDATA_OTHER_ERROR
;
657 scoped_ptr
<ChangeList
> result
;
660 base::RunLoop run_loop
;
661 drive::ChangesListNextPageRequest
* request
=
662 new drive::ChangesListNextPageRequest(
663 request_sender_
.get(),
664 test_util::CreateQuitCallback(
666 test_util::CreateCopyResultCallback(&error
, &result
)));
667 request
->set_next_link(test_server_
.GetURL("/continue/get/change/list"));
668 request_sender_
->StartRequestWithRetry(request
);
672 EXPECT_EQ(HTTP_SUCCESS
, error
);
673 EXPECT_EQ(net::test_server::METHOD_GET
, http_request_
.method
);
674 EXPECT_EQ("/continue/get/change/list", http_request_
.relative_url
);
678 TEST_F(DriveApiRequestsTest
, FilesCopyRequest
) {
679 const base::Time::Exploded kModifiedDate
= {2012, 7, 0, 19, 15, 59, 13, 123};
681 // Set an expected data file containing the dummy file entry data.
682 // It'd be returned if we copy a file.
683 expected_data_file_path_
=
684 test_util::GetTestFilePath("drive/file_entry.json");
686 GDataErrorCode error
= GDATA_OTHER_ERROR
;
687 scoped_ptr
<FileResource
> file_resource
;
689 // Copy the file to a new file named "new title".
691 base::RunLoop run_loop
;
692 drive::FilesCopyRequest
* request
= new drive::FilesCopyRequest(
693 request_sender_
.get(),
695 test_util::CreateQuitCallback(
697 test_util::CreateCopyResultCallback(&error
, &file_resource
)));
698 request
->set_file_id("resource_id");
699 request
->set_modified_date(base::Time::FromUTCExploded(kModifiedDate
));
700 request
->add_parent("parent_resource_id");
701 request
->set_title("new title");
702 request_sender_
->StartRequestWithRetry(request
);
706 EXPECT_EQ(HTTP_SUCCESS
, error
);
707 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
708 EXPECT_EQ("/drive/v2/files/resource_id/copy", http_request_
.relative_url
);
709 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
711 EXPECT_TRUE(http_request_
.has_content
);
713 "{\"modifiedDate\":\"2012-07-19T15:59:13.123Z\","
714 "\"parents\":[{\"id\":\"parent_resource_id\"}],\"title\":\"new title\"}",
715 http_request_
.content
);
716 EXPECT_TRUE(file_resource
);
719 TEST_F(DriveApiRequestsTest
, FilesCopyRequest_EmptyParentResourceId
) {
720 // Set an expected data file containing the dummy file entry data.
721 // It'd be returned if we copy a file.
722 expected_data_file_path_
=
723 test_util::GetTestFilePath("drive/file_entry.json");
725 GDataErrorCode error
= GDATA_OTHER_ERROR
;
726 scoped_ptr
<FileResource
> file_resource
;
728 // Copy the file to a new file named "new title".
730 base::RunLoop run_loop
;
731 drive::FilesCopyRequest
* request
= new drive::FilesCopyRequest(
732 request_sender_
.get(),
734 test_util::CreateQuitCallback(
736 test_util::CreateCopyResultCallback(&error
, &file_resource
)));
737 request
->set_file_id("resource_id");
738 request
->set_title("new title");
739 request_sender_
->StartRequestWithRetry(request
);
743 EXPECT_EQ(HTTP_SUCCESS
, error
);
744 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
745 EXPECT_EQ("/drive/v2/files/resource_id/copy", http_request_
.relative_url
);
746 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
748 EXPECT_TRUE(http_request_
.has_content
);
749 EXPECT_EQ("{\"title\":\"new title\"}", http_request_
.content
);
750 EXPECT_TRUE(file_resource
);
753 TEST_F(DriveApiRequestsTest
, FilesListRequest
) {
754 // Set an expected data file containing valid result.
755 expected_data_file_path_
= test_util::GetTestFilePath(
756 "drive/filelist.json");
758 GDataErrorCode error
= GDATA_OTHER_ERROR
;
759 scoped_ptr
<FileList
> result
;
762 base::RunLoop run_loop
;
763 drive::FilesListRequest
* request
= new drive::FilesListRequest(
764 request_sender_
.get(), *url_generator_
,
765 test_util::CreateQuitCallback(
767 test_util::CreateCopyResultCallback(&error
, &result
)));
768 request
->set_max_results(50);
769 request
->set_q("\"abcde\" in parents");
770 request_sender_
->StartRequestWithRetry(request
);
774 EXPECT_EQ(HTTP_SUCCESS
, error
);
775 EXPECT_EQ(net::test_server::METHOD_GET
, http_request_
.method
);
776 EXPECT_EQ("/drive/v2/files?maxResults=50&q=%22abcde%22+in+parents",
777 http_request_
.relative_url
);
781 TEST_F(DriveApiRequestsTest
, FilesListNextPageRequest
) {
782 // Set an expected data file containing valid result.
783 expected_data_file_path_
= test_util::GetTestFilePath(
784 "drive/filelist.json");
786 GDataErrorCode error
= GDATA_OTHER_ERROR
;
787 scoped_ptr
<FileList
> result
;
790 base::RunLoop run_loop
;
791 drive::FilesListNextPageRequest
* request
=
792 new drive::FilesListNextPageRequest(
793 request_sender_
.get(),
794 test_util::CreateQuitCallback(
796 test_util::CreateCopyResultCallback(&error
, &result
)));
797 request
->set_next_link(test_server_
.GetURL("/continue/get/file/list"));
798 request_sender_
->StartRequestWithRetry(request
);
802 EXPECT_EQ(HTTP_SUCCESS
, error
);
803 EXPECT_EQ(net::test_server::METHOD_GET
, http_request_
.method
);
804 EXPECT_EQ("/continue/get/file/list", http_request_
.relative_url
);
808 TEST_F(DriveApiRequestsTest
, FilesDeleteRequest
) {
809 GDataErrorCode error
= GDATA_OTHER_ERROR
;
811 // Delete a resource with the given resource id.
813 base::RunLoop run_loop
;
814 drive::FilesDeleteRequest
* request
= new drive::FilesDeleteRequest(
815 request_sender_
.get(),
817 test_util::CreateQuitCallback(
818 &run_loop
, test_util::CreateCopyResultCallback(&error
)));
819 request
->set_file_id("resource_id");
820 request
->set_etag(kTestETag
);
821 request_sender_
->StartRequestWithRetry(request
);
825 EXPECT_EQ(HTTP_NO_CONTENT
, error
);
826 EXPECT_EQ(net::test_server::METHOD_DELETE
, http_request_
.method
);
827 EXPECT_EQ(kTestETag
, http_request_
.headers
["If-Match"]);
828 EXPECT_EQ("/drive/v2/files/resource_id", http_request_
.relative_url
);
829 EXPECT_FALSE(http_request_
.has_content
);
832 TEST_F(DriveApiRequestsTest
, FilesTrashRequest
) {
833 // Set data for the expected result. Directory entry should be returned
834 // if the trashing entry is a directory, so using it here should be fine.
835 expected_data_file_path_
=
836 test_util::GetTestFilePath("drive/directory_entry.json");
838 GDataErrorCode error
= GDATA_OTHER_ERROR
;
839 scoped_ptr
<FileResource
> file_resource
;
841 // Trash a resource with the given resource id.
843 base::RunLoop run_loop
;
844 drive::FilesTrashRequest
* request
= new drive::FilesTrashRequest(
845 request_sender_
.get(),
847 test_util::CreateQuitCallback(
849 test_util::CreateCopyResultCallback(&error
, &file_resource
)));
850 request
->set_file_id("resource_id");
851 request_sender_
->StartRequestWithRetry(request
);
855 EXPECT_EQ(HTTP_SUCCESS
, error
);
856 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
857 EXPECT_EQ("/drive/v2/files/resource_id/trash", http_request_
.relative_url
);
858 EXPECT_TRUE(http_request_
.has_content
);
859 EXPECT_TRUE(http_request_
.content
.empty());
862 TEST_F(DriveApiRequestsTest
, ChildrenInsertRequest
) {
863 // Set an expected data file containing the children entry.
864 expected_content_type_
= "application/json";
865 expected_content_
= kTestChildrenResponse
;
867 GDataErrorCode error
= GDATA_OTHER_ERROR
;
869 // Add a resource with "resource_id" to a directory with
870 // "parent_resource_id".
872 base::RunLoop run_loop
;
873 drive::ChildrenInsertRequest
* request
= new drive::ChildrenInsertRequest(
874 request_sender_
.get(),
876 test_util::CreateQuitCallback(
878 test_util::CreateCopyResultCallback(&error
)));
879 request
->set_folder_id("parent_resource_id");
880 request
->set_id("resource_id");
881 request_sender_
->StartRequestWithRetry(request
);
885 EXPECT_EQ(HTTP_SUCCESS
, error
);
886 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
887 EXPECT_EQ("/drive/v2/files/parent_resource_id/children",
888 http_request_
.relative_url
);
889 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
891 EXPECT_TRUE(http_request_
.has_content
);
892 EXPECT_EQ("{\"id\":\"resource_id\"}", http_request_
.content
);
895 TEST_F(DriveApiRequestsTest
, ChildrenDeleteRequest
) {
896 GDataErrorCode error
= GDATA_OTHER_ERROR
;
898 // Remove a resource with "resource_id" from a directory with
899 // "parent_resource_id".
901 base::RunLoop run_loop
;
902 drive::ChildrenDeleteRequest
* request
= new drive::ChildrenDeleteRequest(
903 request_sender_
.get(),
905 test_util::CreateQuitCallback(
907 test_util::CreateCopyResultCallback(&error
)));
908 request
->set_child_id("resource_id");
909 request
->set_folder_id("parent_resource_id");
910 request_sender_
->StartRequestWithRetry(request
);
914 EXPECT_EQ(HTTP_NO_CONTENT
, error
);
915 EXPECT_EQ(net::test_server::METHOD_DELETE
, http_request_
.method
);
916 EXPECT_EQ("/drive/v2/files/parent_resource_id/children/resource_id",
917 http_request_
.relative_url
);
918 EXPECT_FALSE(http_request_
.has_content
);
921 TEST_F(DriveApiRequestsTest
, UploadNewFileRequest
) {
922 // Set an expected url for uploading.
923 expected_upload_path_
= kTestUploadNewFilePath
;
925 const char kTestContentType
[] = "text/plain";
926 const std::string
kTestContent(100, 'a');
927 const base::FilePath kTestFilePath
=
928 temp_dir_
.path().AppendASCII("upload_file.txt");
929 ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath
, kTestContent
));
931 GDataErrorCode error
= GDATA_OTHER_ERROR
;
934 // Initiate uploading a new file to the directory with
935 // "parent_resource_id".
937 base::RunLoop run_loop
;
938 drive::InitiateUploadNewFileRequest
* request
=
939 new drive::InitiateUploadNewFileRequest(
940 request_sender_
.get(),
944 "parent_resource_id", // The resource id of the parent directory.
945 "new file title", // The title of the file being uploaded.
946 test_util::CreateQuitCallback(
948 test_util::CreateCopyResultCallback(&error
, &upload_url
)));
949 request_sender_
->StartRequestWithRetry(request
);
953 EXPECT_EQ(HTTP_SUCCESS
, error
);
954 EXPECT_EQ(kTestUploadNewFilePath
, upload_url
.path());
955 EXPECT_EQ(kTestContentType
, http_request_
.headers
["X-Upload-Content-Type"]);
956 EXPECT_EQ(base::Int64ToString(kTestContent
.size()),
957 http_request_
.headers
["X-Upload-Content-Length"]);
959 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
960 EXPECT_EQ("/upload/drive/v2/files?uploadType=resumable",
961 http_request_
.relative_url
);
962 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
963 EXPECT_TRUE(http_request_
.has_content
);
964 EXPECT_EQ("{\"parents\":[{"
965 "\"id\":\"parent_resource_id\","
966 "\"kind\":\"drive#fileLink\""
968 "\"title\":\"new file title\"}",
969 http_request_
.content
);
971 // Upload the content to the upload URL.
972 UploadRangeResponse response
;
973 scoped_ptr
<FileResource
> new_entry
;
976 base::RunLoop run_loop
;
977 drive::ResumeUploadRequest
* resume_request
=
978 new drive::ResumeUploadRequest(
979 request_sender_
.get(),
982 kTestContent
.size(), // end_position (exclusive)
983 kTestContent
.size(), // content_length,
986 test_util::CreateQuitCallback(
988 test_util::CreateCopyResultCallback(&response
, &new_entry
)),
990 request_sender_
->StartRequestWithRetry(resume_request
);
994 // METHOD_PUT should be used to upload data.
995 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
996 // Request should go to the upload URL.
997 EXPECT_EQ(upload_url
.path(), http_request_
.relative_url
);
998 // Content-Range header should be added.
999 EXPECT_EQ("bytes 0-" +
1000 base::Int64ToString(kTestContent
.size() - 1) + "/" +
1001 base::Int64ToString(kTestContent
.size()),
1002 http_request_
.headers
["Content-Range"]);
1003 // The upload content should be set in the HTTP request.
1004 EXPECT_TRUE(http_request_
.has_content
);
1005 EXPECT_EQ(kTestContent
, http_request_
.content
);
1007 // Check the response.
1008 EXPECT_EQ(HTTP_CREATED
, response
.code
); // Because it's a new file
1009 // The start and end positions should be set to -1, if an upload is complete.
1010 EXPECT_EQ(-1, response
.start_position_received
);
1011 EXPECT_EQ(-1, response
.end_position_received
);
1014 TEST_F(DriveApiRequestsTest
, UploadNewEmptyFileRequest
) {
1015 // Set an expected url for uploading.
1016 expected_upload_path_
= kTestUploadNewFilePath
;
1018 const char kTestContentType
[] = "text/plain";
1019 const char kTestContent
[] = "";
1020 const base::FilePath kTestFilePath
=
1021 temp_dir_
.path().AppendASCII("empty_file.txt");
1022 ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath
, kTestContent
));
1024 GDataErrorCode error
= GDATA_OTHER_ERROR
;
1027 // Initiate uploading a new file to the directory with "parent_resource_id".
1029 base::RunLoop run_loop
;
1030 drive::InitiateUploadNewFileRequest
* request
=
1031 new drive::InitiateUploadNewFileRequest(
1032 request_sender_
.get(),
1036 "parent_resource_id", // The resource id of the parent directory.
1037 "new file title", // The title of the file being uploaded.
1038 test_util::CreateQuitCallback(
1040 test_util::CreateCopyResultCallback(&error
, &upload_url
)));
1041 request_sender_
->StartRequestWithRetry(request
);
1045 EXPECT_EQ(HTTP_SUCCESS
, error
);
1046 EXPECT_EQ(kTestUploadNewFilePath
, upload_url
.path());
1047 EXPECT_EQ(kTestContentType
, http_request_
.headers
["X-Upload-Content-Type"]);
1048 EXPECT_EQ("0", http_request_
.headers
["X-Upload-Content-Length"]);
1050 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
1051 EXPECT_EQ("/upload/drive/v2/files?uploadType=resumable",
1052 http_request_
.relative_url
);
1053 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
1054 EXPECT_TRUE(http_request_
.has_content
);
1055 EXPECT_EQ("{\"parents\":[{"
1056 "\"id\":\"parent_resource_id\","
1057 "\"kind\":\"drive#fileLink\""
1059 "\"title\":\"new file title\"}",
1060 http_request_
.content
);
1062 // Upload the content to the upload URL.
1063 UploadRangeResponse response
;
1064 scoped_ptr
<FileResource
> new_entry
;
1067 base::RunLoop run_loop
;
1068 drive::ResumeUploadRequest
* resume_request
=
1069 new drive::ResumeUploadRequest(
1070 request_sender_
.get(),
1072 0, // start_position
1073 0, // end_position (exclusive)
1074 0, // content_length,
1077 test_util::CreateQuitCallback(
1079 test_util::CreateCopyResultCallback(&response
, &new_entry
)),
1080 ProgressCallback());
1081 request_sender_
->StartRequestWithRetry(resume_request
);
1085 // METHOD_PUT should be used to upload data.
1086 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1087 // Request should go to the upload URL.
1088 EXPECT_EQ(upload_url
.path(), http_request_
.relative_url
);
1089 // Content-Range header should NOT be added.
1090 EXPECT_EQ(0U, http_request_
.headers
.count("Content-Range"));
1091 // The upload content should be set in the HTTP request.
1092 EXPECT_TRUE(http_request_
.has_content
);
1093 EXPECT_EQ(kTestContent
, http_request_
.content
);
1095 // Check the response.
1096 EXPECT_EQ(HTTP_CREATED
, response
.code
); // Because it's a new file
1097 // The start and end positions should be set to -1, if an upload is complete.
1098 EXPECT_EQ(-1, response
.start_position_received
);
1099 EXPECT_EQ(-1, response
.end_position_received
);
1102 TEST_F(DriveApiRequestsTest
, UploadNewLargeFileRequest
) {
1103 // Set an expected url for uploading.
1104 expected_upload_path_
= kTestUploadNewFilePath
;
1106 const char kTestContentType
[] = "text/plain";
1107 const size_t kNumChunkBytes
= 10; // Num bytes in a chunk.
1108 const std::string
kTestContent(100, 'a');
1109 const base::FilePath kTestFilePath
=
1110 temp_dir_
.path().AppendASCII("upload_file.txt");
1111 ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath
, kTestContent
));
1113 GDataErrorCode error
= GDATA_OTHER_ERROR
;
1116 // Initiate uploading a new file to the directory with "parent_resource_id".
1118 base::RunLoop run_loop
;
1119 drive::InitiateUploadNewFileRequest
* request
=
1120 new drive::InitiateUploadNewFileRequest(
1121 request_sender_
.get(),
1124 kTestContent
.size(),
1125 "parent_resource_id", // The resource id of the parent directory.
1126 "new file title", // The title of the file being uploaded.
1127 test_util::CreateQuitCallback(
1129 test_util::CreateCopyResultCallback(&error
, &upload_url
)));
1130 request_sender_
->StartRequestWithRetry(request
);
1134 EXPECT_EQ(HTTP_SUCCESS
, error
);
1135 EXPECT_EQ(kTestUploadNewFilePath
, upload_url
.path());
1136 EXPECT_EQ(kTestContentType
, http_request_
.headers
["X-Upload-Content-Type"]);
1137 EXPECT_EQ(base::Int64ToString(kTestContent
.size()),
1138 http_request_
.headers
["X-Upload-Content-Length"]);
1140 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
1141 EXPECT_EQ("/upload/drive/v2/files?uploadType=resumable",
1142 http_request_
.relative_url
);
1143 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
1144 EXPECT_TRUE(http_request_
.has_content
);
1145 EXPECT_EQ("{\"parents\":[{"
1146 "\"id\":\"parent_resource_id\","
1147 "\"kind\":\"drive#fileLink\""
1149 "\"title\":\"new file title\"}",
1150 http_request_
.content
);
1152 // Before sending any data, check the current status.
1153 // This is an edge case test for GetUploadStatusRequest.
1155 UploadRangeResponse response
;
1156 scoped_ptr
<FileResource
> new_entry
;
1158 // Check the response by GetUploadStatusRequest.
1160 base::RunLoop run_loop
;
1161 drive::GetUploadStatusRequest
* get_upload_status_request
=
1162 new drive::GetUploadStatusRequest(
1163 request_sender_
.get(),
1165 kTestContent
.size(),
1166 test_util::CreateQuitCallback(
1168 test_util::CreateCopyResultCallback(&response
, &new_entry
)));
1169 request_sender_
->StartRequestWithRetry(get_upload_status_request
);
1173 // METHOD_PUT should be used to upload data.
1174 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1175 // Request should go to the upload URL.
1176 EXPECT_EQ(upload_url
.path(), http_request_
.relative_url
);
1177 // Content-Range header should be added.
1178 EXPECT_EQ("bytes */" + base::Int64ToString(kTestContent
.size()),
1179 http_request_
.headers
["Content-Range"]);
1180 EXPECT_TRUE(http_request_
.has_content
);
1181 EXPECT_TRUE(http_request_
.content
.empty());
1183 // Check the response.
1184 EXPECT_EQ(HTTP_RESUME_INCOMPLETE
, response
.code
);
1185 EXPECT_EQ(0, response
.start_position_received
);
1186 EXPECT_EQ(0, response
.end_position_received
);
1189 // Upload the content to the upload URL.
1190 for (size_t start_position
= 0; start_position
< kTestContent
.size();
1191 start_position
+= kNumChunkBytes
) {
1192 const std::string payload
= kTestContent
.substr(
1194 std::min(kNumChunkBytes
, kTestContent
.size() - start_position
));
1195 const size_t end_position
= start_position
+ payload
.size();
1197 UploadRangeResponse response
;
1198 scoped_ptr
<FileResource
> new_entry
;
1201 base::RunLoop run_loop
;
1202 drive::ResumeUploadRequest
* resume_request
=
1203 new drive::ResumeUploadRequest(
1204 request_sender_
.get(),
1208 kTestContent
.size(), // content_length,
1211 test_util::CreateQuitCallback(
1213 test_util::CreateCopyResultCallback(&response
, &new_entry
)),
1214 ProgressCallback());
1215 request_sender_
->StartRequestWithRetry(resume_request
);
1219 // METHOD_PUT should be used to upload data.
1220 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1221 // Request should go to the upload URL.
1222 EXPECT_EQ(upload_url
.path(), http_request_
.relative_url
);
1223 // Content-Range header should be added.
1224 EXPECT_EQ("bytes " +
1225 base::Int64ToString(start_position
) + "-" +
1226 base::Int64ToString(end_position
- 1) + "/" +
1227 base::Int64ToString(kTestContent
.size()),
1228 http_request_
.headers
["Content-Range"]);
1229 // The upload content should be set in the HTTP request.
1230 EXPECT_TRUE(http_request_
.has_content
);
1231 EXPECT_EQ(payload
, http_request_
.content
);
1233 if (end_position
== kTestContent
.size()) {
1234 // Check the response.
1235 EXPECT_EQ(HTTP_CREATED
, response
.code
); // Because it's a new file
1236 // The start and end positions should be set to -1, if an upload is
1238 EXPECT_EQ(-1, response
.start_position_received
);
1239 EXPECT_EQ(-1, response
.end_position_received
);
1243 // Check the response.
1244 EXPECT_EQ(HTTP_RESUME_INCOMPLETE
, response
.code
);
1245 EXPECT_EQ(0, response
.start_position_received
);
1246 EXPECT_EQ(static_cast<int64
>(end_position
), response
.end_position_received
);
1248 // Check the response by GetUploadStatusRequest.
1250 base::RunLoop run_loop
;
1251 drive::GetUploadStatusRequest
* get_upload_status_request
=
1252 new drive::GetUploadStatusRequest(
1253 request_sender_
.get(),
1255 kTestContent
.size(),
1256 test_util::CreateQuitCallback(
1258 test_util::CreateCopyResultCallback(&response
, &new_entry
)));
1259 request_sender_
->StartRequestWithRetry(get_upload_status_request
);
1263 // METHOD_PUT should be used to upload data.
1264 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1265 // Request should go to the upload URL.
1266 EXPECT_EQ(upload_url
.path(), http_request_
.relative_url
);
1267 // Content-Range header should be added.
1268 EXPECT_EQ("bytes */" + base::Int64ToString(kTestContent
.size()),
1269 http_request_
.headers
["Content-Range"]);
1270 EXPECT_TRUE(http_request_
.has_content
);
1271 EXPECT_TRUE(http_request_
.content
.empty());
1273 // Check the response.
1274 EXPECT_EQ(HTTP_RESUME_INCOMPLETE
, response
.code
);
1275 EXPECT_EQ(0, response
.start_position_received
);
1276 EXPECT_EQ(static_cast<int64
>(end_position
),
1277 response
.end_position_received
);
1281 TEST_F(DriveApiRequestsTest
, UploadNewFileWithMetadataRequest
) {
1282 const base::Time::Exploded kModifiedDate
= {2012, 7, 0, 19, 15, 59, 13, 123};
1283 const base::Time::Exploded kLastViewedByMeDate
=
1284 {2013, 7, 0, 19, 15, 59, 13, 123};
1286 // Set an expected url for uploading.
1287 expected_upload_path_
= kTestUploadNewFilePath
;
1289 const char kTestContentType
[] = "text/plain";
1290 const std::string
kTestContent(100, 'a');
1292 GDataErrorCode error
= GDATA_OTHER_ERROR
;
1295 // Initiate uploading a new file to the directory with "parent_resource_id".
1297 base::RunLoop run_loop
;
1298 drive::InitiateUploadNewFileRequest
* request
=
1299 new drive::InitiateUploadNewFileRequest(
1300 request_sender_
.get(),
1303 kTestContent
.size(),
1304 "parent_resource_id", // The resource id of the parent directory.
1305 "new file title", // The title of the file being uploaded.
1306 test_util::CreateQuitCallback(
1308 test_util::CreateCopyResultCallback(&error
, &upload_url
)));
1309 request
->set_modified_date(base::Time::FromUTCExploded(kModifiedDate
));
1310 request
->set_last_viewed_by_me_date(
1311 base::Time::FromUTCExploded(kLastViewedByMeDate
));
1312 request_sender_
->StartRequestWithRetry(request
);
1316 EXPECT_EQ(HTTP_SUCCESS
, error
);
1317 EXPECT_EQ(kTestUploadNewFilePath
, upload_url
.path());
1318 EXPECT_EQ(kTestContentType
, http_request_
.headers
["X-Upload-Content-Type"]);
1319 EXPECT_EQ(base::Int64ToString(kTestContent
.size()),
1320 http_request_
.headers
["X-Upload-Content-Length"]);
1322 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
1323 EXPECT_EQ("/upload/drive/v2/files?uploadType=resumable&setModifiedDate=true",
1324 http_request_
.relative_url
);
1325 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
1326 EXPECT_TRUE(http_request_
.has_content
);
1327 EXPECT_EQ("{\"lastViewedByMeDate\":\"2013-07-19T15:59:13.123Z\","
1328 "\"modifiedDate\":\"2012-07-19T15:59:13.123Z\","
1329 "\"parents\":[{\"id\":\"parent_resource_id\","
1330 "\"kind\":\"drive#fileLink\"}],"
1331 "\"title\":\"new file title\"}",
1332 http_request_
.content
);
1335 TEST_F(DriveApiRequestsTest
, UploadExistingFileRequest
) {
1336 // Set an expected url for uploading.
1337 expected_upload_path_
= kTestUploadExistingFilePath
;
1339 const char kTestContentType
[] = "text/plain";
1340 const std::string
kTestContent(100, 'a');
1341 const base::FilePath kTestFilePath
=
1342 temp_dir_
.path().AppendASCII("upload_file.txt");
1343 ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath
, kTestContent
));
1345 GDataErrorCode error
= GDATA_OTHER_ERROR
;
1348 // Initiate uploading a new file to the directory with "parent_resource_id".
1350 base::RunLoop run_loop
;
1351 drive::InitiateUploadExistingFileRequest
* request
=
1352 new drive::InitiateUploadExistingFileRequest(
1353 request_sender_
.get(),
1356 kTestContent
.size(),
1357 "resource_id", // The resource id of the file to be overwritten.
1358 std::string(), // No etag.
1359 test_util::CreateQuitCallback(
1361 test_util::CreateCopyResultCallback(&error
, &upload_url
)));
1362 request_sender_
->StartRequestWithRetry(request
);
1366 EXPECT_EQ(HTTP_SUCCESS
, error
);
1367 EXPECT_EQ(kTestUploadExistingFilePath
, upload_url
.path());
1368 EXPECT_EQ(kTestContentType
, http_request_
.headers
["X-Upload-Content-Type"]);
1369 EXPECT_EQ(base::Int64ToString(kTestContent
.size()),
1370 http_request_
.headers
["X-Upload-Content-Length"]);
1371 EXPECT_EQ("*", http_request_
.headers
["If-Match"]);
1373 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1374 EXPECT_EQ("/upload/drive/v2/files/resource_id?uploadType=resumable",
1375 http_request_
.relative_url
);
1376 EXPECT_TRUE(http_request_
.has_content
);
1377 EXPECT_TRUE(http_request_
.content
.empty());
1379 // Upload the content to the upload URL.
1380 UploadRangeResponse response
;
1381 scoped_ptr
<FileResource
> new_entry
;
1384 base::RunLoop run_loop
;
1385 drive::ResumeUploadRequest
* resume_request
=
1386 new drive::ResumeUploadRequest(
1387 request_sender_
.get(),
1389 0, // start_position
1390 kTestContent
.size(), // end_position (exclusive)
1391 kTestContent
.size(), // content_length,
1394 test_util::CreateQuitCallback(
1396 test_util::CreateCopyResultCallback(&response
, &new_entry
)),
1397 ProgressCallback());
1398 request_sender_
->StartRequestWithRetry(resume_request
);
1402 // METHOD_PUT should be used to upload data.
1403 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1404 // Request should go to the upload URL.
1405 EXPECT_EQ(upload_url
.path(), http_request_
.relative_url
);
1406 // Content-Range header should be added.
1407 EXPECT_EQ("bytes 0-" +
1408 base::Int64ToString(kTestContent
.size() - 1) + "/" +
1409 base::Int64ToString(kTestContent
.size()),
1410 http_request_
.headers
["Content-Range"]);
1411 // The upload content should be set in the HTTP request.
1412 EXPECT_TRUE(http_request_
.has_content
);
1413 EXPECT_EQ(kTestContent
, http_request_
.content
);
1415 // Check the response.
1416 EXPECT_EQ(HTTP_SUCCESS
, response
.code
); // Because it's an existing file
1417 // The start and end positions should be set to -1, if an upload is complete.
1418 EXPECT_EQ(-1, response
.start_position_received
);
1419 EXPECT_EQ(-1, response
.end_position_received
);
1422 TEST_F(DriveApiRequestsTest
, UploadExistingFileRequestWithETag
) {
1423 // Set an expected url for uploading.
1424 expected_upload_path_
= kTestUploadExistingFilePath
;
1426 const char kTestContentType
[] = "text/plain";
1427 const std::string
kTestContent(100, 'a');
1428 const base::FilePath kTestFilePath
=
1429 temp_dir_
.path().AppendASCII("upload_file.txt");
1430 ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath
, kTestContent
));
1432 GDataErrorCode error
= GDATA_OTHER_ERROR
;
1435 // Initiate uploading a new file to the directory with "parent_resource_id".
1437 base::RunLoop run_loop
;
1438 drive::InitiateUploadExistingFileRequest
* request
=
1439 new drive::InitiateUploadExistingFileRequest(
1440 request_sender_
.get(),
1443 kTestContent
.size(),
1444 "resource_id", // The resource id of the file to be overwritten.
1446 test_util::CreateQuitCallback(
1448 test_util::CreateCopyResultCallback(&error
, &upload_url
)));
1449 request_sender_
->StartRequestWithRetry(request
);
1453 EXPECT_EQ(HTTP_SUCCESS
, error
);
1454 EXPECT_EQ(kTestUploadExistingFilePath
, upload_url
.path());
1455 EXPECT_EQ(kTestContentType
, http_request_
.headers
["X-Upload-Content-Type"]);
1456 EXPECT_EQ(base::Int64ToString(kTestContent
.size()),
1457 http_request_
.headers
["X-Upload-Content-Length"]);
1458 EXPECT_EQ(kTestETag
, http_request_
.headers
["If-Match"]);
1460 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1461 EXPECT_EQ("/upload/drive/v2/files/resource_id?uploadType=resumable",
1462 http_request_
.relative_url
);
1463 EXPECT_TRUE(http_request_
.has_content
);
1464 EXPECT_TRUE(http_request_
.content
.empty());
1466 // Upload the content to the upload URL.
1467 UploadRangeResponse response
;
1468 scoped_ptr
<FileResource
> new_entry
;
1471 base::RunLoop run_loop
;
1472 drive::ResumeUploadRequest
* resume_request
=
1473 new drive::ResumeUploadRequest(
1474 request_sender_
.get(),
1476 0, // start_position
1477 kTestContent
.size(), // end_position (exclusive)
1478 kTestContent
.size(), // content_length,
1481 test_util::CreateQuitCallback(
1483 test_util::CreateCopyResultCallback(&response
, &new_entry
)),
1484 ProgressCallback());
1485 request_sender_
->StartRequestWithRetry(resume_request
);
1489 // METHOD_PUT should be used to upload data.
1490 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1491 // Request should go to the upload URL.
1492 EXPECT_EQ(upload_url
.path(), http_request_
.relative_url
);
1493 // Content-Range header should be added.
1494 EXPECT_EQ("bytes 0-" +
1495 base::Int64ToString(kTestContent
.size() - 1) + "/" +
1496 base::Int64ToString(kTestContent
.size()),
1497 http_request_
.headers
["Content-Range"]);
1498 // The upload content should be set in the HTTP request.
1499 EXPECT_TRUE(http_request_
.has_content
);
1500 EXPECT_EQ(kTestContent
, http_request_
.content
);
1502 // Check the response.
1503 EXPECT_EQ(HTTP_SUCCESS
, response
.code
); // Because it's an existing file
1504 // The start and end positions should be set to -1, if an upload is complete.
1505 EXPECT_EQ(-1, response
.start_position_received
);
1506 EXPECT_EQ(-1, response
.end_position_received
);
1509 TEST_F(DriveApiRequestsTest
, UploadExistingFileRequestWithETagConflicting
) {
1510 // Set an expected url for uploading.
1511 expected_upload_path_
= kTestUploadExistingFilePath
;
1513 // If it turned out that the etag is conflicting, PRECONDITION_FAILED should
1515 expected_precondition_failed_file_path_
=
1516 test_util::GetTestFilePath("drive/error.json");
1518 const char kTestContentType
[] = "text/plain";
1519 const std::string
kTestContent(100, 'a');
1521 GDataErrorCode error
= GDATA_OTHER_ERROR
;
1524 // Initiate uploading a new file to the directory with "parent_resource_id".
1526 base::RunLoop run_loop
;
1527 drive::InitiateUploadExistingFileRequest
* request
=
1528 new drive::InitiateUploadExistingFileRequest(
1529 request_sender_
.get(),
1532 kTestContent
.size(),
1533 "resource_id", // The resource id of the file to be overwritten.
1535 test_util::CreateQuitCallback(
1537 test_util::CreateCopyResultCallback(&error
, &upload_url
)));
1538 request_sender_
->StartRequestWithRetry(request
);
1542 EXPECT_EQ(HTTP_PRECONDITION
, error
);
1543 EXPECT_EQ(kTestContentType
, http_request_
.headers
["X-Upload-Content-Type"]);
1544 EXPECT_EQ(base::Int64ToString(kTestContent
.size()),
1545 http_request_
.headers
["X-Upload-Content-Length"]);
1546 EXPECT_EQ("Conflicting-etag", http_request_
.headers
["If-Match"]);
1548 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1549 EXPECT_EQ("/upload/drive/v2/files/resource_id?uploadType=resumable",
1550 http_request_
.relative_url
);
1551 EXPECT_TRUE(http_request_
.has_content
);
1552 EXPECT_TRUE(http_request_
.content
.empty());
1555 TEST_F(DriveApiRequestsTest
,
1556 UploadExistingFileRequestWithETagConflictOnResumeUpload
) {
1557 // Set an expected url for uploading.
1558 expected_upload_path_
= kTestUploadExistingFilePath
;
1560 const char kTestContentType
[] = "text/plain";
1561 const std::string
kTestContent(100, 'a');
1562 const base::FilePath kTestFilePath
=
1563 temp_dir_
.path().AppendASCII("upload_file.txt");
1564 ASSERT_TRUE(test_util::WriteStringToFile(kTestFilePath
, kTestContent
));
1566 GDataErrorCode error
= GDATA_OTHER_ERROR
;
1569 // Initiate uploading a new file to the directory with "parent_resource_id".
1571 base::RunLoop run_loop
;
1572 drive::InitiateUploadExistingFileRequest
* request
=
1573 new drive::InitiateUploadExistingFileRequest(
1574 request_sender_
.get(),
1577 kTestContent
.size(),
1578 "resource_id", // The resource id of the file to be overwritten.
1580 test_util::CreateQuitCallback(
1582 test_util::CreateCopyResultCallback(&error
, &upload_url
)));
1583 request_sender_
->StartRequestWithRetry(request
);
1587 EXPECT_EQ(HTTP_SUCCESS
, error
);
1588 EXPECT_EQ(kTestUploadExistingFilePath
, upload_url
.path());
1589 EXPECT_EQ(kTestContentType
, http_request_
.headers
["X-Upload-Content-Type"]);
1590 EXPECT_EQ(base::Int64ToString(kTestContent
.size()),
1591 http_request_
.headers
["X-Upload-Content-Length"]);
1592 EXPECT_EQ(kTestETag
, http_request_
.headers
["If-Match"]);
1594 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1595 EXPECT_EQ("/upload/drive/v2/files/resource_id?uploadType=resumable",
1596 http_request_
.relative_url
);
1597 EXPECT_TRUE(http_request_
.has_content
);
1598 EXPECT_TRUE(http_request_
.content
.empty());
1600 // Set PRECONDITION_FAILED to the server. This is the emulation of the
1601 // confliction during uploading.
1602 expected_precondition_failed_file_path_
=
1603 test_util::GetTestFilePath("drive/error.json");
1605 // Upload the content to the upload URL.
1606 UploadRangeResponse response
;
1607 scoped_ptr
<FileResource
> new_entry
;
1610 base::RunLoop run_loop
;
1611 drive::ResumeUploadRequest
* resume_request
=
1612 new drive::ResumeUploadRequest(
1613 request_sender_
.get(),
1615 0, // start_position
1616 kTestContent
.size(), // end_position (exclusive)
1617 kTestContent
.size(), // content_length,
1620 test_util::CreateQuitCallback(
1622 test_util::CreateCopyResultCallback(&response
, &new_entry
)),
1623 ProgressCallback());
1624 request_sender_
->StartRequestWithRetry(resume_request
);
1628 // METHOD_PUT should be used to upload data.
1629 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1630 // Request should go to the upload URL.
1631 EXPECT_EQ(upload_url
.path(), http_request_
.relative_url
);
1632 // Content-Range header should be added.
1633 EXPECT_EQ("bytes 0-" +
1634 base::Int64ToString(kTestContent
.size() - 1) + "/" +
1635 base::Int64ToString(kTestContent
.size()),
1636 http_request_
.headers
["Content-Range"]);
1637 // The upload content should be set in the HTTP request.
1638 EXPECT_TRUE(http_request_
.has_content
);
1639 EXPECT_EQ(kTestContent
, http_request_
.content
);
1641 // Check the response.
1642 EXPECT_EQ(HTTP_PRECONDITION
, response
.code
);
1643 // The start and end positions should be set to -1 for error.
1644 EXPECT_EQ(-1, response
.start_position_received
);
1645 EXPECT_EQ(-1, response
.end_position_received
);
1647 // New entry should be NULL.
1648 EXPECT_FALSE(new_entry
.get());
1651 TEST_F(DriveApiRequestsTest
, UploadExistingFileWithMetadataRequest
) {
1652 const base::Time::Exploded kModifiedDate
= {2012, 7, 0, 19, 15, 59, 13, 123};
1653 const base::Time::Exploded kLastViewedByMeDate
=
1654 {2013, 7, 0, 19, 15, 59, 13, 123};
1656 // Set an expected url for uploading.
1657 expected_upload_path_
= kTestUploadExistingFilePath
;
1659 const char kTestContentType
[] = "text/plain";
1660 const std::string
kTestContent(100, 'a');
1662 GDataErrorCode error
= GDATA_OTHER_ERROR
;
1665 // Initiate uploading a new file to the directory with "parent_resource_id".
1667 base::RunLoop run_loop
;
1668 drive::InitiateUploadExistingFileRequest
* request
=
1669 new drive::InitiateUploadExistingFileRequest(
1670 request_sender_
.get(),
1673 kTestContent
.size(),
1674 "resource_id", // The resource id of the file to be overwritten.
1676 test_util::CreateQuitCallback(
1678 test_util::CreateCopyResultCallback(&error
, &upload_url
)));
1679 request
->set_parent_resource_id("new_parent_resource_id");
1680 request
->set_title("new file title");
1681 request
->set_modified_date(base::Time::FromUTCExploded(kModifiedDate
));
1682 request
->set_last_viewed_by_me_date(
1683 base::Time::FromUTCExploded(kLastViewedByMeDate
));
1685 request_sender_
->StartRequestWithRetry(request
);
1689 EXPECT_EQ(HTTP_SUCCESS
, error
);
1690 EXPECT_EQ(kTestUploadExistingFilePath
, upload_url
.path());
1691 EXPECT_EQ(kTestContentType
, http_request_
.headers
["X-Upload-Content-Type"]);
1692 EXPECT_EQ(base::Int64ToString(kTestContent
.size()),
1693 http_request_
.headers
["X-Upload-Content-Length"]);
1694 EXPECT_EQ(kTestETag
, http_request_
.headers
["If-Match"]);
1696 EXPECT_EQ(net::test_server::METHOD_PUT
, http_request_
.method
);
1697 EXPECT_EQ("/upload/drive/v2/files/resource_id?"
1698 "uploadType=resumable&setModifiedDate=true",
1699 http_request_
.relative_url
);
1700 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
1701 EXPECT_TRUE(http_request_
.has_content
);
1702 EXPECT_EQ("{\"lastViewedByMeDate\":\"2013-07-19T15:59:13.123Z\","
1703 "\"modifiedDate\":\"2012-07-19T15:59:13.123Z\","
1704 "\"parents\":[{\"id\":\"new_parent_resource_id\","
1705 "\"kind\":\"drive#fileLink\"}],"
1706 "\"title\":\"new file title\"}",
1707 http_request_
.content
);
1710 TEST_F(DriveApiRequestsTest
, DownloadFileRequest
) {
1711 const base::FilePath kDownloadedFilePath
=
1712 temp_dir_
.path().AppendASCII("cache_file");
1713 const std::string
kTestId("dummyId");
1715 GDataErrorCode result_code
= GDATA_OTHER_ERROR
;
1716 base::FilePath temp_file
;
1718 base::RunLoop run_loop
;
1719 drive::DownloadFileRequest
* request
= new drive::DownloadFileRequest(
1720 request_sender_
.get(),
1723 kDownloadedFilePath
,
1724 test_util::CreateQuitCallback(
1726 test_util::CreateCopyResultCallback(&result_code
, &temp_file
)),
1727 GetContentCallback(),
1728 ProgressCallback());
1729 request_sender_
->StartRequestWithRetry(request
);
1733 std::string contents
;
1734 base::ReadFileToString(temp_file
, &contents
);
1735 base::DeleteFile(temp_file
, false);
1737 EXPECT_EQ(HTTP_SUCCESS
, result_code
);
1738 EXPECT_EQ(net::test_server::METHOD_GET
, http_request_
.method
);
1739 EXPECT_EQ(kTestDownloadPathPrefix
+ kTestId
, http_request_
.relative_url
);
1740 EXPECT_EQ(kDownloadedFilePath
, temp_file
);
1742 const std::string expected_contents
= kTestId
+ kTestId
+ kTestId
;
1743 EXPECT_EQ(expected_contents
, contents
);
1746 TEST_F(DriveApiRequestsTest
, DownloadFileRequest_GetContentCallback
) {
1747 const base::FilePath kDownloadedFilePath
=
1748 temp_dir_
.path().AppendASCII("cache_file");
1749 const std::string
kTestId("dummyId");
1751 GDataErrorCode result_code
= GDATA_OTHER_ERROR
;
1752 base::FilePath temp_file
;
1753 std::string contents
;
1755 base::RunLoop run_loop
;
1756 drive::DownloadFileRequest
* request
= new drive::DownloadFileRequest(
1757 request_sender_
.get(),
1760 kDownloadedFilePath
,
1761 test_util::CreateQuitCallback(
1763 test_util::CreateCopyResultCallback(&result_code
, &temp_file
)),
1764 base::Bind(&AppendContent
, &contents
),
1765 ProgressCallback());
1766 request_sender_
->StartRequestWithRetry(request
);
1770 base::DeleteFile(temp_file
, false);
1772 EXPECT_EQ(HTTP_SUCCESS
, result_code
);
1773 EXPECT_EQ(net::test_server::METHOD_GET
, http_request_
.method
);
1774 EXPECT_EQ(kTestDownloadPathPrefix
+ kTestId
, http_request_
.relative_url
);
1775 EXPECT_EQ(kDownloadedFilePath
, temp_file
);
1777 const std::string expected_contents
= kTestId
+ kTestId
+ kTestId
;
1778 EXPECT_EQ(expected_contents
, contents
);
1781 TEST_F(DriveApiRequestsTest
, PermissionsInsertRequest
) {
1782 expected_content_type_
= "application/json";
1783 expected_content_
= kTestPermissionResponse
;
1785 GDataErrorCode error
= GDATA_OTHER_ERROR
;
1787 // Add comment permission to the user "user@example.com".
1789 base::RunLoop run_loop
;
1790 drive::PermissionsInsertRequest
* request
=
1791 new drive::PermissionsInsertRequest(
1792 request_sender_
.get(),
1794 test_util::CreateQuitCallback(
1796 test_util::CreateCopyResultCallback(&error
)));
1797 request
->set_id("resource_id");
1798 request
->set_role(drive::PERMISSION_ROLE_COMMENTER
);
1799 request
->set_type(drive::PERMISSION_TYPE_USER
);
1800 request
->set_value("user@example.com");
1801 request_sender_
->StartRequestWithRetry(request
);
1805 EXPECT_EQ(HTTP_SUCCESS
, error
);
1806 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
1807 EXPECT_EQ("/drive/v2/files/resource_id/permissions",
1808 http_request_
.relative_url
);
1809 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
1811 scoped_ptr
<base::Value
> expected(base::JSONReader::Read(
1812 "{\"additionalRoles\":[\"commenter\"], \"role\":\"reader\", "
1813 "\"type\":\"user\",\"value\":\"user@example.com\"}"));
1814 ASSERT_TRUE(expected
);
1816 scoped_ptr
<base::Value
> result(base::JSONReader::Read(http_request_
.content
));
1817 EXPECT_TRUE(http_request_
.has_content
);
1818 EXPECT_TRUE(base::Value::Equals(expected
.get(), result
.get()));
1820 // Add "can edit" permission to users in "example.com".
1821 error
= GDATA_OTHER_ERROR
;
1823 base::RunLoop run_loop
;
1824 drive::PermissionsInsertRequest
* request
=
1825 new drive::PermissionsInsertRequest(
1826 request_sender_
.get(),
1828 test_util::CreateQuitCallback(
1830 test_util::CreateCopyResultCallback(&error
)));
1831 request
->set_id("resource_id2");
1832 request
->set_role(drive::PERMISSION_ROLE_WRITER
);
1833 request
->set_type(drive::PERMISSION_TYPE_DOMAIN
);
1834 request
->set_value("example.com");
1835 request_sender_
->StartRequestWithRetry(request
);
1839 EXPECT_EQ(HTTP_SUCCESS
, error
);
1840 EXPECT_EQ(net::test_server::METHOD_POST
, http_request_
.method
);
1841 EXPECT_EQ("/drive/v2/files/resource_id2/permissions",
1842 http_request_
.relative_url
);
1843 EXPECT_EQ("application/json", http_request_
.headers
["Content-Type"]);
1845 expected
.reset(base::JSONReader::Read(
1846 "{\"role\":\"writer\", \"type\":\"domain\",\"value\":\"example.com\"}"));
1847 ASSERT_TRUE(expected
);
1849 result
.reset(base::JSONReader::Read(http_request_
.content
));
1850 EXPECT_TRUE(http_request_
.has_content
);
1851 EXPECT_TRUE(base::Value::Equals(expected
.get(), result
.get()));
1854 } // namespace google_apis