mirror of
https://github.com/eosswedenorg/thalos
synced 2026-06-16 04:24:56 +02:00
180 lines
4.9 KiB
Go
180 lines
4.9 KiB
Go
package abi
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/shufflingpixels/antelope-go/api"
|
|
"github.com/shufflingpixels/antelope-go/chain"
|
|
|
|
"github.com/eosswedenorg/thalos/internal/cache"
|
|
"github.com/eosswedenorg/thalos/internal/config"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var abiString = `
|
|
{
|
|
"version": "eosio::abi/1.0",
|
|
"types": [{
|
|
"new_type_name": "new_type_name_1",
|
|
"type": "name"
|
|
}],
|
|
"structs": [
|
|
{
|
|
"name": "struct_name_1",
|
|
"base": "struct_name_2",
|
|
"fields": [
|
|
{"name":"struct_1_field_1", "type":"new_type_name_1"},
|
|
{"name":"struct_1_field_2", "type":"struct_name_3"},
|
|
{"name":"struct_1_field_3", "type":"string?"},
|
|
{"name":"struct_1_field_4", "type":"string?"},
|
|
{"name":"struct_1_field_5", "type":"struct_name_4[]"}
|
|
]
|
|
},{
|
|
"name": "struct_name_2",
|
|
"base": "",
|
|
"fields": [
|
|
{"name":"struct_2_field_1", "type":"string"}
|
|
]
|
|
},{
|
|
"name": "struct_name_3",
|
|
"base": "",
|
|
"fields": [
|
|
{"name":"struct_3_field_1", "type":"string"}
|
|
]
|
|
},{
|
|
"name": "struct_name_4",
|
|
"base": "",
|
|
"fields": [
|
|
{"name":"struct_4_field_1", "type":"string"}
|
|
]
|
|
}
|
|
],
|
|
"actions": [{
|
|
"name": "action_name_1",
|
|
"type": "struct_name_1",
|
|
"ricardian_contract": ""
|
|
}],
|
|
"tables": [{
|
|
"name": "table_name_1",
|
|
"index_type": "i64",
|
|
"key_names": [
|
|
"key_name_1",
|
|
"key_name_2"
|
|
],
|
|
"key_types": [
|
|
"string",
|
|
"int"
|
|
],
|
|
"type": "struct_name_1"
|
|
}
|
|
]
|
|
}
|
|
`
|
|
|
|
func assert_abi(t *testing.T, abi *chain.Abi) {
|
|
assert.Equal(t, abi.Version, "eosio::abi/1.0")
|
|
|
|
// Types
|
|
assert.Equal(t, abi.Types[0].NewTypeName, "new_type_name_1")
|
|
assert.Equal(t, abi.Types[0].Type, "name")
|
|
|
|
// Structs
|
|
assert.Equal(t, abi.Structs[0].Name, "struct_name_1")
|
|
assert.Equal(t, abi.Structs[0].Base, "struct_name_2")
|
|
assert.Equal(t, abi.Structs[0].Fields[0].Name, "struct_1_field_1")
|
|
assert.Equal(t, abi.Structs[0].Fields[0].Type, "new_type_name_1")
|
|
assert.Equal(t, abi.Structs[0].Fields[1].Name, "struct_1_field_2")
|
|
assert.Equal(t, abi.Structs[0].Fields[1].Type, "struct_name_3")
|
|
assert.Equal(t, abi.Structs[0].Fields[2].Name, "struct_1_field_3")
|
|
assert.Equal(t, abi.Structs[0].Fields[2].Type, "string?")
|
|
assert.Equal(t, abi.Structs[0].Fields[3].Name, "struct_1_field_4")
|
|
assert.Equal(t, abi.Structs[0].Fields[3].Type, "string?")
|
|
assert.Equal(t, abi.Structs[0].Fields[4].Name, "struct_1_field_5")
|
|
assert.Equal(t, abi.Structs[0].Fields[4].Type, "struct_name_4[]")
|
|
|
|
assert.Equal(t, abi.Structs[1].Name, "struct_name_2")
|
|
assert.Equal(t, abi.Structs[1].Base, "")
|
|
assert.Equal(t, abi.Structs[1].Fields[0].Name, "struct_2_field_1")
|
|
assert.Equal(t, abi.Structs[1].Fields[0].Type, "string")
|
|
|
|
assert.Equal(t, abi.Structs[2].Name, "struct_name_3")
|
|
assert.Equal(t, abi.Structs[2].Base, "")
|
|
assert.Equal(t, abi.Structs[2].Fields[0].Name, "struct_3_field_1")
|
|
assert.Equal(t, abi.Structs[2].Fields[0].Type, "string")
|
|
|
|
assert.Equal(t, abi.Structs[3].Name, "struct_name_4")
|
|
assert.Equal(t, abi.Structs[3].Base, "")
|
|
assert.Equal(t, abi.Structs[3].Fields[0].Name, "struct_4_field_1")
|
|
assert.Equal(t, abi.Structs[3].Fields[0].Type, "string")
|
|
|
|
// Actions
|
|
assert.Equal(t, abi.Actions[0].Name, chain.N("action_name_1"))
|
|
assert.Equal(t, abi.Actions[0].Type, "struct_name_1")
|
|
assert.Equal(t, abi.Actions[0].RicardianContract, "")
|
|
|
|
// Tables
|
|
assert.Equal(t, abi.Tables[0].Name, chain.N("table_name_1"))
|
|
assert.Equal(t, abi.Tables[0].Type, "struct_name_1")
|
|
assert.Equal(t, abi.Tables[0].IndexType, "i64")
|
|
assert.Equal(t, abi.Tables[0].KeyNames[0], "key_name_1")
|
|
assert.Equal(t, abi.Tables[0].KeyNames[1], "key_name_2")
|
|
assert.Equal(t, abi.Tables[0].KeyTypes[0], "string")
|
|
assert.Equal(t, abi.Tables[0].KeyTypes[1], "int")
|
|
}
|
|
|
|
func mockAPI(handler http.HandlerFunc) (*api.Client, *httptest.Server) {
|
|
server := httptest.NewServer(handler)
|
|
|
|
return api.New(server.URL), server
|
|
}
|
|
|
|
func TestManager_GetAbiFromCache(t *testing.T) {
|
|
cfg := &config.AbiCache{
|
|
ApiTimeout: time.Second,
|
|
}
|
|
|
|
cache := cache.NewCache("thalos::cache::abi::test", cache.NewMemoryStore())
|
|
|
|
api, _ := mockAPI(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
}))
|
|
|
|
mgr := NewAbiManager(cfg, cache, api)
|
|
|
|
abi := chain.Abi{}
|
|
err := json.Unmarshal([]byte(abiString), &abi)
|
|
assert.NoError(t, err)
|
|
|
|
err = mgr.SetAbi(chain.N("testaccount"), &abi)
|
|
assert.NoError(t, err)
|
|
|
|
c_abi, err := mgr.GetAbi(chain.N("testaccount"))
|
|
assert.NoError(t, err)
|
|
assert_abi(t, c_abi)
|
|
}
|
|
|
|
func TestManager_GetAbiFromAPI(t *testing.T) {
|
|
cfg := &config.AbiCache{
|
|
ApiTimeout: time.Second,
|
|
}
|
|
|
|
cache := cache.NewCache("thalos::cache::abi::test", cache.NewMemoryStore())
|
|
|
|
api, _ := mockAPI(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
body := fmt.Sprintf(`{"account_name": "testaccount", "abi": %s}`, abiString)
|
|
|
|
_, err := w.Write([]byte(body))
|
|
assert.NoError(t, err)
|
|
}))
|
|
|
|
mgr := NewAbiManager(cfg, cache, api)
|
|
|
|
c_abi, err := mgr.GetAbi(chain.N("testaccount"))
|
|
assert.NoError(t, err)
|
|
|
|
assert_abi(t, c_abi)
|
|
}
|