master
sh 442 lines 14.8 KB
Raw
1 #!/usr/bin/env bash
2 #
3 # Copyright (c) 2016 Jeromy Johnson
4 # MIT Licensed; see the LICENSE file in this repository.
5 #
6
7 test_description="Test dag command"
8
9 . lib/test-lib.sh
10
11 test_init_ipfs
12
13 test_expect_success "make a few test files" '
14 echo "foo" > file1 &&
15 echo "bar" > file2 &&
16 echo "baz" > file3 &&
17 echo "qux" > file4 &&
18 HASH1=$(ipfs add --pin=false -q file1) &&
19 HASH2=$(ipfs add --pin=false -q file2) &&
20 HASH3=$(ipfs add --pin=false -q file3) &&
21 HASH4=$(ipfs add --pin=false -q file4)
22 '
23
24 test_expect_success "make an ipld object in dag-json" '
25 printf "{\"hello\":\"world\",\"cats\":[{\"/\":\"%s\"},{\"water\":{\"/\":\"%s\"}}],\"magic\":{\"/\":\"%s\"},\"sub\":{\"dict\":\"ionary\",\"beep\":[0,\"bop\"]}}" $HASH1 $HASH2 $HASH3 > ipld_object
26 '
27
28 # This data is in https://github.com/ipld/codec-fixtures/tree/master/fixtures/dagpb_Data_some
29 test_expect_success "make the same ipld object in dag-cbor, dag-json and dag-pb" '
30 echo "omREYXRhRQABAgMEZUxpbmtzgA==" | base64 -d > ipld_object_dagcbor
31 echo "CgUAAQIDBA==" | base64 -d > ipld_object_dagpb
32 echo "{\"Data\":{\"/\":{\"bytes\":\"AAECAwQ\"}},\"Links\":[]}" > ipld_object_dagjson
33 '
34
35 test_dag_cmd() {
36 # Working with a plain IPLD hello-world object that's dag-json and dag-cbor compatible
37
38 test_expect_success "can add an ipld object using defaults (dag-json to dag-cbor)" '
39 IPLDHASH=$(cat ipld_object | ipfs dag put)
40 '
41
42 test_expect_success "CID looks correct" '
43 EXPHASH="bafyreiblwimnjbqcdoeafiobk6q27jcw64ew7n2fmmhdpldd63edmjecde"
44 test $EXPHASH = $IPLDHASH
45 '
46
47 test_expect_success "'ipfs dag put' check block size" '
48 dd if=/dev/zero bs=2097153 count=1 > over-2MiB-file &&
49 test_expect_code 1 ipfs dag put --input-codec=raw --store-codec=raw over-2MiB-file >dag_put_out 2>&1
50 '
51
52 test_expect_success "ipfs dag put output has the correct error" '
53 grep "produced block is over 2MiB" dag_put_out
54 '
55
56 test_expect_success "ipfs dag put --allow-big-block=true works" '
57 test_expect_code 0 ipfs dag put --input-codec=raw --store-codec=raw over-2MiB-file --allow-big-block=true &&
58 rm over-2MiB-file
59 '
60
61 test_expect_success "can add an ipld object using dag-json to dag-json" '
62 IPLDHASH=$(cat ipld_object | ipfs dag put --input-codec dag-json --store-codec dag-json)
63 '
64
65 test_expect_success "CID looks correct" '
66 EXPHASH="baguqeera6gviseelmbzn2ugoddo5vulxlshqs3kw5ymgsb6w4cabnoh4ldpa"
67 test $EXPHASH = $IPLDHASH
68 '
69
70 test_expect_success "can add an ipld object using dag-json to dag-cbor" '
71 IPLDHASH=$(cat ipld_object | ipfs dag put --input-codec dag-json --store-codec dag-cbor)
72 '
73
74 test_expect_success "CID looks correct" '
75 EXPHASH="bafyreiblwimnjbqcdoeafiobk6q27jcw64ew7n2fmmhdpldd63edmjecde"
76 test $EXPHASH = $IPLDHASH
77 '
78
79 test_expect_success "can add an ipld object using cid-base=base58btc" '
80 IPLDb58HASH=$(cat ipld_object | ipfs dag put -cid-base=base58btc)
81 '
82
83 test_expect_success "CID looks correct" '
84 EXPHASH="zdpuAoN1XJ3GsrxEzMuCbRKZzRUVJekJUCbPVgCgE4D9yYqVi"
85 test $EXPHASH = $IPLDb58HASH
86 '
87
88 # Same object, different forms
89 # (1) dag-cbor input
90
91 test_expect_success "can add a dag-cbor input block stored as dag-cbor" '
92 IPLDCBORHASH=$(cat ipld_object_dagcbor | ipfs dag put --input-codec dag-cbor --store-codec dag-cbor)
93 '
94
95 test_expect_success "dag-cbor CID looks correct" '
96 EXPHASH="bafyreieculsmrexh3ty5jentbvuku452o27mst4h2tq2rb2zntqhgcstji"
97 test $EXPHASH = $IPLDCBORHASH
98 '
99
100 test_expect_success "can add a dag-cbor input block stored as dag-pb" '
101 IPLDPBHASH=$(cat ipld_object_dagcbor | ipfs dag put --input-codec dag-cbor --store-codec dag-pb)
102 '
103
104 test_expect_success "dag-pb CID looks correct" '
105 EXPHASH="bafybeibazl2z4vqp2tmwcfag6wirmtpnomxknqcgrauj7m2yisrz3qjbom"
106 test $EXPHASH = $IPLDPBHASH
107 '
108
109 test_expect_success "can add a dag-cbor input block stored as dag-json" '
110 IPLDJSONHASH=$(cat ipld_object_dagcbor | ipfs dag put --input-codec dag-cbor --store-codec dag-json)
111 '
112
113 test_expect_success "dag-json CID looks correct" '
114 EXPHASH="baguqeerajwksxu3lxpomdwxvosl542zl3xknhjgxtq3277gafrhl6vdw5tcq"
115 test $EXPHASH = $IPLDJSONHASH
116 '
117
118 # (2) dag-json input
119
120 test_expect_success "can add a dag-json input block stored as dag-cbor" '
121 IPLDCBORHASH=$(cat ipld_object_dagjson | ipfs dag put --input-codec dag-json --store-codec dag-cbor)
122 '
123
124 test_expect_success "dag-cbor CID looks correct" '
125 EXPHASH="bafyreieculsmrexh3ty5jentbvuku452o27mst4h2tq2rb2zntqhgcstji"
126 test $EXPHASH = $IPLDCBORHASH
127 '
128
129 test_expect_success "can add a dag-json input block stored as dag-pb" '
130 IPLDPBHASH=$(cat ipld_object_dagjson | ipfs dag put --input-codec dag-json --store-codec dag-pb)
131 '
132
133 test_expect_success "dag-pb CID looks correct" '
134 EXPHASH="bafybeibazl2z4vqp2tmwcfag6wirmtpnomxknqcgrauj7m2yisrz3qjbom"
135 test $EXPHASH = $IPLDPBHASH
136 '
137
138 test_expect_success "can add a dag-json input block stored as dag-json" '
139 IPLDJSONHASH=$(cat ipld_object_dagjson | ipfs dag put --input-codec dag-json --store-codec dag-json)
140 '
141
142 test_expect_success "dag-json CID looks correct" '
143 EXPHASH="baguqeerajwksxu3lxpomdwxvosl542zl3xknhjgxtq3277gafrhl6vdw5tcq"
144 test $EXPHASH = $IPLDJSONHASH
145 '
146
147 # (3) dag-pb input
148
149 test_expect_success "can add a dag-pb input block stored as dag-cbor" '
150 IPLDCBORHASH=$(cat ipld_object_dagpb | ipfs dag put --input-codec dag-pb --store-codec dag-cbor)
151 '
152
153 test_expect_success "dag-cbor CID looks correct" '
154 EXPHASH="bafyreieculsmrexh3ty5jentbvuku452o27mst4h2tq2rb2zntqhgcstji"
155 test $EXPHASH = $IPLDCBORHASH
156 '
157
158 test_expect_success "can add a dag-pb input block stored as dag-pb" '
159 IPLDPBHASH=$(cat ipld_object_dagpb | ipfs dag put --input-codec dag-pb --store-codec dag-pb)
160 '
161
162 test_expect_success "dag-pb CID looks correct" '
163 EXPHASH="bafybeibazl2z4vqp2tmwcfag6wirmtpnomxknqcgrauj7m2yisrz3qjbom"
164 test $EXPHASH = $IPLDPBHASH
165 '
166
167 test_expect_success "can add a dag-pb input block stored as dag-json" '
168 IPLDJSONHASH=$(cat ipld_object_dagpb | ipfs dag put --input-codec dag-pb --store-codec dag-json)
169 '
170
171 test_expect_success "dag-json CID looks correct" '
172 EXPHASH="baguqeerajwksxu3lxpomdwxvosl542zl3xknhjgxtq3277gafrhl6vdw5tcq"
173 test $EXPHASH = $IPLDJSONHASH
174 '
175
176 test_expect_success "can get dag-cbor, dag-json, dag-pb blocks as dag-json" '
177 ipfs dag get $IPLDCBORHASH >& dag-get-cbor &&
178 ipfs dag get $IPLDJSONHASH >& dag-get-json &&
179 ipfs dag get $IPLDPBHASH >& dag-get-pb
180 '
181
182 test_expect_success "can get dag-pb block transcoded as dag-cbor" '
183 ipfs dag get --output-codec=dag-cbor $IPLDPBHASH >& dag-get-dagpb-transcoded-to-dagcbor &&
184 echo "122082a2e4c892e7dcf1d491b30d68aa73ba76bec94f87d4e1a887596ce0730a534a" >sha2_dagpb_to_dagcbor_expected &&
185 multihash -a=sha2-256 -e=hex dag-get-dagpb-transcoded-to-dagcbor >sha2_dagpb_to_dagcbor_actual &&
186 test_cmp sha2_dagpb_to_dagcbor_expected sha2_dagpb_to_dagcbor_actual
187 '
188
189 test_expect_success "dag put and dag get transcodings match" '
190 ROUNDTRIPDAGCBOR=$(ipfs dag put --input-codec=dag-cbor --store-codec=dag-cbor dag-get-dagpb-transcoded-to-dagcbor) &&
191 test $ROUNDTRIPDAGCBOR = $IPLDCBORHASH
192 '
193
194 # this doesn't tell us if they are correct, we test that better below
195 test_expect_success "outputs are the same" '
196 test_cmp dag-get-cbor dag-get-json &&
197 test_cmp dag-get-cbor dag-get-pb
198 '
199
200 # Traversals using the original hello-world object
201
202 test_expect_success "various path traversals work" '
203 ipfs cat $IPLDHASH/cats/0 > out1 &&
204 ipfs cat $IPLDHASH/cats/1/water > out2 &&
205 ipfs cat $IPLDHASH/magic > out3
206 '
207
208 test_expect_success "outputs look correct" '
209 test_cmp file1 out1 &&
210 test_cmp file2 out2 &&
211 test_cmp file3 out3
212 '
213
214 test_expect_success "resolving sub-objects works" '
215 ipfs dag get $IPLDHASH/hello > sub1 &&
216 ipfs dag get $IPLDHASH/sub > sub2 &&
217 ipfs dag get $IPLDHASH/sub/beep > sub3 &&
218 ipfs dag get $IPLDHASH/sub/beep/0 > sub4 &&
219 ipfs dag get $IPLDHASH/sub/beep/1 > sub5
220 '
221
222 test_expect_success "sub-objects look right" '
223 echo -n "\"world\"" > sub1_exp &&
224 test_cmp sub1_exp sub1 &&
225 echo -n "{\"beep\":[0,\"bop\"],\"dict\":\"ionary\"}" > sub2_exp &&
226 test_cmp sub2_exp sub2 &&
227 echo -n "[0,\"bop\"]" > sub3_exp &&
228 test_cmp sub3_exp sub3 &&
229 echo -n "0" > sub4_exp &&
230 test_cmp sub4_exp sub4 &&
231 echo -n "\"bop\"" > sub5_exp &&
232 test_cmp sub5_exp sub5
233 '
234
235 test_expect_success "traversals using /ipld/ work" '
236 ipfs dag get /ipld/$IPLDPBHASH/Data > ipld_path_Data_actual
237 '
238
239 test_expect_success "retrieved node looks right" '
240 echo -n "{\"/\":{\"bytes\":\"AAECAwQ\"}}" > ipld_path_Data_expected
241 test_cmp ipld_path_Data_actual ipld_path_Data_expected
242 '
243
244 test_expect_success "can pin ipld object" '
245 ipfs pin add $IPLDHASH
246 '
247
248 test_expect_success "can pin dag-pb object" '
249 ipfs pin add $IPLDPBHASH
250 '
251
252 test_expect_success "can pin dag-cbor object" '
253 ipfs pin add $IPLDCBORHASH
254 '
255
256 test_expect_success "can pin dag-json object" '
257 ipfs pin add $IPLDJSONHASH
258 '
259
260 test_expect_success "after gc, objects still accessible" '
261 ipfs repo gc > /dev/null &&
262 ipfs refs -r --timeout=2s $IPLDJSONHASH > /dev/null
263 '
264
265 test_expect_success "can get object" '
266 ipfs dag get $IPLDHASH > ipld_obj_out
267 '
268
269 test_expect_success "object links look right" '
270 grep "{\"/\":\"" ipld_obj_out > /dev/null
271 '
272
273 test_expect_success "retrieved object hashes back correctly" '
274 IPLDHASH2=$(cat ipld_obj_out | ipfs dag put --input-codec dag-json --store-codec dag-cbor) &&
275 test "$IPLDHASH" = "$IPLDHASH2"
276 '
277
278 test_expect_success "add a normal file" '
279 HASH=$(echo "foobar" | ipfs add -q)
280 '
281
282 test_expect_success "can view protobuf object with dag get" '
283 ipfs dag get $HASH > dag_get_pb_out
284 '
285
286 test_expect_success "output looks correct" '
287 echo -n "{\"Data\":{\"/\":{\"bytes\":\"CAISB2Zvb2JhcgoYBw\"}},\"Links\":[]}" > dag_get_pb_exp &&
288 test_cmp dag_get_pb_exp dag_get_pb_out
289 '
290
291 test_expect_success "can call dag get with a path" '
292 ipfs dag get $IPLDHASH/cats/0 > cat_out
293 '
294
295 test_expect_success "output looks correct" '
296 echo -n "{\"Data\":{\"/\":{\"bytes\":\"CAISBGZvbwoYBA\"}},\"Links\":[]}" > cat_exp &&
297 test_cmp cat_exp cat_out
298 '
299
300 test_expect_success "non-canonical dag-cbor input is normalized" '
301 HASH=$(cat ../t0053-dag-data/non-canon.cbor | ipfs dag put --store-codec dag-cbor --input-codec dag-cbor) &&
302 test $HASH = "bafyreiawx7ona7oa2ptcoh6vwq4q6bmd7x2ibtkykld327bgb7t73ayrqm" ||
303 test_fsh echo $HASH
304 '
305
306 test_expect_success "cbor input can be fetched" '
307 EXPARR=$(ipfs dag get $HASH/arr)
308 test $EXPARR = "[]"
309 '
310
311 test_expect_success "add an ipld with pin" '
312 PINHASH=$(printf {\"foo\":\"bar\"} | ipfs dag put --input-codec dag-json --pin=true)
313 '
314
315 test_expect_success "after gc, objects still accessible" '
316 ipfs repo gc > /dev/null &&
317 ipfs refs -r --timeout=2s $PINHASH > /dev/null
318 '
319
320 test_expect_success "can add an ipld object with sha3-512 hash" '
321 IPLDHASH=$(cat ipld_object | ipfs dag put --hash sha3-512)
322 '
323
324 test_expect_success "output looks correct" '
325 EXPHASH="bafyriqforjma7y7akqz7nhuu73r6liggj5zhkbfiqgicywe3fgkna2ijlhod2af3ue7doj56tlzt5hh6iu5esafc4msr3sd53jol5m2o25ucy"
326 test $EXPHASH = $IPLDHASH
327 '
328
329 test_expect_success "prepare dag-pb object" '
330 echo foo > test_file &&
331 HASH=$(ipfs add -wQ test_file | ipfs cid base32)
332 '
333
334 test_expect_success "dag put with json dag-pb works" '
335 ipfs dag get $HASH > pbjson &&
336 cat pbjson | ipfs dag put --store-codec=dag-pb --input-codec=dag-json > dag_put_out
337 '
338
339 test_expect_success "dag put with dag-pb works output looks good" '
340 echo $HASH > dag_put_exp &&
341 test_cmp dag_put_exp dag_put_out
342 '
343
344 test_expect_success "dag put with raw dag-pb works" '
345 ipfs block get $HASH > pbraw &&
346 cat pbraw | ipfs dag put --store-codec=dag-pb --input-codec=dag-pb > dag_put_out
347 '
348
349 test_expect_success "dag put with dag-pb works output looks good" '
350 echo $HASH > dag_put_exp &&
351 test_cmp dag_put_exp dag_put_out
352 '
353
354 test_expect_success "dag put with raw node works" '
355 echo "foo bar" > raw_node_in &&
356 HASH=$(ipfs dag put --store-codec=raw --input-codec=raw -- raw_node_in) &&
357 ipfs block get "$HASH" > raw_node_out &&
358 test_cmp raw_node_in raw_node_out'
359
360 test_expect_success "dag put multiple files" '
361 printf {\"foo\":\"bar\"} > a.json &&
362 printf {\"foo\":\"baz\"} > b.json &&
363 ipfs dag put a.json b.json > dag_put_out
364 '
365
366 test_expect_success "dag put multiple files output looks good" '
367 echo bafyreiblaotetvwobe7cu2uqvnddr6ew2q3cu75qsoweulzku2egca4dxq > dag_put_exp &&
368 echo bafyreibqp7zvp6dvrqhtkbwuzzk7jhtmfmngtiqjajqpm6gtw55o7kqzfi >> dag_put_exp &&
369
370 test_cmp dag_put_exp dag_put_out
371 '
372
373 test_expect_success "prepare data for dag resolve" '
374 NESTED_HASH=$(echo "{\"data\":123}" | ipfs dag put) &&
375 HASH=$(echo "{\"obj\":{\"/\":\"${NESTED_HASH}\"}}" | ipfs dag put)
376 '
377
378 test_expect_success "dag resolve some things" '
379 ipfs dag resolve $HASH > resolve_hash &&
380 ipfs dag resolve ${HASH}/obj > resolve_obj &&
381 ipfs dag resolve ${HASH}/obj/data > resolve_data
382 '
383
384 test_expect_success "dag resolve output looks good" '
385 printf $HASH > resolve_hash_exp &&
386 printf $NESTED_HASH > resolve_obj_exp &&
387 printf $NESTED_HASH/data > resolve_data_exp &&
388
389 test_cmp resolve_hash_exp resolve_hash &&
390 test_cmp resolve_obj_exp resolve_obj &&
391 test_cmp resolve_data_exp resolve_data
392 '
393
394 test_expect_success "get base32 version of hashes for testing" '
395 HASHb32=$(ipfs cid base32 $HASH) &&
396 NESTED_HASHb32=$(ipfs cid base32 $NESTED_HASH)
397 '
398
399 test_expect_success "dag resolve some things with --cid-base=base32" '
400 ipfs dag resolve $HASH --cid-base=base32 > resolve_hash &&
401 ipfs dag resolve ${HASH}/obj --cid-base=base32 > resolve_obj &&
402 ipfs dag resolve ${HASH}/obj/data --cid-base=base32 > resolve_data
403 '
404
405 test_expect_success "dag resolve output looks good with --cid-base=base32" '
406 printf $HASHb32 > resolve_hash_exp &&
407 printf $NESTED_HASHb32 > resolve_obj_exp &&
408 printf $NESTED_HASHb32/data > resolve_data_exp &&
409
410 test_cmp resolve_hash_exp resolve_hash &&
411 test_cmp resolve_obj_exp resolve_obj &&
412 test_cmp resolve_data_exp resolve_data
413 '
414
415 test_expect_success "dag resolve some things with base32 hash" '
416 ipfs dag resolve $HASHb32 > resolve_hash &&
417 ipfs dag resolve ${HASHb32}/obj > resolve_obj &&
418 ipfs dag resolve ${HASHb32}/obj/data > resolve_data
419 '
420
421 test_expect_success "dag resolve output looks good with base32 hash" '
422 printf $HASHb32 > resolve_hash_exp &&
423 printf $NESTED_HASHb32 > resolve_obj_exp &&
424 printf $NESTED_HASHb32/data > resolve_data_exp &&
425
426 test_cmp resolve_hash_exp resolve_hash &&
427 test_cmp resolve_obj_exp resolve_obj &&
428 test_cmp resolve_data_exp resolve_data
429 '
430
431
432 }
433
434 # should work offline
435 test_dag_cmd
436
437 # should work online
438 test_launch_ipfs_daemon
439 test_dag_cmd
440 test_kill_ipfs_daemon
441
442 test_done