[Parted-commits] GNU Parted Official Repository: Changes to 'master'
Jim Meyering
meyering at alioth.debian.org
Thu Apr 26 21:19:13 UTC 2007
Makefile.am | 2 -
configure.ac | 1
parted/parted.c | 24 ++++++++++---
parted/ui.c | 7 +--
parted/ui.h | 4 +-
tests/Makefile.am | 11 ++++++
tests/label-01 | 61 ++++++++++++++++++++++++++++++++++
tests/label-02 | 70 +++++++++++++++++++++++++++++++++++++++
tests/lang-default | 10 +++++
tests/part-01 | 60 +++++++++++++++++++++++++++++++++
tests/part-02 | 62 ++++++++++++++++++++++++++++++++++
tests/priv-check | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++
12 files changed, 394 insertions(+), 12 deletions(-)
New commits:
commit b235f8a487d81b4703e76e08add3c89cf109a06f
Author: Jim Meyering <jim at meyering.net>
Date: Thu Apr 26 23:17:32 2007 +0200
Add integration tests, then adjust code so that they pass.
These changes affect how --script (-s) works, and when diagnostics
are displayed.
* Makefile.am (SUBDIRS): Add tests.
* configure.ac (AC_OUTPUT): Add tests/Makefile.
* tests/Makefile.am: New file.
* tests/part-01, tests/label-01: New files.
* tests/part-02, tests/label-02: New files.
* parted/parted.c (enum) [PRETEND_INPUT_TTY]: Define.
Support a new, undocumented option: ---pretend-input-tty.
It is intended solely for testing. The leading '---' ensures
that it will never conflict with a "regular" long option.
(do_mkpartfs): Prompt only when not in script mode.
Call ped_exception_leave_all() to decrement global counter.
Without this, the use of parted in tests/part-01 would still fail,
but would not issue the diagnostic explaining why.
* parted/ui.h (pretend_input_tty): Declare new global.
* parted/ui.c (exception_handler): Let the new "pretend_input_tty"
option override "!isatty (0)".
(init_ui): Don't set opt_script_mode.
* tests/lang-default, tests/priv-check: New files.
diff --git a/Makefile.am b/Makefile.am
index 1c65b5f..1aba177 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,5 @@
ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = po lib libparted parted partprobe include doc debug
+SUBDIRS = po lib libparted parted partprobe include doc debug tests
EXTRA_DIST = \
.prev-version \
diff --git a/configure.ac b/configure.ac
index 5735541..9401d46 100644
--- a/configure.ac
+++ b/configure.ac
@@ -502,6 +502,7 @@ doc/pt_BR/Makefile
debug/Makefile
debug/clearfat/Makefile
debug/test/Makefile
+tests/Makefile
po/Makefile.in
])
diff --git a/parted/parted.c b/parted/parted.c
index ff72dcd..37ed053 100644
--- a/parted/parted.c
+++ b/parted/parted.c
@@ -65,6 +65,13 @@ static int MEGABYTE_SECTORS (PedDevice* dev)
return PED_MEGABYTE_SIZE / dev->sector_size;
}
+/* For long options that have no equivalent short option, use a
+ non-character as a pseudo short option, starting with CHAR_MAX + 1. */
+enum
+{
+ PRETEND_INPUT_TTY = CHAR_MAX + 1,
+};
+
typedef struct {
time_t last_update;
@@ -78,6 +85,7 @@ static struct option options[] = {
{"machine", 0, NULL, 'm'},
{"script", 0, NULL, 's'},
{"version", 0, NULL, 'v'},
+ {"-pretend-input-tty", 0, NULL, PRETEND_INPUT_TTY},
{NULL, 0, NULL, 0}
};
@@ -93,6 +101,7 @@ static char* options_help [][2] = {
char *program_name;
int opt_script_mode = 0;
+int pretend_input_tty = 0;
int opt_machine_mode = 0;
int disk_is_modified = 0;
int is_toggle_mode = 0;
@@ -592,11 +601,12 @@ do_mklabel (PedDevice** dev)
ped_exception_leave_all ();
if (disk) {
- if (!_disk_warn_busy (disk))
- goto error_destroy_disk;
-
- if (!_disk_warn_loss (disk))
- goto error_destroy_disk;
+ if (!opt_script_mode) {
+ if (!_disk_warn_busy (disk))
+ goto error_destroy_disk;
+ if (!_disk_warn_loss (disk))
+ goto error_destroy_disk;
+ }
ped_disk_destroy (disk);
}
@@ -943,6 +953,7 @@ do_mkpartfs (PedDevice** dev)
}
}
ped_exception_catch();
+ ped_exception_leave_all();
/* set LBA flag automatically if available */
if (ped_partition_is_flag_available (part, PED_PARTITION_LBA))
@@ -2309,6 +2320,9 @@ while (1)
case 'm': opt_machine_mode = 1; break;
case 's': opt_script_mode = 1; break;
case 'v': version = 1; break;
+ case PRETEND_INPUT_TTY:
+ pretend_input_tty = 1;
+ break;
default: wrong = 1; break;
}
}
diff --git a/parted/ui.c b/parted/ui.c
index 59cb98b..25700ac 100644
--- a/parted/ui.c
+++ b/parted/ui.c
@@ -624,14 +624,15 @@ exception_handler (PedException* ex)
return opt;
/* script-mode: don't handle the exception */
- if (opt_script_mode)
+ if (opt_script_mode || (!isatty (0) && !pretend_input_tty))
return PED_EXCEPTION_UNHANDLED;
got_ctrl_c = 0;
do {
opt = command_line_get_ex_opt ("", ex->options);
- } while (opt == PED_EXCEPTION_UNHANDLED && isatty (0) && !got_ctrl_c);
+ } while (opt == PED_EXCEPTION_UNHANDLED
+ && (isatty (0) || pretend_input_tty) && !got_ctrl_c);
if (got_ctrl_c) {
got_ctrl_c = 0;
@@ -1365,8 +1366,6 @@ init_disk_type_str ()
int
init_ui ()
{
- opt_script_mode = !isatty (0);
-
if (!init_ex_opt_str ()
|| !init_state_str ()
|| !init_fs_type_str ()
diff --git a/parted/ui.h b/parted/ui.h
index 3ea0acb..147b170 100644
--- a/parted/ui.h
+++ b/parted/ui.h
@@ -1,6 +1,6 @@
/*
parted - a frontend to libparted
- Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2007 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
@@ -74,10 +74,10 @@ extern void print_using_dev (PedDevice* dev);
/* in parted.c */
extern int opt_script_mode;
+extern int pretend_input_tty;
extern void print_options_help ();
extern void print_commands_help ();
#endif /* UI_H_INCLUDED */
-
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..3d443ad
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,11 @@
+TESTS = \
+ label-01 \
+ label-02 \
+ part-01 \
+ part-02
+
+TESTS_ENVIRONMENT = \
+ PATH="`pwd`/../parted$(PATH_SEPARATOR)$$PATH"
+
+EXTRA_DIST = \
+ $(TESTS) lang-default priv-check
diff --git a/tests/label-01 b/tests/label-01
new file mode 100755
index 0000000..596ced3
--- /dev/null
+++ b/tests/label-01
@@ -0,0 +1,61 @@
+#!/bin/sh
+# Ensure that a simple command using -s succeeds with no prompt
+
+# Copyright (C) 2007 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+if test "$VERBOSE" = yes; then
+ set -x
+ parted --version
+fi
+
+. $srcdir/lang-default
+
+pwd=`pwd`
+t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$
+trap 'status=$?; cd "$pwd" && chmod -R u+rwx $t0 && rm -rf $t0 && exit $status' 0
+trap '(exit $?); exit $?' 1 2 13 15
+
+framework_failure=0
+mkdir -p $tmp || framework_failure=1
+cd $tmp || framework_failure=1
+
+# create a file of size N bytes
+N=1M
+dev=loop-file
+dd if=/dev/zero of=$dev bs=$N count=1 2> /dev/null || framework_failure=1
+
+# Expect no output for root.
+# Expect the warning for non-root.
+touch exp
+uid=`id -u` || uid=1
+test "$uid" = 0 || cat <<\EOF > exp || fail=1
+WARNING: You are not superuser. Watch out for permissions.
+EOF
+
+if test $framework_failure = 1; then
+ echo "$0: failure in testing framework" 1>&2
+ (exit 1); exit 1
+fi
+
+fail=0
+parted -s $dev mklabel msdos > out 2>&1 || fail=1
+
+cmp out exp || fail=1
+test $fail = 1 && diff out exp 2> /dev/null
+
+(exit $fail); exit $fail
diff --git a/tests/label-02 b/tests/label-02
new file mode 100755
index 0000000..f26fed5
--- /dev/null
+++ b/tests/label-02
@@ -0,0 +1,70 @@
+#!/bin/sh
+# Ensure that a simple mklabel command succeeds.
+# Since there's no -s option, there are prompts.
+
+# Copyright (C) 2007 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+if test "$VERBOSE" = yes; then
+ set -x
+ parted --version
+fi
+
+. $srcdir/lang-default
+
+pwd=`pwd`
+t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$
+trap 'status=$?; cd "$pwd" && chmod -R u+rwx $t0 && rm -rf $t0 && exit $status' 0
+trap '(exit $?); exit $?' 1 2 13 15
+
+framework_failure=0
+mkdir -p $tmp || framework_failure=1
+cd $tmp || framework_failure=1
+
+# create a file of size N bytes
+N=1M
+dev=loop-file
+dd if=/dev/zero of=$dev bs=$N count=1 2> /dev/null || framework_failure=1
+printf 'y\n\n' > in || framework_failure=1
+
+if test $framework_failure = 1; then
+ echo "$0: failure in testing framework" 1>&2
+ (exit 1); exit 1
+fi
+
+fail=0
+# First iteration works with no prompting, since there is no preexisting label.
+parted $dev mklabel msdos > out 2>&1 || fail=1
+
+# Now that there's a label, rerunning the same command is interactive.
+parted ---pretend-input-tty $dev mklabel msdos < in > o2 2>&1 || fail=1
+sed "s,^/.*$dev ,,;s,
*
,,;s, $,," o2 >> out
+
+cat <<\EOF > exp || fail=1
+WARNING: You are not superuser. Watch out for permissions.
+WARNING: You are not superuser. Watch out for permissions.
+Warning: The existing disk label on
+will be destroyed and all
+data on this disk will be lost. Do you want to continue?
+Yes/No? y
+New disk label type? [msdos]?
+EOF
+
+cmp out exp || fail=1
+test $fail = 1 && diff -u out exp 2> /dev/null
+
+(exit $fail); exit $fail
diff --git a/tests/lang-default b/tests/lang-default
new file mode 100644
index 0000000..882672f
--- /dev/null
+++ b/tests/lang-default
@@ -0,0 +1,10 @@
+#!/bin/sh
+# Set locale-related environment variables so we get consistent
+# message translations, time formats, sort orderings, etc.
+
+LC_ALL=C
+export LC_ALL
+unset LANGUAGE NLSPATH
+
+# These settings shouldn't matter, but unset them anyway just in case.
+unset LANG LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME
diff --git a/tests/part-01 b/tests/part-01
new file mode 100755
index 0000000..1d6798e
--- /dev/null
+++ b/tests/part-01
@@ -0,0 +1,60 @@
+#!/bin/sh
+# Ensure that mkpartfs fails when the device is too small.
+
+# Copyright (C) 2007 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+if test "$VERBOSE" = yes; then
+ set -x
+ parted --version
+fi
+
+. $srcdir/lang-default
+
+pwd=`pwd`
+t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$
+trap 'status=$?; cd "$pwd" && chmod -R u+rwx $t0 && rm -rf $t0 && exit $status' 0
+trap '(exit $?); exit $?' 1 2 13 15
+
+framework_failure=0
+mkdir -p $tmp || framework_failure=1
+cd $tmp || framework_failure=1
+
+# You need much more than this to create a fat32 file system
+N=1M
+dev=loop-file
+dd if=/dev/zero of=$dev bs=$N count=1 2> /dev/null || framework_failure=1
+parted $dev mklabel msdos > /dev/null 2>&1 || framework_failure=1
+
+cat <<\EOF > exp || framework_failure=1
+WARNING: You are not superuser. Watch out for permissions.
+Error: Partition too big/small for a fat32 file system.
+EOF
+
+if test $framework_failure = 1; then
+ echo "$0: failure in testing framework" 1>&2
+ (exit 1); exit 1
+fi
+
+fail=0
+# Require nonzero exit status.
+parted -s $dev mkpartfs primary fat32 0 1 > out 2>&1 && fail=1
+
+cmp out exp || fail=1
+test $fail = 1 && diff -u out exp 2> /dev/null
+
+(exit $fail); exit $fail
diff --git a/tests/part-02 b/tests/part-02
new file mode 100755
index 0000000..bef517e
--- /dev/null
+++ b/tests/part-02
@@ -0,0 +1,62 @@
+#!/bin/sh
+# Ensure that mkpartfs works in one small case.
+
+# Copyright (C) 2007 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+if test "$VERBOSE" = yes; then
+ set -x
+ parted --version
+fi
+
+. $srcdir/lang-default
+
+pwd=`pwd`
+t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$
+trap 'status=$?; cd "$pwd" && chmod -R u+rwx $t0 && rm -rf $t0 && exit $status' 0
+trap '(exit $?); exit $?' 1 2 13 15
+
+framework_failure=0
+mkdir -p $tmp || framework_failure=1
+cd $tmp || framework_failure=1
+
+# 40MB is just enough space in which to create a fat32 file system
+N=40M
+dev=loop-file
+dd if=/dev/zero of=$dev bs=$N count=1 2> /dev/null || framework_failure=1
+parted $dev mklabel msdos > /dev/null 2>&1 || framework_failure=1
+
+# Expect no output for root.
+# Expect the warning for non-root.
+touch exp
+uid=`id -u` || uid=1
+test "$uid" = 0 || cat <<\EOF > exp || fail=1
+WARNING: You are not superuser. Watch out for permissions.
+EOF
+
+if test $framework_failure = 1; then
+ echo "$0: failure in testing framework" 1>&2
+ (exit 1); exit 1
+fi
+
+fail=0
+parted -s $dev mkpartfs primary fat32 0 40 > out 2>&1 || fail=1
+
+cmp out exp || fail=1
+test $fail = 1 && diff -u out exp 2> /dev/null
+
+(exit $fail); exit $fail
diff --git a/tests/priv-check b/tests/priv-check
new file mode 100644
index 0000000..b0d6c92
--- /dev/null
+++ b/tests/priv-check
@@ -0,0 +1,94 @@
+# -*- sh -*-
+# Source this file at the beginning of a test that works
+# only when run as root or as non-root.
+
+# Copyright (C) 2001, 2003, 2004 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+case "$PRIV_CHECK_ARG" in
+ require-root) who='as root';;
+ require-non-root) who='by an unprivileged user';;
+ *) echo "Usage: PRIV_CHECK_ARG={require-root|require-non-root} . priv-check"\
+ 1>&2; exit 1;;
+esac
+
+# Make sure id -u succeeds.
+my_uid=`id -u`
+test $? = 0 || {
+ echo "$0: cannot run \`id -u'" 1>&2
+ (exit 1); exit 1
+}
+
+# Make sure it gives valid output.
+case $my_uid in
+ *[!0-9]*)
+ echo "$0: invalid output (\`$my_uid') from \`id -u'" 1>&2
+ (exit 1); exit 1
+ ;;
+ *) ;;
+esac
+
+test $my_uid = 0 && \
+{
+ # When running as root, always ensure that we have a valid non-root username.
+ # As non-root, don't do anything, since we won't be running setuidgid.
+ : ${NON_ROOT_USERNAME=nobody}
+
+ # Ensure that the supplied username is valid and with UID != 0.
+ coreutils_non_root_uid=`id -u $NON_ROOT_USERNAME`
+ test $? = 0 || \
+ {
+ echo "$0: This command failed: \`id -u $NON_ROOT_USERNAME'" 1>&2
+ echo "$0: Skipping this test. To enable it, set the envvar" 1>&2
+ echo "$0: NON_ROOT_USERNAME to a non-root user name." 1>&2
+ (exit 77); exit 77
+ }
+ test "$coreutils_non_root_uid" = 0 && \
+ {
+ echo "$0: The specified NON_ROOT_USERNAME ($NON_ROOT_USERNAME)" 1>&2
+ echo "$0: is invalid because its UID is 0." 1>&2
+ (exit 1); exit 1
+ }
+}
+
+give_msg=no
+case $PRIV_CHECK_ARG:$my_uid in
+ require-root:0) ;;
+ require-root:*) give_msg=yes ;;
+ require-non-root:0)
+ # `.' must be writable by $NON_ROOT_USERNAME
+ setuidgid $NON_ROOT_USERNAME test -w . ||
+ {
+ echo "$0: `pwd`: not writable by user \`$NON_ROOT_USERNAME'" 1>&2
+ echo "$0: skipping this test" 1>&2
+ (exit 77); exit 77
+ }
+ exec setuidgid $NON_ROOT_USERNAME env PATH="$PATH" $0
+ ;;
+ require-non-root:*) ;;
+esac
+
+test $give_msg = yes && {
+ cat <<EOF
+***************************
+NOTICE:
+$0: This test is being skipped, since it works only
+when run $who.
+***************************
+EOF
+ (exit 77); exit 77
+}
More information about the Parted-commits
mailing list