1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <string>
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/run_loop.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/utility/image_writer/error_messages.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/utility/image_writer/image_writer.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/utility/image_writer/image_writer_handler.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace image_writer {
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using testing::_;
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using testing::AnyNumber;
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using testing::AtLeast;
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using testing::Lt;
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int64 kTestFileSize = 1 << 15;  // 32 kB
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kTestPattern = 0x55555555;
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ImageWriterUtilityTest : public testing::Test {
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &image_path_));
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        base::CreateTemporaryFileInDir(temp_dir_.path(), &device_path_));
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void TearDown() OVERRIDE {}
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void FillFile(const base::FilePath& path, int pattern) {
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    scoped_ptr<char[]> buffer(new char[kTestFileSize]);
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    memset(buffer.get(), pattern, kTestFileSize);
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(base::WriteFile(path, buffer.get(), kTestFileSize));
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void FillDefault(const base::FilePath& path) { FillFile(path, kTestPattern); }
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::FilePath image_path_;
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::FilePath device_path_;
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::MessageLoop message_loop_;
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::ScopedTempDir temp_dir_;
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class MockHandler : public ImageWriterHandler {
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MOCK_METHOD1(SendProgress, void(int64));
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MOCK_METHOD1(SendFailed, void(const std::string& message));
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MOCK_METHOD0(SendSucceeded, void());
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MOCK_METHOD1(OnMessageReceived, bool(const IPC::Message& message));
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// This Mock has the additional feature that it will start verification when
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// the write completes.
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class VerifyingHandler : public MockHandler {
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyingHandler() : image_writer_(NULL), verified_(false) {}
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SendSucceeded() OVERRIDE {
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    MockHandler::SendSucceeded();
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (!verified_) {
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      image_writer_->Verify();
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      verified_ = true;
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter* image_writer_;
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool verified_;
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(ImageWriterUtilityTest, Getters) {
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MockHandler mock_handler;
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter image_writer(&mock_handler, image_path_, device_path_);
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(image_path_, image_writer.GetImagePath());
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(device_path_, image_writer.GetDevicePath());
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(ImageWriterUtilityTest, WriteSuccessful) {
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockHandler mock_handler;
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter image_writer(&mock_handler, image_path_, device_path_);
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(_)).Times(AnyNumber());
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(kTestFileSize)).Times(1);
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(0)).Times(1);
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendSucceeded()).Times(1);
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendFailed(_)).Times(0);
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FillDefault(image_path_);
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  image_writer.Write();
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(ImageWriterUtilityTest, WriteInvalidImageFile) {
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockHandler mock_handler;
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter image_writer(&mock_handler, image_path_, device_path_);
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(_)).Times(0);
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendFailed(error::kOpenImage)).Times(1);
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::DeleteFile(image_path_, false));
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  image_writer.Write();
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(ImageWriterUtilityTest, WriteInvalidDeviceFile) {
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockHandler mock_handler;
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter image_writer(&mock_handler, image_path_, device_path_);
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(_)).Times(0);
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendFailed(error::kOpenDevice)).Times(1);
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::DeleteFile(device_path_, false));
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  image_writer.Write();
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(ImageWriterUtilityTest, VerifySuccessful) {
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockHandler mock_handler;
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter image_writer(&mock_handler, image_path_, device_path_);
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(_)).Times(AnyNumber());
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(kTestFileSize)).Times(1);
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(0)).Times(1);
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendSucceeded()).Times(1);
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendFailed(_)).Times(0);
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FillDefault(image_path_);
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FillDefault(device_path_);
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  image_writer.Verify();
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(ImageWriterUtilityTest, VerifyInvalidImageFile) {
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockHandler mock_handler;
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter image_writer(&mock_handler, image_path_, device_path_);
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(_)).Times(0);
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendFailed(error::kOpenImage)).Times(1);
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::DeleteFile(image_path_, false));
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  image_writer.Verify();
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(ImageWriterUtilityTest, VerifyInvalidDeviceFile) {
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockHandler mock_handler;
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter image_writer(&mock_handler, image_path_, device_path_);
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(_)).Times(0);
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendFailed(error::kOpenDevice)).Times(1);
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::DeleteFile(device_path_, false));
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  image_writer.Verify();
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(ImageWriterUtilityTest, VerifyEmptyDevice) {
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockHandler mock_handler;
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter image_writer(&mock_handler, image_path_, device_path_);
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(_)).Times(AnyNumber());
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendFailed(error::kReadDevice)).Times(1);
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FillDefault(image_path_);
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  image_writer.Verify();
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(ImageWriterUtilityTest, VerifyFailed) {
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockHandler mock_handler;
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter image_writer(&mock_handler, image_path_, device_path_);
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(_)).Times(AnyNumber());
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendSucceeded()).Times(0);
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendFailed(error::kVerificationFailed)).Times(1);
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FillDefault(image_path_);
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FillFile(device_path_, ~kTestPattern);
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  image_writer.Verify();
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(ImageWriterUtilityTest, WriteWithVerifySuccessful) {
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyingHandler mock_handler;
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ImageWriter image_writer(&mock_handler, image_path_, device_path_);
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  mock_handler.image_writer_ = &image_writer;
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(_)).Times(AnyNumber());
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(kTestFileSize)).Times(2);
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(mock_handler, SendProgress(0)).Times(2);
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendSucceeded()).Times(2);
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(mock_handler, SendFailed(_)).Times(0);
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  FillDefault(image_path_);
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  image_writer.Write();
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace image_writer
231