// Copyright (c) 2011 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_impl.h"

#include <memory>

#include "image-burner/image_burner_test_utils.h"

namespace imageburn {

using ::testing::_;
using ::testing::AnyNumber;
using ::testing::AtMost;
using ::testing::DoAll;
using ::testing::Return;
using ::testing::SetArgPointee;
using ::testing::StrEq;

const int kTestDataBlockSize = 8;
const char kDataBlockLength8[] = {'1', '2', '3', '4', '5', '6', '7', 0};
const char kDataBlockLength3[] = {'a', 'b', 0};
const char kDataBlockLength1[] = {0};
const char kResolvedSourcePath[] = "/media/removable/usb/a.img";

ACTION_P(SetArgCharString, value) {
  strncpy(arg0, value, arg1);
}

class ImageBurnerImplTest : public ::testing::Test {
 public:
  virtual void SetUp() {
    burner_.reset(new BurnerImpl(&writer_,
                                 &reader_,
                                 &signal_sender_,
                                 &path_getter_));
    EXPECT_CALL(signal_sender_, SendProgressSignal(_, _, _))
        .Times(0);
    EXPECT_CALL(writer_, Open(_))
        .Times(0);
    EXPECT_CALL(writer_, Close())
        .Times(0);
    EXPECT_CALL(writer_, Write(_, _))
        .Times(0);
    EXPECT_CALL(reader_, Open(_))
        .Times(0);
    EXPECT_CALL(reader_, Close())
        .Times(0);
    EXPECT_CALL(reader_, Read(_, _))
        .Times(0);
    EXPECT_CALL(reader_, GetSize())
        .Times(0);
    EXPECT_CALL(path_getter_, GetRealPath(_, _))
        .Times(AtMost(1))
        .WillRepeatedly(DoAll(SetArgPointee<1>(kResolvedSourcePath),
                              Return(true)));
    EXPECT_CALL(path_getter_, GetRootPath(_))
        .Times(AtMost(1))
        .WillRepeatedly(DoAll(SetArgPointee<0>("/dev/sda"),
                              Return(true)));
    burner_->SetDataBlockSize(kTestDataBlockSize);
  }

  virtual void TearDown() {
  }

  virtual void SetFinishedSignalExpectation(const char* path, bool success) {
    EXPECT_CALL(signal_sender_,
                SendFinishedSignal(StrEq(path),
                                   success,
                                   StrEq(success ? "" : "Error during burn")))
        .Times(1);
  }

  virtual void SetUpEmptyFileMocks() {
    // These return values for empty file.
    EXPECT_CALL(reader_, Read(_, _))
        .Times(AtMost(1))
        .WillRepeatedly(Return(0));
    EXPECT_CALL(reader_, GetSize())
        .Times(AtMost(1))
        .WillRepeatedly(Return(0));
    EXPECT_CALL(writer_, Write(_, _))
        .Times(0);
  }

  virtual void SetUpDefaultOpenAndCloseMocks() {
    EXPECT_CALL(reader_, Open(StrEq(kResolvedSourcePath)))
       .WillOnce(Return(true));
    EXPECT_CALL(writer_, Close())
        .WillOnce(Return(true));
    EXPECT_CALL(reader_, Close())
        .WillOnce(Return(true));
    EXPECT_CALL(writer_, Open("/dev/sdb"))
        .WillOnce(Return(true));
  }

  virtual void SetUpOpenAndCloseMocksForSDCard() {
    EXPECT_CALL(reader_, Open(StrEq(kResolvedSourcePath)))
       .WillOnce(Return(true));
    EXPECT_CALL(writer_, Close())
        .WillOnce(Return(true));
    EXPECT_CALL(reader_, Close())
        .WillOnce(Return(true));
    EXPECT_CALL(writer_, Open("/dev/mmcblk0"))
        .WillOnce(Return(true));
  }

