android_external_toybox/tests/dd.test

129 lines
5.1 KiB
Plaintext
Raw Normal View History

#!/bin/bash
# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
2023-07-23 09:18:31 -07:00
# TODO test skip= for seekable and nonseekable input.
# TODO bs overrides ibs= and obs=, and disables block aggregation
[ -f testing.sh ] && . testing.sh
# 'dd' command, stderr prints redirecting to /dev/null
exec 2>/dev/null
#testing "name" "command" "result" "infile" "stdin"
# Test suffixed number parsing; `count` is representative.
testcmd "count=2" "if=input count=2 ibs=1" "hi" "high\n" ""
testcmd "count= 2" "if=input 'count= 2' ibs=1" "hi" "high\n" ""
toyonly testcmd "count=0x2" "if=input 'count=0x2' ibs=1" "hi" "high\n" ""
testcmd 'posix 2x3x4' "if=input count=2x3x4 ibs=1" \
'abcdefghijklmnopqrstuvwx' 'abcdefghijklmnopqrstuvwxyz' ''
testcmd "count=-2" "if=input 'count=-2' ibs=1 || echo errored" "errored\n" "" ""
testcmd "if=(file)" "if=input" "I WANT\n" "I WANT\n" ""
testcmd "of=(file)" "of=file && cat file" "I WANT\n" "" "I WANT\n"
testcmd "if=file of=file" "if=input of=foo && cat foo && rm -f foo" \
"I WANT\n" "I WANT\n" ""
testcmd "if=file | dd of=file" "if=input | dd of=foo && cat foo && rm -f foo" \
"I WANT\n" "I WANT\n" ""
testcmd "(stdout)" '' "I WANT\n" "" "I WANT\n"
testcmd "sync,noerror" \
"if=input of=outFile seek=8860 bs=1M conv=sync,noerror &&
stat -c \"%s\" outFile && rm -f outFile" "9291431936\n" "I WANT\n" ""
testcmd "if=file of=(null)" "if=input of=/dev/null && echo 'yes'" "yes\n" \
"I WANT\n" ""
testcmd "with if of bs" \
"if=/dev/zero of=sda.txt bs=512 count=1 &&
stat -c '%s' sda.txt && rm -f sda.txt" "512\n" "" ""
testcmd "with if of ibs obs" \
"if=/dev/zero of=sda.txt ibs=512 obs=256 count=1 &&
stat -c '%s' sda.txt && rm -f sda.txt" "512\n" "" ""
2023-07-23 09:18:31 -07:00
// TODO check block size of transactions
testcmd "with if of ibs obs count" \
"if=/dev/zero of=sda.txt ibs=512 obs=256 count=3 &&
stat -c '%s' sda.txt && rm -f sda.txt" "1536\n" "" ""
ln -s input softlink
testcmd "if=softlink" "if=softlink" "I WANT\n" "I WANT\n" ""
rm -f softlink
ln -s file softlink
testcmd "if=file of=softlink" "if=input of=softlink &&
[ -f file -a -L softlink ] && cat softlink" "I WANT\n" "I WANT\n" ""
rm -f softlink file
testcmd "if=file of=file (same file)" "if=input of=input &&
[ -f input ] && cat input && echo 'yes'" "yes\n" "I WANT\n" ""
testcmd "same file notrunc" \
"if=input of=input conv=notrunc && cat input" "I WANT\n" "I WANT\n" ""
2023-07-23 09:18:31 -07:00
testcmd "seek truncate" \
'of=input bs=3 count=2 seek=7 oflag=seek_bytes && cat input' \
'1234567ABCDEF' '1234567890abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJK'
testcmd "seek notrunc" \
'of=input bs=3 count=2 seek=7 conv=notrunc oflag=seek_bytes && cat input' \
'1234567ABCDEFdefghijklmnopqrstuvwxyz' '1234567890abcdefghijklmnopqrstuvwxyz'\
'ABCDEFGHIJK'
testcmd "with ibs obs bs" "ibs=2 obs=5 bs=9" "I WANT\n" "" "I WANT\n"
testcmd "with ibs obs bs if" "ibs=2 obs=5 bs=9 if=input" "I WANT\n" "I WANT\n"\
""
testcmd "with ibs obs count" "ibs=1 obs=1 count=1" "I" "" "I WANT\n"
testcmd "with ibs obs count if" "ibs=1 obs=1 count=3 if=input" "I W" "I WANT\n"\
""
testcmd "with count" "count=1" "I WANT\n" "" "I WANT\n"
testcmd "with count if" "count=1 if=input" "I WANT\n" "I WANT\n" ""
testcmd "with skip" "skip=0" "I WANT\n" "" "I WANT\n"
testcmd "with skip if" "skip=0 if=input" "I WANT\n" "I WANT\n" ""
testcmd "with seek" "seek=0" "I WANT\n" "" "I WANT\n"
testcmd "with seek if" "seek=0 if=input" "I WANT\n" "I WANT\n" ""
# Testing only 'notrunc', 'noerror', 'fsync', 'sync'
testcmd "conv=notrunc" "conv=notrunc" "I WANT\n" "" "I WANT\n"
testcmd "conv=notrunc with IF" "conv=notrunc if=input" "I WANT\n" \
"I WANT\n" ""
testcmd "conv=noerror" "conv=noerror" "I WANT\n" "" "I WANT\n"
testcmd "conv=noerror with IF" "conv=noerror if=input" "I WANT\n" \
"I WANT\n" ""
testcmd "conv=fsync" "conv=fsync" "I WANT\n" "" "I WANT\n"
testcmd "conv=fsync with IF" "conv=fsync if=input" "I WANT\n" \
"I WANT\n" ""
testcmd "conv=sync" "conv=sync | head -n 1" "I WANT\n" "" "I WANT\n"
testcmd "conv=sync with IF" "conv=sync if=input | head -n 1" "I WANT\n" \
"I WANT\n" ""
# status=noxfer|none
testcmd "status=noxfer" "if=input status=noxfer ibs=1 2>&1" \
"input\n6+0 records in\n0+1 records out\n" "input\n" ""
testcmd "status=none" "if=input status=none ibs=1 2>&1" \
"input\n" "input\n" ""
2019-07-09 09:49:12 -07:00
testing "seek stdout" "yes | dd bs=8 seek=2 count=1 > out && xxd -p out" \
2019-07-09 09:49:12 -07:00
"00000000000000000000000000000000790a790a790a790a\n" "" ""
dd: iflags, oflags, fix ^C, fix the fundamental loop. Investigating why the toybox tar tests fail on Android with toybox dd, I realized I was rewriting a part of dd I'd rewritten before! This is a re-send of my 2019-02-22 patch, rebased against the current ToT... This patch was originally motivated because after suggesting to the author of https://stackoverflow.com/questions/17157820/access-vdsolinux/54797221#54797221 that he could tell dd to work in bytes rather than blocks, I realized that our dd doesn't actually support that. But the rewrite of the main loop is necessary to fix the incorrect output from the dd calls in the tar test. Without this patch, `yes | dd bs=65536 count=1 > fweep` basically gives random output, based on how many bytes the pipe feels like giving you in your first read. (As far as I know, dd *without* bs= was fine, but I can't guarantee that that's true, just that I haven't seen it fail.) Also switch to TAGGED_ARRAY and comma_* for conv rather than add two more copies of an undesired idiom. It turned out -- contrary to the belief of cp(1) -- that comma_scan isn't suitable for this because of its magic handling of "no" prefixes. (It's actually harmless in cp because none of the --preserve options begin with "no", but some dd options do.) To this end, comma_remove is a less-magic comma_scan. I've also changed an `if` to a `while` because other implementations allow things like `--preserve=mode,mode` or `conv=sync,sync`. (If we decide this is a bug rather than a feature, we should at least fix the error message to be clear that we're rejecting the *duplication*, not the option itself.) I've also fixed the ^C behavior by simply adding a direct SIGINT handler rather than trying to be clever inside the read loop (which is why we weren't handling the SIGINT until the read returned). I've also removed `strstarteq` and just added the '=' to each literal when calling regular `strstart`. Plus basic tests.
2019-07-09 16:08:16 -07:00
# Duplicated options are fine.
testcmd "conv=sync,sync" "conv=sync,sync | head -n 1" "I WANT\n" "" "I WANT\n"
dd: iflags, oflags, fix ^C, fix the fundamental loop. Investigating why the toybox tar tests fail on Android with toybox dd, I realized I was rewriting a part of dd I'd rewritten before! This is a re-send of my 2019-02-22 patch, rebased against the current ToT... This patch was originally motivated because after suggesting to the author of https://stackoverflow.com/questions/17157820/access-vdsolinux/54797221#54797221 that he could tell dd to work in bytes rather than blocks, I realized that our dd doesn't actually support that. But the rewrite of the main loop is necessary to fix the incorrect output from the dd calls in the tar test. Without this patch, `yes | dd bs=65536 count=1 > fweep` basically gives random output, based on how many bytes the pipe feels like giving you in your first read. (As far as I know, dd *without* bs= was fine, but I can't guarantee that that's true, just that I haven't seen it fail.) Also switch to TAGGED_ARRAY and comma_* for conv rather than add two more copies of an undesired idiom. It turned out -- contrary to the belief of cp(1) -- that comma_scan isn't suitable for this because of its magic handling of "no" prefixes. (It's actually harmless in cp because none of the --preserve options begin with "no", but some dd options do.) To this end, comma_remove is a less-magic comma_scan. I've also changed an `if` to a `while` because other implementations allow things like `--preserve=mode,mode` or `conv=sync,sync`. (If we decide this is a bug rather than a feature, we should at least fix the error message to be clear that we're rejecting the *duplication*, not the option itself.) I've also fixed the ^C behavior by simply adding a direct SIGINT handler rather than trying to be clever inside the read loop (which is why we weren't handling the SIGINT until the read returned). I've also removed `strstarteq` and just added the '=' to each literal when calling regular `strstart`. Plus basic tests.
2019-07-09 16:08:16 -07:00
# _bytes options
testcmd "iflag=count_bytes" "if=input count=2 ibs=4096 iflag=count_bytes" "hi"\
"high" ""
testcmd "iflag=skip_bytes" "if=input skip=2 ibs=4096 iflag=skip_bytes" "gh" \
"high" ""
testcmd "oflag=seek_bytes" \
"if=input of=output seek=2 obs=4096 oflag=seek_bytes status=none && \
dd: iflags, oflags, fix ^C, fix the fundamental loop. Investigating why the toybox tar tests fail on Android with toybox dd, I realized I was rewriting a part of dd I'd rewritten before! This is a re-send of my 2019-02-22 patch, rebased against the current ToT... This patch was originally motivated because after suggesting to the author of https://stackoverflow.com/questions/17157820/access-vdsolinux/54797221#54797221 that he could tell dd to work in bytes rather than blocks, I realized that our dd doesn't actually support that. But the rewrite of the main loop is necessary to fix the incorrect output from the dd calls in the tar test. Without this patch, `yes | dd bs=65536 count=1 > fweep` basically gives random output, based on how many bytes the pipe feels like giving you in your first read. (As far as I know, dd *without* bs= was fine, but I can't guarantee that that's true, just that I haven't seen it fail.) Also switch to TAGGED_ARRAY and comma_* for conv rather than add two more copies of an undesired idiom. It turned out -- contrary to the belief of cp(1) -- that comma_scan isn't suitable for this because of its magic handling of "no" prefixes. (It's actually harmless in cp because none of the --preserve options begin with "no", but some dd options do.) To this end, comma_remove is a less-magic comma_scan. I've also changed an `if` to a `while` because other implementations allow things like `--preserve=mode,mode` or `conv=sync,sync`. (If we decide this is a bug rather than a feature, we should at least fix the error message to be clear that we're rejecting the *duplication*, not the option itself.) I've also fixed the ^C behavior by simply adding a direct SIGINT handler rather than trying to be clever inside the read loop (which is why we weren't handling the SIGINT until the read returned). I've also removed `strstarteq` and just added the '=' to each literal when calling regular `strstart`. Plus basic tests.
2019-07-09 16:08:16 -07:00
xxd -p output" "000030313233\n" "0123" ""
2023-07-23 09:18:31 -07:00
# The sleep decouples input blocks to force short reads for conv=sync to pad
testing 'sync padding ticks down count' \
'for i in one two three four five "$(seq 1 100)"
do echo "$i"; sleep .1; done | dd bs=1024 count=5 conv=sync | sha1sum' \
'02dcf1f497ccbe940f57818dfc34f2d0def8b3f9 -\n' '' ''