github.com/lino-network/lino@v0.6.11/x/global/model/storage_test.go (about)

     1  package model
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	wire "github.com/cosmos/cosmos-sdk/codec"
     8  	sdk "github.com/cosmos/cosmos-sdk/types"
     9  	"github.com/stretchr/testify/suite"
    10  
    11  	"github.com/lino-network/lino/testsuites"
    12  	"github.com/lino-network/lino/testutils"
    13  	linotypes "github.com/lino-network/lino/types"
    14  )
    15  
    16  type testEvent struct {
    17  	Name string `json:"name"`
    18  }
    19  
    20  func regTestCodec(c *wire.Codec) {
    21  	c.RegisterInterface((*linotypes.Event)(nil), nil)
    22  	c.RegisterConcrete(testEvent{}, "lino/testevent", nil)
    23  }
    24  
    25  func testCodec() *wire.Codec {
    26  	c := wire.New()
    27  	regTestCodec(c)
    28  	return c
    29  }
    30  
    31  var (
    32  	storeKeyStr = "testGlobalStore"
    33  	kvStoreKey  = sdk.NewKVStoreKey(storeKeyStr)
    34  )
    35  
    36  type storeDumper struct{}
    37  
    38  func (dumper storeDumper) NewDumper() *testutils.Dumper {
    39  	return NewDumper(NewGlobalStorage(kvStoreKey, testCodec()), regTestCodec)
    40  }
    41  
    42  type globalStoreTestSuite struct {
    43  	testsuites.GoldenTestSuite
    44  	store GlobalStorage
    45  }
    46  
    47  func NewGlobalStoreTestSuite() *globalStoreTestSuite {
    48  	return &globalStoreTestSuite{
    49  		GoldenTestSuite: testsuites.NewGoldenTestSuite(storeDumper{}, kvStoreKey),
    50  	}
    51  }
    52  
    53  func (suite *globalStoreTestSuite) SetupTest() {
    54  	suite.SetupCtx(0, time.Unix(0, 0), kvStoreKey)
    55  	suite.store = NewGlobalStorage(kvStoreKey, testCodec())
    56  }
    57  
    58  func TestGlobalStoreSuite(t *testing.T) {
    59  	suite.Run(t, NewGlobalStoreTestSuite())
    60  }
    61  
    62  func (suite *globalStoreTestSuite) TestGetSetDelTimeEventList() {
    63  	// empty not nil
    64  	lst := suite.store.GetTimeEventList(suite.Ctx, 100)
    65  	suite.NotNil(lst)
    66  	suite.Equal(0, len(lst.Events))
    67  
    68  	events1 := &linotypes.TimeEventList{
    69  		Events: []linotypes.Event{
    70  			testEvent{
    71  				Name: "event1",
    72  			},
    73  			testEvent{
    74  				Name: "event2",
    75  			},
    76  			testEvent{
    77  				Name: "event3",
    78  			},
    79  		},
    80  	}
    81  	events2 := &linotypes.TimeEventList{
    82  		Events: []linotypes.Event{
    83  			testEvent{
    84  				Name: "event4",
    85  			},
    86  		},
    87  	}
    88  	events3 := &linotypes.TimeEventList{
    89  		Events: []linotypes.Event{
    90  			testEvent{
    91  				Name: "event6",
    92  			},
    93  		},
    94  	}
    95  
    96  	suite.store.SetTimeEventList(suite.Ctx, 123, events1)
    97  	suite.store.SetTimeEventList(suite.Ctx, 456, events2)
    98  	suite.store.SetTimeEventList(suite.Ctx, 789, events3)
    99  
   100  	suite.Equal(events1, suite.store.GetTimeEventList(suite.Ctx, 123))
   101  	suite.Equal(events2, suite.store.GetTimeEventList(suite.Ctx, 456))
   102  	suite.Equal(events3, suite.store.GetTimeEventList(suite.Ctx, 789))
   103  
   104  	suite.store.RemoveTimeEventList(suite.Ctx, 789)
   105  	suite.Equal(0, len(suite.store.GetTimeEventList(suite.Ctx, 789).Events))
   106  
   107  	suite.Golden()
   108  }
   109  
   110  func (suite *globalStoreTestSuite) TestGetSetGlobalTime() {
   111  	suite.Panics(func() {
   112  		suite.store.GetGlobalTime(suite.Ctx)
   113  	})
   114  
   115  	globalTime := &GlobalTime{
   116  		ChainStartTime: 123,
   117  		LastBlockTime:  234,
   118  		PastMinutes:    345,
   119  	}
   120  
   121  	suite.store.SetGlobalTime(suite.Ctx, globalTime)
   122  	suite.Equal(globalTime, suite.store.GetGlobalTime(suite.Ctx))
   123  
   124  	globalTime.PastMinutes = 999
   125  	suite.store.SetGlobalTime(suite.Ctx, globalTime)
   126  	suite.Equal(globalTime, suite.store.GetGlobalTime(suite.Ctx))
   127  
   128  	suite.Golden()
   129  }
   130  
   131  func (suite *globalStoreTestSuite) TestGetSetEventErrors() {
   132  	suite.Nil(suite.store.GetEventErrors(suite.Ctx))
   133  
   134  	errs := []EventError{
   135  		{
   136  			Time:    123,
   137  			Event:   testEvent{Name: "lol"},
   138  			ErrCode: sdk.CodeType(123),
   139  		},
   140  	}
   141  
   142  	suite.store.SetEventErrors(suite.Ctx, errs)
   143  	suite.Equal(errs, suite.store.GetEventErrors(suite.Ctx))
   144  
   145  	errs = append(errs, EventError{
   146  		Time:    456,
   147  		Event:   testEvent{Name: "dota"},
   148  		ErrCode: sdk.CodeType(999),
   149  	})
   150  	suite.store.SetEventErrors(suite.Ctx, errs)
   151  	suite.Equal(errs, suite.store.GetEventErrors(suite.Ctx))
   152  
   153  	suite.Golden()
   154  }
   155  
   156  func (suite *globalStoreTestSuite) TestGetSetBCErrors() {
   157  	suite.Nil(suite.store.GetBCErrors(suite.Ctx))
   158  
   159  	errs := []linotypes.BCEventErr{
   160  		{
   161  			Time:         123,
   162  			ErrCode:      sdk.CodeType(123),
   163  			ErrCodeSpace: sdk.CodespaceType(789),
   164  			Reason:       "inflation failed",
   165  		},
   166  	}
   167  
   168  	suite.store.SetBCErrors(suite.Ctx, errs)
   169  	suite.Equal(errs, suite.store.GetBCErrors(suite.Ctx))
   170  
   171  	errs = append(errs, linotypes.BCEventErr{
   172  		Time:         456,
   173  		ErrCode:      sdk.CodeType(34),
   174  		ErrCodeSpace: sdk.CodespaceType(1585),
   175  		Reason:       "validator failed",
   176  	})
   177  	suite.store.SetBCErrors(suite.Ctx, errs)
   178  	suite.Equal(errs, suite.store.GetBCErrors(suite.Ctx))
   179  
   180  	suite.Golden()
   181  }