 protected:
  std::unique_ptr<BurnerImpl> burner_;
  MockFileSystemWriter writer_;
  MockFileSystemReader reader_;
  MockSignalSender signal_sender_;
  MockPathGetter path_getter_;
};

TEST_F(ImageBurnerImplTest, BlankTargetPath) {
  SetFinishedSignalExpectation("", false);
  EXPECT_EQ(burner_->BurnImage("some_path", ""),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, NullTargetPath) {
  EXPECT_CALL(signal_sender_,
              SendFinishedSignal(NULL, false, StrEq("Error during burn")))
      .Times(1);
  EXPECT_EQ(burner_->BurnImage("some_path", NULL),
           imageburn::IMAGEBURN_ERROR_NULL_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, NullSourcePath) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  EXPECT_EQ(burner_->BurnImage(NULL, "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_NULL_SOURCE_PATH);
}

TEST_F(ImageBurnerImplTest, TargetIllegalFilePath) {
  SetFinishedSignalExpectation("/usr/local/chromeos_image.bin.zip", false);
  EXPECT_EQ(burner_->BurnImage("some_path",
                               "/usr/local/chromeos_image.bin.zip"),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, TargetNotAParent1) {
  SetFinishedSignalExpectation("/dev/sdb/sdb1", false);
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb/sdb1"),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, TargetNotAParent2) {
  SetFinishedSignalExpectation("/dev/sdb1", false);
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb1"),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, TargetNotAParent3) {
  SetFinishedSignalExpectation("/dev/mmcblk0p1", false);
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/mmcblk0p1"),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, InvalidTargetPathWithValidSufix) {
  SetFinishedSignalExpectation("/foo/bar/dev/sdb", false);
  EXPECT_EQ(burner_->BurnImage("some_path", "/foo/bar/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, InvalidTargetPathWithValidSufixMMC) {
  SetFinishedSignalExpectation("/foo/bar/dev/mmcblk1", false);
  EXPECT_EQ(burner_->BurnImage("some_path", "/foo/bar/dev/mmcblk1"),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, TargetEqualsPrefix1) {
  SetFinishedSignalExpectation("/dev/sd", false);
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sd"),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, TargetEqualsPrefix2) {
  SetFinishedSignalExpectation("/dev/mmcblk", false);
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/mmcblk"),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, TargetPathEqualsRootPath) {
  SetFinishedSignalExpectation("/dev/sda", false);
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sda"),
            imageburn::IMAGEBURN_ERROR_TARGET_PATH_ON_ROOT);
}

TEST_F(ImageBurnerImplTest, TargetPathPrefixesRootPath) {
  SetFinishedSignalExpectation("/./dev/sda", false);
  EXPECT_EQ(burner_->BurnImage("some_path", "/./dev/sda"),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, TargetPathIsOnTheRootPath) {
  SetFinishedSignalExpectation("/dev/sda/sda3", false);
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sda/sda3"),
            imageburn::IMAGEBURN_ERROR_INVALID_TARGET_PATH);
}

TEST_F(ImageBurnerImplTest, TargetPathEqualsRootPathOtherThanSda) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  EXPECT_CALL(path_getter_, GetRootPath(_))
      .WillOnce(DoAll(SetArgPointee<0>("/dev/sdb"),
                      Return(true)));
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_TARGET_PATH_ON_ROOT);
}

TEST_F(ImageBurnerImplTest, RootPathCannotBeFound) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  EXPECT_CALL(path_getter_, GetRootPath(_))
      .WillOnce(Return(false));
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_TARGET_PATH_ON_ROOT);
}

TEST_F(ImageBurnerImplTest, SourceRealPathCannotBeDetermined) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  EXPECT_CALL(path_getter_, GetRealPath(_, _)).WillOnce(Return(false));
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_SOURCE_REAL_PATH_NOT_DETERMINED);
}

TEST_F(ImageBurnerImplTest, SourcePathIsNotAllowed) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  EXPECT_CALL(path_getter_, GetRealPath("some_path", _))
      .WillOnce(DoAll(SetArgPointee<1>("/media/foo/a.img"), Return(true)));
  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_SOURCE_PATH_NOT_ALLOWED);
}

TEST_F(ImageBurnerImplTest, SourceFileCannotBeOpened) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpEmptyFileMocks();

  EXPECT_CALL(writer_, Close())
      .WillOnce(Return(true));
  EXPECT_CALL(reader_, Close())
      .WillOnce(Return(true));
  EXPECT_CALL(reader_, Open(StrEq(kResolvedSourcePath)))
      .WillOnce(Return(false));
  // We should not try to open target file if we don't open source file.
  EXPECT_CALL(writer_, Open("/dev/sdb"))
      .Times(0);

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_CANNOT_OPEN_SOURCE);
}

TEST_F(ImageBurnerImplTest, TargetFileCannotBeOpened) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpEmptyFileMocks();

  EXPECT_CALL(reader_, Open(StrEq(kResolvedSourcePath)))
     .WillOnce(Return(true));
  EXPECT_CALL(writer_, Close())
      .WillOnce(Return(true));
  EXPECT_CALL(reader_, Close())
      .WillOnce(Return(true));
  EXPECT_CALL(writer_, Open("/dev/sdb"))
      .WillOnce(Return(false));

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_CANNOT_OPEN_TARGET);
}

