1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "google_apis/drive/test_util.h"
7 #include "base/files/file_util.h"
8 #include "base/json/json_file_value_serializer.h"
9 #include "base/json/json_reader.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/path_service.h"
12 #include "base/rand_util.h"
13 #include "base/run_loop.h"
14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/string_split.h"
16 #include "base/strings/string_util.h"
17 #include "base/strings/stringprintf.h"
18 #include "google_apis/drive/drive_api_parser.h"
19 #include "net/test/embedded_test_server/http_request.h"
20 #include "net/test/embedded_test_server/http_response.h"
23 namespace google_apis
{
26 bool RemovePrefix(const std::string
& input
,
27 const std::string
& prefix
,
28 std::string
* output
) {
29 if (!base::StartsWith(input
, prefix
, base::CompareCase::SENSITIVE
))
32 *output
= input
.substr(prefix
.size());
36 base::FilePath
GetTestFilePath(const std::string
& relative_path
) {
38 if (!PathService::Get(base::DIR_SOURCE_ROOT
, &path
))
39 return base::FilePath();
40 path
= path
.AppendASCII("chrome")
43 .Append(base::FilePath::FromUTF8Unsafe(relative_path
));
47 GURL
GetBaseUrlForTesting(int port
) {
48 return GURL(base::StringPrintf("http://127.0.0.1:%d/", port
));
51 void RunAndQuit(base::RunLoop
* run_loop
, const base::Closure
& closure
) {
56 bool WriteStringToFile(const base::FilePath
& file_path
,
57 const std::string
& content
) {
58 int result
= base::WriteFile(
59 file_path
, content
.data(), static_cast<int>(content
.size()));
60 return content
.size() == static_cast<size_t>(result
);
63 bool CreateFileOfSpecifiedSize(const base::FilePath
& temp_dir
,
67 if (!base::CreateTemporaryFileInDir(temp_dir
, path
))
71 // Note: RandBytesAsString doesn't support generating an empty string.
76 *data
= base::RandBytesAsString(size
);
77 return WriteStringToFile(*path
, *data
);
80 scoped_ptr
<base::Value
> LoadJSONFile(const std::string
& relative_path
) {
81 base::FilePath path
= GetTestFilePath(relative_path
);
84 JSONFileValueDeserializer
deserializer(path
);
85 scoped_ptr
<base::Value
> value(deserializer
.Deserialize(NULL
, &error
));
86 LOG_IF(WARNING
, !value
.get()) << "Failed to parse " << path
.value()
91 // Returns a HttpResponse created from the given file path.
92 scoped_ptr
<net::test_server::BasicHttpResponse
> CreateHttpResponseFromFile(
93 const base::FilePath
& file_path
) {
95 if (!base::ReadFileToString(file_path
, &content
))
96 return scoped_ptr
<net::test_server::BasicHttpResponse
>();
98 std::string content_type
= "text/plain";
99 if (base::EndsWith(file_path
.AsUTF8Unsafe(), ".json",
100 base::CompareCase::SENSITIVE
))
101 content_type
= "application/json";
103 scoped_ptr
<net::test_server::BasicHttpResponse
> http_response(
104 new net::test_server::BasicHttpResponse
);
105 http_response
->set_code(net::HTTP_OK
);
106 http_response
->set_content(content
);
107 http_response
->set_content_type(content_type
);
108 return http_response
.Pass();
111 scoped_ptr
<net::test_server::HttpResponse
> HandleDownloadFileRequest(
112 const GURL
& base_url
,
113 net::test_server::HttpRequest
* out_request
,
114 const net::test_server::HttpRequest
& request
) {
115 *out_request
= request
;
117 GURL absolute_url
= base_url
.Resolve(request
.relative_url
);
118 std::string remaining_path
;
119 if (!RemovePrefix(absolute_url
.path(), "/files/", &remaining_path
))
120 return scoped_ptr
<net::test_server::HttpResponse
>();
121 return CreateHttpResponseFromFile(GetTestFilePath(remaining_path
));
124 bool ParseContentRangeHeader(const std::string
& value
,
125 int64
* start_position
,
128 DCHECK(start_position
);
129 DCHECK(end_position
);
132 std::string remaining
;
133 if (!RemovePrefix(value
, "bytes ", &remaining
))
136 std::vector
<std::string
> parts
;
137 base::SplitString(remaining
, '/', &parts
);
138 if (parts
.size() != 2U)
141 const std::string range
= parts
[0];
142 if (!base::StringToInt64(parts
[1], length
))
146 base::SplitString(range
, '-', &parts
);
147 if (parts
.size() != 2U)
150 return (base::StringToInt64(parts
[0], start_position
) &&
151 base::StringToInt64(parts
[1], end_position
));
154 void AppendProgressCallbackResult(std::vector
<ProgressInfo
>* progress_values
,
157 progress_values
->push_back(ProgressInfo(progress
, total
));
160 TestGetContentCallback::TestGetContentCallback()
161 : callback_(base::Bind(&TestGetContentCallback::OnGetContent
,
162 base::Unretained(this))) {
165 TestGetContentCallback::~TestGetContentCallback() {
168 std::string
TestGetContentCallback::GetConcatenatedData() const {
170 for (size_t i
= 0; i
< data_
.size(); ++i
) {
176 void TestGetContentCallback::OnGetContent(google_apis::DriveApiErrorCode error
,
177 scoped_ptr
<std::string
> data
) {
178 data_
.push_back(data
.release());
181 } // namespace test_util
182 } // namespace google_apis