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  }