OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 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 "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/files/file_path.h" | 6 #include "base/files/file_path.h" |
7 #include "base/files/file_util.h" | 7 #include "base/files/file_util.h" |
8 #include "base/files/scoped_temp_dir.h" | 8 #include "base/files/scoped_temp_dir.h" |
9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 const char kTestDownloadPathPrefix[] = "/host/"; | 51 const char kTestDownloadPathPrefix[] = "/host/"; |
52 | 52 |
53 // Used as a GetContentCallback. | 53 // Used as a GetContentCallback. |
54 void AppendContent(std::string* out, | 54 void AppendContent(std::string* out, |
55 DriveApiErrorCode error, | 55 DriveApiErrorCode error, |
56 scoped_ptr<std::string> content) { | 56 scoped_ptr<std::string> content) { |
57 EXPECT_EQ(HTTP_SUCCESS, error); | 57 EXPECT_EQ(HTTP_SUCCESS, error); |
58 out->append(*content); | 58 out->append(*content); |
59 } | 59 } |
60 | 60 |
61 class TestBatchableRequest : public BatchableRequestBase { | 61 class TestBatchableDelegate : public BatchableDelegate { |
62 public: | 62 public: |
63 TestBatchableRequest(RequestSender* sender, | 63 TestBatchableDelegate(const GURL url, |
64 const GURL url, | 64 const std::string& content_type, |
65 const std::string& content_type, | 65 const std::string& content_data, |
66 const std::string& content_data, | 66 const base::Closure& callback) |
67 const base::Closure& callback) | 67 : url_(url), |
68 : BatchableRequestBase(sender), | |
69 url_(url), | |
70 content_type_(content_type), | 68 content_type_(content_type), |
71 content_data_(content_data), | 69 content_data_(content_data), |
72 callback_(callback) {} | 70 callback_(callback) {} |
73 GURL GetURL() const override { return url_; } | 71 GURL GetURL() const override { return url_; } |
74 void RunCallbackOnPrematureFailure(DriveApiErrorCode code) override { | |
75 callback_.Run(); | |
76 } | |
77 void ProcessURLFetchResults(DriveApiErrorCode code, | |
78 const std::string& body) override { | |
79 callback_.Run(); | |
80 } | |
81 net::URLFetcher::RequestType GetRequestType() const override { | 72 net::URLFetcher::RequestType GetRequestType() const override { |
82 return net::URLFetcher::PUT; | 73 return net::URLFetcher::PUT; |
83 } | 74 } |
| 75 std::vector<std::string> GetExtraRequestHeaders() const override { |
| 76 return std::vector<std::string>(); |
| 77 } |
| 78 void Prepare(const PrepareCallback& callback) override { |
| 79 callback.Run(HTTP_SUCCESS); |
| 80 } |
84 bool GetContentData(std::string* upload_content_type, | 81 bool GetContentData(std::string* upload_content_type, |
85 std::string* upload_content) override { | 82 std::string* upload_content) override { |
86 upload_content_type->assign(content_type_); | 83 upload_content_type->assign(content_type_); |
87 upload_content->assign(content_data_); | 84 upload_content->assign(content_data_); |
88 return true; | 85 return true; |
89 } | 86 } |
90 void OnURLFetchUploadProgress(const net::URLFetcher* source, | 87 void NotifyError(DriveApiErrorCode code) override { callback_.Run(); } |
91 int64 current, | 88 void NotifyResult(DriveApiErrorCode code, |
92 int64 total) override { | 89 const std::string& body, |
| 90 const base::Closure& closure) override { |
| 91 callback_.Run(); |
| 92 closure.Run(); |
| 93 } |
| 94 void NotifyUploadProgress(const net::URLFetcher* source, |
| 95 int64 current, |
| 96 int64 total) override { |
93 progress_values_.push_back(current); | 97 progress_values_.push_back(current); |
94 } | 98 } |
95 const std::vector<int64>& progress_values() const { return progress_values_; } | 99 const std::vector<int64>& progress_values() const { return progress_values_; } |
96 | 100 |
97 private: | 101 private: |
98 GURL url_; | 102 GURL url_; |
99 std::string content_type_; | 103 std::string content_type_; |
100 std::string content_data_; | 104 std::string content_data_; |
101 base::Closure callback_; | 105 base::Closure callback_; |
102 std::vector<int64> progress_values_; | 106 std::vector<int64> progress_values_; |
(...skipping 1892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1995 request_sender_->StartRequestWithRetry(request); | 1999 request_sender_->StartRequestWithRetry(request); |
1996 | 2000 |
1997 // Create child request. | 2001 // Create child request. |
1998 DriveApiErrorCode errors[] = {DRIVE_OTHER_ERROR, DRIVE_OTHER_ERROR}; | 2002 DriveApiErrorCode errors[] = {DRIVE_OTHER_ERROR, DRIVE_OTHER_ERROR}; |
1999 scoped_ptr<FileResource> file_resources[2]; | 2003 scoped_ptr<FileResource> file_resources[2]; |
2000 base::RunLoop run_loop[2]; | 2004 base::RunLoop run_loop[2]; |
2001 for (int i = 0; i < 2; ++i) { | 2005 for (int i = 0; i < 2; ++i) { |
2002 const FileResourceCallback callback = test_util::CreateQuitCallback( | 2006 const FileResourceCallback callback = test_util::CreateQuitCallback( |
2003 &run_loop[i], | 2007 &run_loop[i], |
2004 test_util::CreateCopyResultCallback(&errors[i], &file_resources[i])); | 2008 test_util::CreateCopyResultCallback(&errors[i], &file_resources[i])); |
2005 drive::MultipartUploadNewFileRequest* const child_request = | 2009 drive::MultipartUploadNewFileDelegate* const child_request = |
2006 new drive::MultipartUploadNewFileRequest( | 2010 new drive::MultipartUploadNewFileDelegate( |
2007 request_sender_.get(), base::StringPrintf("new file title %d", i), | 2011 request_sender_.get(), base::StringPrintf("new file title %d", i), |
2008 "parent_resource_id", kTestContentType, kTestContent.size(), | 2012 "parent_resource_id", kTestContentType, kTestContent.size(), |
2009 base::Time(), base::Time(), kTestFilePath, drive::Properties(), | 2013 base::Time(), base::Time(), kTestFilePath, drive::Properties(), |
2010 *url_generator_, callback, ProgressCallback()); | 2014 *url_generator_, callback, ProgressCallback()); |
2011 child_request->SetBoundaryForTesting("INNERBOUNDARY"); | 2015 child_request->SetBoundaryForTesting("INNERBOUNDARY"); |
2012 request->AddRequest(child_request); | 2016 request->AddRequest(child_request); |
2013 } | 2017 } |
2014 request->Commit(); | 2018 request->Commit(); |
2015 run_loop[0].Run(); | 2019 run_loop[0].Run(); |
2016 run_loop[1].Run(); | 2020 run_loop[1].Run(); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2055 "Content-Type: text/plain\n" | 2059 "Content-Type: text/plain\n" |
2056 "\n" | 2060 "\n" |
2057 "aaaaaaaaaa\n" | 2061 "aaaaaaaaaa\n" |
2058 "--INNERBOUNDARY--\n" | 2062 "--INNERBOUNDARY--\n" |
2059 "--OUTERBOUNDARY--", | 2063 "--OUTERBOUNDARY--", |
2060 http_request_.content); | 2064 http_request_.content); |
2061 EXPECT_EQ(HTTP_SUCCESS, errors[0]); | 2065 EXPECT_EQ(HTTP_SUCCESS, errors[0]); |
2062 ASSERT_TRUE(file_resources[0]); | 2066 ASSERT_TRUE(file_resources[0]); |
2063 EXPECT_EQ("file_id_1", file_resources[0]->file_id()); | 2067 EXPECT_EQ("file_id_1", file_resources[0]->file_id()); |
2064 ASSERT_FALSE(file_resources[1]); | 2068 ASSERT_FALSE(file_resources[1]); |
2065 EXPECT_EQ(DRIVE_PARSE_ERROR, errors[1]); | 2069 EXPECT_EQ(HTTP_SERVICE_UNAVAILABLE, errors[1]); |
2066 } | 2070 } |
2067 | 2071 |
2068 TEST_F(DriveApiRequestsTest, EmptyBatchUploadRequest) { | 2072 TEST_F(DriveApiRequestsTest, EmptyBatchUploadRequest) { |
2069 drive::BatchUploadRequest* const request = | 2073 drive::BatchUploadRequest* const request = |
2070 new drive::BatchUploadRequest(request_sender_.get(), *url_generator_); | 2074 new drive::BatchUploadRequest(request_sender_.get(), *url_generator_); |
2071 base::WeakPtr<drive::BatchUploadRequest> weak_ptr = | 2075 base::WeakPtr<drive::BatchUploadRequest> weak_ptr = |
2072 request->GetWeakPtrAsBatchUploadRequest(); | 2076 request->GetWeakPtrAsBatchUploadRequest(); |
2073 request->Commit(); | 2077 request->Commit(); |
2074 ASSERT_FALSE(weak_ptr.get()); | 2078 ASSERT_FALSE(weak_ptr.get()); |
2075 } | 2079 } |
2076 | 2080 |
2077 TEST_F(DriveApiRequestsTest, BatchUploadRequestWithBodyIncludingZero) { | 2081 TEST_F(DriveApiRequestsTest, BatchUploadRequestWithBodyIncludingZero) { |
2078 // Create batch request. | 2082 // Create batch request. |
2079 drive::BatchUploadRequest* const request = | 2083 drive::BatchUploadRequest* const request = |
2080 new drive::BatchUploadRequest(request_sender_.get(), *url_generator_); | 2084 new drive::BatchUploadRequest(request_sender_.get(), *url_generator_); |
2081 request->SetBoundaryForTesting("OUTERBOUNDARY"); | 2085 request->SetBoundaryForTesting("OUTERBOUNDARY"); |
2082 request_sender_->StartRequestWithRetry(request); | 2086 request_sender_->StartRequestWithRetry(request); |
2083 | 2087 |
2084 // Create child request. | 2088 // Create child request. |
2085 { | 2089 { |
2086 base::RunLoop loop; | 2090 base::RunLoop loop; |
2087 TestBatchableRequest* child_request = new TestBatchableRequest( | 2091 TestBatchableDelegate* const child_request = new TestBatchableDelegate( |
2088 request_sender_.get(), GURL("http://example.com/test"), | 2092 GURL("http://example.com/test"), "application/binary", |
2089 "application/binary", std::string("Apple\0Orange\0", 13), | 2093 std::string("Apple\0Orange\0", 13), loop.QuitClosure()); |
2090 loop.QuitClosure()); | |
2091 request->AddRequest(child_request); | 2094 request->AddRequest(child_request); |
2092 request->Commit(); | 2095 request->Commit(); |
2093 loop.Run(); | 2096 loop.Run(); |
2094 } | 2097 } |
2095 | 2098 |
2096 EXPECT_EQ(net::test_server::METHOD_PUT, http_request_.method); | 2099 EXPECT_EQ(net::test_server::METHOD_PUT, http_request_.method); |
2097 EXPECT_EQ("batch", http_request_.headers["X-Goog-Upload-Protocol"]); | 2100 EXPECT_EQ("batch", http_request_.headers["X-Goog-Upload-Protocol"]); |
2098 EXPECT_EQ("multipart/mixed; boundary=OUTERBOUNDARY", | 2101 EXPECT_EQ("multipart/mixed; boundary=OUTERBOUNDARY", |
2099 http_request_.headers["Content-Type"]); | 2102 http_request_.headers["Content-Type"]); |
2100 EXPECT_EQ( | 2103 EXPECT_EQ( |
2101 "--OUTERBOUNDARY\n" | 2104 "--OUTERBOUNDARY\n" |
2102 "Content-Type: application/http\n" | 2105 "Content-Type: application/http\n" |
2103 "\n" | 2106 "\n" |
2104 "PUT /test HTTP/1.1\n" | 2107 "PUT /test HTTP/1.1\n" |
2105 "Host: 127.0.0.1\n" | 2108 "Host: 127.0.0.1\n" |
2106 "X-Goog-Upload-Protocol: multipart\n" | 2109 "X-Goog-Upload-Protocol: multipart\n" |
2107 "Content-Type: application/binary\n" | 2110 "Content-Type: application/binary\n" |
2108 "\n" + | 2111 "\n" + |
2109 std::string("Apple\0Orange\0", 13) + | 2112 std::string("Apple\0Orange\0", 13) + |
2110 "\n" | 2113 "\n" |
2111 "--OUTERBOUNDARY--", | 2114 "--OUTERBOUNDARY--", |
2112 http_request_.content); | 2115 http_request_.content); |
2113 } | 2116 } |
2114 | 2117 |
2115 TEST_F(DriveApiRequestsTest, BatchUploadRequestProgress) { | 2118 TEST_F(DriveApiRequestsTest, BatchUploadRequestProgress) { |
2116 // Create batch request. | 2119 // Create batch request. |
2117 drive::BatchUploadRequest* const request = | 2120 drive::BatchUploadRequest* const request = |
2118 new drive::BatchUploadRequest(request_sender_.get(), *url_generator_); | 2121 new drive::BatchUploadRequest(request_sender_.get(), *url_generator_); |
2119 TestBatchableRequest* requests[] = { | 2122 TestBatchableDelegate* requests[] = { |
2120 new TestBatchableRequest(request_sender_.get(), | 2123 new TestBatchableDelegate(GURL("http://example.com/test"), |
2121 GURL("http://example.com/test"), | 2124 "application/binary", std::string(100, 'a'), |
2122 "application/binary", std::string(100, 'a'), | 2125 base::Bind(&EmptyClosure)), |
2123 base::Bind(&EmptyClosure)), | 2126 new TestBatchableDelegate(GURL("http://example.com/test"), |
2124 new TestBatchableRequest(request_sender_.get(), | 2127 "application/binary", std::string(50, 'b'), |
2125 GURL("http://example.com/test"), | 2128 base::Bind(&EmptyClosure)), |
2126 "application/binary", std::string(50, 'b'), | 2129 new TestBatchableDelegate(GURL("http://example.com/test"), |
2127 base::Bind(&EmptyClosure)), | 2130 "application/binary", std::string(0, 'c'), |
2128 new TestBatchableRequest(request_sender_.get(), | 2131 base::Bind(&EmptyClosure))}; |
2129 GURL("http://example.com/test"), | |
2130 "application/binary", std::string(0, 'c'), | |
2131 base::Bind(&EmptyClosure))}; | |
2132 const size_t kExpectedUploadDataPosition[] = {208, 517, 776}; | 2132 const size_t kExpectedUploadDataPosition[] = {208, 517, 776}; |
2133 const size_t kExpectedUploadDataSize = 851; | 2133 const size_t kExpectedUploadDataSize = 851; |
2134 request->AddRequest(requests[0]); | 2134 request->AddRequest(requests[0]); |
2135 request->AddRequest(requests[1]); | 2135 request->AddRequest(requests[1]); |
2136 request->AddRequest(requests[2]); | 2136 request->AddRequest(requests[2]); |
2137 request->Commit(); | 2137 request->Commit(); |
2138 request->Prepare(base::Bind(&EmptyPreapreCallback)); | 2138 request->Prepare(base::Bind(&EmptyPreapreCallback)); |
2139 | 2139 |
2140 request->OnURLFetchUploadProgress(nullptr, 0, kExpectedUploadDataSize); | 2140 request->OnURLFetchUploadProgress(nullptr, 0, kExpectedUploadDataSize); |
2141 request->OnURLFetchUploadProgress(nullptr, 150, kExpectedUploadDataSize); | 2141 request->OnURLFetchUploadProgress(nullptr, 150, kExpectedUploadDataSize); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2278 "Header: value\r\n" | 2278 "Header: value\r\n" |
2279 "\r\n" | 2279 "\r\n" |
2280 "BODY\r\n" | 2280 "BODY\r\n" |
2281 "--BOUNDARY-- \t", | 2281 "--BOUNDARY-- \t", |
2282 &parts)); | 2282 &parts)); |
2283 ASSERT_EQ(1u, parts.size()); | 2283 ASSERT_EQ(1u, parts.size()); |
2284 EXPECT_EQ(HTTP_SUCCESS, parts[0].code); | 2284 EXPECT_EQ(HTTP_SUCCESS, parts[0].code); |
2285 EXPECT_EQ("BODY", parts[0].body); | 2285 EXPECT_EQ("BODY", parts[0].body); |
2286 } | 2286 } |
2287 } // namespace google_apis | 2287 } // namespace google_apis |
OLD | NEW |