package vm
|
|
|
|
import (
|
|
"bytes"
|
|
"reflect"
|
|
"testing"
|
|
|
|
. "github.com/tendermint/tendermint/common"
|
|
"github.com/tendermint/tendermint/events"
|
|
"github.com/tendermint/tendermint/types"
|
|
. "github.com/tendermint/tendermint/vm"
|
|
)
|
|
|
|
var expectedData = []byte{0x10}
|
|
var expectedHeight int64 = 0
|
|
var expectedTopics = []Word256{
|
|
Int64ToWord256(1),
|
|
Int64ToWord256(2),
|
|
Int64ToWord256(3),
|
|
Int64ToWord256(4)}
|
|
|
|
// Tests logs and events.
|
|
func TestLog4(t *testing.T) {
|
|
|
|
st := newAppState()
|
|
// Create accounts
|
|
account1 := &Account{
|
|
Address: LeftPadWord256(makeBytes(20)),
|
|
}
|
|
account2 := &Account{
|
|
Address: LeftPadWord256(makeBytes(20)),
|
|
}
|
|
st.accounts[account1.Address.String()] = account1
|
|
st.accounts[account2.Address.String()] = account2
|
|
|
|
ourVm := NewVM(st, newParams(), Zero256, nil)
|
|
|
|
eventSwitch := events.NewEventSwitch()
|
|
_, err := eventSwitch.Start()
|
|
if err != nil {
|
|
t.Errorf("Failed to start eventSwitch: %v", err)
|
|
}
|
|
eventID := types.EventStringLogEvent(account2.Address.Postfix(20))
|
|
|
|
doneChan := make(chan struct{}, 1)
|
|
|
|
eventSwitch.AddListenerForEvent("test", eventID, func(event types.EventData) {
|
|
logEvent := event.(types.EventDataLog)
|
|
// No need to test address as this event would not happen if it wasn't correct
|
|
if !reflect.DeepEqual(logEvent.Topics, expectedTopics) {
|
|
t.Errorf("Event topics are wrong. Got: %v. Expected: %v", logEvent.Topics, expectedTopics)
|
|
}
|
|
if !bytes.Equal(logEvent.Data, expectedData) {
|
|
t.Errorf("Event data is wrong. Got: %s. Expected: %s", logEvent.Data, expectedData)
|
|
}
|
|
if logEvent.Height != expectedHeight {
|
|
t.Errorf("Event block height is wrong. Got: %d. Expected: %d", logEvent.Height, expectedHeight)
|
|
}
|
|
doneChan <- struct{}{}
|
|
})
|
|
|
|
ourVm.SetFireable(eventSwitch)
|
|
|
|
var gas int64 = 100000
|
|
|
|
mstore8 := byte(MSTORE8)
|
|
push1 := byte(PUSH1)
|
|
log4 := byte(LOG4)
|
|
stop := byte(STOP)
|
|
|
|
code := []byte{
|
|
push1, 16, // data value
|
|
push1, 0, // memory slot
|
|
mstore8,
|
|
push1, 4, // topic 4
|
|
push1, 3, // topic 3
|
|
push1, 2, // topic 2
|
|
push1, 1, // topic 1
|
|
push1, 1, // size of data
|
|
push1, 0, // data starts at this offset
|
|
log4,
|
|
stop,
|
|
}
|
|
|
|
_, err = ourVm.Call(account1, account2, code, []byte{}, 0, &gas)
|
|
<-doneChan
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|