fix(commands): Add sharness tests for streaming
Also fixes issues discovered with sharness tests License: MIT Signed-off-by: hannahhoward <hannah@hannahhoward.net>
hannahhoward committed
Nov 8, 2018 at 16:20 UTC
20b928094c990af969e71beadaa47b48c5079c9f
2 files changed
+108
-14
core/commands/ls.go
+25
-14
@@ -111,10 +111,9 @@ The JSON output contains type information.
111
ng := merkledag.NewSession(req.Context, nd.DAG)
112
ro := merkledag.NewReadOnlyDagService(ng)
113
114
- output := make([]LsObject, len(req.Arguments))
115
-
114
stream, _ := req.Options[lsStreamOptionName].(bool)
115
if !stream {
116
+ output := make([]LsObject, len(req.Arguments))
117
118
for i, dagnode := range dagnodes {
119
dir, err := uio.NewDirectoryFromNode(ro, dagnode)
@@ -148,14 +147,6 @@ The JSON output contains type information.
147
return cmds.EmitOnce(res, &LsOutput{output})
148
}
149
151
- outputLinks := make([]LsLink, 1)
152
- for i, path := range paths {
153
- output[i] = LsObject{
154
- Hash: path,
155
- Links: nil,
156
- }
157
- }
158
-
150
for i, dagnode := range dagnodes {
151
dir, err := uio.NewDirectoryFromNode(ro, dagnode)
152
if err != nil && err != uio.ErrNotADir {
@@ -169,9 +160,17 @@ The JSON output contains type information.
160
linkResults = dir.EnumLinksAsync(req.Context)
161
}
162
172
- output[i].Links = outputLinks
173
-
163
for linkResult := range linkResults {
164
+ output := make([]LsObject, len(req.Arguments))
165
+
166
+ for i, path := range paths {
167
+ output[i] = LsObject{
168
+ Hash: path,
169
+ Links: nil,
170
+ }
171
+ }
172
+ outputLinks := make([]LsLink, 1)
173
+
174
if linkResult.Err != nil {
175
return linkResult.Err
176
}
@@ -181,11 +180,11 @@ The JSON output contains type information.
180
return err
181
}
182
outputLinks[0] = *lsLink
183
+ output[i].Links = outputLinks
184
if err = res.Emit(&LsOutput{output}); err != nil {
185
return err
186
}
187
}
188
- output[i].Links = nil
188
}
189
return nil
190
},
@@ -193,9 +192,21 @@ The JSON output contains type information.
192
cmds.CLI: func(res cmds.Response, re cmds.ResponseEmitter) error {
193
req := res.Request()
194
headers, _ := req.Options[lsHeadersOptionNameTime].(bool)
195
+ stream, _ := req.Options[lsStreamOptionName].(bool)
196
+
197
+ // in streaming mode we can't automatically align the tabs
198
+ // so we take a best guess
199
+ var minTabWidth int
200
+ if stream {
201
+ minTabWidth = 10
202
+ } else {
203
+ minTabWidth = 1
204
+ }
205
+
206
multipleFolders := len(req.Arguments) > 1
207
lastDirectoryWritten := -1
198
- tw := tabwriter.NewWriter(os.Stdout, 1, 2, 1, ' ', 0)
208
+
209
+ tw := tabwriter.NewWriter(os.Stdout, minTabWidth, 2, 1, ' ', 0)
210
for {
211
v, err := res.Next()
212
if err != nil {
test/sharness/t0045-ls.sh
+83
@@ -90,6 +90,87 @@ EOF
90
'
91
}
92
93
+
94
+test_ls_cmd_streaming() {
95
+
96
+ test_expect_success "'ipfs add -r testData' succeeds" '
97
+ mkdir -p testData testData/d1 testData/d2 &&
98
+ echo "test" >testData/f1 &&
99
+ echo "data" >testData/f2 &&
100
+ echo "hello" >testData/d1/a &&
101
+ random 128 42 >testData/d1/128 &&
102
+ echo "world" >testData/d2/a &&
103
+ random 1024 42 >testData/d2/1024 &&
104
+ ipfs add -r testData >actual_add
105
+ '
106
+
107
+ test_expect_success "'ipfs add' output looks good" '
108
+ cat <<-\EOF >expected_add &&
109
+added QmQNd6ubRXaNG6Prov8o6vk3bn6eWsj9FxLGrAVDUAGkGe testData/d1/128
110
+added QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN testData/d1/a
111
+added QmbQBUSRL9raZtNXfpTDeaxQapibJEG6qEY8WqAN22aUzd testData/d2/1024
112
+added QmaRGe7bVmVaLmxbrMiVNXqW4pRNNp3xq7hFtyRKA3mtJL testData/d2/a
113
+added QmeomffUNfmQy76CQGy9NdmqEnnHU9soCexBnGU3ezPHVH testData/f1
114
+added QmNtocSs7MoDkJMc1RkyisCSKvLadujPsfJfSdJ3e1eA1M testData/f2
115
+added QmSix55yz8CzWXf5ZVM9vgEvijnEeeXiTSarVtsqiiCJss testData/d1
116
+added QmR3jhV4XpxxPjPT3Y8vNnWvWNvakdcT3H6vqpRBsX1MLy testData/d2
117
+added QmfNy183bXiRVyrhyWtq3TwHn79yHEkiAGFr18P7YNzESj testData
118
+EOF
119
+ test_cmp expected_add actual_add
120
+ '
121
+
122
+ test_expect_success "'ipfs ls --stream <three dir hashes>' succeeds" '
123
+ ipfs ls --stream QmfNy183bXiRVyrhyWtq3TwHn79yHEkiAGFr18P7YNzESj QmR3jhV4XpxxPjPT3Y8vNnWvWNvakdcT3H6vqpRBsX1MLy QmSix55yz8CzWXf5ZVM9vgEvijnEeeXiTSarVtsqiiCJss >actual_ls_stream
124
+ '
125
+
126
+ test_expect_success "'ipfs ls --stream <three dir hashes>' output looks good" '
127
+ cat <<-\EOF >expected_ls_stream &&
128
+QmfNy183bXiRVyrhyWtq3TwHn79yHEkiAGFr18P7YNzESj:
129
+QmSix55yz8CzWXf5ZVM9vgEvijnEeeXiTSarVtsqiiCJss 246 d1/
130
+QmR3jhV4XpxxPjPT3Y8vNnWvWNvakdcT3H6vqpRBsX1MLy 1143 d2/
131
+QmeomffUNfmQy76CQGy9NdmqEnnHU9soCexBnGU3ezPHVH 13 f1
132
+QmNtocSs7MoDkJMc1RkyisCSKvLadujPsfJfSdJ3e1eA1M 13 f2
133
+
134
+QmR3jhV4XpxxPjPT3Y8vNnWvWNvakdcT3H6vqpRBsX1MLy:
135
+QmbQBUSRL9raZtNXfpTDeaxQapibJEG6qEY8WqAN22aUzd 1035 1024
136
+QmaRGe7bVmVaLmxbrMiVNXqW4pRNNp3xq7hFtyRKA3mtJL 14 a
137
+
138
+QmSix55yz8CzWXf5ZVM9vgEvijnEeeXiTSarVtsqiiCJss:
139
+QmQNd6ubRXaNG6Prov8o6vk3bn6eWsj9FxLGrAVDUAGkGe 139 128
140
+QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN 14 a
141
+
142
+EOF
143
+ test_cmp expected_ls_stream actual_ls_stream
144
+ '
145
+
146
+ test_expect_success "'ipfs ls --stream --headers <three dir hashes>' succeeds" '
147
+ ipfs ls --stream --headers QmfNy183bXiRVyrhyWtq3TwHn79yHEkiAGFr18P7YNzESj QmR3jhV4XpxxPjPT3Y8vNnWvWNvakdcT3H6vqpRBsX1MLy QmSix55yz8CzWXf5ZVM9vgEvijnEeeXiTSarVtsqiiCJss >actual_ls_stream_headers
148
+ '
149
+
150
+ test_expect_success "'ipfs ls --stream --headers <three dir hashes>' output looks good" '
151
+ cat <<-\EOF >expected_ls_stream_headers &&
152
+QmfNy183bXiRVyrhyWtq3TwHn79yHEkiAGFr18P7YNzESj:
153
+Hash Size Name
154
+QmSix55yz8CzWXf5ZVM9vgEvijnEeeXiTSarVtsqiiCJss 246 d1/
155
+QmR3jhV4XpxxPjPT3Y8vNnWvWNvakdcT3H6vqpRBsX1MLy 1143 d2/
156
+QmeomffUNfmQy76CQGy9NdmqEnnHU9soCexBnGU3ezPHVH 13 f1
157
+QmNtocSs7MoDkJMc1RkyisCSKvLadujPsfJfSdJ3e1eA1M 13 f2
158
+
159
+QmR3jhV4XpxxPjPT3Y8vNnWvWNvakdcT3H6vqpRBsX1MLy:
160
+Hash Size Name
161
+QmbQBUSRL9raZtNXfpTDeaxQapibJEG6qEY8WqAN22aUzd 1035 1024
162
+QmaRGe7bVmVaLmxbrMiVNXqW4pRNNp3xq7hFtyRKA3mtJL 14 a
163
+
164
+QmSix55yz8CzWXf5ZVM9vgEvijnEeeXiTSarVtsqiiCJss:
165
+Hash Size Name
166
+QmQNd6ubRXaNG6Prov8o6vk3bn6eWsj9FxLGrAVDUAGkGe 139 128
167
+QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN 14 a
168
+
169
+EOF
170
+ test_cmp expected_ls_stream_headers actual_ls_stream_headers
171
+ '
172
+}
173
+
174
test_ls_cmd_raw_leaves() {
175
test_expect_success "'ipfs add -r --raw-leaves' then 'ipfs ls' works as expected" '
176
mkdir -p somedir &&
@@ -114,12 +195,14 @@ test_ls_object() {
195
196
# should work offline
197
test_ls_cmd
198
+test_ls_cmd_streaming
199
test_ls_cmd_raw_leaves
200
test_ls_object
201
202
# should work online
203
test_launch_ipfs_daemon
204
test_ls_cmd
205
+test_ls_cmd_streaming
206
test_ls_cmd_raw_leaves
207
test_kill_ipfs_daemon
208
test_ls_object