blob: 068c8b439d78791ce675f5daf1a5f7c5fe9a085e [file] [log] [blame]
// Copyright 2020 The Fuchsia 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 "src/storage/fs_test/fs_test_fixture.h"
#include <fidl/fuchsia.hardware.ramdisk/cpp/wire.h>
#include <zircon/errors.h>
#include <iostream>
#include <gtest/gtest-spi.h>
#include "src/storage/fs_test/fs_test.h"
namespace fs_test {
BaseFilesystemTest::~BaseFilesystemTest() {
if (fs_.is_mounted()) {
EXPECT_EQ(fs_.Unmount().status_value(), ZX_OK);
}
EXPECT_EQ(fs_.Fsck().status_value(), ZX_OK);
}
void BaseFilesystemTest::RunSimulatedPowerCutTest(const PowerCutOptions& options,
const std::function<void()>& test_function) {
ASSERT_FALSE(fs().options().use_ram_nand); // This only works with ram-disks.
ASSERT_EQ(fs().GetRamDisk()->Wake().status_value(), ZX_OK); // This resets counts.
// Make sure the test function runs without any failures.
ASSERT_NO_FATAL_FAILURE(test_function());
zx::result counts = fs().GetRamDisk()->GetBlockCounts();
ASSERT_EQ(counts.status_value(), ZX_OK);
std::cout << "Total block count: " << counts->received << std::endl;
// Now repeatedly stop writes after a certain block number.
for (uint64_t block_cut = 1; block_cut < counts->received; block_cut += options.stride) {
ASSERT_EQ(fs().GetRamDisk()->SleepAfter(block_cut).status_value(), ZX_OK);
{
// Ignore any test failures whilst we are doing this.
testing::TestPartResultArray result;
testing::ScopedFakeTestPartResultReporter reporter(
testing::ScopedFakeTestPartResultReporter::InterceptMode::INTERCEPT_ALL_THREADS, &result);
test_function();
}
ASSERT_EQ(fs().Unmount().status_value(), ZX_OK);
ASSERT_EQ(fs().GetRamDisk()->Wake().status_value(), ZX_OK);
ASSERT_EQ(fs().Fsck().status_value(), ZX_OK);
if (options.reformat) {
ASSERT_EQ(fs().Format().status_value(), ZX_OK);
}
ASSERT_EQ(fs().Mount().status_value(), ZX_OK);
}
}
} // namespace fs_test