| 1 | #!/usr/bin/env bash |
| 2 | # |
| 3 | # Copyright (c) 2014 Christian Couder |
| 4 | # MIT Licensed; see the LICENSE file in this repository. |
| 5 | # |
| 6 | |
| 7 | test_description="Test block command" |
| 8 | |
| 9 | . lib/test-lib.sh |
| 10 | |
| 11 | test_init_ipfs |
| 12 | |
| 13 | HASH="bafkreibmlvvgdyihetgocpof6xk64kjjzdeq2e4c7hqs3krdheosk4tgj4" |
| 14 | HASHB="bafkreihfsphazrk2ilejpekyltjeh5k4yvwgjuwg26ueafohqioeo3sdca" |
| 15 | |
| 16 | HASHV0="QmRKqGMAM6EZngbpjSqrvYzq5Qd8b1bSWymjSUY9zQSNDk" |
| 17 | HASHBV0="QmdnpnsaEj69isdw5sNzp3h3HkaDz7xKq7BmvFFBzNr5e7" |
| 18 | |
| 19 | # "block put tests" |
| 20 | # |
| 21 | |
| 22 | test_expect_success "'ipfs block put' succeeds" ' |
| 23 | echo "Hello Mars!" >expected_in && |
| 24 | ipfs block put <expected_in | tee actual_out |
| 25 | ' |
| 26 | |
| 27 | test_expect_success "'ipfs block put' output looks good" ' |
| 28 | echo "$HASH" >expected_out && |
| 29 | test_cmp expected_out actual_out |
| 30 | ' |
| 31 | |
| 32 | test_expect_success "'ipfs block put' with 2 files succeeds" ' |
| 33 | echo "Hello Mars!" > a && |
| 34 | echo "Hello Venus!" > b && |
| 35 | ipfs block put a b | tee actual_out |
| 36 | ' |
| 37 | |
| 38 | test_expect_success "'ipfs block put' output looks good" ' |
| 39 | echo "$HASH" >expected_out && |
| 40 | echo "$HASHB" >>expected_out && |
| 41 | test_cmp expected_out actual_out |
| 42 | ' |
| 43 | |
| 44 | test_expect_success "can set cid codec on block put" ' |
| 45 | CODEC_HASH=$(ipfs block put --cid-codec=dag-pb ../t0050-block-data/testPut.pb) |
| 46 | ' |
| 47 | |
| 48 | test_expect_success "block get output looks right" ' |
| 49 | ipfs block get $CODEC_HASH > pb_block_out && |
| 50 | test_cmp pb_block_out ../t0050-block-data/testPut.pb |
| 51 | ' |
| 52 | |
| 53 | # |
| 54 | # "block get" tests |
| 55 | # |
| 56 | |
| 57 | test_expect_success "'ipfs block get' succeeds" ' |
| 58 | ipfs block get $HASH >actual_in |
| 59 | ' |
| 60 | |
| 61 | test_expect_success "'ipfs block get' output looks good" ' |
| 62 | test_cmp expected_in actual_in |
| 63 | ' |
| 64 | |
| 65 | # |
| 66 | # "block stat" tests |
| 67 | # |
| 68 | |
| 69 | test_expect_success "'ipfs block stat' succeeds" ' |
| 70 | ipfs block stat $HASH >actual_stat |
| 71 | ' |
| 72 | |
| 73 | test_expect_success "'ipfs block stat' output looks good" ' |
| 74 | echo "Key: $HASH" >expected_stat && |
| 75 | echo "Size: 12" >>expected_stat && |
| 76 | test_cmp expected_stat actual_stat |
| 77 | ' |
| 78 | |
| 79 | # |
| 80 | # "block rm" tests |
| 81 | # |
| 82 | |
| 83 | test_expect_success "'ipfs block rm' succeeds" ' |
| 84 | ipfs block rm $HASH >actual_rm |
| 85 | ' |
| 86 | |
| 87 | test_expect_success "'ipfs block rm' output looks good" ' |
| 88 | echo "removed $HASH" > expected_rm && |
| 89 | test_cmp expected_rm actual_rm |
| 90 | ' |
| 91 | |
| 92 | test_expect_success "'ipfs block rm' block actually removed" ' |
| 93 | test_must_fail ipfs block stat $HASH |
| 94 | ' |
| 95 | |
| 96 | RANDOMHASH=QmRKqGMAM6EbngbZjSqrvYzq5Qd8b1bSWymjSUY9zQSNDq |
| 97 | DIRHASH=QmdWmVmM6W2abTgkEfpbtA1CJyTWS2rhuUB9uP1xV8Uwtf |
| 98 | FILE1HASH=Qmae3RedM7SNkWGsdzYzsr6svmsFdsva4WoTvYYsWhUSVz |
| 99 | FILE2HASH=QmUtkGLvPf63NwVzLPKPUYgwhn8ZYPWF6vKWN3fZ2amfJF |
| 100 | FILE3HASH=Qmesmmf1EEG1orJb6XdK6DabxexsseJnCfw8pqWgonbkoj |
| 101 | TESTHASH=QmeomffUNfmQy76CQGy9NdmqEnnHU9soCexBnGU3ezPHVH |
| 102 | |
| 103 | test_expect_success "add and pin directory" ' |
| 104 | echo "test" | ipfs add --pin=false && |
| 105 | mkdir adir && |
| 106 | echo "file1" > adir/file1 && |
| 107 | echo "file2" > adir/file2 && |
| 108 | echo "file3" > adir/file3 && |
| 109 | ipfs add -r adir |
| 110 | ipfs pin add -r $DIRHASH |
| 111 | ' |
| 112 | |
| 113 | test_expect_success "can't remove pinned block" ' |
| 114 | test_must_fail ipfs block rm $DIRHASH 2> block_rm_err |
| 115 | ' |
| 116 | |
| 117 | test_expect_success "can't remove pinned block: output looks good" ' |
| 118 | grep -q "$DIRHASH: pinned: recursive" block_rm_err |
| 119 | ' |
| 120 | |
| 121 | test_expect_success "can't remove indirectly pinned block" ' |
| 122 | test_must_fail ipfs block rm $FILE1HASH 2> block_rm_err |
| 123 | ' |
| 124 | |
| 125 | test_expect_success "can't remove indirectly pinned block: output looks good" ' |
| 126 | grep -q "$FILE1HASH: pinned via $DIRHASH" block_rm_err |
| 127 | ' |
| 128 | |
| 129 | test_expect_success "remove pin" ' |
| 130 | ipfs pin rm -r $DIRHASH |
| 131 | ' |
| 132 | |
| 133 | test_expect_success "multi-block 'ipfs block rm' succeeds" ' |
| 134 | ipfs block rm $FILE1HASH $FILE2HASH $FILE3HASH > actual_rm |
| 135 | ' |
| 136 | |
| 137 | test_expect_success "multi-block 'ipfs block rm' output looks good" ' |
| 138 | grep -F -q "removed $FILE1HASH" actual_rm && |
| 139 | grep -F -q "removed $FILE2HASH" actual_rm && |
| 140 | grep -F -q "removed $FILE3HASH" actual_rm |
| 141 | ' |
| 142 | |
| 143 | test_expect_success "multi-block 'ipfs block rm <invalid> <valid> <invalid>'" ' |
| 144 | test_must_fail ipfs block rm $RANDOMHASH $TESTHASH $RANDOMHASH &> actual_mixed_rm |
| 145 | ' |
| 146 | |
| 147 | test_expect_success "multi-block 'ipfs block rm <invalid> <valid> <invalid>' output looks good" ' |
| 148 | echo "cannot remove $RANDOMHASH: ipld: could not find $RANDOMHASH" >> expect_mixed_rm && |
| 149 | echo "removed $TESTHASH" >> expect_mixed_rm && |
| 150 | echo "cannot remove $RANDOMHASH: ipld: could not find $RANDOMHASH" >> expect_mixed_rm && |
| 151 | echo "Error: some blocks not removed" >> expect_mixed_rm |
| 152 | test_cmp actual_mixed_rm expect_mixed_rm |
| 153 | ' |
| 154 | |
| 155 | test_expect_success "'add some blocks' succeeds" ' |
| 156 | echo "Hello Mars!" | ipfs block put && |
| 157 | echo "Hello Venus!" | ipfs block put |
| 158 | ' |
| 159 | |
| 160 | test_expect_success "add and pin directory" ' |
| 161 | ipfs add -r adir |
| 162 | ipfs pin add -r $DIRHASH |
| 163 | ' |
| 164 | |
| 165 | HASH=QmRKqGMAM6EZngbpjSqrvYzq5Qd8b1bSWymjSUY9zQSNDk |
| 166 | HASH2=QmdnpnsaEj69isdw5sNzp3h3HkaDz7xKq7BmvFFBzNr5e7 |
| 167 | |
| 168 | test_expect_success "multi-block 'ipfs block rm' mixed" ' |
| 169 | test_must_fail ipfs block rm $FILE1HASH $DIRHASH $HASH $FILE3HASH $RANDOMHASH $HASH2 2> block_rm_err |
| 170 | ' |
| 171 | |
| 172 | test_expect_success "pinned block not removed" ' |
| 173 | ipfs block stat $FILE1HASH && |
| 174 | ipfs block stat $FILE3HASH |
| 175 | ' |
| 176 | |
| 177 | test_expect_success "non-pinned blocks removed" ' |
| 178 | test_must_fail ipfs block stat $HASH && |
| 179 | test_must_fail ipfs block stat $HASH2 |
| 180 | ' |
| 181 | |
| 182 | test_expect_success "error reported on removing non-existent block" ' |
| 183 | grep -q "cannot remove $RANDOMHASH" block_rm_err |
| 184 | ' |
| 185 | |
| 186 | test_expect_success "'add some blocks' succeeds" ' |
| 187 | echo "Hello Mars!" | ipfs block put && |
| 188 | echo "Hello Venus!" | ipfs block put |
| 189 | ' |
| 190 | |
| 191 | test_expect_success "multi-block 'ipfs block rm -f' with non existent blocks succeed" ' |
| 192 | ipfs block rm -f $HASH $RANDOMHASH $HASH2 |
| 193 | ' |
| 194 | |
| 195 | test_expect_success "existent blocks removed" ' |
| 196 | test_must_fail ipfs block stat $HASH && |
| 197 | test_must_fail ipfs block stat $HASH2 |
| 198 | ' |
| 199 | |
| 200 | test_expect_success "'add some blocks' succeeds" ' |
| 201 | echo "Hello Mars!" | ipfs block put && |
| 202 | echo "Hello Venus!" | ipfs block put |
| 203 | ' |
| 204 | |
| 205 | test_expect_success "multi-block 'ipfs block rm -q' produces no output" ' |
| 206 | ipfs block rm -q $HASH $HASH2 > block_rm_out && |
| 207 | test ! -s block_rm_out |
| 208 | ' |
| 209 | |
| 210 | # --format used 'protobuf' for 'dag-pb' which was invalid, but we keep |
| 211 | # for backward-compatibility |
| 212 | test_expect_success "can set deprecated --format=protobuf on block put" ' |
| 213 | HASH=$(ipfs block put --format=protobuf ../t0050-block-data/testPut.pb) |
| 214 | ' |
| 215 | |
| 216 | test_expect_success "created an object correctly!" ' |
| 217 | ipfs dag get $HASH > obj_out && |
| 218 | echo -n "{\"Data\":{\"/\":{\"bytes\":\"dGVzdCBqc29uIGZvciBzaGFybmVzcyB0ZXN0\"}},\"Links\":[]}" > obj_exp && |
| 219 | test_cmp obj_out obj_exp |
| 220 | ' |
| 221 | |
| 222 | test_expect_success "block get output looks right" ' |
| 223 | ipfs block get $HASH > pb_block_out && |
| 224 | test_cmp pb_block_out ../t0050-block-data/testPut.pb |
| 225 | ' |
| 226 | |
| 227 | test_expect_success "can set --cid-codec=dag-pb on block put" ' |
| 228 | HASH=$(ipfs block put --cid-codec=dag-pb ../t0050-block-data/testPut.pb) |
| 229 | ' |
| 230 | |
| 231 | test_expect_success "created an object correctly!" ' |
| 232 | ipfs dag get $HASH > obj_out && |
| 233 | echo -n "{\"Data\":{\"/\":{\"bytes\":\"dGVzdCBqc29uIGZvciBzaGFybmVzcyB0ZXN0\"}},\"Links\":[]}" > obj_exp && |
| 234 | test_cmp obj_out obj_exp |
| 235 | ' |
| 236 | |
| 237 | test_expect_success "block get output looks right" ' |
| 238 | ipfs block get $HASH > pb_block_out && |
| 239 | test_cmp pb_block_out ../t0050-block-data/testPut.pb |
| 240 | ' |
| 241 | |
| 242 | test_expect_success "can set multihash type and length on block put with --format=raw (deprecated)" ' |
| 243 | HASH=$(echo "foooo" | ipfs block put --format=raw --mhtype=sha3 --mhlen=20) |
| 244 | ' |
| 245 | |
| 246 | test_expect_success "output looks good" ' |
| 247 | test "bafkrifctrq4xazzixy2v4ezymjcvzpskqdwlxra" = "$HASH" |
| 248 | ' |
| 249 | |
| 250 | test_expect_success "can't use both legacy format and custom cid-codec at the same time" ' |
| 251 | test_expect_code 1 ipfs block put --format=dag-cbor --cid-codec=dag-json < ../t0050-block-data/testPut.pb 2> output && |
| 252 | test_should_contain "unable to use \"format\" (deprecated) and a custom \"cid-codec\" at the same time" output |
| 253 | ' |
| 254 | |
| 255 | test_expect_success "can read block with different hash" ' |
| 256 | ipfs block get $HASH > blk_get_out && |
| 257 | echo "foooo" > blk_get_exp && |
| 258 | test_cmp blk_get_exp blk_get_out |
| 259 | ' |
| 260 | # |
| 261 | # Misc tests |
| 262 | # |
| 263 | |
| 264 | test_expect_success "'ipfs block stat' with nothing from stdin doesn't crash" ' |
| 265 | test_expect_code 1 ipfs block stat < /dev/null 2> stat_out |
| 266 | ' |
| 267 | |
| 268 | # lol |
| 269 | test_expect_success "no panic in output" ' |
| 270 | test_expect_code 1 grep "panic" stat_out |
| 271 | ' |
| 272 | |
| 273 | test_expect_success "can set multihash type and length on block put without format or cid-codec" ' |
| 274 | HASH=$(echo "foooo" | ipfs block put --mhtype=sha3 --mhlen=20) |
| 275 | ' |
| 276 | |
| 277 | test_expect_success "output looks good" ' |
| 278 | test "bafkrifctrq4xazzixy2v4ezymjcvzpskqdwlxra" = "$HASH" |
| 279 | ' |
| 280 | |
| 281 | test_expect_success "can set multihash type and length on block put with cid-codec=dag-pb" ' |
| 282 | HASH=$(echo "foooo" | ipfs block put --mhtype=sha3 --mhlen=20 --cid-codec=dag-pb) |
| 283 | ' |
| 284 | |
| 285 | test_expect_success "output looks good" ' |
| 286 | test "bafybifctrq4xazzixy2v4ezymjcvzpskqdwlxra" = "$HASH" |
| 287 | ' |
| 288 | |
| 289 | test_expect_success "put with sha3 and cidv0 fails" ' |
| 290 | echo "foooo" | test_must_fail ipfs block put --mhtype=sha3 --mhlen=20 --format=v0 |
| 291 | ' |
| 292 | |
| 293 | test_expect_success "'ipfs block put' check block size" ' |
| 294 | dd if=/dev/zero bs=2097153 count=1 > over-2MiB-file && |
| 295 | test_expect_code 1 ipfs block put over-2MiB-file >block_put_out 2>&1 |
| 296 | ' |
| 297 | |
| 298 | test_expect_success "ipfs block put output has the correct error" ' |
| 299 | grep "produced block is over 2MiB" block_put_out |
| 300 | ' |
| 301 | |
| 302 | test_expect_success "ipfs block put --allow-big-block=true works" ' |
| 303 | test_expect_code 0 ipfs block put over-2MiB-file --allow-big-block=true && |
| 304 | rm over-2MiB-file |
| 305 | ' |
| 306 | |
| 307 | test_done |