From deb572c298c5b09cb768de8bd3d045df427f1e8f Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Mon, 31 Oct 2011 16:35:17 -0700 Subject: [PATCH] tests: add new test to check ped_disk_duplicate * tests/duplicate.c: New test. * tests/t0501-duplicate.sh: New test program. * tests/Makefile.am (TEST): Add new test. (check_PROGRAMS): Add new test program. --- tests/Makefile.am | 3 +- tests/duplicate.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++ tests/t0501-duplicate.sh | 25 +++++++++ 3 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 tests/duplicate.c create mode 100644 tests/t0501-duplicate.sh diff --git a/tests/Makefile.am b/tests/Makefile.am index 63bcd31..9638248 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -25,6 +25,7 @@ TESTS = \ t0300-dos-on-gpt.sh \ t0400-loop-clobber-infloop.sh \ t0500-dup-clobber.sh \ + t0501-duplicate.sh \ t1100-busy-label.sh \ t1101-busy-partition.sh \ t1700-probe-fs.sh \ @@ -63,7 +64,7 @@ EXTRA_DIST = \ $(TESTS) lvm-utils.sh t-local.sh t-lvm.sh \ init.cfg init.sh t-lib-helpers.sh -check_PROGRAMS = print-align print-max dup-clobber +check_PROGRAMS = print-align print-max dup-clobber duplicate LDADD = \ $(top_builddir)/libparted/libparted.la AM_CPPFLAGS = \ diff --git a/tests/duplicate.c b/tests/duplicate.c new file mode 100644 index 0000000..129537c --- /dev/null +++ b/tests/duplicate.c @@ -0,0 +1,134 @@ +/* Demonstrate that ped_disk_duplicate is working correctly. +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "closeout.h" +#include "progname.h" + +int +main (int argc, char **argv) +{ + atexit (close_stdout); + set_program_name (argv[0]); + + if (argc != 2) + return EXIT_FAILURE; + + char const *dev_name = "dev-file"; + + /* Create a file. */ + int fd = open (dev_name, O_CREAT|O_TRUNC|O_WRONLY, 0644); + assert (0 <= fd); + off_t size = 8 * 1024 * 1024; + assert (ftruncate (fd, size) == 0); + assert (close (fd) == 0); + + PedDevice *dev = ped_device_get (dev_name); + assert (dev); + + PedDisk *disk = ped_disk_new_fresh (dev, ped_disk_type_get (argv[1])); + assert (disk); + assert (ped_disk_commit(disk)); + ped_disk_destroy (disk); + + /* re-open the disk */ + disk = ped_disk_new (dev); + assert (disk); + + /* Create a partition */ + const PedFileSystemType *fs_type = ped_file_system_type_get ("ext2"); + assert (fs_type); + PedPartitionType part_type = PED_PARTITION_NORMAL; + const PedGeometry *geometry = ped_geometry_new (dev, 34, 1024); + assert (geometry); + PedPartition *part = ped_partition_new (disk, part_type, fs_type, + geometry->start, geometry->end); + assert (part); + PedConstraint *constraint = ped_constraint_exact (geometry); + assert (constraint); + + if (ped_partition_is_flag_available (part, PED_PARTITION_BOOT)) + assert (ped_partition_set_flag (part, PED_PARTITION_BOOT, 1)); + + assert (ped_disk_add_partition (disk, part, constraint)); + ped_constraint_destroy (constraint); + + assert (ped_partition_set_system (part, fs_type)); + if (ped_partition_is_flag_available (part, PED_PARTITION_LBA)) + ped_partition_set_flag (part, PED_PARTITION_LBA, 1); + + assert (ped_disk_commit(disk)); + + /* Duplicate it */ + PedDisk *copy = ped_disk_duplicate (disk); + assert (ped_disk_commit(copy)); + + /* Compare the two copies */ + + /* Check the device */ + assert (strcmp (disk->dev->model, copy->dev->model) == 0); + assert (strcmp (disk->dev->path, copy->dev->path) == 0); + assert (disk->dev->sector_size == copy->dev->sector_size); + assert (disk->dev->phys_sector_size == copy->dev->phys_sector_size); + assert (disk->dev->length == copy->dev->length); + + /* Check the type */ + assert (strcmp (disk->type->name, copy->type->name) == 0); + assert (disk->type->features == copy->type->features); + + /* Check the flags */ + for (PedDiskFlag flag = PED_DISK_FIRST_FLAG; flag <= PED_DISK_LAST_FLAG; + flag++) { + if (!ped_disk_is_flag_available(disk, flag)) + continue; + assert (ped_disk_get_flag (disk, flag) == ped_disk_get_flag (copy, flag)); + } + + /* Check the partitions */ + PedPartition *disk_part, *copy_part; + for ( disk_part = disk->part_list, copy_part = copy->part_list; + disk_part && copy_part; + disk_part = disk_part->next, copy_part = copy_part->next) + { + /* Only active partitions are duplicated */ + if (!ped_partition_is_active (disk_part)) + continue; + + assert (disk_part->geom.start == copy_part->geom.start); + assert (disk_part->geom.end == copy_part->geom.end); + assert (disk_part->geom.length == copy_part->geom.length); + assert (disk_part->num == copy_part->num); + assert (disk_part->type == copy_part->type); + + if (disk_part->fs_type && disk_part->fs_type->name) { + assert (strcmp (disk_part->fs_type->name, copy_part->fs_type->name) == 0); + } + + /* Check the flags */ + for (PedPartitionFlag flag = PED_PARTITION_FIRST_FLAG; + flag <= PED_PARTITION_LAST_FLAG; flag++) { + if (!ped_partition_is_flag_available(disk_part, flag)) + continue; + fprintf (stderr, "Checking partition flag %d\n", flag); + fprintf (stderr, "%d ? %d\n", ped_partition_get_flag (disk_part, flag), + ped_partition_get_flag (copy_part, flag)); + assert (ped_partition_get_flag (disk_part, flag) + == ped_partition_get_flag (copy_part, flag)); + } + } + + /* Cleanup the mess */ + ped_disk_destroy (copy); + ped_disk_destroy (disk); + ped_device_destroy (dev); + + return EXIT_SUCCESS; +} diff --git a/tests/t0501-duplicate.sh b/tests/t0501-duplicate.sh new file mode 100644 index 0000000..3d0fac4 --- /dev/null +++ b/tests/t0501-duplicate.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# Drive the dup-clobber program. + +# Copyright (C) 2011 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/init.sh"; path_prepend_ ../parted . + +for t in msdos gpt bsd; do + duplicate $t || fail=1 +done + +Exit $fail -- 2.11.0