15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cdm/ppapi/cdm_file_io_test.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback_helpers.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media {
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define FILE_IO_DVLOG(level) DVLOG(level) << "File IO Test: "
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint8 kData[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint32 kDataSize = arraysize(kData);
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint8 kBigData[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           0x00 };
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint32 kBigDataSize = arraysize(kBigData);
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Must be > kReadSize in cdm_file_io_impl.cc.
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst uint32 kLargeDataSize = 20 * 1024 + 7;
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Macros to help add test cases/steps.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// |test_name| is also used as the file name. File name validity tests relies
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// on this to work.
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define START_TEST_CASE(test_name)                                     \
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  do {                                                                 \
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    FileIOTest test_case(create_file_io_cb_, test_name);               \
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CREATE_FILE_IO  // Create FileIO for each test case.
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define ADD_TEST_STEP(type, status, data, data_size)                   \
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_case.AddTestStep(FileIOTest::type, cdm::FileIOClient::status, \
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          (data), (data_size));
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define END_TEST_CASE                 \
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    remaining_tests_.push_back(test_case); \
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } while(0);
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define CREATE_FILE_IO \
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ADD_TEST_STEP(ACTION_CREATE, kSuccess, NULL, 0)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define OPEN_FILE \
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ADD_TEST_STEP(ACTION_OPEN, kSuccess, NULL, 0)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define EXPECT_FILE_OPENED(status) \
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ADD_TEST_STEP(RESULT_OPEN, status, NULL, 0)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define READ_FILE \
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ADD_TEST_STEP(ACTION_READ, kSuccess, NULL, 0)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define EXPECT_FILE_READ(status, data, data_size) \
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ADD_TEST_STEP(RESULT_READ, status, data, data_size)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define WRITE_FILE(data, data_size) \
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ADD_TEST_STEP(ACTION_WRITE, kSuccess, data, data_size)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define EXPECT_FILE_WRITTEN(status) \
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ADD_TEST_STEP(RESULT_WRITE, status, NULL, 0)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define CLOSE_FILE \
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ADD_TEST_STEP(ACTION_CLOSE, kSuccess, NULL, 0)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// FileIOTestRunner implementation.
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FileIOTestRunner::FileIOTestRunner(const CreateFileIOCB& create_file_io_cb)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : create_file_io_cb_(create_file_io_cb),
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      total_num_tests_(0),
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      num_passed_tests_(0) {
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Generate |large_data_|.
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  large_data_.resize(kLargeDataSize);
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < kLargeDataSize; ++i)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    large_data_[i] = i % kuint8max;
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddTests();
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FileIOTestRunner::~FileIOTestRunner() {
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (remaining_tests_.empty())
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_LT(num_passed_tests_, total_num_tests_);
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FILE_IO_DVLOG(1) << "Not Finished (probably due to timeout). "
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   << num_passed_tests_ << " passed in "
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   << total_num_tests_ << " tests.";
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Note: Consecutive expectations (EXPECT*) can happen in any order.
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTestRunner::AddTests() {
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("/FileNameStartsWithForwardSlash")
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kError)
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("FileNameContains/ForwardSlash")
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kError)
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("\\FileNameStartsWithBackslash")
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kError)
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("FileNameContains\\Backslash")
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kError)
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("_FileNameStartsWithUnderscore")
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kError)
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("FileNameContains_Underscore")
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kSuccess)
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("ReadBeforeOpeningFile")
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kError, NULL, 0)
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("WriteBeforeOpeningFile")
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kError)
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("ReadBeforeFileOpened")
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kError, NULL, 0)
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // After file opened, we can still do normal operations.
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WRITE_FILE(kData, kDataSize)
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_WRITTEN(kSuccess)
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("WriteBeforeFileOpened")
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kError)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // After file opened, we can still do normal operations.
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WRITE_FILE(kData, kDataSize)
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_WRITTEN(kSuccess)
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("ReadDuringPendingRead")
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kInUse, NULL, 0)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Read again.
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("ReadDuringPendingWrite")
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kInUse, NULL, 0)
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Read again.
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("WriteDuringPendingRead")
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kInUse)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, NULL, 0)
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // We can still do normal operations.
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WRITE_FILE(kData, kDataSize)
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_WRITTEN(kSuccess)
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("WriteDuringPendingWrite")
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kBigData, kBigDataSize)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kInUse)
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Read to make sure original data (kData) is written.
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("ReadFileThatDoesNotExist")
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, NULL, 0)
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("WriteAndRead")
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("WriteAndReadEmptyFile")
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(NULL, 0)
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, NULL, 0)
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("WriteAndReadLargeData")
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(&large_data_[0], kLargeDataSize)
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, &large_data_[0], kLargeDataSize)
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("OverwriteZeroBytes")
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(NULL, 0)
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, NULL, 0)
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("OverwriteWithSmallerData")
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kBigData, kBigDataSize)
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("OverwriteWithLargerData")
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kBigData, kBigDataSize)
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, kBigData, kBigDataSize)
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("ReadExistingFile")
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CLOSE_FILE
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CREATE_FILE_IO
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    READ_FILE
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("MultipleReadsAndWrites")
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kSuccess)
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Read file which doesn't exist.
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, NULL, 0)
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Write kData to file.
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WRITE_FILE(kData, kDataSize)
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_WRITTEN(kSuccess)
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Read file.
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Read file again.
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Overwrite file with large data.
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WRITE_FILE(&large_data_[0], kLargeDataSize)
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_WRITTEN(kSuccess)
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Read file.
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, &large_data_[0], kLargeDataSize)
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Overwrite file with kData.
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WRITE_FILE(kData, kDataSize)
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_WRITTEN(kSuccess)
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Read file.
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Overwrite file with zero bytes.
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WRITE_FILE(NULL, 0)
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_WRITTEN(kSuccess)
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Read file.
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, NULL, 0)
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("OpenAfterOpen")
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kSuccess)
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kError)
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("OpenDuringPendingOpen")
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kError)  // The second Open() failed.
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)  // The first Open() succeeded.
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("ReopenFileInSeparateFileIO")
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CREATE_FILE_IO  // Create a second FileIO without closing the first one.
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kInUse)
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("CloseAfterCreation")
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CLOSE_FILE
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("CloseDuringPendingOpen")
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CLOSE_FILE
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("CloseDuringPendingWrite")
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(xhwang): Reenable this after http:://crbug.com/415401 is fixed.
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // WRITE_FILE(kData, kDataSize)
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CLOSE_FILE
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("CloseDuringPendingOverwriteWithLargerData")
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kSuccess)
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_WRITTEN(kSuccess)
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(xhwang): Reenable this after http:://crbug.com/415401 is fixed.
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // WRITE_FILE(kBigData, kBigDataSize)
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CLOSE_FILE
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Write() didn't finish and the content of the file is not modified.
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CREATE_FILE_IO
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kSuccess)
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("CloseDuringPendingOverwriteWithSmallerData")
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kSuccess)
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WRITE_FILE(kBigData, kBigDataSize)
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_WRITTEN(kSuccess)
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(xhwang): Reenable this after http:://crbug.com/415401 is fixed.
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // WRITE_FILE(kData, kDataSize)
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CLOSE_FILE
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Write() didn't finish and the content of the file is not modified.
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CREATE_FILE_IO
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kSuccess)
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kBigData, kBigDataSize)
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  START_TEST_CASE("CloseDuringPendingRead")
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OPEN_FILE
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_OPENED(kSuccess)
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WRITE_FILE(kData, kDataSize)
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FILE_WRITTEN(kSuccess)
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(xhwang): Reenable this after http:://crbug.com/415401 is fixed.
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // READ_FILE
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CLOSE_FILE
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Make sure the file is not modified.
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CREATE_FILE_IO
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    OPEN_FILE
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_OPENED(kSuccess)
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    READ_FILE
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FILE_READ(kSuccess, kData, kDataSize)
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  END_TEST_CASE
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  START_TEST_CASE("StressTest")
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (int i = 0; i < 100; ++i) {
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CREATE_FILE_IO
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      OPEN_FILE
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_FILE_OPENED(kSuccess)
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WRITE_FILE(kData, kDataSize)
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_FILE_WRITTEN(kSuccess)
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // TODO(xhwang): Reenable this after http:://crbug.com/415401 is fixed.
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // WRITE_FILE(kBigData, kBigDataSize)
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CLOSE_FILE
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Make sure the file is not modified.
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CREATE_FILE_IO
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      OPEN_FILE
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_FILE_OPENED(kSuccess)
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      READ_FILE
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_FILE_READ(kSuccess, kData, kDataSize)
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      CLOSE_FILE
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  END_TEST_CASE
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTestRunner::RunAllTests(const CompletionCB& completion_cb) {
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  completion_cb_ = completion_cb;
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  total_num_tests_ = remaining_tests_.size();
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunNextTest();
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTestRunner::RunNextTest() {
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (remaining_tests_.empty()) {
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FILE_IO_DVLOG(1) << num_passed_tests_ << " passed and "
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     << (total_num_tests_ - num_passed_tests_) << " failed in "
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     << total_num_tests_ << " tests.";
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool success = (num_passed_tests_ == total_num_tests_);
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ResetAndReturn(&completion_cb_).Run(success);
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  remaining_tests_.front().Run(
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&FileIOTestRunner::OnTestComplete, base::Unretained(this)));
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTestRunner::OnTestComplete(bool success) {
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (success)
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    num_passed_tests_++;
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  remaining_tests_.pop_front();
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunNextTest();
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// FileIOTest implementation.
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FileIOTest::FileIOTest(const CreateFileIOCB& create_file_io_cb,
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const std::string& test_name)
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : create_file_io_cb_(create_file_io_cb),
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      test_name_(test_name) {}
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FileIOTest::~FileIOTest() {}
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTest::AddTestStep(
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    StepType type, Status status, const uint8* data, uint32 data_size) {
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  test_steps_.push_back(TestStep(type, status, data, data_size));
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTest::Run(const CompletionCB& completion_cb) {
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FILE_IO_DVLOG(3) << "Run " << test_name_;
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  completion_cb_ = completion_cb;
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!test_steps_.empty() && !IsResult(test_steps_.front()));
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunNextStep();
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTest::OnOpenComplete(Status status) {
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnResult(TestStep(RESULT_OPEN, status, NULL, 0));
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTest::OnReadComplete(Status status,
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                const uint8_t* data,
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                uint32_t data_size) {
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnResult(TestStep(RESULT_READ, status, data, data_size));
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTest::OnWriteComplete(Status status) {
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnResult(TestStep(RESULT_WRITE, status, NULL, 0));
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FileIOTest::IsResult(const TestStep& test_step) {
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (test_step.type) {
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case RESULT_OPEN:
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case RESULT_READ:
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case RESULT_WRITE:
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return true;
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ACTION_CREATE:
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ACTION_OPEN:
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ACTION_READ:
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ACTION_WRITE:
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ACTION_CLOSE:
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NOTREACHED();
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FileIOTest::MatchesResult(const TestStep& a, const TestStep& b) {
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(IsResult(a) && IsResult(b));
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (a.type != b.type || a.status != b.status)
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (a.type != RESULT_READ || a.status != cdm::FileIOClient::kSuccess)
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return (a.data_size == b.data_size &&
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          std::equal(a.data, a.data + a.data_size, b.data));
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTest::RunNextStep() {
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Run all actions in the current action group.
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (!test_steps_.empty()) {
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Start to wait for test results when the next step is a test result.
5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (IsResult(test_steps_.front()))
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestStep test_step = test_steps_.front();
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_steps_.pop_front();
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cdm::FileIO* file_io = file_io_stack_.empty()? NULL : file_io_stack_.top();
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (test_step.type) {
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ACTION_CREATE:
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_io = create_file_io_cb_.Run(this);
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if (!file_io) {
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          FILE_IO_DVLOG(3) << "Cannot create FileIO object.";
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          OnTestComplete(false);
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          return;
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        }
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_io_stack_.push(file_io);
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ACTION_OPEN:
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Use test name as the test file name.
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_io->Open(test_name_.data(), test_name_.size());
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ACTION_READ:
5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_io->Read();
5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ACTION_WRITE:
5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_io->Write(test_step.data, test_step.data_size);
5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ACTION_CLOSE:
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_io->Close();
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file_io_stack_.pop();
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      default:
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        NOTREACHED();
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OnTestComplete(true);
5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTest::OnResult(const TestStep& result) {
5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(IsResult(result));
5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!CheckResult(result)) {
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    OnTestComplete(false);
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunNextStep();
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool FileIOTest::CheckResult(const TestStep& result) {
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (test_steps_.empty() || !IsResult(test_steps_.front()))
5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If there are multiple results expected, the order does not matter.
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::list<TestStep>::iterator iter = test_steps_.begin();
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (; iter != test_steps_.end(); ++iter) {
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!IsResult(*iter))
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!MatchesResult(*iter, result))
5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      continue;
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_steps_.erase(iter);
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FileIOTest::OnTestComplete(bool success) {
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (!file_io_stack_.empty()) {
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file_io_stack_.top()->Close();
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file_io_stack_.pop();
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FILE_IO_DVLOG(3) << test_name_ << (success ? " PASSED" : " FAILED");
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ResetAndReturn(&completion_cb_).Run(success);
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace media
614