TEST_F(ImageBurnerImplTest, TargetFileCannotBeClosed) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpEmptyFileMocks();

  EXPECT_CALL(reader_, Open(StrEq(kResolvedSourcePath)))
     .WillOnce(Return(true));
  EXPECT_CALL(writer_, Open("/dev/sdb"))
      .WillOnce(Return(true));
  EXPECT_CALL(writer_, Close())
      .WillOnce(Return(false));
  EXPECT_CALL(reader_, Close())
      .WillOnce(Return(true));

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_CANNOT_CLOSE_TARGET);
}

TEST_F(ImageBurnerImplTest, SourceFileCannotBeClosed) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpEmptyFileMocks();

  EXPECT_CALL(reader_, Open(StrEq(kResolvedSourcePath)))
     .WillOnce(Return(true));
  EXPECT_CALL(writer_, Open("/dev/sdb"))
      .WillOnce(Return(true));
  EXPECT_CALL(writer_, Close())
      .WillOnce(Return(true));
  EXPECT_CALL(reader_, Close())
    .WillOnce(Return(false));

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_CANNOT_CLOSE_SOURCE);
}

TEST_F(ImageBurnerImplTest, TargetAndSourceFilesCannotBeClosed) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpEmptyFileMocks();

  EXPECT_CALL(reader_, Open(StrEq(kResolvedSourcePath)))
     .WillOnce(Return(true));
  EXPECT_CALL(writer_, Open("/dev/sdb"))
      .WillOnce(Return(true));
  EXPECT_CALL(writer_, Close())
    .WillOnce(Return(false));
  EXPECT_CALL(reader_, Close())
    .WillOnce(Return(false));

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_CANNOT_CLOSE_TARGET);
}

TEST_F(ImageBurnerImplTest, CloseTargetErrorDoesNotOverwritePreviousErrors) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpEmptyFileMocks();

  EXPECT_CALL(reader_, Open(StrEq(kResolvedSourcePath)))
     .WillOnce(Return(true));
  EXPECT_CALL(reader_, Close())
      .WillOnce(Return(true));
  // Let's set up an error.
  EXPECT_CALL(writer_, Open("/dev/sdb"))
      .WillOnce(Return(false));
  EXPECT_CALL(writer_, Close())
      .WillOnce(Return(false));

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_CANNOT_OPEN_TARGET);
}

TEST_F(ImageBurnerImplTest, CloseSourceErrorDoesNotOverwritePreviousErrors) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpEmptyFileMocks();

  EXPECT_CALL(reader_, Open(StrEq(kResolvedSourcePath)))
     .WillOnce(Return(true));
  EXPECT_CALL(writer_, Close())
      .WillOnce(Return(true));
  // Let's set up an error.
  EXPECT_CALL(writer_, Open("/dev/sdb"))
      .WillOnce(Return(false));
  EXPECT_CALL(reader_, Close())
      .WillOnce(Return(false));

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_CANNOT_OPEN_TARGET);
}

TEST_F(ImageBurnerImplTest, ErrorReadingFirstRead) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpDefaultOpenAndCloseMocks();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(21));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(Return(-1));
  EXPECT_CALL(writer_, Write(_, _))
      .Times(0);

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_FAILED_READING_SOURCE);
}

TEST_F(ImageBurnerImplTest, ErrorReadingFourthRead) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpDefaultOpenAndCloseMocks();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(53));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(Return(-1));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .Times(3)
      .WillRepeatedly(DoAll(SetArgCharString(kDataBlockLength8),
                            Return(kTestDataBlockSize)))
      .RetiresOnSaturation();
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength8), kTestDataBlockSize))
      .Times(3)
      .WillRepeatedly(Return(kTestDataBlockSize));
  EXPECT_CALL(signal_sender_, SendProgressSignal(24, 53, "/dev/sdb"))
      .Times(1)
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(16, 53, "/dev/sdb"))
      .Times(1)
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(8, 53, "/dev/sdb"))
      .Times(1)
      .RetiresOnSaturation();

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_FAILED_READING_SOURCE);
}

TEST_F(ImageBurnerImplTest, ErrorWriting) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpDefaultOpenAndCloseMocks();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(53));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(DoAll(SetArgCharString(kDataBlockLength8),
                      Return(kTestDataBlockSize)));
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength8), kTestDataBlockSize))
      .WillOnce(Return(-1));

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_FAILED_WRITING_TO_TARGET);
}

