[parted-devel] [PATCH 2/2] test for the bootcode-in-extended-partition fix

Petr Uzel petr.uzel at suse.cz
Fri May 22 14:42:48 UTC 2009


Hi!

On Fri, May 22, 2009 at 01:57:31PM +0200, Joel Granados wrote:
> 
> This is great!!! my comments bellow.
> On Fri, May 22, 2009 at 11:11:32AM +0200, Petr Uzel wrote:
> > * tests/t2300-dos-label-extended-bootcode.sh: New file.
> > * tests/Makefile.am (TESTS): Add t2300-dos-label-extended-bootcode.sh.
> > 
> > Signed-off-by: Petr Uzel <petr.uzel at suse.cz>
<SNIP>
> > +
> > +test_description='Make sure that parted preserves bootcode in extended partition.'
> > +
> > +: ${srcdir=.}
> > +. $srcdir/test-lib.sh
> > +
> > +
> > +N=10M
> 
> Why so large?  I made some tests and 100K was enough for these types of
> tests.  Seems a waist of effort to me.

TBH, the size comes from /dev/random :)

> 
> > +prim_part_size=5M
> 
> Why so large?

N/2 (so still from /dev/random)

> 
> > +dev=loop-file
> > +bootcode=bootcode
> > +bootcode_size=440
> > +bootcode_before=bootcode_before
> > +bootcode_after=bootcode_after
> > +
> > +
> > +test_expect_success \
> > +	'Create the test file' \
> > +	'dd if=/dev/null of=$dev bs=1 seek=$N 2>/dev/null'
> > +
> > +test_expect_success \
> > +	'Create msdos label' \
> > +	'parted -s $dev mklabel msdos > out 2>&1'
> > +test_expect_success 'Expect no output' 'compare out /dev/null'
> > +
> > +test_expect_success \
> > +	'Create primary partition' \
> > +	'parted -s $dev mkpart primary 0 $prim_part_size > out 2>&1'
> > +test_expect_success 'Expect no output' 'compare out /dev/null'
> 
> Why is the primary partition created?  The test also works without the
> primary partition.  You can create an extended and a logical, then
> install and save the boot code, then erase the logical partition, then
> test to see if the boot code is still there.

Well, I've tried to reproduce the original issue. But I agree that the
primary partition is not needed for this test.

> 
> > +
> > +test_expect_success \
> > +	'Create extended partition' \
> > +	'parted -s $dev mkpart extended $prim_part_size $N > out 2>&1'
> > +test_expect_success 'Expect no output' 'compare out /dev/null'
> > +
> > +test_expect_success \
> > +	'Create logical partition' \
> > +	'parted -s $dev mkpart logical $prim_part_size $N > out 2>&1'
> > +test_expect_success 'Expect no output' 'compare out /dev/null'
> > +
> 
> I think you can install the boot code with the following code.  I tested
> this and it works pretty well.  You would have to apply it to your
> test.
> 
> <snip>
> dd if=file of=file2 bs=512c count=32 &&
> dd if=/dev/urandom of=file2 seek=16384c bs=1c count=446 &&
> dd if=file of=file2 skip=16830 seek=16830 bs=1c count=85570
> </snip>

OK, this can make the test simpler. But when we know the position of
extended partition, we could even install the bootcode directly with
on call to dd:

[*] dd if=/dev/urandom of=file bs=1c count=440 seek=16384 conv=notrunc

> 
> Note that those three lines install a randomised boot section (I used
> 446 but 440 is better).  Also note that the calculations expect the
> partitions to be in certain places.  With this in mind the previous code
> must be preceeded by the following partition creation (I think the
> parted lines need the -s arg)
> 
> <snip>
> dd if=/dev/zero of=file bs=1024c count=100
> parted file mklabel msdos
> parted file unit s mkpart extended 32s 127s
> parted file unit s mkpart logical 64s 127s
> </snip>
> 
> I have attached a bash script of what I think the test should look like.
> IMO its much cleaner than what you propose.  Pls have a look and tell me
> what you think.

Yes, let's keep the test simple. So if you agree, I will rework the
test according to your script, but with [*].


Thanks a lot for your feedback!


> > +test_expect_success \
> > +	'Get start of extended partition' \
> > +	'ep_start=`parted -s $dev unit B print | grep extended | sed -e "s/^ *[[:digit:]]* *\([[:digit:]]*\)B.*$/\1/"`'
> > +
> > +test_expect_success \
> > +	'Prepare fake bootcode' \
> > +	'rm -rf $bootcode && for char in `seq 1 440`; do echo -n "X" >> $bootcode; done'
> > +
> > +test_expect_success \
> > +	'Install fake bootcode' \
> > +	'dd if=$bootcode of=$dev bs=1 seek=$ep_start count=$bootcode_size conv=notrunc 2> /dev/null'
> > +
> > +test_expect_success \
> > +	'Save fake bootcode for later comparison' \
> > +	'dd if=$dev of=$bootcode_before bs=1 skip=$ep_start count=$bootcode_size 2>/dev/null'
> > +
> > +test_expect_success \
> > +	'Unset bootflag for logical partition' \
> > +	'parted -s $dev set 5 boot of > out 2>&1'
> > +test_expect_success 'Expect no output' 'compare out /dev/null'
> > +
> > +test_expect_success \
> > +	'Retrieve bootcode after parted operation' \
> > +	'dd if=$dev of=$bootcode_after bs=1 skip=$ep_start count=$bootcode_size 2>/dev/null'
> > +
> > +test_expect_success \
> > +	'Expect bootcode has not changed' \
> > +	'compare $bootcode_before $bootcode_after'
> > +
> > +test_done
> > -- 
> > 1.6.3
> > 
> > 

> #!/bin/bash
> 
> parted="sudo /usr/local/sbin/parted"
> # Create the test label
> dd if=/dev/zero of=file bs=1024c count=100
> $parted -s file mklabel msdos
> $parted -s file unit s mkpart extended 32s 127s
> $parted -s file unit s mkpart logical 64s 127s
> 
> # Install the boot code
> dd if=file of=file2 bs=512c count=32
> dd if=/dev/urandom of=file2 seek=16384c bs=1c count=440
> dd if=file of=file2 skip=16824 seek=16824 bs=1c count=85576
> mv file2 file
> 
> # Print so we can see its still valid (not in the real test)
> $parted -s file unit s print free
> 
> # extract the boot code for comparison.
> dd if=file of=before skip=16384 bs=1c count=440
> 
> # do something to the label
> $parted -s file rm 5
> 
> # extract the boot code for comparison.
> dd if=file of=after skip=16384 bs=1c count=440
> 
> #compare
> diff before after
> 
> # Print so we can see its still valid (not in the real test)
> $parted -s file unit s print free
> 
> rm file before after

-- 
Best regards / s pozdravem

Petr Uzel, Packages maintainer
---------------------------------------------------------------------
SUSE LINUX, s.r.o.                          e-mail: puzel at suse.cz
Lihovarská 1060/12                          tel: +420 284 028 964
190 00 Prague 9                             fax: +420 284 028 951
Czech Republic                              http://www.suse.cz



More information about the parted-devel mailing list