Index: net/base/upload_data_unittest.cc |
diff --git a/net/base/upload_data_unittest.cc b/net/base/upload_data_unittest.cc |
index 5d56523ff41bbbb1f9432b53a70adb5a7fa9bf5b..63636a24c55b6fa7516a64603e80e4662c0f8ad1 100644 |
--- a/net/base/upload_data_unittest.cc |
+++ b/net/base/upload_data_unittest.cc |
@@ -4,58 +4,177 @@ |
#include "net/base/upload_data.h" |
+#include "base/bind.h" |
#include "base/file_path.h" |
+#include "base/file_util.h" |
+#include "base/message_loop.h" |
+#include "base/scoped_temp_dir.h" |
#include "base/memory/ref_counted.h" |
+#include "base/threading/thread_restrictions.h" |
#include "base/time.h" |
#include "googleurl/src/gurl.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "testing/platform_test.h" |
namespace net { |
-TEST(UploadDataTest, IsInMemory_Empty) { |
- scoped_refptr<UploadData> upload_data = new UploadData; |
- ASSERT_TRUE(upload_data->IsInMemory()); |
+// Simplified version of TestCompletionCallback for ContentLengthCallback, |
+// that handles uint64 rather than int. |
+class TestContentLengthCallback { |
+ public: |
+ TestContentLengthCallback() |
+ : result_(0), |
+ callback_(ALLOW_THIS_IN_INITIALIZER_LIST( |
+ base::Bind(&TestContentLengthCallback::SetResult, |
+ base::Unretained(this)))) { |
+ } |
+ |
+ ~TestContentLengthCallback() {} |
+ |
+ const UploadData::ContentLengthCallback& callback() const { |
+ return callback_; |
+ } |
+ |
+ // Waits for the result and returns it. |
+ uint64 WaitForResult() { |
+ MessageLoop::current()->Run(); |
+ return result_; |
+ } |
+ |
+ private: |
+ // Sets the result and stops the message loop. |
+ void SetResult(uint64 result) { |
+ result_ = result; |
+ MessageLoop::current()->Quit(); |
+ } |
+ |
+ uint64 result_; |
+ const UploadData::ContentLengthCallback callback_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestContentLengthCallback); |
+}; |
+ |
+class UploadDataTest : public PlatformTest { |
+ protected: |
+ virtual void SetUp() { |
+ upload_data_= new UploadData; |
+ // To ensure that file IO is not performed on the main thread in the |
+ // test (i.e. GetContentLengthSync() will fail if file IO is performed). |
+ base::ThreadRestrictions::SetIOAllowed(false); |
+ } |
+ |
+ virtual void TearDown() { |
+ base::ThreadRestrictions::SetIOAllowed(true); |
+ } |
+ |
+ // Creates a temporary file with the given data. The temporary file is |
+ // deleted by temp_dir_. Returns true on success. |
+ bool CreateTemporaryFile(const std::string& data, |
+ FilePath* temp_file_path) { |
+ base::ThreadRestrictions::ScopedAllowIO allow_io; |
+ if (!temp_dir_.CreateUniqueTempDir()) |
+ return false; |
+ if (!file_util::CreateTemporaryFileInDir(temp_dir_.path(), temp_file_path)) |
+ return false; |
+ if (static_cast<int>(data.size()) != |
+ file_util::WriteFile(*temp_file_path, data.data(), data.size())) |
+ return false; |
+ |
+ return true; |
+ } |
+ |
+ ScopedTempDir temp_dir_; |
+ scoped_refptr<UploadData> upload_data_; |
+}; |
+ |
+TEST_F(UploadDataTest, IsInMemory_Empty) { |
+ ASSERT_TRUE(upload_data_->IsInMemory()); |
} |
-TEST(UploadDataTest, IsInMemory_Bytes) { |
- scoped_refptr<UploadData> upload_data = new UploadData; |
- upload_data->AppendBytes("123", 3); |
- ASSERT_TRUE(upload_data->IsInMemory()); |
+TEST_F(UploadDataTest, IsInMemory_Bytes) { |
+ upload_data_->AppendBytes("123", 3); |
+ ASSERT_TRUE(upload_data_->IsInMemory()); |
} |
-TEST(UploadDataTest, IsInMemory_File) { |
- scoped_refptr<UploadData> upload_data = new UploadData; |
- upload_data->AppendFileRange( |
+TEST_F(UploadDataTest, IsInMemory_File) { |
+ upload_data_->AppendFileRange( |
FilePath(FILE_PATH_LITERAL("random_file_name.txt")), |
0, 0, base::Time()); |
- ASSERT_FALSE(upload_data->IsInMemory()); |
+ ASSERT_FALSE(upload_data_->IsInMemory()); |
} |
-TEST(UploadDataTest, IsInMemory_Blob) { |
- scoped_refptr<UploadData> upload_data = new UploadData; |
- upload_data->AppendBlob(GURL("blog:internal:12345")); |
+TEST_F(UploadDataTest, IsInMemory_Blob) { |
+ upload_data_->AppendBlob(GURL("blog:internal:12345")); |
// Until it's resolved, we don't know what blob contains. |
- ASSERT_FALSE(upload_data->IsInMemory()); |
+ ASSERT_FALSE(upload_data_->IsInMemory()); |
} |
-TEST(UploadDataTest, IsInMemory_Chunk) { |
- scoped_refptr<UploadData> upload_data = new UploadData; |
- upload_data->set_is_chunked(true); |
- ASSERT_FALSE(upload_data->IsInMemory()); |
+TEST_F(UploadDataTest, IsInMemory_Chunk) { |
+ upload_data_->set_is_chunked(true); |
+ ASSERT_FALSE(upload_data_->IsInMemory()); |
} |
-TEST(UploadDataTest, IsInMemory_Mixed) { |
- scoped_refptr<UploadData> upload_data = new UploadData; |
- ASSERT_TRUE(upload_data->IsInMemory()); |
+TEST_F(UploadDataTest, IsInMemory_Mixed) { |
+ ASSERT_TRUE(upload_data_->IsInMemory()); |
- upload_data->AppendBytes("123", 3); |
- upload_data->AppendBytes("abc", 3); |
- ASSERT_TRUE(upload_data->IsInMemory()); |
+ upload_data_->AppendBytes("123", 3); |
+ upload_data_->AppendBytes("abc", 3); |
+ ASSERT_TRUE(upload_data_->IsInMemory()); |
- upload_data->AppendFileRange( |
+ upload_data_->AppendFileRange( |
FilePath(FILE_PATH_LITERAL("random_file_name.txt")), |
0, 0, base::Time()); |
- ASSERT_FALSE(upload_data->IsInMemory()); |
+ ASSERT_FALSE(upload_data_->IsInMemory()); |
+} |
+ |
+TEST_F(UploadDataTest, GetContentLength_Empty) { |
+ ASSERT_EQ(0U, upload_data_->GetContentLengthSync()); |
+} |
+ |
+TEST_F(UploadDataTest, GetContentLength_Bytes) { |
+ upload_data_->AppendBytes("123", 3); |
+ ASSERT_EQ(3U, upload_data_->GetContentLengthSync()); |
+} |
+ |
+TEST_F(UploadDataTest, GetContentLength_File) { |
+ // Create a temporary file with some data. |
+ const std::string kData = "hello"; |
+ FilePath temp_file_path; |
+ ASSERT_TRUE(CreateTemporaryFile(kData, &temp_file_path)); |
+ upload_data_->AppendFileRange(temp_file_path, 0, kuint64max, base::Time()); |
+ |
+ // The length is returned asynchronously. |
+ TestContentLengthCallback callback; |
+ upload_data_->GetContentLength(callback.callback()); |
+ ASSERT_EQ(kData.size(), callback.WaitForResult()); |
+} |
+ |
+TEST_F(UploadDataTest, GetContentLength_Blob) { |
+ upload_data_->AppendBlob(GURL("blog:internal:12345")); |
+ ASSERT_EQ(0U, upload_data_->GetContentLengthSync()); |
+} |
+ |
+TEST_F(UploadDataTest, GetContentLength_Chunk) { |
+ upload_data_->set_is_chunked(true); |
+ ASSERT_EQ(0U, upload_data_->GetContentLengthSync()); |
+} |
+ |
+TEST_F(UploadDataTest, GetContentLength_Mixed) { |
+ upload_data_->AppendBytes("123", 3); |
+ upload_data_->AppendBytes("abc", 3); |
+ |
+ const uint64 content_length = upload_data_->GetContentLengthSync(); |
+ ASSERT_EQ(6U, content_length); |
+ |
+ // Append a file. |
+ const std::string kData = "hello"; |
+ FilePath temp_file_path; |
+ ASSERT_TRUE(CreateTemporaryFile(kData, &temp_file_path)); |
+ upload_data_->AppendFileRange(temp_file_path, 0, kuint64max, base::Time()); |
+ |
+ TestContentLengthCallback callback; |
+ upload_data_->GetContentLength(callback.callback()); |
+ ASSERT_EQ(content_length + kData.size(), callback.WaitForResult()); |
} |
} // namespace net |