github.com/braveheart12/insolar-09-08-19@v0.8.7/ledger/pulsemanager/pulsemanager_test.go (about) 1 /* 2 * Copyright 2019 Insolar Technologies 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package pulsemanager 18 19 import ( 20 "context" 21 "testing" 22 23 "github.com/insolar/insolar/component" 24 "github.com/insolar/insolar/configuration" 25 "github.com/insolar/insolar/core" 26 "github.com/insolar/insolar/core/message" 27 "github.com/insolar/insolar/instrumentation/inslogger" 28 "github.com/insolar/insolar/ledger/recentstorage" 29 "github.com/insolar/insolar/ledger/storage" 30 "github.com/insolar/insolar/ledger/storage/index" 31 "github.com/insolar/insolar/ledger/storage/jet" 32 "github.com/insolar/insolar/ledger/storage/record" 33 "github.com/insolar/insolar/ledger/storage/storagetest" 34 "github.com/insolar/insolar/platformpolicy" 35 "github.com/insolar/insolar/testutils" 36 "github.com/insolar/insolar/testutils/network" 37 "github.com/stretchr/testify/assert" 38 "github.com/stretchr/testify/require" 39 "github.com/stretchr/testify/suite" 40 ) 41 42 type pulseManagerSuite struct { 43 suite.Suite 44 45 cm *component.Manager 46 ctx context.Context 47 cleaner func() 48 49 objectStorage storage.ObjectStorage 50 } 51 52 func NewPulseManagerSuite() *pulseManagerSuite { 53 return &pulseManagerSuite{ 54 Suite: suite.Suite{}, 55 } 56 } 57 58 // Init and run suite 59 func TestPulseManager(t *testing.T) { 60 suite.Run(t, NewPulseManagerSuite()) 61 } 62 63 func (s *pulseManagerSuite) BeforeTest(suiteName, testName string) { 64 s.cm = &component.Manager{} 65 s.ctx = inslogger.TestContext(s.T()) 66 67 db, cleaner := storagetest.TmpDB(s.ctx, s.T()) 68 s.cleaner = cleaner 69 s.objectStorage = storage.NewObjectStorage() 70 71 s.cm.Inject( 72 platformpolicy.NewPlatformCryptographyScheme(), 73 db, 74 s.objectStorage, 75 ) 76 77 err := s.cm.Init(s.ctx) 78 if err != nil { 79 s.T().Error("ComponentManager init failed", err) 80 } 81 err = s.cm.Start(s.ctx) 82 if err != nil { 83 s.T().Error("ComponentManager start failed", err) 84 } 85 } 86 87 func (s *pulseManagerSuite) AfterTest(suiteName, testName string) { 88 err := s.cm.Stop(s.ctx) 89 if err != nil { 90 s.T().Error("ComponentManager stop failed", err) 91 } 92 s.cleaner() 93 } 94 95 func (s *pulseManagerSuite) TestPulseManager_Set_CheckHotIndexesSending() { 96 // Error: Not equal: 97 // expected: 0x2 98 // actual : 0x0 99 s.T().Skip() 100 101 // Arrange 102 jetID := jet.ZeroJetID 103 objID := core.RecordID{} 104 105 lr := testutils.NewLogicRunnerMock(s.T()) 106 lr.OnPulseMock.Return(nil) 107 108 firstID, _ := s.objectStorage.SetRecord( 109 s.ctx, 110 jetID, 111 core.GenesisPulse.PulseNumber, 112 &record.ObjectActivateRecord{}) 113 firstIndex := index.ObjectLifeline{ 114 LatestState: firstID, 115 } 116 _ = s.objectStorage.SetObjectIndex(s.ctx, jetID, firstID, &firstIndex) 117 codeRecord := &record.CodeRecord{} 118 secondID, _ := s.objectStorage.SetRecord( 119 s.ctx, 120 jetID, 121 core.GenesisPulse.PulseNumber, 122 codeRecord, 123 ) 124 125 indexMock := recentstorage.NewRecentIndexStorageMock(s.T()) 126 pendingMock := recentstorage.NewPendingStorageMock(s.T()) 127 // TODO: @andreyromancev. 12.01.19. Uncomment to check if this doesn't delete indexes it should not. 128 // recentMock.ClearZeroTTLObjectsMock.Return() 129 // recentMock.ClearObjectsMock.Return() 130 indexMock.GetObjectsMock.Return(map[core.RecordID]int{ 131 *firstID: 1, 132 }) 133 pendingMock.GetRequestsMock.Return( 134 map[core.RecordID]recentstorage.PendingObjectContext{ 135 objID: {Requests: []core.RecordID{*secondID}}, 136 }) 137 138 providerMock := recentstorage.NewProviderMock(s.T()) 139 providerMock.GetPendingStorageMock.Return(pendingMock) 140 providerMock.GetIndexStorageMock.Return(indexMock) 141 providerMock.ClonePendingStorageMock.Return() 142 providerMock.CloneIndexStorageMock.Return() 143 144 mbMock := testutils.NewMessageBusMock(s.T()) 145 mbMock.OnPulseFunc = func(context.Context, core.Pulse) error { 146 return nil 147 } 148 mbMock.SendFunc = func(p context.Context, p1 core.Message, p2 *core.MessageSendOptions) (r core.Reply, r1 error) { 149 val, ok := p1.(*message.HotData) 150 if !ok { 151 return nil, nil 152 } 153 154 // Assert 155 require.Equal(s.T(), 1, len(val.PendingRequests)) 156 objContext, ok := val.PendingRequests[objID] 157 require.True(s.T(), ok) 158 require.Equal(s.T(), 1, len(objContext.Requests)) 159 160 require.Equal(s.T(), 1, len(val.RecentObjects)) 161 decodedIndex, err := index.DecodeObjectLifeline(val.RecentObjects[*firstID].Index) 162 require.NoError(s.T(), err) 163 require.Equal(s.T(), firstIndex, *decodedIndex) 164 require.Equal(s.T(), 1, val.RecentObjects[*firstID].TTL) 165 166 return nil, nil 167 } 168 169 nodeMock := network.NewNodeMock(s.T()) 170 nodeMock.RoleMock.Return(core.StaticRoleLightMaterial) 171 nodeMock.IDMock.Return(core.RecordRef{}) 172 173 nodeNetworkMock := network.NewNodeNetworkMock(s.T()) 174 nodeNetworkMock.GetWorkingNodesMock.Return([]core.Node{nodeMock}) 175 nodeNetworkMock.GetOriginMock.Return(nodeMock) 176 177 jetCoordinatorMock := testutils.NewJetCoordinatorMock(s.T()) 178 executor := core.NewRecordRef(core.RecordID{}, *core.NewRecordID(123, []byte{3, 2, 1})) 179 jetCoordinatorMock.LightExecutorForJetMock.Return(executor, nil) 180 jetCoordinatorMock.MeMock.Return(*executor) 181 182 pm := NewPulseManager(configuration.Ledger{ 183 JetSizesHistoryDepth: 5, 184 }) 185 186 gil := testutils.NewGlobalInsolarLockMock(s.T()) 187 gil.AcquireMock.Return() 188 gil.ReleaseMock.Return() 189 190 alsMock := testutils.NewActiveListSwapperMock(s.T()) 191 alsMock.MoveSyncToActiveFunc = func(context.Context) error { return nil } 192 193 cryptoServiceMock := testutils.NewCryptographyServiceMock(s.T()) 194 cryptoServiceMock.SignFunc = func(p []byte) (r *core.Signature, r1 error) { 195 signature := core.SignatureFromBytes(nil) 196 return &signature, nil 197 } 198 199 pulseStorageMock := NewpulseStoragePmMock(s.T()) 200 pulseStorageMock.CurrentMock.Return(core.GenesisPulse, nil) 201 pulseStorageMock.LockMock.Return() 202 pulseStorageMock.UnlockMock.Return() 203 pulseStorageMock.SetMock.Return() 204 205 pm.LR = lr 206 207 pm.RecentStorageProvider = providerMock 208 pm.Bus = mbMock 209 pm.NodeNet = nodeNetworkMock 210 pm.GIL = gil 211 pm.ActiveListSwapper = alsMock 212 pm.CryptographyService = cryptoServiceMock 213 pm.PlatformCryptographyScheme = testutils.NewPlatformCryptographyScheme() 214 pm.PulseStorage = pulseStorageMock 215 pm.JetCoordinator = jetCoordinatorMock 216 217 // Act 218 err := pm.Set(s.ctx, core.Pulse{PulseNumber: core.FirstPulseNumber + 1}, true) 219 require.NoError(s.T(), err) 220 // // TODO: @andreyromancev. 12.01.19. put 1, when dynamic split is working. 221 assert.Equal(s.T(), uint64(2), mbMock.SendMinimockCounter()) // 1 validator drop (no split) 222 savedIndex, err := s.objectStorage.GetObjectIndex(s.ctx, jetID, firstID, false) 223 require.NoError(s.T(), err) 224 225 // Assert 226 require.NotNil(s.T(), savedIndex) 227 require.NotNil(s.T(), firstIndex, savedIndex) 228 indexMock.MinimockFinish() 229 pendingMock.MinimockFinish() 230 }