| // Copyright 2017 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/host_fs_test/fixture.h" |
| |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <stdlib.h> |
| #include <sys/stat.h> |
| #include <unistd.h> |
| |
| #include <cstring> |
| #include <filesystem> |
| #include <iostream> |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| #include <fbl/unique_fd.h> |
| |
| #include "src/storage/minfs/fsck.h" |
| |
| namespace fs_test { |
| |
| constexpr off_t kDiskSize = 1llu << 32; |
| |
| void HostFilesystemTest::SetUp() { |
| mount_path_ = std::filesystem::temp_directory_path().append("host_fs_test.XXXXXX").string(); |
| auto fd = fbl::unique_fd(mkstemp(mount_path_.data())); |
| ASSERT_TRUE(fd); |
| |
| ASSERT_EQ(ftruncate(fd.get(), kDiskSize), 0); |
| |
| fd.reset(); |
| |
| ASSERT_EQ(emu_mkfs(mount_path_.c_str()), 0); |
| |
| ASSERT_EQ(emu_mount(mount_path_.c_str()), 0); |
| } |
| |
| void HostFilesystemTest::TearDown() { EXPECT_EQ(unlink(mount_path_.c_str()), 0); } |
| |
| int HostFilesystemTest::RunFsck() { |
| fbl::unique_fd disk(open(mount_path_.c_str(), O_RDONLY)); |
| |
| if (!disk) { |
| std::cerr << "Unable to open disk for fsck" << std::endl; |
| return -1; |
| } |
| |
| struct stat stats; |
| if (fstat(disk.get(), &stats) < 0) { |
| std::cerr << "error: minfs could not find end of file/device" << std::endl; |
| return 0; |
| } |
| |
| if (stats.st_size != kDiskSize) { |
| std::cerr << "Invalid disk" << std::endl; |
| return -1; |
| } |
| |
| size_t size = stats.st_size /= minfs::kMinfsBlockSize; |
| |
| std::unique_ptr<minfs::Bcache> block_cache; |
| if (minfs::Bcache::Create(std::move(disk), static_cast<uint32_t>(size), &block_cache) != ZX_OK) { |
| std::cerr << "error: cannot create block cache" << std::endl; |
| return -1; |
| } |
| |
| // The filesystem is never repaired on the host side. |
| return Fsck(std::move(block_cache), minfs::FsckOptions{.quiet = true}); |
| } |
| |
| } // namespace fs_test |