7 "github.com/bytom/vapor/application/mov"
8 movDatabase "github.com/bytom/vapor/application/mov/database"
9 "github.com/bytom/vapor/database"
10 dbm "github.com/bytom/vapor/database/leveldb"
11 "github.com/bytom/vapor/protocol"
12 "github.com/bytom/vapor/protocol/bc"
13 "github.com/bytom/vapor/protocol/bc/types"
14 "github.com/bytom/vapor/protocol/state"
15 "github.com/bytom/vapor/testutil"
18 type chainStatus struct {
23 type chainBlock struct {
28 var blocks = map[uint64][]*types.Block{
31 BlockHeader: types.BlockHeader{
33 Timestamp: 1585814309,
34 PreviousBlockHash: bc.Hash{},
39 // prev block is [0][0]
41 BlockHeader: types.BlockHeader{
43 Timestamp: 1585814310,
44 PreviousBlockHash: testutil.MustDecodeHash("2e5406c82fe34f6ee44fe694b05ffc8fb5918a026415b086df03fb03760b42a9"),
47 // prev block is [0][0]
49 BlockHeader: types.BlockHeader{
51 Timestamp: 1585814311,
52 PreviousBlockHash: testutil.MustDecodeHash("2e5406c82fe34f6ee44fe694b05ffc8fb5918a026415b086df03fb03760b42a9"),
57 // prev block is [1][0]
59 BlockHeader: types.BlockHeader{
61 Timestamp: 1585814320,
62 PreviousBlockHash: testutil.MustDecodeHash("5bc198f4c0198e7e8b52173a82836cfd3f124d88bf052f53390948d845bf6fe0"),
68 func TestSyncProtocolStatus(t *testing.T) {
71 savedBlocks []*chainBlock
74 wantChainStatus *chainStatus
77 desc: "start height from 0, mov is not init",
78 savedBlocks: []*chainBlock{
93 wantChainStatus: &chainStatus{
95 blockHash: blocks[2][0].Hash(),
99 desc: "start height from 1, mov is not init",
100 savedBlocks: []*chainBlock{
115 wantChainStatus: &chainStatus{
117 blockHash: blocks[2][0].Hash(),
121 desc: "start height from 1, state of mov is not sync completed",
122 savedBlocks: []*chainBlock{
137 startHash: hashPtr(blocks[1][0].Hash()),
138 wantChainStatus: &chainStatus{
140 blockHash: blocks[2][0].Hash(),
144 desc: "chain status of mov is forked",
145 savedBlocks: []*chainBlock{
164 startHash: hashPtr(blocks[1][1].Hash()),
165 wantChainStatus: &chainStatus{
167 blockHash: blocks[2][0].Hash(),
172 defer os.RemoveAll("temp")
174 for i, c := range cases {
175 chainDB := dbm.NewDB("core", "leveldb", "temp")
176 store := database.NewStore(chainDB)
177 if err := initStore(store, c.savedBlocks); err != nil {
181 movDB := dbm.NewDB("mov", "leveldb", "temp")
182 movCore := mov.NewCoreWithDB(movDatabase.NewLevelDBMovStore(movDB), c.startHeight)
183 if c.startHash != nil {
184 if err := movCore.InitChainStatus(c.startHash); err != nil {
189 _, err := protocol.NewChain(store, nil, []protocol.SubProtocol{movCore}, nil)
194 gotHeight, gotHash, err := movCore.ChainStatus()
199 if gotHeight != c.wantChainStatus.blockHeight || *gotHash != c.wantChainStatus.blockHash {
200 t.Logf("#%d(%s): got chain status of sub protocol is not equals want chain status", i, c.desc)
209 func initStore(store *database.Store, savedBlocks []*chainBlock) error {
210 var mainBlockHeaders []*types.BlockHeader
211 for _, block := range savedBlocks {
212 if err := store.SaveBlock(block.block, bc.NewTransactionStatus()); err != nil {
216 if block.inMainChain {
217 mainBlockHeaders = append(mainBlockHeaders, &block.block.BlockHeader)
220 last := len(mainBlockHeaders) - 1
221 if err := store.SaveChainStatus(mainBlockHeaders[last], mainBlockHeaders[last], mainBlockHeaders, state.NewUtxoViewpoint(), nil); err != nil {
228 func hashPtr(hash bc.Hash) *bc.Hash {
232 func TestBlockHash(t *testing.T) {
233 blockHash := blocks[1][0].Hash()
234 t.Log(blockHash.String())