github.com/braveheart12/insolar-09-08-19@v0.8.7/ledger/storage/storage_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 storage_test 18 19 import ( 20 "bytes" 21 "context" 22 "testing" 23 24 "github.com/insolar/insolar/component" 25 base58 "github.com/jbenet/go-base58" 26 "github.com/stretchr/testify/suite" 27 28 "github.com/insolar/insolar/core" 29 "github.com/insolar/insolar/core/message" 30 "github.com/insolar/insolar/instrumentation/inslogger" 31 "github.com/insolar/insolar/ledger/storage" 32 "github.com/insolar/insolar/ledger/storage/index" 33 "github.com/insolar/insolar/ledger/storage/jet" 34 "github.com/insolar/insolar/ledger/storage/record" 35 "github.com/insolar/insolar/ledger/storage/storagetest" 36 "github.com/insolar/insolar/platformpolicy" 37 "github.com/insolar/insolar/testutils" 38 "github.com/stretchr/testify/assert" 39 "github.com/stretchr/testify/require" 40 ) 41 42 type storageSuite struct { 43 suite.Suite 44 45 cm *component.Manager 46 ctx context.Context 47 cleaner func() 48 db storage.DBContext 49 50 objectStorage storage.ObjectStorage 51 dropStorage storage.DropStorage 52 pulseTracker storage.PulseTracker 53 54 jetID core.RecordID 55 } 56 57 func NewStorageSuite() *storageSuite { 58 return &storageSuite{ 59 Suite: suite.Suite{}, 60 } 61 } 62 63 // Init and run suite 64 func TestStorage(t *testing.T) { 65 suite.Run(t, NewStorageSuite()) 66 } 67 68 func (s *storageSuite) 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.db = db 74 s.cleaner = cleaner 75 76 s.objectStorage = storage.NewObjectStorage() 77 s.dropStorage = storage.NewDropStorage(10) 78 s.pulseTracker = storage.NewPulseTracker() 79 s.jetID = testutils.RandomJet() 80 81 s.cm.Inject( 82 platformpolicy.NewPlatformCryptographyScheme(), 83 s.db, 84 s.objectStorage, 85 s.dropStorage, 86 s.pulseTracker, 87 ) 88 89 err := s.cm.Init(s.ctx) 90 if err != nil { 91 s.T().Error("ComponentManager init failed", err) 92 } 93 err = s.cm.Start(s.ctx) 94 if err != nil { 95 s.T().Error("ComponentManager start failed", err) 96 } 97 } 98 99 func (s *storageSuite) AfterTest(suiteName, testName string) { 100 err := s.cm.Stop(s.ctx) 101 if err != nil { 102 s.T().Error("ComponentManager stop failed", err) 103 } 104 s.cleaner() 105 } 106 107 func (s *storageSuite) TestDB_GetRecordNotFound() { 108 rec, err := s.objectStorage.GetRecord(s.ctx, s.jetID, &core.RecordID{}) 109 assert.Equal(s.T(), err, core.ErrNotFound) 110 assert.Nil(s.T(), rec) 111 } 112 113 func (s *storageSuite) TestDB_SetRecord() { 114 rec := &record.RequestRecord{} 115 gotRef, err := s.objectStorage.SetRecord(s.ctx, s.jetID, core.GenesisPulse.PulseNumber, rec) 116 assert.Nil(s.T(), err) 117 118 gotRec, err := s.objectStorage.GetRecord(s.ctx, s.jetID, gotRef) 119 assert.Nil(s.T(), err) 120 assert.Equal(s.T(), rec, gotRec) 121 122 _, err = s.objectStorage.SetRecord(s.ctx, s.jetID, core.GenesisPulse.PulseNumber, rec) 123 assert.Equalf(s.T(), err, storage.ErrOverride, "records override should be forbidden") 124 } 125 126 func (s *storageSuite) TestDB_SetObjectIndex_ReturnsNotFoundIfNoIndex() { 127 idx, err := s.objectStorage.GetObjectIndex(s.ctx, s.jetID, core.NewRecordID(0, hexhash("5000")), false) 128 assert.Equal(s.T(), core.ErrNotFound, err) 129 assert.Nil(s.T(), idx) 130 } 131 132 func (s *storageSuite) TestDB_SetObjectIndex_StoresCorrectDataInStorage() { 133 idx := index.ObjectLifeline{ 134 LatestState: core.NewRecordID(0, hexhash("20")), 135 } 136 zeroid := core.NewRecordID(0, hexhash("")) 137 err := s.objectStorage.SetObjectIndex(s.ctx, s.jetID, zeroid, &idx) 138 assert.Nil(s.T(), err) 139 140 storedIndex, err := s.objectStorage.GetObjectIndex(s.ctx, s.jetID, zeroid, false) 141 assert.NoError(s.T(), err) 142 assert.Equal(s.T(), *storedIndex, idx) 143 } 144 145 func (s *storageSuite) TestDB_SetObjectIndex_SaveLastUpdate() { 146 // Arrange 147 jetID := testutils.RandomJet() 148 149 idx := index.ObjectLifeline{ 150 LatestState: core.NewRecordID(0, hexhash("20")), 151 LatestUpdate: 1239, 152 } 153 zeroid := core.NewRecordID(0, hexhash("")) 154 155 // Act 156 err := s.objectStorage.SetObjectIndex(s.ctx, jetID, zeroid, &idx) 157 assert.Nil(s.T(), err) 158 159 // Assert 160 storedIndex, err := s.objectStorage.GetObjectIndex(s.ctx, jetID, zeroid, false) 161 assert.NoError(s.T(), err) 162 assert.Equal(s.T(), *storedIndex, idx) 163 assert.Equal(s.T(), 1239, int(idx.LatestUpdate)) 164 } 165 166 func (s *storageSuite) TestDB_GetDrop_ReturnsNotFoundIfNoDrop() { 167 drop, err := s.dropStorage.GetDrop(s.ctx, testutils.RandomJet(), 1) 168 assert.Equal(s.T(), err, core.ErrNotFound) 169 assert.Nil(s.T(), drop) 170 } 171 172 func (s *storageSuite) TestDB_CreateDrop() { 173 // FIXME: should work with random jet 174 // jetID := testutils.RandomJet() 175 jetID := *jet.NewID(0, nil) 176 177 pulse := core.PulseNumber(core.FirstPulseNumber + 10) 178 err := s.pulseTracker.AddPulse( 179 s.ctx, 180 core.Pulse{ 181 PulseNumber: pulse, 182 Entropy: core.Entropy{1, 2, 3}, 183 }, 184 ) 185 cs := platformpolicy.NewPlatformCryptographyScheme() 186 187 msgCount := 3 188 for i := 1; i < 1+msgCount; i++ { 189 setRecordMessage := message.SetRecord{ 190 Record: record.SerializeRecord(&record.CodeRecord{ 191 Code: record.CalculateIDForBlob(cs, pulse, []byte{byte(i)}), 192 }), 193 } 194 err = s.objectStorage.SetMessage(s.ctx, jetID, pulse, &setRecordMessage) 195 require.NoError(s.T(), err) 196 _, err = s.objectStorage.SetBlob(s.ctx, jetID, pulse, []byte{byte(i)}) 197 require.NoError(s.T(), err) 198 } 199 200 drop, messages, dropSize, err := s.dropStorage.CreateDrop(s.ctx, jetID, pulse, []byte{4, 5, 6}) 201 require.NoError(s.T(), err) 202 require.NotEqual(s.T(), 0, dropSize) 203 // TODO: messages collection was disabled in ab46d01, validation is not active ATM 204 require.Equal(s.T(), 0, len(messages)) 205 require.Equal(s.T(), pulse, drop.Pulse) 206 require.Equal(s.T(), "2aCdao6DhZSWQNTrtrxJW7QQZRb6UJ1ssRi9cg", base58.Encode(drop.Hash)) 207 208 for _, rawMessage := range messages { 209 formatedMessage, err := message.Deserialize(bytes.NewBuffer(rawMessage)) 210 assert.NoError(s.T(), err) 211 assert.Equal(s.T(), core.TypeSetRecord, formatedMessage.Type()) 212 } 213 } 214 215 func (s *storageSuite) TestDB_SetDrop() { 216 drop42 := jet.JetDrop{ 217 Pulse: 42, 218 Hash: []byte{0xFF}, 219 } 220 // FIXME: should work with random jet 221 // jetID := testutils.RandomJet() 222 jetID := *jet.NewID(0, nil) 223 err := s.dropStorage.SetDrop(s.ctx, jetID, &drop42) 224 assert.NoError(s.T(), err) 225 226 got, err := s.dropStorage.GetDrop(s.ctx, jetID, 42) 227 assert.NoError(s.T(), err) 228 assert.Equal(s.T(), *got, drop42) 229 } 230 231 func (s *storageSuite) TestDB_AddPulse() { 232 pulse42 := core.Pulse{PulseNumber: 42, Entropy: core.Entropy{1, 2, 3}} 233 err := s.pulseTracker.AddPulse(s.ctx, pulse42) 234 require.NoError(s.T(), err) 235 236 latestPulse, err := s.pulseTracker.GetLatestPulse(s.ctx) 237 assert.Equal(s.T(), core.PulseNumber(42), latestPulse.Pulse.PulseNumber) 238 239 pulse, err := s.pulseTracker.GetPulse(s.ctx, latestPulse.Pulse.PulseNumber) 240 require.NoError(s.T(), err) 241 242 prevPulse, err := s.pulseTracker.GetPulse(s.ctx, *latestPulse.Prev) 243 require.NoError(s.T(), err) 244 245 prevPN := core.PulseNumber(core.FirstPulseNumber) 246 expectPulse := storage.Pulse{ 247 Prev: &prevPN, 248 Pulse: pulse42, 249 SerialNumber: prevPulse.SerialNumber + 1, 250 } 251 assert.Equal(s.T(), expectPulse, *pulse) 252 } 253 254 func TestDB_Close(t *testing.T) { 255 ctx := inslogger.TestContext(t) 256 db, cleaner := storagetest.TmpDB(ctx, t) 257 258 jetID := testutils.RandomJet() 259 260 os := storage.NewObjectStorage() 261 ds := storage.NewDropStorage(10) 262 263 cm := &component.Manager{} 264 cm.Inject( 265 platformpolicy.NewPlatformCryptographyScheme(), 266 db, 267 os, 268 ds, 269 ) 270 err := cm.Init(ctx) 271 if err != nil { 272 t.Error("ComponentManager init failed", err) 273 } 274 err = cm.Start(ctx) 275 if err != nil { 276 t.Error("ComponentManager start failed", err) 277 } 278 279 err = cm.Stop(ctx) 280 if err != nil { 281 t.Error("ComponentManager stop failed", err) 282 } 283 284 cleaner() 285 286 rec, err := os.GetRecord(ctx, jetID, &core.RecordID{}) 287 assert.Nil(t, rec) 288 assert.Equal(t, err, storage.ErrClosed) 289 290 rec = &record.RequestRecord{} 291 gotRef, err := os.SetRecord(ctx, jetID, core.GenesisPulse.PulseNumber, rec) 292 assert.Nil(t, gotRef) 293 assert.Equal(t, err, storage.ErrClosed) 294 }