Skip to content

Commit e8916f8

Browse files
committed
test(logic): improve test coverage for wasm vfs
1 parent 22e4f6b commit e8916f8

File tree

4 files changed

+137
-25
lines changed

4 files changed

+137
-25
lines changed

x/logic/fs/wasm/fs.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ var (
3737

3838
// NewFS creates a new filesystem that can read data from a WASM contract.
3939
// The URI should be in the format `cosmwasm:{contractName}:{contractAddr}?query={query}`.
40-
func NewFS(ctx context.Context, wasmKeeper types.WasmKeeper) fs.FS {
40+
func NewFS(ctx context.Context, wasmKeeper types.WasmKeeper) fs.ReadFileFS {
4141
return &vfs{ctx: ctx, wasmKeeper: wasmKeeper}
4242
}
4343

@@ -52,7 +52,7 @@ func (f *vfs) Open(name string) (fs.File, error) {
5252
}
5353

5454
func (f *vfs) ReadFile(name string) ([]byte, error) {
55-
return f.readFile("readFile", name)
55+
return f.readFile("readfile", name)
5656
}
5757

5858
func (f *vfs) readFile(op string, name string) ([]byte, error) {

x/logic/fs/wasm/fs_test.go

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"io"
8+
"io/fs"
89
"testing"
910

1011
dbm "github.com/cosmos/cosmos-db"
@@ -23,7 +24,7 @@ import (
2324
"github.com/axone-protocol/axoned/v8/x/logic/testutil"
2425
)
2526

26-
func TestWasmHandler(t *testing.T) {
27+
func TestWasmVFS(t *testing.T) {
2728
ctrl := gomock.NewController(t)
2829
defer ctrl.Finish()
2930

@@ -34,8 +35,9 @@ func TestWasmHandler(t *testing.T) {
3435
query []byte
3536
data []byte
3637
uri string
38+
fail bool
3739
wantResult []byte
38-
wantError error
40+
wantError string
3941
}{
4042
{
4143
contractAddress: contractAddress,
@@ -50,7 +52,7 @@ func TestWasmHandler(t *testing.T) {
5052
data: []byte("Y2FsYyhYKSA6LSAgWCBpcyAxMDAgKyAyMDAu"),
5153
uri: `cosmwasm:cw-storage:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D`,
5254
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),
5456
},
5557
{
5658
contractAddress: contractAddress,
@@ -64,39 +66,39 @@ func TestWasmHandler(t *testing.T) {
6466
query: []byte("{\"object_data\":{\"id\": \"4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\"}}"),
6567
data: []byte("\"Y2FsYyhYKSA6LSAgWCBpcyAxMDAgKyAyMDAu\""),
6668
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),
6870
},
6971
{
7072
contractAddress: contractAddress,
7173
query: []byte("{\"object_data\":{\"id\": \"4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\"}}"),
7274
data: []byte("\"hey\""),
7375
uri: `cosmwasm:cw-storage:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D`,
7476
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),
7678
},
7779
{
7880
contractAddress: contractAddress,
7981
query: []byte("{\"object_data\":{\"id\": \"4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\"}}"),
8082
data: []byte("\"hey\""),
8183
uri: `cosmwasm:cw-storage?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D`,
8284
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"),
8486
},
8587
{
8688
contractAddress: contractAddress,
8789
query: []byte("{\"object_data\":{\"id\": \"4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\"}}"),
8890
data: []byte("\"hey\""),
8991
uri: `cosmwasm:cw-storage:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?wasm=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D`,
9092
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),
9294
},
9395
{
9496
contractAddress: contractAddress,
9597
query: []byte("{\"object_data\":{\"id\": \"4cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05\"}}"),
9698
data: []byte("\"hey\""),
9799
uri: `cosmwasm:?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D`,
98100
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}'"),
100102
},
101103
{
102104
contractAddress: contractAddress,
@@ -118,7 +120,23 @@ func TestWasmHandler(t *testing.T) {
118120
data: []byte("\"hey\""),
119121
uri: `cosmwasm:axone15ekvz3qdter33mdnk98v8whv5qdr53yusksnfgc08xd26fpdn3tsrhsdrk?query=%7B%22object_data%22%3A%7B%22id%22%3A%20%224cbe36399aabfcc7158ee7a66cbfffa525bb0ceab33d1ff2cff08759fe0a9b05%22%7D%7D&base64Decode=foo`,
120122
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",
122140
},
123141
}
124142
for nc, tc := range cases {
@@ -134,23 +152,38 @@ func TestWasmHandler(t *testing.T) {
134152
wasmKeeper.EXPECT().
135153
QuerySmart(ctx, sdk.MustAccAddressFromBech32(tc.contractAddress), tc.query).
136154
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+
})
138162

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)
141165

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)
144168

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 != "" {
147171
So(err, ShouldNotBeNil)
148-
So(err.Error(), ShouldEqual, tc.wantError.Error())
172+
So(err.Error(), ShouldEqual, fmt.Sprintf("open %s", tc.wantError))
149173
} else {
150174
So(err, ShouldBeNil)
151175

152176
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+
154187
data := make([]byte, info.Size())
155188
for {
156189
_, err := file.Read(data)
@@ -163,6 +196,20 @@ func TestWasmHandler(t *testing.T) {
163196
So(data, ShouldResemble, tc.wantResult)
164197
}
165198
})
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+
})
166213
})
167214
})
168215
})

x/logic/testutil/fs_mocks.go

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x/logic/testutil/read_file_fs_mocks.go

Lines changed: 65 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)