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  }