xref: /aosp_15_r20/external/toybox/tests/dd.test (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash
2*cf5a6c84SAndroid Build Coastguard Worker
3*cf5a6c84SAndroid Build Coastguard Worker# Copyright 2013 Robin Mittal <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker# Copyright 2013 Divya Kothari <[email protected]>
5*cf5a6c84SAndroid Build Coastguard Worker
6*cf5a6c84SAndroid Build Coastguard Worker# TODO test skip= for seekable and nonseekable input.
7*cf5a6c84SAndroid Build Coastguard Worker# TODO bs overrides ibs= and obs=, and disables block aggregation
8*cf5a6c84SAndroid Build Coastguard Worker
9*cf5a6c84SAndroid Build Coastguard Worker[ -f testing.sh ] && . testing.sh
10*cf5a6c84SAndroid Build Coastguard Worker
11*cf5a6c84SAndroid Build Coastguard Worker# 'dd' command, stderr prints redirecting to /dev/null
12*cf5a6c84SAndroid Build Coastguard Workerexec 2>/dev/null
13*cf5a6c84SAndroid Build Coastguard Worker
14*cf5a6c84SAndroid Build Coastguard Worker#testing "name" "command" "result" "infile" "stdin"
15*cf5a6c84SAndroid Build Coastguard Worker
16*cf5a6c84SAndroid Build Coastguard Worker# Test suffixed number parsing; `count` is representative.
17*cf5a6c84SAndroid Build Coastguard Workertestcmd "count=2" "if=input count=2 ibs=1" "hi" "high\n" ""
18*cf5a6c84SAndroid Build Coastguard Workertestcmd "count= 2" "if=input 'count= 2' ibs=1" "hi" "high\n" ""
19*cf5a6c84SAndroid Build Coastguard Workertoyonly testcmd "count=0x2" "if=input 'count=0x2' ibs=1" "hi" "high\n" ""
20*cf5a6c84SAndroid Build Coastguard Workertestcmd 'posix 2x3x4' "if=input count=2x3x4 ibs=1" \
21*cf5a6c84SAndroid Build Coastguard Worker  'abcdefghijklmnopqrstuvwx' 'abcdefghijklmnopqrstuvwxyz' ''
22*cf5a6c84SAndroid Build Coastguard Workertestcmd "count=-2" "if=input 'count=-2' ibs=1 || echo errored" "errored\n" "" ""
23*cf5a6c84SAndroid Build Coastguard Worker
24*cf5a6c84SAndroid Build Coastguard Workertestcmd "if=(file)" "if=input" "I WANT\n" "I WANT\n" ""
25*cf5a6c84SAndroid Build Coastguard Workertestcmd "of=(file)" "of=file && cat file" "I WANT\n" "" "I WANT\n"
26*cf5a6c84SAndroid Build Coastguard Workertestcmd "if=file of=file" "if=input of=foo && cat foo && rm -f foo" \
27*cf5a6c84SAndroid Build Coastguard Worker  "I WANT\n" "I WANT\n" ""
28*cf5a6c84SAndroid Build Coastguard Workertestcmd "if=file | dd of=file" "if=input | dd of=foo && cat foo && rm -f foo" \
29*cf5a6c84SAndroid Build Coastguard Worker  "I WANT\n" "I WANT\n" ""
30*cf5a6c84SAndroid Build Coastguard Workertestcmd "(stdout)" '' "I WANT\n" "" "I WANT\n"
31*cf5a6c84SAndroid Build Coastguard Workertestcmd "sync,noerror" \
32*cf5a6c84SAndroid Build Coastguard Worker  "if=input of=outFile seek=8860 bs=1M conv=sync,noerror &&
33*cf5a6c84SAndroid Build Coastguard Worker   stat -c \"%s\" outFile && rm -f outFile" "9291431936\n" "I WANT\n" ""
34*cf5a6c84SAndroid Build Coastguard Workertestcmd "if=file of=(null)" "if=input of=/dev/null && echo 'yes'" "yes\n" \
35*cf5a6c84SAndroid Build Coastguard Worker  "I WANT\n" ""
36*cf5a6c84SAndroid Build Coastguard Workertestcmd "with if of bs" \
37*cf5a6c84SAndroid Build Coastguard Worker  "if=/dev/zero of=sda.txt bs=512 count=1 &&
38*cf5a6c84SAndroid Build Coastguard Worker   stat -c '%s' sda.txt && rm -f sda.txt" "512\n" "" ""
39*cf5a6c84SAndroid Build Coastguard Workertestcmd "with if of ibs obs" \
40*cf5a6c84SAndroid Build Coastguard Worker  "if=/dev/zero of=sda.txt ibs=512 obs=256 count=1 &&
41*cf5a6c84SAndroid Build Coastguard Worker   stat -c '%s' sda.txt && rm -f sda.txt" "512\n" "" ""
42*cf5a6c84SAndroid Build Coastguard Worker// TODO check block size of transactions
43*cf5a6c84SAndroid Build Coastguard Workertestcmd "with if of ibs obs count" \
44*cf5a6c84SAndroid Build Coastguard Worker  "if=/dev/zero of=sda.txt ibs=512 obs=256 count=3 &&
45*cf5a6c84SAndroid Build Coastguard Worker   stat -c '%s' sda.txt && rm -f sda.txt" "1536\n" "" ""
46*cf5a6c84SAndroid Build Coastguard Worker
47*cf5a6c84SAndroid Build Coastguard Workerln -s input softlink
48*cf5a6c84SAndroid Build Coastguard Workertestcmd "if=softlink" "if=softlink" "I WANT\n" "I WANT\n" ""
49*cf5a6c84SAndroid Build Coastguard Workerrm -f softlink
50*cf5a6c84SAndroid Build Coastguard Worker
51*cf5a6c84SAndroid Build Coastguard Workerln -s file softlink
52*cf5a6c84SAndroid Build Coastguard Workertestcmd "if=file of=softlink" "if=input of=softlink &&
53*cf5a6c84SAndroid Build Coastguard Worker   [ -f file -a -L softlink ] && cat softlink" "I WANT\n" "I WANT\n" ""
54*cf5a6c84SAndroid Build Coastguard Workerrm -f softlink file
55*cf5a6c84SAndroid Build Coastguard Worker
56*cf5a6c84SAndroid Build Coastguard Workertestcmd "if=file of=file (same file)" "if=input of=input &&
57*cf5a6c84SAndroid Build Coastguard Worker   [ -f input ] && cat input && echo 'yes'" "yes\n" "I WANT\n" ""
58*cf5a6c84SAndroid Build Coastguard Workertestcmd "same file notrunc" \
59*cf5a6c84SAndroid Build Coastguard Worker  "if=input of=input conv=notrunc && cat input" "I WANT\n" "I WANT\n" ""
60*cf5a6c84SAndroid Build Coastguard Workertestcmd "seek truncate" \
61*cf5a6c84SAndroid Build Coastguard Worker  'of=input bs=3 count=2 seek=7 oflag=seek_bytes && cat input' \
62*cf5a6c84SAndroid Build Coastguard Worker  '1234567ABCDEF' '1234567890abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJK'
63*cf5a6c84SAndroid Build Coastguard Workertestcmd "seek notrunc" \
64*cf5a6c84SAndroid Build Coastguard Worker  'of=input bs=3 count=2 seek=7 conv=notrunc oflag=seek_bytes && cat input' \
65*cf5a6c84SAndroid Build Coastguard Worker  '1234567ABCDEFdefghijklmnopqrstuvwxyz' '1234567890abcdefghijklmnopqrstuvwxyz'\
66*cf5a6c84SAndroid Build Coastguard Worker  'ABCDEFGHIJK'
67*cf5a6c84SAndroid Build Coastguard Worker
68*cf5a6c84SAndroid Build Coastguard Workertestcmd "with ibs obs bs" "ibs=2 obs=5 bs=9" "I WANT\n" "" "I WANT\n"
69*cf5a6c84SAndroid Build Coastguard Workertestcmd "with ibs obs bs if" "ibs=2 obs=5 bs=9 if=input" "I WANT\n" "I WANT\n"\
70*cf5a6c84SAndroid Build Coastguard Worker  ""
71*cf5a6c84SAndroid Build Coastguard Worker
72*cf5a6c84SAndroid Build Coastguard Workertestcmd "with ibs obs count" "ibs=1 obs=1 count=1" "I" "" "I WANT\n"
73*cf5a6c84SAndroid Build Coastguard Workertestcmd "with ibs obs count if" "ibs=1 obs=1 count=3 if=input" "I W" "I WANT\n"\
74*cf5a6c84SAndroid Build Coastguard Worker  ""
75*cf5a6c84SAndroid Build Coastguard Worker
76*cf5a6c84SAndroid Build Coastguard Workertestcmd "with count" "count=1" "I WANT\n" "" "I WANT\n"
77*cf5a6c84SAndroid Build Coastguard Workertestcmd "with count if" "count=1 if=input" "I WANT\n" "I WANT\n" ""
78*cf5a6c84SAndroid Build Coastguard Worker
79*cf5a6c84SAndroid Build Coastguard Workertestcmd "with skip" "skip=0" "I WANT\n" "" "I WANT\n"
80*cf5a6c84SAndroid Build Coastguard Workertestcmd "with skip if" "skip=0 if=input" "I WANT\n" "I WANT\n" ""
81*cf5a6c84SAndroid Build Coastguard Worker
82*cf5a6c84SAndroid Build Coastguard Workertestcmd "with seek" "seek=0" "I WANT\n" "" "I WANT\n"
83*cf5a6c84SAndroid Build Coastguard Workertestcmd "with seek if" "seek=0 if=input" "I WANT\n" "I WANT\n" ""
84*cf5a6c84SAndroid Build Coastguard Worker
85*cf5a6c84SAndroid Build Coastguard Worker# Testing only 'notrunc', 'noerror', 'fsync', 'sync'
86*cf5a6c84SAndroid Build Coastguard Worker
87*cf5a6c84SAndroid Build Coastguard Workertestcmd "conv=notrunc" "conv=notrunc" "I WANT\n" "" "I WANT\n"
88*cf5a6c84SAndroid Build Coastguard Workertestcmd "conv=notrunc with IF" "conv=notrunc if=input" "I WANT\n" \
89*cf5a6c84SAndroid Build Coastguard Worker  "I WANT\n" ""
90*cf5a6c84SAndroid Build Coastguard Worker
91*cf5a6c84SAndroid Build Coastguard Workertestcmd "conv=noerror" "conv=noerror" "I WANT\n" "" "I WANT\n"
92*cf5a6c84SAndroid Build Coastguard Workertestcmd "conv=noerror with IF" "conv=noerror if=input" "I WANT\n" \
93*cf5a6c84SAndroid Build Coastguard Worker  "I WANT\n" ""
94*cf5a6c84SAndroid Build Coastguard Worker
95*cf5a6c84SAndroid Build Coastguard Workertestcmd "conv=fsync" "conv=fsync" "I WANT\n" "" "I WANT\n"
96*cf5a6c84SAndroid Build Coastguard Workertestcmd "conv=fsync with IF" "conv=fsync if=input" "I WANT\n" \
97*cf5a6c84SAndroid Build Coastguard Worker  "I WANT\n" ""
98*cf5a6c84SAndroid Build Coastguard Worker
99*cf5a6c84SAndroid Build Coastguard Workertestcmd "conv=sync" "conv=sync | head -n 1" "I WANT\n" "" "I WANT\n"
100*cf5a6c84SAndroid Build Coastguard Workertestcmd "conv=sync with IF" "conv=sync if=input | head -n 1" "I WANT\n" \
101*cf5a6c84SAndroid Build Coastguard Worker  "I WANT\n" ""
102*cf5a6c84SAndroid Build Coastguard Worker
103*cf5a6c84SAndroid Build Coastguard Worker# status=noxfer|none
104*cf5a6c84SAndroid Build Coastguard Workertestcmd "status=noxfer" "if=input status=noxfer ibs=1 2>&1" \
105*cf5a6c84SAndroid Build Coastguard Worker  "input\n6+0 records in\n0+1 records out\n" "input\n" ""
106*cf5a6c84SAndroid Build Coastguard Workertestcmd "status=none" "if=input status=none ibs=1 2>&1" \
107*cf5a6c84SAndroid Build Coastguard Worker "input\n" "input\n" ""
108*cf5a6c84SAndroid Build Coastguard Worker
109*cf5a6c84SAndroid Build Coastguard Workertesting "seek stdout" "yes | dd bs=8 seek=2 count=1 > out && xxd -p out" \
110*cf5a6c84SAndroid Build Coastguard Worker  "00000000000000000000000000000000790a790a790a790a\n" "" ""
111*cf5a6c84SAndroid Build Coastguard Worker
112*cf5a6c84SAndroid Build Coastguard Worker# Duplicated options are fine.
113*cf5a6c84SAndroid Build Coastguard Workertestcmd "conv=sync,sync" "conv=sync,sync | head -n 1" "I WANT\n" "" "I WANT\n"
114*cf5a6c84SAndroid Build Coastguard Worker
115*cf5a6c84SAndroid Build Coastguard Worker# _bytes options
116*cf5a6c84SAndroid Build Coastguard Workertestcmd "iflag=count_bytes" "if=input count=2 ibs=4096 iflag=count_bytes" "hi"\
117*cf5a6c84SAndroid Build Coastguard Worker  "high" ""
118*cf5a6c84SAndroid Build Coastguard Workertestcmd "iflag=skip_bytes" "if=input skip=2 ibs=4096 iflag=skip_bytes" "gh" \
119*cf5a6c84SAndroid Build Coastguard Worker  "high" ""
120*cf5a6c84SAndroid Build Coastguard Workertestcmd "oflag=seek_bytes" \
121*cf5a6c84SAndroid Build Coastguard Worker  "if=input of=output seek=2 obs=4096 oflag=seek_bytes status=none && \
122*cf5a6c84SAndroid Build Coastguard Worker   xxd -p output" "000030313233\n" "0123" ""
123*cf5a6c84SAndroid Build Coastguard Worker
124*cf5a6c84SAndroid Build Coastguard Worker# The sleep decouples input blocks to force short reads for conv=sync to pad
125*cf5a6c84SAndroid Build Coastguard Workertesting 'sync padding ticks down count' \
126*cf5a6c84SAndroid Build Coastguard Worker  'for i in one two three four five "$(seq 1 100)"
127*cf5a6c84SAndroid Build Coastguard Worker   do echo "$i"; sleep .1; done | dd bs=1024 count=5 conv=sync | sha1sum' \
128*cf5a6c84SAndroid Build Coastguard Worker  '02dcf1f497ccbe940f57818dfc34f2d0def8b3f9  -\n' '' ''
129