github.com/braveheart12/just@v0.8.7/ledger/artifactmanager/component_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 artifactmanager 18 19 import ( 20 "context" 21 "testing" 22 23 "github.com/gojuno/minimock" 24 "github.com/insolar/insolar/component" 25 "github.com/insolar/insolar/configuration" 26 "github.com/insolar/insolar/core" 27 "github.com/insolar/insolar/core/message" 28 "github.com/insolar/insolar/instrumentation/inslogger" 29 "github.com/insolar/insolar/ledger/recentstorage" 30 "github.com/insolar/insolar/ledger/storage" 31 "github.com/insolar/insolar/ledger/storage/jet" 32 "github.com/insolar/insolar/ledger/storage/nodes" 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/testmessagebus" 37 "github.com/stretchr/testify/assert" 38 "github.com/stretchr/testify/require" 39 "github.com/stretchr/testify/suite" 40 ) 41 42 type componentSuite struct { 43 suite.Suite 44 45 cm *component.Manager 46 ctx context.Context 47 cleaner func() 48 db storage.DBContext 49 50 scheme core.PlatformCryptographyScheme 51 pulseTracker storage.PulseTracker 52 nodeStorage nodes.Accessor 53 objectStorage storage.ObjectStorage 54 jetStorage storage.JetStorage 55 } 56 57 func NewComponentSuite() *componentSuite { 58 return &componentSuite{ 59 Suite: suite.Suite{}, 60 } 61 } 62 63 // Init and run suite 64 func TestComponentSuite(t *testing.T) { 65 suite.Run(t, NewComponentSuite()) 66 } 67 68 func (s *componentSuite) BeforeTest(suiteName, testName string) { 69 s.cm = &component.Manager{} 70 s.ctx = inslogger.TestContext(s.T()) 71 72 db, cleaner := storagetest.TmpDB(s.ctx, s.T()) 73 s.cleaner = cleaner 74 s.db = db 75 s.scheme = testutils.NewPlatformCryptographyScheme() 76 s.jetStorage = storage.NewJetStorage() 77 s.nodeStorage = nodes.NewStorage() 78 s.pulseTracker = storage.NewPulseTracker() 79 s.objectStorage = storage.NewObjectStorage() 80 81 s.cm.Inject( 82 s.scheme, 83 s.db, 84 s.jetStorage, 85 s.nodeStorage, 86 s.pulseTracker, 87 s.objectStorage, 88 ) 89 90 err := s.cm.Init(s.ctx) 91 if err != nil { 92 s.T().Error("ComponentManager init failed", err) 93 } 94 err = s.cm.Start(s.ctx) 95 if err != nil { 96 s.T().Error("ComponentManager start failed", err) 97 } 98 } 99 100 func (s *componentSuite) AfterTest(suiteName, testName string) { 101 err := s.cm.Stop(s.ctx) 102 if err != nil { 103 s.T().Error("ComponentManager stop failed", err) 104 } 105 s.cleaner() 106 } 107 108 func (s *componentSuite) TestLedgerArtifactManager_PendingRequest() { 109 mc := minimock.NewController(s.T()) 110 defer mc.Finish() 111 112 jetID := *jet.NewID(0, nil) 113 114 amPulseStorageMock := testutils.NewPulseStorageMock(s.T()) 115 amPulseStorageMock.CurrentFunc = func(p context.Context) (r *core.Pulse, r1 error) { 116 pulse, err := s.pulseTracker.GetLatestPulse(p) 117 require.NoError(s.T(), err) 118 return &pulse.Pulse, err 119 } 120 121 jcMock := testutils.NewJetCoordinatorMock(s.T()) 122 jcMock.LightExecutorForJetMock.Return(&core.RecordRef{}, nil) 123 jcMock.MeMock.Return(core.RecordRef{}) 124 125 certificate := testutils.NewCertificateMock(s.T()) 126 certificate.GetRoleMock.Return(core.StaticRoleLightMaterial) 127 128 cs := testutils.NewPlatformCryptographyScheme() 129 mb := testmessagebus.NewTestMessageBus(s.T()) 130 mb.PulseStorage = amPulseStorageMock 131 132 am := NewArtifactManger() 133 am.PulseStorage = amPulseStorageMock 134 am.PlatformCryptographyScheme = cs 135 am.DefaultBus = mb 136 am.PlatformCryptographyScheme = platformpolicy.NewPlatformCryptographyScheme() 137 138 provider := recentstorage.NewRecentStorageProvider(0) 139 140 cryptoScheme := testutils.NewPlatformCryptographyScheme() 141 142 handler := NewMessageHandler(&configuration.Ledger{ 143 LightChainLimit: 10, 144 }, 145 certificate) 146 147 handler.JetStorage = s.jetStorage 148 handler.Nodes = s.nodeStorage 149 handler.DBContext = s.db 150 handler.PulseTracker = s.pulseTracker 151 handler.ObjectStorage = s.objectStorage 152 153 handler.PlatformCryptographyScheme = cryptoScheme 154 handler.Bus = mb 155 handler.RecentStorageProvider = provider 156 handler.JetCoordinator = jcMock 157 158 handler.HotDataWaiter = NewHotDataWaiterConcrete() 159 err := handler.HotDataWaiter.Unlock(s.ctx, jetID) 160 require.NoError(s.T(), err) 161 162 err = handler.Init(s.ctx) 163 require.NoError(s.T(), err) 164 objRef := *genRandomRef(0) 165 166 s.jetStorage.UpdateJetTree(s.ctx, core.FirstPulseNumber, true, jetID) 167 s.jetStorage.UpdateJetTree(s.ctx, core.FirstPulseNumber+1, true, jetID) 168 169 // Register request 170 reqID, err := am.RegisterRequest(s.ctx, objRef, &message.Parcel{Msg: &message.CallMethod{}, PulseNumber: core.FirstPulseNumber}) 171 require.NoError(s.T(), err) 172 173 // Change pulse. 174 err = s.pulseTracker.AddPulse(s.ctx, core.Pulse{PulseNumber: core.FirstPulseNumber + 1}) 175 require.NoError(s.T(), err) 176 177 // Should have pending request. 178 has, err := am.HasPendingRequests(s.ctx, objRef) 179 require.NoError(s.T(), err) 180 assert.True(s.T(), has) 181 182 // Register result. 183 reqRef := *core.NewRecordRef(core.DomainID, *reqID) 184 _, err = am.RegisterResult(s.ctx, objRef, reqRef, nil) 185 require.NoError(s.T(), err) 186 187 // Should not have pending request. 188 has, err = am.HasPendingRequests(s.ctx, objRef) 189 require.NoError(s.T(), err) 190 assert.False(s.T(), has) 191 }