TEST_F(ImageBurnerImplTest, ErrorWritingWrongReturn) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpDefaultOpenAndCloseMocks();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(53));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .Times(2)
      .WillRepeatedly(DoAll(SetArgCharString(kDataBlockLength8),
                            Return(kTestDataBlockSize)));
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength8), kTestDataBlockSize))
      .WillOnce(Return(8))
      .WillOnce(Return(7));
  EXPECT_CALL(signal_sender_, SendProgressSignal(8, 53, "/dev/sdb"))
      .Times(1);

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_FAILED_WRITING_TO_TARGET);
}

TEST_F(ImageBurnerImplTest, ErrorWritingLastBlockFileSize2x8) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpDefaultOpenAndCloseMocks();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(16));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .Times(2)
      .WillRepeatedly(DoAll(SetArgCharString(kDataBlockLength8),
                            Return(kTestDataBlockSize)));
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength8), kTestDataBlockSize))
      .WillOnce(Return(8))
      .WillOnce(Return(-1));
  EXPECT_CALL(signal_sender_, SendProgressSignal(8, 16, "/dev/sdb"))
      .Times(1);

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_FAILED_WRITING_TO_TARGET);
}

TEST_F(ImageBurnerImplTest, ErrorWritingLastBlock) {
  SetFinishedSignalExpectation("/dev/sdb", false);
  SetUpDefaultOpenAndCloseMocks();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(13));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(DoAll(SetArgCharString(kDataBlockLength8),
                            Return(kTestDataBlockSize)))
      .WillOnce(DoAll(SetArgCharString(kDataBlockLength3),
                            Return(3)));
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength3), 3))
      .WillOnce(Return(-1));
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength8), kTestDataBlockSize))
      .WillOnce(Return(8))
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(8, 13, "/dev/sdb"))
      .Times(1);

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_ERROR_FAILED_WRITING_TO_TARGET);
}


TEST_F(ImageBurnerImplTest, EmptyFile) {
  SetFinishedSignalExpectation("/dev/sdb", true);
  SetUpDefaultOpenAndCloseMocks();
  SetUpEmptyFileMocks();

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_OK);
}

TEST_F(ImageBurnerImplTest, FileSizeLessThanDataBlockSize) {
  SetFinishedSignalExpectation("/dev/sdb", true);
  SetUpDefaultOpenAndCloseMocks();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(3));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(Return(0));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(DoAll(SetArgCharString(kDataBlockLength3),
                      Return(3)))
      .RetiresOnSaturation();
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength3), 3))
      .WillOnce(Return(3))
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(3, 3, "/dev/sdb"))
      .Times(1);

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_OK);
}

TEST_F(ImageBurnerImplTest, FileSizeEqualsDataBlockSize) {
  SetFinishedSignalExpectation("/dev/sdb", true);
  SetUpDefaultOpenAndCloseMocks();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(8));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(Return(0));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(DoAll(SetArgCharString(kDataBlockLength8),
                      Return(kTestDataBlockSize)))
      .RetiresOnSaturation();
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength8), kTestDataBlockSize))
      .WillOnce(Return(kTestDataBlockSize))
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(8, 8, "/dev/sdb"))
      .Times(1);

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_OK);
}

TEST_F(ImageBurnerImplTest, FileSizeMultipleOfDataBlockSize) {
  SetFinishedSignalExpectation("/dev/sdb", true);
  SetUpDefaultOpenAndCloseMocks();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(24));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(Return(0));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .Times(3)
      .WillRepeatedly(DoAll(SetArgCharString(kDataBlockLength8),
                            Return(kTestDataBlockSize)))
      .RetiresOnSaturation();
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength8), kTestDataBlockSize))
      .Times(3)
      .WillRepeatedly(Return(kTestDataBlockSize));
  EXPECT_CALL(signal_sender_, SendProgressSignal(24, 24, "/dev/sdb"))
      .Times(1)
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(16, 24, "/dev/sdb"))
      .Times(1)
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(8, 24, "/dev/sdb"))
      .Times(1)
      .RetiresOnSaturation();

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_OK);
}

