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  }