blob: 9c98125f82e9a8dcadda3bd16c4d03511eb2e51a [file] [log] [blame]
// Copyright 2016 The Chromium OS 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 "image-burner/image_burner_utils.h"
#include <string>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>
namespace imageburn {
namespace {
const int kTestDataBufferSize = 100;
} // namespace
class BurnReaderTest : public ::testing::Test {
public:
BurnReaderTest() {}
~BurnReaderTest() override = default;
void SetUp() override {
ASSERT_TRUE(test_dir_.CreateUniqueTempDir());
ASSERT_TRUE(base::CreateTemporaryFileInDir(
test_dir_.path(), &test_file_path_));
}
protected:
bool SetTestFileContent(const std::string& content) {
const int written =
base::WriteFile(test_file_path_, content.data(), content.size());
return written >= 0 && static_cast<size_t>(written) == content.size();
}
BurnReader file_reader_;
base::ScopedTempDir test_dir_;
base::FilePath test_file_path_;
private:
DISALLOW_COPY_AND_ASSIGN(BurnReaderTest);
};
class BurnWriterTest : public ::testing::Test {
public:
BurnWriterTest() {}
~BurnWriterTest() override = default;
void SetUp() override {
ASSERT_TRUE(test_dir_.CreateUniqueTempDir());
ASSERT_TRUE(base::CreateTemporaryFileInDir(
test_dir_.path(), &test_file_path_));
}
protected:
BurnWriter file_writer_;
base::ScopedTempDir test_dir_;
base::FilePath test_file_path_;
private:
DISALLOW_COPY_AND_ASSIGN(BurnWriterTest);
};
TEST_F(BurnReaderTest, ReadFile) {
const std::string kTestFileContent = "test file content";
ASSERT_TRUE(SetTestFileContent(kTestFileContent));
ASSERT_TRUE(file_reader_.Open(test_file_path_.value().c_str()));
EXPECT_EQ(kTestFileContent.size(), file_reader_.GetSize());
ASSERT_LE(kTestFileContent.size(), kTestDataBufferSize);
char kDataBuffer[kTestDataBufferSize] = {};
const size_t kFirstReadSize = kTestFileContent.size() / 2;
ASSERT_EQ(kFirstReadSize, file_reader_.Read(kDataBuffer, kFirstReadSize));
EXPECT_EQ(kTestFileContent.substr(0, kFirstReadSize),
std::string(kDataBuffer, kFirstReadSize));
const size_t kExpectedSecondReadSize =
kTestFileContent.size() - kFirstReadSize;
ASSERT_EQ(kExpectedSecondReadSize,
file_reader_.Read(kDataBuffer, kTestFileContent.size()));
EXPECT_EQ(kTestFileContent.substr(kFirstReadSize),
std::string(kDataBuffer, kExpectedSecondReadSize));
EXPECT_EQ(0, file_reader_.Read(kDataBuffer, kTestFileContent.size()));
EXPECT_TRUE(file_reader_.Close());
}
TEST_F(BurnReaderTest, ReopeningFile) {
ASSERT_TRUE(file_reader_.Open(test_file_path_.value().c_str()));
EXPECT_FALSE(file_reader_.Open(test_file_path_.value().c_str()));
ASSERT_TRUE(file_reader_.Close());
}
TEST_F(BurnReaderTest, ReusingClosedReader) {
const std::string kTestFileContent = "test file content";
ASSERT_TRUE(SetTestFileContent(kTestFileContent));
ASSERT_TRUE(file_reader_.Open(test_file_path_.value().c_str()));
ASSERT_LE(kTestFileContent.size(), kTestDataBufferSize);
char kDataBuffer[kTestDataBufferSize] = {};
const size_t kFirstReadSize = kTestFileContent.size() / 2;
ASSERT_EQ(kFirstReadSize, file_reader_.Read(kDataBuffer, kFirstReadSize));
EXPECT_EQ(kTestFileContent.substr(0, kFirstReadSize),
std::string(kDataBuffer, kFirstReadSize));
ASSERT_TRUE(file_reader_.Close());
ASSERT_TRUE(file_reader_.Open(test_file_path_.value().c_str()));
ASSERT_EQ(kTestFileContent.size(),
file_reader_.Read(kDataBuffer, kTestDataBufferSize));
EXPECT_EQ(kTestFileContent,
std::string(kDataBuffer, kTestFileContent.size()));
ASSERT_TRUE(file_reader_.Close());
}
TEST_F(BurnReaderTest, HandlingEmptyFile) {
ASSERT_TRUE(file_reader_.Open(test_file_path_.value().c_str()));
EXPECT_EQ(0, file_reader_.GetSize());
char kDataBuffer[kTestDataBufferSize] = {};
EXPECT_EQ(0, file_reader_.Read(kDataBuffer, kTestDataBufferSize));
ASSERT_TRUE(file_reader_.Close());
}
TEST_F(BurnReaderTest, HandlingNonExistingFile) {
base::FilePath non_existent_file = test_dir_.path().Append("non-existent");
ASSERT_FALSE(base::PathExists(non_existent_file));
EXPECT_FALSE(file_reader_.Open(non_existent_file.value().c_str()));
EXPECT_EQ(-1, file_reader_.GetSize());
EXPECT_FALSE(file_reader_.Close());
}
TEST_F(BurnWriterTest, WriteFile) {
const std::string kTestFileContent = "test file content";
ASSERT_TRUE(file_writer_.Open(test_file_path_.value().c_str()));
const size_t kFirstWriteSize = kTestFileContent.size() / 2;
ASSERT_EQ(kFirstWriteSize,
file_writer_.Write(kTestFileContent.data(), kFirstWriteSize));
std::string file_content;
ASSERT_TRUE(base::ReadFileToString(test_file_path_, &file_content));
EXPECT_EQ(kTestFileContent.substr(0, kFirstWriteSize), file_content);
const size_t kSecondWriteSize = kTestFileContent.size() - kFirstWriteSize;
ASSERT_EQ(kSecondWriteSize,
file_writer_.Write(kTestFileContent.data() + kFirstWriteSize,
kSecondWriteSize));
ASSERT_TRUE(base::ReadFileToString(test_file_path_, &file_content));
EXPECT_EQ(kTestFileContent, file_content);
EXPECT_TRUE(file_writer_.Close());
}
TEST_F(BurnWriterTest, ReopeningFile) {
ASSERT_TRUE(file_writer_.Open(test_file_path_.value().c_str()));
EXPECT_FALSE(file_writer_.Open(test_file_path_.value().c_str()));
ASSERT_TRUE(file_writer_.Close());
}
TEST_F(BurnWriterTest, ReusingClosedReader) {
const std::string kTestFileContent = "test file content";
ASSERT_TRUE(file_writer_.Open(test_file_path_.value().c_str()));
const size_t kFirstWriteSize = kTestFileContent.size() / 2;
ASSERT_EQ(kFirstWriteSize,
file_writer_.Write(kTestFileContent.data(), kFirstWriteSize));
std::string file_content;
ASSERT_TRUE(base::ReadFileToString(test_file_path_, &file_content));
EXPECT_EQ(kTestFileContent.substr(0, kFirstWriteSize), file_content);
ASSERT_TRUE(file_writer_.Close());
ASSERT_TRUE(file_writer_.Open(test_file_path_.value().c_str()));
ASSERT_EQ(kTestFileContent.size(),
file_writer_.Write(kTestFileContent.data(),
kTestFileContent.size()));
ASSERT_TRUE(base::ReadFileToString(test_file_path_, &file_content));
EXPECT_EQ(kTestFileContent, file_content);
ASSERT_TRUE(file_writer_.Close());
}
TEST_F(BurnWriterTest, HandlingNonExistingFile) {
base::FilePath non_existent_file = test_dir_.path().Append("non-existent");
ASSERT_FALSE(base::PathExists(non_existent_file));
EXPECT_FALSE(file_writer_.Open(non_existent_file.value().c_str()));
EXPECT_FALSE(file_writer_.Close());
}
} // namespace imageburn