5
5
"errors"
6
6
"fmt"
7
7
"io"
8
+ "io/fs"
8
9
"testing"
9
10
10
11
dbm "github.com/cosmos/cosmos-db"
@@ -23,7 +24,7 @@ import (
23
24
"github.com/axone-protocol/axoned/v8/x/logic/testutil"
24
25
)
25
26
26
- func TestWasmHandler (t * testing.T ) {
27
+ func TestWasmVFS (t * testing.T ) {
27
28
ctrl := gomock .NewController (t )
28
29
defer ctrl .Finish ()
29
30
@@ -34,8 +35,9 @@ func TestWasmHandler(t *testing.T) {
34
35
query []byte
35
36
data []byte
36
37
uri string
38
+ fail bool
37
39
wantResult []byte
38
- wantError error
40
+ wantError string
39
41
}{
40
42
{
41
43
contractAddress : contractAddress ,
@@ -50,7 +52,7 @@ func TestWasmHandler(t *testing.T) {
50
52
data : []byte ("Y2FsYyhYKSA6LSAgWCBpcyAxMDAgKyAyMDAu" ),
51
53
uri : `cosmwasm:cw-storage:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D` ,
52
54
wantResult : []byte ("\" \" " ),
53
- wantError : fmt .Errorf ( "open cosmwasm:cw-storage:%s?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: failed to unmarshal JSON WASM response to string: invalid character 'Y' looking for beginning of value" , contractAddress ),
55
+ wantError : fmt .Sprintf ( " cosmwasm:cw-storage:%s?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: failed to unmarshal JSON WASM response to string: invalid character 'Y' looking for beginning of value" , contractAddress ),
54
56
},
55
57
{
56
58
contractAddress : contractAddress ,
@@ -64,39 +66,39 @@ func TestWasmHandler(t *testing.T) {
64
66
query : []byte ("{\" object_data\" :{\" id\" : \" 4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\" }}" ),
65
67
data : []byte ("\" Y2FsYyhYKSA6LSAgWCBpcyAxMDAgKyAyMDAu\" " ),
66
68
uri : `axone:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D` ,
67
- wantError : fmt .Errorf ( "open axone:%s?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: invalid scheme, expected 'cosmwasm', got 'axone'" , contractAddress ),
69
+ wantError : fmt .Sprintf ( " axone:%s?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: invalid scheme, expected 'cosmwasm', got 'axone'" , contractAddress ),
68
70
},
69
71
{
70
72
contractAddress : contractAddress ,
71
73
query : []byte ("{\" object_data\" :{\" id\" : \" 4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\" }}" ),
72
74
data : []byte ("\" hey\" " ),
73
75
uri : `cosmwasm:cw-storage:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D` ,
74
76
wantResult : []byte ("\" \" " ),
75
- wantError : fmt .Errorf ( "open cosmwasm:cw-storage:%s?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: failed to decode WASM base64 response: illegal base64 data at input byte 0" , contractAddress ),
77
+ wantError : fmt .Sprintf ( " cosmwasm:cw-storage:%s?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: failed to decode WASM base64 response: illegal base64 data at input byte 0" , contractAddress ),
76
78
},
77
79
{
78
80
contractAddress : contractAddress ,
79
81
query : []byte ("{\" object_data\" :{\" id\" : \" 4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\" }}" ),
80
82
data : []byte ("\" hey\" " ),
81
83
uri : `cosmwasm:cw-storage?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D` ,
82
84
wantResult : []byte ("\" \" " ),
83
- wantError : fmt .Errorf ( "open cosmwasm:cw-storage?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: failed to convert path 'cw-storage' to contract address: decoding bech32 failed: invalid separator index -1" ),
85
+ wantError : fmt .Sprintf ( " cosmwasm:cw-storage?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: failed to convert path 'cw-storage' to contract address: decoding bech32 failed: invalid separator index -1" ),
84
86
},
85
87
{
86
88
contractAddress : contractAddress ,
87
89
query : []byte ("{\" object_data\" :{\" id\" : \" 4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\" }}" ),
88
90
data : []byte ("\" hey\" " ),
89
91
uri : `cosmwasm:cw-storage:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?wasm=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D` ,
90
92
wantResult : []byte ("\" \" " ),
91
- wantError : fmt .Errorf ( "open cosmwasm:cw-storage:%s?wasm=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: uri should contains `query` params" , contractAddress ),
93
+ wantError : fmt .Sprintf ( " cosmwasm:cw-storage:%s?wasm=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: uri should contains `query` params" , contractAddress ),
92
94
},
93
95
{
94
96
contractAddress : contractAddress ,
95
97
query : []byte ("{\" object_data\" :{\" id\" : \" 4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\" }}" ),
96
98
data : []byte ("\" hey\" " ),
97
99
uri : `cosmwasm:?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D` ,
98
100
wantResult : []byte ("\" \" " ),
99
- wantError : fmt .Errorf ( "open cosmwasm:?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: emtpy path given, should be 'cosmwasm:{contractName}:{contractAddr}?query={query}'" ),
101
+ wantError : fmt .Sprintf ( " cosmwasm:?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D: emtpy path given, should be 'cosmwasm:{contractName}:{contractAddr}?query={query}'" ),
100
102
},
101
103
{
102
104
contractAddress : contractAddress ,
@@ -118,7 +120,23 @@ func TestWasmHandler(t *testing.T) {
118
120
data : []byte ("\" hey\" " ),
119
121
uri : `cosmwasm:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D&base64Decode=foo` ,
120
122
wantResult : []byte ("\" \" " ),
121
- wantError : fmt .Errorf (`open cosmwasm:%s?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D&base64Decode=foo: failed to convert 'base64Decode' query value to boolean: strconv.ParseBool: parsing "foo": invalid syntax` , contractAddress ),
123
+ wantError : fmt .Sprintf (`cosmwasm:%s?query=%%7B%%22object_data%%22%%3A%%7B%%22id%%22%%3A%%20%%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%%22%%7D%%7D&base64Decode=foo: failed to convert 'base64Decode' query value to boolean: strconv.ParseBool: parsing "foo": invalid syntax` , contractAddress ),
124
+ },
125
+ {
126
+ contractAddress : contractAddress ,
127
+ query : []byte ("{\" object_data\" :{\" id\" : \" 4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\" }}" ),
128
+ data : []byte ("\" hey\" " ),
129
+ uri : `% %` ,
130
+ wantResult : []byte ("\" \" " ),
131
+ wantError : "% %: invalid argument" ,
132
+ },
133
+ {
134
+ contractAddress : contractAddress ,
135
+ query : []byte ("{\" object_data\" :{\" id\" : \" 4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\" }}" ),
136
+ data : []byte ("\" Y2FsYyhYKSA6LSAgWCBpcyAxMDAgKyAyMDAu\" " ),
137
+ uri : `cosmwasm:cw-storage:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D` ,
138
+ fail : true ,
139
+ wantError : "cosmwasm:cw-storage:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D: failed to query WASM contract axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk: failed to query smart contract" ,
122
140
},
123
141
}
124
142
for nc , tc := range cases {
@@ -134,23 +152,38 @@ func TestWasmHandler(t *testing.T) {
134
152
wasmKeeper .EXPECT ().
135
153
QuerySmart (ctx , sdk .MustAccAddressFromBech32 (tc .contractAddress ), tc .query ).
136
154
AnyTimes ().
137
- Return (tc .data , nil )
155
+ DoAndReturn (func (_ , _ , _ interface {}) ([]byte , error ) {
156
+ if tc .fail {
157
+ return nil , errors .New ("failed to query smart contract" )
158
+ }
159
+
160
+ return tc .data , nil
161
+ })
138
162
139
- Convey ("and wasm handler " , func () {
140
- handler := NewFS (ctx , wasmKeeper )
163
+ Convey ("and a wasm file system under test " , func () {
164
+ vfs := NewFS (ctx , wasmKeeper )
141
165
142
- Convey ("When ask handler if it can open uri" , func () {
143
- file , err := handler .Open (tc .uri )
166
+ Convey (fmt . Sprintf ( `when the open("%s") is called` , tc . uri ) , func () {
167
+ file , err := vfs .Open (tc .uri )
144
168
145
- Convey ("Then handler response should be as expected" , func () {
146
- if tc .wantError != nil {
169
+ Convey ("then the result should be as expected" , func () {
170
+ if tc .wantError != "" {
147
171
So (err , ShouldNotBeNil )
148
- So (err .Error (), ShouldEqual , tc .wantError . Error ( ))
172
+ So (err .Error (), ShouldEqual , fmt . Sprintf ( "open %s" , tc .wantError ))
149
173
} else {
150
174
So (err , ShouldBeNil )
151
175
152
176
defer file .Close ()
153
- info , _ := file .Stat ()
177
+ info , err := file .Stat ()
178
+ So (err , ShouldBeNil )
179
+
180
+ So (info .Name (), ShouldEqual , tc .uri )
181
+ So (info .Size (), ShouldEqual , int64 (len (tc .wantResult )))
182
+ So (info .ModTime (), ShouldEqual , ctx .BlockTime ())
183
+ So (info .IsDir (), ShouldBeFalse )
184
+ So (info .Mode (), ShouldEqual , fs .ModeIrregular )
185
+ So (info .Sys (), ShouldBeNil )
186
+
154
187
data := make ([]byte , info .Size ())
155
188
for {
156
189
_ , err := file .Read (data )
@@ -163,6 +196,20 @@ func TestWasmHandler(t *testing.T) {
163
196
So (data , ShouldResemble , tc .wantResult )
164
197
}
165
198
})
199
+
200
+ Convey (fmt .Sprintf (`when the readFile("%s") is called` , tc .uri ), func () {
201
+ result , err := vfs .ReadFile (tc .uri )
202
+
203
+ Convey ("then the result should be as expected" , func () {
204
+ if tc .wantError != "" {
205
+ So (err , ShouldNotBeNil )
206
+ So (err .Error (), ShouldEqual , fmt .Sprintf ("readfile %s" , tc .wantError ))
207
+ } else {
208
+ So (err , ShouldBeNil )
209
+ So (result , ShouldResemble , tc .wantResult )
210
+ }
211
+ })
212
+ })
166
213
})
167
214
})
168
215
})
0 commit comments