Add offline ext2 resizing tests (!49)

Closes !49 - Add file system interface tests
This commit is contained in:
Mike Fleetwood 2019-07-27 09:59:22 +01:00 committed by Curtis Gedak
parent 1c6a594e8d
commit 279a9c44ed
1 changed files with 59 additions and 7 deletions

View File

@ -178,19 +178,25 @@ std::ostream& operator<<(std::ostream& out, const OperationDetail& od)
} }
const Byte_Value IMAGESIZE_Default = 256*MEBIBYTE;
const Byte_Value IMAGESIZE_Larger = 512*MEBIBYTE;
class ext2Test : public ::testing::Test class ext2Test : public ::testing::Test
{ {
protected: protected:
// Initialise top-level operation detail object with description ... // Initialise top-level operation detail object with description ...
ext2Test() : m_operation_detail("Operation details:", STATUS_NONE) {}; ext2Test() : m_operation_detail("Operation details:", STATUS_NONE) {};
virtual void extra_setup(); virtual void extra_setup(Byte_Value size = IMAGESIZE_Default);
virtual void TearDown(); virtual void TearDown();
static void SetUpTestCase(); static void SetUpTestCase();
static void TearDownTestCase(); static void TearDownTestCase();
virtual void reload_partition(); virtual void reload_partition();
virtual void resize_image(Byte_Value new_size);
virtual void shrink_partition(Byte_Value size);
static FileSystem* s_ext2_obj; static FileSystem* s_ext2_obj;
static FS s_ext2_support; static FS s_ext2_support;
@ -206,17 +212,15 @@ FS ext2Test::s_ext2_support;
const char* ext2Test::s_image_name = "test_ext2.img"; const char* ext2Test::s_image_name = "test_ext2.img";
void ext2Test::extra_setup() void ext2Test::extra_setup(Byte_Value size)
{ {
const Byte_Value ImageSize = 256*MEBIBYTE; // Create new image file to work with.
// Create new 256M image file to work with.
unlink(s_image_name); unlink(s_image_name);
int fd = open(s_image_name, O_WRONLY|O_CREAT|O_NONBLOCK, 0666); int fd = open(s_image_name, O_WRONLY|O_CREAT|O_NONBLOCK, 0666);
ASSERT_GE(fd, 0) << "Failed to create image file '" << s_image_name << "'. errno=" ASSERT_GE(fd, 0) << "Failed to create image file '" << s_image_name << "'. errno="
<< errno << "," << strerror(errno); << errno << "," << strerror(errno);
ASSERT_EQ(ftruncate(fd, (off_t)ImageSize), 0) << "Failed to set image file '" << s_image_name << "' to size " ASSERT_EQ(ftruncate(fd, (off_t)size), 0) << "Failed to set image file '" << s_image_name << "' to size "
<< ImageSize << ". errno=" << errno << "," << strerror(errno); << size << ". errno=" << errno << "," << strerror(errno);
close(fd); close(fd);
reload_partition(); reload_partition();
@ -269,6 +273,25 @@ void ext2Test::reload_partition()
} }
void ext2Test::resize_image(Byte_Value new_size)
{
int fd = open(s_image_name, O_WRONLY|O_NONBLOCK);
ASSERT_GE(fd, 0) << "Failed to open image file '" << s_image_name << "'. errno="
<< errno << "," << strerror(errno);
ASSERT_EQ(ftruncate(fd, (off_t)new_size), 0) << "Failed to resize image file '" << s_image_name << "' to size "
<< new_size << ". errno=" << errno << "," << strerror(errno);
close(fd);
}
void ext2Test::shrink_partition(Byte_Value new_size)
{
ASSERT_LE(new_size, m_partition.get_byte_length()) << __func__ << "(): TEST_BUG: Cannot grow Partition object size";
Sector new_sectors = (new_size + m_partition.sector_size - 1) / m_partition.sector_size;
m_partition.sector_end = new_sectors;
}
TEST_F(ext2Test, Create) TEST_F(ext2Test, Create)
{ {
SKIP_IF_FS_DOESNT_SUPPORT(create); SKIP_IF_FS_DOESNT_SUPPORT(create);
@ -398,6 +421,35 @@ TEST_F(ext2Test, CreateAndRemove)
} }
TEST_F(ext2Test, CreateAndGrow)
{
SKIP_IF_FS_DOESNT_SUPPORT(create);
SKIP_IF_FS_DOESNT_SUPPORT(grow);
extra_setup(IMAGESIZE_Default);
ASSERT_TRUE(s_ext2_obj->create(m_partition, m_operation_detail)) << m_operation_detail;
// Test growing the file system is successful.
resize_image(IMAGESIZE_Larger);
reload_partition();
ASSERT_TRUE(s_ext2_obj->resize(m_partition, m_operation_detail, true)) << m_operation_detail;
}
TEST_F(ext2Test, CreateAndShrink)
{
SKIP_IF_FS_DOESNT_SUPPORT(create);
SKIP_IF_FS_DOESNT_SUPPORT(shrink);
extra_setup(IMAGESIZE_Larger);
ASSERT_TRUE(s_ext2_obj->create(m_partition, m_operation_detail)) << m_operation_detail;
// Test shrinking the file system is successful.
shrink_partition(IMAGESIZE_Default);
ASSERT_TRUE(s_ext2_obj->resize(m_partition, m_operation_detail, false)) << m_operation_detail;
}
} // namespace GParted } // namespace GParted