TEST_F(ImageBurnerImplTest, FileSizeNotDivisibleByDAtaBlockSize) {
  SetFinishedSignalExpectation("/dev/sdb", true);
  SetUpDefaultOpenAndCloseMocks();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(17));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(Return(0));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(DoAll(SetArgCharString(kDataBlockLength1),
                      Return(1)))
      .RetiresOnSaturation();;
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .Times(2)
      .WillRepeatedly(DoAll(SetArgCharString(kDataBlockLength8),
                            Return(kTestDataBlockSize)))
      .RetiresOnSaturation();
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength1), 1))
      .WillOnce(Return(1));
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength8), kTestDataBlockSize))
      .Times(2)
      .WillRepeatedly(Return(kTestDataBlockSize))
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(17, 17, "/dev/sdb"))
      .Times(1)
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(16, 17, "/dev/sdb"))
      .Times(1)
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(8, 17, "/dev/sdb"))
      .Times(1)
      .RetiresOnSaturation();

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/sdb"),
            imageburn::IMAGEBURN_OK);
}

TEST_F(ImageBurnerImplTest, FileSizeNotDivisibleByDAtaBlockSizeSDCard) {
  SetFinishedSignalExpectation("/dev/mmcblk0", true);
  SetUpOpenAndCloseMocksForSDCard();

  EXPECT_CALL(reader_, GetSize())
      .WillOnce(Return(17));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(Return(0));
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .WillOnce(DoAll(SetArgCharString(kDataBlockLength1),
                      Return(1)))
      .RetiresOnSaturation();;
  EXPECT_CALL(reader_, Read(_, kTestDataBlockSize))
      .Times(2)
      .WillRepeatedly(DoAll(SetArgCharString(kDataBlockLength8),
                            Return(kTestDataBlockSize)))
      .RetiresOnSaturation();
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength1), 1))
      .WillOnce(Return(1));
  EXPECT_CALL(writer_, Write(StrEq(kDataBlockLength8), kTestDataBlockSize))
      .Times(2)
      .WillRepeatedly(Return(kTestDataBlockSize))
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(17, 17, "/dev/mmcblk0"))
      .Times(1)
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(16, 17, "/dev/mmcblk0"))
      .Times(1)
      .RetiresOnSaturation();
  EXPECT_CALL(signal_sender_, SendProgressSignal(8, 17, "/dev/mmcblk0"))
      .Times(1)
      .RetiresOnSaturation();

  EXPECT_EQ(burner_->BurnImage("some_path", "/dev/mmcblk0"),
            imageburn::IMAGEBURN_OK);
}

TEST_F(ImageBurnerImplTest, IsSourcePathAllowed) {
  static const char* const kPathsNotAllowed[] = {
      "",
      "/",
      "/dev/sda1",
      "/home/chronos/Downloads/file",
      "/home/chronos/GCache/file",
      "/home/chronos/foo/Downloads/file",
      "/home/chronos/foo/GCache/file",
      "/home/chronos/u-/Downloads/file",
      "/home/chronos/u-0123456789abcdef0123456789abcdef0123456/Downloads/file",
      "/home/chronos/u-0123456789abcdef0123456789abcdef01234567/Downloads",
      "/home/chronos/u-0123456789abcdef0123456789abcdef01234567/Downloads/",
      "/home/chronos/u-0123456789abcdef0123456789abcdef01234567/GCache",
      "/home/chronos/u-0123456789abcdef0123456789abcdef01234567/GCache/",
      "/home/chronos/u-0123456789abcdef0123456789abcdef01234567/file",
      "/home/chronos/u-xyz3456789abcdef0123456789abcdef01234567/Downloads/file",
      "/home/chronos/user/Downloads",
      "/home/chronos/user/Downloads/",
      "/home/chronos/user/GCache",
      "/home/chronos/user/GCache/",
      "/home/chronos/user/file",
      "/media/archive",
      "/media/archive/",
      "/media/archive/test 1.zip",
      "/media/archive/test.zip",
      "/media/archive/test.zip/",
      "/media/removable",
      "/media/removable/",
      "/media/removable/disk 1",
      "/media/removable/disk1",
      "/media/removable/disk1/",
      "/tmp",
      "/tmp/chronos/user/Downloads/file",
  };

  for (const char* path : kPathsNotAllowed) {
    EXPECT_FALSE(burner_->IsSourcePathAllowed(path));
  }

  static const char* const kPathsAllowed[] = {
      "/media/removable/disk1/file",
      "/media/removable/disk1/file",
      "/media/removable/disk1/dir1/file",
      "/media/removable/test.zip/file",
      "/home/chronos/u-0123456789abcdef0123456789abcdef01234567/Downloads/file",
      "/home/chronos/u-0123456789abcdef0123456789abcdef01234567/GCache/file",
      "/home/chronos/user/Downloads/file",
      "/home/chronos/user/GCache/file",
  };

  for (const char* path : kPathsAllowed) {
    EXPECT_TRUE(burner_->IsSourcePathAllowed(path));
  }
}

}  // namespace imageburn
