Home | History | Annotate | Download | only in image_writer
      1 // Copyright 2014 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.
      4 
      5 #include <string>
      6 
      7 #include "base/files/file_util.h"
      8 #include "base/files/scoped_temp_dir.h"
      9 #include "base/run_loop.h"
     10 #include "chrome/utility/image_writer/error_messages.h"
     11 #include "chrome/utility/image_writer/image_writer.h"
     12 #include "chrome/utility/image_writer/image_writer_handler.h"
     13 #include "testing/gmock/include/gmock/gmock.h"
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 
     16 namespace image_writer {
     17 
     18 using testing::_;
     19 using testing::AnyNumber;
     20 using testing::AtLeast;
     21 using testing::Lt;
     22 
     23 namespace {
     24 
     25 const int64 kTestFileSize = 1 << 15;  // 32 kB
     26 const int kTestPattern = 0x55555555;
     27 
     28 class ImageWriterUtilityTest : public testing::Test {
     29  protected:
     30   virtual void SetUp() OVERRIDE {
     31     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     32     ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &image_path_));
     33     ASSERT_TRUE(
     34         base::CreateTemporaryFileInDir(temp_dir_.path(), &device_path_));
     35   }
     36 
     37   virtual void TearDown() OVERRIDE {}
     38 
     39   void FillFile(const base::FilePath& path, int pattern) {
     40     scoped_ptr<char[]> buffer(new char[kTestFileSize]);
     41     memset(buffer.get(), pattern, kTestFileSize);
     42 
     43     ASSERT_TRUE(base::WriteFile(path, buffer.get(), kTestFileSize));
     44   }
     45 
     46   void FillDefault(const base::FilePath& path) { FillFile(path, kTestPattern); }
     47 
     48   base::FilePath image_path_;
     49   base::FilePath device_path_;
     50 
     51  private:
     52   base::MessageLoop message_loop_;
     53   base::ScopedTempDir temp_dir_;
     54 };
     55 
     56 class MockHandler : public ImageWriterHandler {
     57  public:
     58   MOCK_METHOD1(SendProgress, void(int64));
     59   MOCK_METHOD1(SendFailed, void(const std::string& message));
     60   MOCK_METHOD0(SendSucceeded, void());
     61   MOCK_METHOD1(OnMessageReceived, bool(const IPC::Message& message));
     62 };
     63 
     64 // This Mock has the additional feature that it will start verification when
     65 // the write completes.
     66 class VerifyingHandler : public MockHandler {
     67  public:
     68   VerifyingHandler() : image_writer_(NULL), verified_(false) {}
     69 
     70   virtual void SendSucceeded() OVERRIDE {
     71     MockHandler::SendSucceeded();
     72     if (!verified_) {
     73       image_writer_->Verify();
     74       verified_ = true;
     75     }
     76   }
     77   ImageWriter* image_writer_;
     78 
     79  private:
     80   bool verified_;
     81 };
     82 
     83 }  // namespace
     84 
     85 TEST_F(ImageWriterUtilityTest, Getters) {
     86   MockHandler mock_handler;
     87   ImageWriter image_writer(&mock_handler, image_path_, device_path_);
     88 
     89   EXPECT_EQ(image_path_, image_writer.GetImagePath());
     90   EXPECT_EQ(device_path_, image_writer.GetDevicePath());
     91 }
     92 
     93 TEST_F(ImageWriterUtilityTest, WriteSuccessful) {
     94   MockHandler mock_handler;
     95   ImageWriter image_writer(&mock_handler, image_path_, device_path_);
     96 
     97   EXPECT_CALL(mock_handler, SendProgress(_)).Times(AnyNumber());
     98   EXPECT_CALL(mock_handler, SendProgress(kTestFileSize)).Times(1);
     99   EXPECT_CALL(mock_handler, SendProgress(0)).Times(1);
    100   EXPECT_CALL(mock_handler, SendSucceeded()).Times(1);
    101   EXPECT_CALL(mock_handler, SendFailed(_)).Times(0);
    102 
    103   FillDefault(image_path_);
    104   image_writer.Write();
    105   base::RunLoop().RunUntilIdle();
    106 }
    107 
    108 TEST_F(ImageWriterUtilityTest, WriteInvalidImageFile) {
    109   MockHandler mock_handler;
    110   ImageWriter image_writer(&mock_handler, image_path_, device_path_);
    111 
    112   EXPECT_CALL(mock_handler, SendProgress(_)).Times(0);
    113   EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
    114   EXPECT_CALL(mock_handler, SendFailed(error::kOpenImage)).Times(1);
    115 
    116   ASSERT_TRUE(base::DeleteFile(image_path_, false));
    117   image_writer.Write();
    118   base::RunLoop().RunUntilIdle();
    119 }
    120 
    121 TEST_F(ImageWriterUtilityTest, WriteInvalidDeviceFile) {
    122   MockHandler mock_handler;
    123   ImageWriter image_writer(&mock_handler, image_path_, device_path_);
    124 
    125   EXPECT_CALL(mock_handler, SendProgress(_)).Times(0);
    126   EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
    127   EXPECT_CALL(mock_handler, SendFailed(error::kOpenDevice)).Times(1);
    128 
    129   ASSERT_TRUE(base::DeleteFile(device_path_, false));
    130   image_writer.Write();
    131   base::RunLoop().RunUntilIdle();
    132 }
    133 
    134 TEST_F(ImageWriterUtilityTest, VerifySuccessful) {
    135   MockHandler mock_handler;
    136   ImageWriter image_writer(&mock_handler, image_path_, device_path_);
    137 
    138   EXPECT_CALL(mock_handler, SendProgress(_)).Times(AnyNumber());
    139   EXPECT_CALL(mock_handler, SendProgress(kTestFileSize)).Times(1);
    140   EXPECT_CALL(mock_handler, SendProgress(0)).Times(1);
    141   EXPECT_CALL(mock_handler, SendSucceeded()).Times(1);
    142   EXPECT_CALL(mock_handler, SendFailed(_)).Times(0);
    143 
    144   FillDefault(image_path_);
    145   FillDefault(device_path_);
    146 
    147   image_writer.Verify();
    148 
    149   base::RunLoop().RunUntilIdle();
    150 }
    151 
    152 TEST_F(ImageWriterUtilityTest, VerifyInvalidImageFile) {
    153   MockHandler mock_handler;
    154   ImageWriter image_writer(&mock_handler, image_path_, device_path_);
    155 
    156   EXPECT_CALL(mock_handler, SendProgress(_)).Times(0);
    157   EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
    158   EXPECT_CALL(mock_handler, SendFailed(error::kOpenImage)).Times(1);
    159 
    160   ASSERT_TRUE(base::DeleteFile(image_path_, false));
    161 
    162   image_writer.Verify();
    163 
    164   base::RunLoop().RunUntilIdle();
    165 }
    166 
    167 TEST_F(ImageWriterUtilityTest, VerifyInvalidDeviceFile) {
    168   MockHandler mock_handler;
    169   ImageWriter image_writer(&mock_handler, image_path_, device_path_);
    170 
    171   EXPECT_CALL(mock_handler, SendProgress(_)).Times(0);
    172   EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
    173   EXPECT_CALL(mock_handler, SendFailed(error::kOpenDevice)).Times(1);
    174 
    175   ASSERT_TRUE(base::DeleteFile(device_path_, false));
    176 
    177   image_writer.Verify();
    178 
    179   base::RunLoop().RunUntilIdle();
    180 }
    181 
    182 TEST_F(ImageWriterUtilityTest, VerifyEmptyDevice) {
    183   MockHandler mock_handler;
    184   ImageWriter image_writer(&mock_handler, image_path_, device_path_);
    185 
    186   EXPECT_CALL(mock_handler, SendProgress(_)).Times(AnyNumber());
    187   EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
    188   EXPECT_CALL(mock_handler, SendFailed(error::kReadDevice)).Times(1);
    189 
    190   FillDefault(image_path_);
    191   image_writer.Verify();
    192 
    193   base::RunLoop().RunUntilIdle();
    194 }
    195 
    196 TEST_F(ImageWriterUtilityTest, VerifyFailed) {
    197   MockHandler mock_handler;
    198   ImageWriter image_writer(&mock_handler, image_path_, device_path_);
    199 
    200   EXPECT_CALL(mock_handler, SendProgress(_)).Times(AnyNumber());
    201   EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
    202   EXPECT_CALL(mock_handler, SendFailed(error::kVerificationFailed)).Times(1);
    203 
    204   FillDefault(image_path_);
    205   FillFile(device_path_, ~kTestPattern);
    206   image_writer.Verify();
    207 
    208   base::RunLoop().RunUntilIdle();
    209 }
    210 
    211 TEST_F(ImageWriterUtilityTest, WriteWithVerifySuccessful) {
    212   VerifyingHandler mock_handler;
    213   ImageWriter image_writer(&mock_handler, image_path_, device_path_);
    214 
    215   mock_handler.image_writer_ = &image_writer;
    216 
    217   EXPECT_CALL(mock_handler, SendProgress(_)).Times(AnyNumber());
    218   EXPECT_CALL(mock_handler, SendProgress(kTestFileSize)).Times(2);
    219   EXPECT_CALL(mock_handler, SendProgress(0)).Times(2);
    220   EXPECT_CALL(mock_handler, SendSucceeded()).Times(2);
    221   EXPECT_CALL(mock_handler, SendFailed(_)).Times(0);
    222 
    223   FillDefault(image_path_);
    224 
    225   image_writer.Write();
    226 
    227   base::RunLoop().RunUntilIdle();
    228 }
    229 
    230 }  // namespace image_writer
    231