fix(commands/cid): error on CIDv0 w/ custom -b, upgrade to CIDv1 w/ custom -b, empty -v
Co-authored-by: Henrique Dias <hacdias@gmail.com>
P. Reis committed
Sep 27, 2023 at 05:36 UTC
de173df9e36f1cff9e237f482ecb609ea90d9e35
2 files changed
+117
-1
core/commands/cid.go
+6
-1
@@ -80,11 +80,16 @@ The optional format string is a printf style format string:
80
81
switch verStr {
82
case "":
83
- // noop
83
+ if baseStr != "" {
84
+ opts.verConv = toCidV1
85
+ }
86
case "0":
87
if opts.newCodec != 0 && opts.newCodec != cid.DagProtobuf {
88
return fmt.Errorf("cannot convert to CIDv0 with any codec other than dag-pb")
89
}
90
+ if baseStr != "" && baseStr != "base58btc" {
91
+ return fmt.Errorf("cannot convert to CIDv0 with any multibase other than the implicit base58btc")
92
+ }
93
opts.verConv = toCidV0
94
case "1":
95
opts.verConv = toCidV1
core/commands/cid_test.go
new
+111
@@ -0,0 +1,111 @@
1
+package commands
2
+
3
+import (
4
+ "testing"
5
+
6
+ cmds "github.com/ipfs/go-ipfs-cmds"
7
+ "github.com/multiformats/go-multibase"
8
+)
9
+
10
+func TestCidFmtCmd(t *testing.T) {
11
+ t.Parallel()
12
+
13
+ // Test 'error when -v 0 is present and a custom -b is passed'
14
+ t.Run("ipfs cid format <cid> -b z -v 0", func(t *testing.T) {
15
+ t.Parallel()
16
+
17
+ type testV0PresentAndCustomBaseCase struct {
18
+ MultibaseName string
19
+ ExpectedErrMsg string
20
+ }
21
+
22
+ var testV0PresentAndCustomBaseCases []testV0PresentAndCustomBaseCase
23
+
24
+ for _, e := range multibase.EncodingToStr {
25
+ var testCase testV0PresentAndCustomBaseCase
26
+
27
+ if e == "base58btc" {
28
+ testCase.MultibaseName = e
29
+ testCase.ExpectedErrMsg = ""
30
+ testV0PresentAndCustomBaseCases = append(testV0PresentAndCustomBaseCases, testCase)
31
+ continue
32
+ }
33
+ testCase.MultibaseName = e
34
+ testCase.ExpectedErrMsg = "cannot convert to CIDv0 with any multibase other than the implicit base58btc"
35
+ testV0PresentAndCustomBaseCases = append(testV0PresentAndCustomBaseCases, testCase)
36
+ }
37
+
38
+ for _, e := range testV0PresentAndCustomBaseCases {
39
+
40
+ // Mock request
41
+ req := &cmds.Request{
42
+ Options: map[string]interface{}{
43
+ cidVerisonOptionName: "0",
44
+ cidMultibaseOptionName: e.MultibaseName,
45
+ cidFormatOptionName: "%s",
46
+ },
47
+ }
48
+
49
+ // Response emitter
50
+ resp := cmds.ResponseEmitter(nil)
51
+
52
+ // Call the CidFmtCmd function with the mock request and response
53
+ err := cidFmtCmd.Run(req, resp, nil)
54
+ if err == nil && e.MultibaseName == "base58btc" {
55
+ continue
56
+ }
57
+
58
+ errMsg := err.Error()
59
+ if errMsg != e.ExpectedErrMsg {
60
+ t.Errorf("Expected %s, got %s instead", e.ExpectedErrMsg, errMsg)
61
+ }
62
+ }
63
+ })
64
+
65
+ // Test 'upgrade CID to v1 when passing a custom -b and no -v is specified'
66
+ t.Run("ipfs cid format <cid-version-0> -b z", func(t *testing.T) {
67
+ t.Parallel()
68
+
69
+ type testImplicitVersionAndCustomMultibaseCase struct {
70
+ Ver string
71
+ CidV1 string
72
+ CidV0 string
73
+ MultibaseName string
74
+ }
75
+
76
+ var testCases = []testImplicitVersionAndCustomMultibaseCase{
77
+ {
78
+ Ver: "",
79
+ CidV1: "zdj7WWwMSWGoyxYkkT7mHgYvr6tV8CYd77aYxxqSbg9HsiMcE",
80
+ CidV0: "QmPr755CxWUwt39C2Yiw4UGKrv16uZhSgeZJmoHUUS9TSJ",
81
+ MultibaseName: "z",
82
+ },
83
+ {
84
+ Ver: "",
85
+ CidV1: "CAFYBEIDI7ZABPGG3S63QW3AJG2XAZNE4NJQPN777WLWYRAIDG3TE5QFN3A======",
86
+ CidV0: "QmVQVyEijmLb2cBQrowNQsaPbnUnJhfDK1sYe3wepm6ySf",
87
+ MultibaseName: "base32padupper",
88
+ },
89
+ }
90
+ for _, e := range testCases {
91
+ // Mock request
92
+ req := &cmds.Request{
93
+ Options: map[string]interface{}{
94
+ cidVerisonOptionName: e.Ver,
95
+ cidMultibaseOptionName: e.MultibaseName,
96
+ cidFormatOptionName: "%s",
97
+ },
98
+ }
99
+
100
+ // Response emitter
101
+ resp := cmds.ResponseEmitter(nil)
102
+
103
+ // Call the CidFmtCmd function with the mock request and response
104
+ err := cidFmtCmd.Run(req, resp, nil)
105
+
106
+ if err != nil {
107
+ t.Error(err)
108
+ }
109
+ }
110
+ })
111
+}