code.vegaprotocol.io/vega@v0.79.0/core/statevar/snapshot_test.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package statevar_test 17 18 import ( 19 "bytes" 20 "context" 21 "testing" 22 23 gtypes "code.vegaprotocol.io/vega/core/types" 24 types "code.vegaprotocol.io/vega/core/types/statevar" 25 "code.vegaprotocol.io/vega/libs/proto" 26 snapshotpb "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" 27 28 "github.com/stretchr/testify/require" 29 ) 30 31 func TestSnapshot(t *testing.T) { 32 engine1 := getTestEngine(t, now).engine 33 engine1.RegisterStateVariable("asset1", "market1", "var1", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 34 engine1.RegisterStateVariable("asset1", "market1", "var2", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 35 engine1.RegisterStateVariable("asset1", "market2", "var1", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 36 engine1.RegisterStateVariable("asset1", "market2", "var2", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 37 engine1.RegisterStateVariable("asset2", "market1", "var1", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 38 engine1.RegisterStateVariable("asset2", "market1", "var1", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 39 40 engine1.ReadyForTimeTrigger("asset1", "market1") 41 engine1.ReadyForTimeTrigger("asset1", "market2") 42 43 key := (>ypes.PayloadFloatingPointConsensus{}).Key() 44 state1, _, err := engine1.GetState(key) 45 require.NoError(t, err) 46 47 engine2 := getTestEngine(t, now).engine 48 engine2.RegisterStateVariable("asset1", "market1", "var1", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 49 engine2.RegisterStateVariable("asset1", "market1", "var2", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 50 engine2.RegisterStateVariable("asset1", "market2", "var1", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 51 engine2.RegisterStateVariable("asset1", "market2", "var2", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 52 engine2.RegisterStateVariable("asset2", "market1", "var1", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 53 engine2.RegisterStateVariable("asset2", "market1", "var1", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 54 55 pl := snapshotpb.Payload{} 56 require.NoError(t, proto.Unmarshal(state1, &pl)) 57 engine2.LoadState(context.Background(), gtypes.PayloadFromProto(&pl)) 58 59 state2, _, err := engine2.GetState(key) 60 require.NoError(t, err) 61 require.True(t, bytes.Equal(state1, state2)) 62 } 63 64 func TestSnapshotChangeFlagSet(t *testing.T) { 65 key := (>ypes.PayloadFloatingPointConsensus{}).Key() 66 engine1 := getTestEngine(t, now).engine 67 68 engine1.RegisterStateVariable("asset1", "market1", "var1", converter{}, defaultStartCalc(), []types.EventType{types.EventTypeMarketEnactment, types.EventTypeTimeTrigger}, defaultResultBack()) 69 70 state1, _, err := engine1.GetState(key) 71 require.NoError(t, err) 72 73 // this should hit the change flag causing us to reserialise at the next hash 74 engine1.ReadyForTimeTrigger("asset1", "market1") 75 76 state2, _, err := engine1.GetState(key) 77 require.NoError(t, err) 78 require.False(t, bytes.Equal(state1, state2)) 79 }