// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/base/upload_data_stream.h"
#include <vector>
#include "base/basictypes.h"
#include "base/file_path.h"
#include "base/file_util.h"
#include "base/memory/scoped_ptr.h"
#include "base/time.h"
#include "net/base/net_errors.h"
#include "net/base/upload_data.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
namespace net {
namespace {
const char kTestData[] = "0123456789";
const int kTestDataSize = arraysize(kTestData) - 1;
} // namespace
class UploadDataStreamTest : public PlatformTest {
public:
UploadDataStreamTest() : upload_data_(new UploadData) { }
void FileChangedHelper(const FilePath& file_path,
const base::Time& time,
bool error_expected);
scoped_refptr<UploadData> upload_data_;
};
TEST_F(UploadDataStreamTest, EmptyUploadData) {
upload_data_->AppendBytes("", 0);
scoped_ptr<UploadDataStream> stream(
UploadDataStream::Create(upload_data_, NULL));
ASSERT_TRUE(stream.get());
EXPECT_TRUE(stream->eof());
}
TEST_F(UploadDataStreamTest, ConsumeAll) {
upload_data_->AppendBytes(kTestData, kTestDataSize);
scoped_ptr<UploadDataStream> stream(
UploadDataStream::Create(upload_data_, NULL));
ASSERT_TRUE(stream.get());
while (!stream->eof()) {
stream->MarkConsumedAndFillBuffer(stream->buf_len());
}
}
TEST_F(UploadDataStreamTest, FileSmallerThanLength) {
FilePath temp_file_path;
ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path));
ASSERT_EQ(kTestDataSize, file_util::WriteFile(temp_file_path,
kTestData, kTestDataSize));
const uint64 kFakeSize = kTestDataSize*2;
std::vector<UploadData::Element> elements;
UploadData::Element element;
element.SetToFilePath(temp_file_path);
element.SetContentLength(kFakeSize);
elements.push_back(element);
upload_data_->SetElements(elements);
EXPECT_EQ(kFakeSize, upload_data_->GetContentLength());
scoped_ptr<UploadDataStream> stream(
UploadDataStream::Create(upload_data_, NULL));
ASSERT_TRUE(stream.get());
EXPECT_FALSE(stream->eof());
uint64 read_counter = 0;
while (!stream->eof()) {
read_counter += stream->buf_len();
stream->MarkConsumedAndFillBuffer(stream->buf_len());
}
// UpdateDataStream will pad out the file with 0 bytes so that the HTTP
// transaction doesn't hang. Therefore we expected the full size.
EXPECT_EQ(read_counter, stream->size());
file_util::Delete(temp_file_path, false);
}
void UploadDataStreamTest::FileChangedHelper(const FilePath& file_path,
const base::Time& time,
bool error_expected) {
std::vector<UploadData::Element> elements;
UploadData::Element element;
element.SetToFilePathRange(file_path, 1, 2, time);
elements.push_back(element);
upload_data_->SetElements(elements);
int error_code;
scoped_ptr<UploadDataStream> stream(
UploadDataStream::Create(upload_data_, &error_code));
if (error_expected)
ASSERT_TRUE(!stream.get() && error_code == ERR_UPLOAD_FILE_CHANGED);
else
ASSERT_TRUE(stream.get() && error_code == OK);
}
TEST_F(UploadDataStreamTest, FileChanged) {
FilePath temp_file_path;
ASSERT_TRUE(file_util::CreateTemporaryFile(&temp_file_path));
ASSERT_EQ(kTestDataSize, file_util::WriteFile(temp_file_path,
kTestData, kTestDataSize));
base::PlatformFileInfo file_info;
ASSERT_TRUE(file_util::GetFileInfo(temp_file_path, &file_info));
// Test file not changed.
FileChangedHelper(temp_file_path, file_info.last_modified, false);
// Test file changed.
FileChangedHelper(temp_file_path,
file_info.last_modified - base::TimeDelta::FromSeconds(1),
true);
file_util::Delete(temp_file_path, false);
}
} // namespace net