Newer
Older
// Copyright 2017 Monax Industries Limited
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
Silas Davis
committed
"encoding/json"
Silas Davis
committed
acm "github.com/hyperledger/burrow/account"
"github.com/hyperledger/burrow/permission/snatives"
ptypes "github.com/hyperledger/burrow/permission/types"
"github.com/hyperledger/burrow/txs/payload"
"github.com/stretchr/testify/assert"
Silas Davis
committed
"github.com/stretchr/testify/require"
var privateAccounts = make(map[crypto.Address]acm.AddressableSigner)
func makePrivateAccount(str string) acm.PrivateAccount {
acc := acm.GeneratePrivateAccountFromSecret(str)
privateAccounts[acc.Address()] = acc
return acc
Silas Davis
committed
}
sendTx := &payload.SendTx{
Inputs: []*payload.TxInput{
Silas Davis
committed
{
Address: makePrivateAccount("input1").Address(),
Silas Davis
committed
{
Address: makePrivateAccount("input2").Address(),
Silas Davis
committed
{
Address: makePrivateAccount("output1").Address(),
Silas Davis
committed
{
Address: makePrivateAccount("output2").Address(),
testTxMarshalJSON(t, sendTx)
testTxSignVerify(t, sendTx)
toAddress := makePrivateAccount("contract1").Address()
callTx := &payload.CallTx{
Input: &payload.TxInput{
Address: makePrivateAccount("input1").Address(),
Silas Davis
committed
Address: &toAddress,
GasLimit: 111,
Fee: 222,
Data: []byte("data1"),
}
testTxMarshalJSON(t, callTx)
testTxSignVerify(t, callTx)
nameTx := &payload.NameTx{
Input: &payload.TxInput{
Address: makePrivateAccount("input1").Address(),
Amount: 12345,
Sequence: 250,
},
Name: "google.com",
Data: "secretly.not.google.com",
Fee: 1000,
}
testTxMarshalJSON(t, nameTx)
testTxSignVerify(t, nameTx)
bondTx := &payload.BondTx{
Inputs: []*payload.TxInput{
Silas Davis
committed
{
Address: makePrivateAccount("input1").Address(),
Silas Davis
committed
{
Address: makePrivateAccount("input2").Address(),
UnbondTo: []*payload.TxOutput{
Silas Davis
committed
{
Address: makePrivateAccount("output1").Address(),
Silas Davis
committed
{
Address: makePrivateAccount("output2").Address(),
testTxMarshalJSON(t, bondTx)
testTxSignVerify(t, bondTx)
}
func TestUnbondTxSignable(t *testing.T) {
unbondTx := &payload.UnbondTx{
Input: &payload.TxInput{
Address: makePrivateAccount("fooo1").Address(),
},
Address: makePrivateAccount("address1").Address(),
testTxMarshalJSON(t, unbondTx)
testTxSignVerify(t, unbondTx)
permsTx := &payload.PermissionsTx{
Input: &payload.TxInput{
Address: makePrivateAccount("input1").Address(),
PermArgs: snatives.SetBaseArgs(makePrivateAccount("address1").Address(), 1, true),
testTxMarshalJSON(t, permsTx)
testTxSignVerify(t, permsTx)
Silas Davis
committed
func TestTxWrapper_MarshalJSON(t *testing.T) {
toAddress := makePrivateAccount("contract1").Address()
callTx := &payload.CallTx{
Input: &payload.TxInput{
Address: makePrivateAccount("input1").Address(),
Silas Davis
committed
Amount: 12345,
Sequence: 67890,
},
Address: &toAddress,
GasLimit: 111,
Fee: 222,
Data: []byte("data1"),
}
testTxMarshalJSON(t, callTx)
Silas Davis
committed
}
func TestNewPermissionsTxWithSequence(t *testing.T) {
privateAccount := makePrivateAccount("shhhhh")
args := snatives.SetBaseArgs(privateAccount.PublicKey().Address(), ptypes.HasRole, true)
permTx := payload.NewPermissionsTxWithSequence(privateAccount.PublicKey(), args, 1)
Silas Davis
committed
testTxMarshalJSON(t, permTx)
Silas Davis
committed
}
func testTxMarshalJSON(t *testing.T, tx payload.Payload) {
txw := &Tx{Payload: tx}
Silas Davis
committed
bs, err := json.Marshal(txw)
require.NoError(t, err)
Silas Davis
committed
err = json.Unmarshal(bs, txwOut)
require.NoError(t, err)
bsOut, err := json.Marshal(txwOut)
require.NoError(t, err)
assert.Equal(t, string(bs), string(bsOut))
func testTxSignVerify(t *testing.T, tx payload.Payload) {
inputs := tx.GetInputs()
var signers []acm.AddressableSigner
for _, in := range inputs {
signers = append(signers, privateAccounts[in.Address])
}
txEnv := Enclose(chainID, tx)
require.NoError(t, txEnv.Sign(signers...), "Error signing tx: %s", debug.Stack())
require.NoError(t, txEnv.Verify(nil), "Error verifying tx: %s", debug.Stack())
}