github.com/braveheart12/insolar-09-08-19@v0.8.7/ledger/ledgertestutils/ledgertestutils.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 ledgertestutils
    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/instrumentation/inslogger"
    28  	"github.com/insolar/insolar/ledger"
    29  	"github.com/insolar/insolar/ledger/artifactmanager"
    30  	"github.com/insolar/insolar/ledger/pulsemanager"
    31  	"github.com/insolar/insolar/ledger/recentstorage"
    32  	"github.com/insolar/insolar/ledger/storage"
    33  	"github.com/insolar/insolar/ledger/storage/jet"
    34  	"github.com/insolar/insolar/ledger/storage/nodes"
    35  	"github.com/insolar/insolar/ledger/storage/storagetest"
    36  	"github.com/insolar/insolar/log"
    37  	"github.com/insolar/insolar/messagebus"
    38  	"github.com/insolar/insolar/network/nodenetwork"
    39  	"github.com/insolar/insolar/platformpolicy"
    40  	"github.com/insolar/insolar/testutils"
    41  	"github.com/insolar/insolar/testutils/testmessagebus"
    42  	"github.com/stretchr/testify/require"
    43  )
    44  
    45  // TmpLedger crteates ledger on top of temporary database.
    46  // Returns *ledger.Ledger and cleanup function.
    47  // FIXME: THIS METHOD IS DEPRECATED. USE MOCKS.
    48  func TmpLedger(t *testing.T, dir string, handlersRole core.StaticRole, c core.Components, closeJets bool) (*ledger.Ledger, storage.DBContext, func()) {
    49  	log.Warn("TmpLedger is deprecated. Use mocks.")
    50  
    51  	pcs := platformpolicy.NewPlatformCryptographyScheme()
    52  	mc := minimock.NewController(t)
    53  
    54  	// Init subcomponents.
    55  	ctx := inslogger.TestContext(t)
    56  	conf := configuration.NewLedger()
    57  	db, dbcancel := storagetest.TmpDB(ctx, t, storagetest.Dir(dir))
    58  
    59  	cm := &component.Manager{}
    60  	gi := storage.NewGenesisInitializer()
    61  	pt := storage.NewPulseTracker()
    62  	ps := storage.NewPulseStorage()
    63  	js := storage.NewJetStorage()
    64  	os := storage.NewObjectStorage()
    65  	ns := nodes.NewStorage()
    66  	ds := storage.NewDropStorage(10)
    67  	rs := storage.NewReplicaStorage()
    68  	cl := storage.NewCleaner()
    69  
    70  	am := artifactmanager.NewArtifactManger()
    71  	am.PlatformCryptographyScheme = pcs
    72  
    73  	conf.PulseManager.HeavySyncEnabled = false
    74  	pm := pulsemanager.NewPulseManager(conf)
    75  	jc := testutils.NewJetCoordinatorMock(mc)
    76  	jc.IsAuthorizedMock.Return(true, nil)
    77  	jc.LightExecutorForJetMock.Return(&core.RecordRef{}, nil)
    78  	jc.HeavyMock.Return(&core.RecordRef{}, nil)
    79  	jc.MeMock.Return(core.RecordRef{})
    80  	jc.IsBeyondLimitMock.Return(false, nil)
    81  
    82  	// Init components.
    83  	if c.MessageBus == nil {
    84  		mb := testmessagebus.NewTestMessageBus(t)
    85  		mb.PulseStorage = ps
    86  		c.MessageBus = mb
    87  	} else {
    88  		switch mb := c.MessageBus.(type) {
    89  		case *messagebus.MessageBus:
    90  			mb.PulseStorage = ps
    91  		case *testmessagebus.TestMessageBus:
    92  			mb.PulseStorage = ps
    93  		default:
    94  			panic("unknown message bus")
    95  		}
    96  	}
    97  	if c.NodeNetwork == nil {
    98  		c.NodeNetwork = nodenetwork.NewNodeKeeper(nodenetwork.NewNode(core.RecordRef{}, core.StaticRoleLightMaterial, nil, "127.0.0.1:5432", ""))
    99  	}
   100  
   101  	certificate := testutils.NewCertificateMock(t)
   102  	certificate.GetRoleMock.Return(handlersRole)
   103  
   104  	handler := artifactmanager.NewMessageHandler(&conf, certificate)
   105  	handler.PulseTracker = pt
   106  	handler.JetStorage = js
   107  	handler.Nodes = ns
   108  	handler.DBContext = db
   109  	handler.ObjectStorage = os
   110  	handler.DropStorage = ds
   111  
   112  	handler.PlatformCryptographyScheme = pcs
   113  	handler.JetCoordinator = jc
   114  
   115  	am.DefaultBus = c.MessageBus
   116  	am.JetCoordinator = jc
   117  
   118  	cm.Inject(
   119  		platformpolicy.NewPlatformCryptographyScheme(),
   120  		db,
   121  		js,
   122  		os,
   123  		ns,
   124  		pt,
   125  		ps,
   126  		ds,
   127  		gi,
   128  		am,
   129  		rs,
   130  		cl,
   131  	)
   132  
   133  	err := cm.Init(ctx)
   134  	if err != nil {
   135  		t.Error("ComponentManager init failed", err)
   136  	}
   137  	err = cm.Start(ctx)
   138  	if err != nil {
   139  		t.Error("ComponentManager start failed", err)
   140  	}
   141  
   142  	pulse, err := pt.GetLatestPulse(ctx)
   143  	require.NoError(t, err)
   144  	ps.Set(&pulse.Pulse)
   145  
   146  	gilMock := testutils.NewGlobalInsolarLockMock(t)
   147  	gilMock.AcquireFunc = func(context.Context) {}
   148  	gilMock.ReleaseFunc = func(context.Context) {}
   149  
   150  	alsMock := testutils.NewActiveListSwapperMock(t)
   151  	alsMock.MoveSyncToActiveFunc = func(context.Context) error { return nil }
   152  
   153  	handler.Bus = c.MessageBus
   154  
   155  	pm.NodeNet = c.NodeNetwork
   156  	pm.GIL = gilMock
   157  	pm.Bus = c.MessageBus
   158  	pm.LR = c.LogicRunner
   159  	pm.ActiveListSwapper = alsMock
   160  	pm.PulseStorage = ps
   161  	pm.JetStorage = js
   162  	pm.DropStorage = ds
   163  	pm.ObjectStorage = os
   164  	pm.Nodes = ns
   165  	pm.NodeSetter = ns
   166  	pm.PulseTracker = pt
   167  	pm.ReplicaStorage = rs
   168  	pm.StorageCleaner = cl
   169  
   170  	hdw := artifactmanager.NewHotDataWaiterConcrete()
   171  
   172  	pm.HotDataWaiter = hdw
   173  	handler.HotDataWaiter = hdw
   174  
   175  	indexMock := recentstorage.NewRecentIndexStorageMock(t)
   176  	pendingMock := recentstorage.NewPendingStorageMock(t)
   177  
   178  	indexMock.AddObjectMock.Return()
   179  	pendingMock.GetRequestsForObjectMock.Return(nil)
   180  	pendingMock.AddPendingRequestMock.Return()
   181  	pendingMock.RemovePendingRequestMock.Return()
   182  
   183  	provideMock := recentstorage.NewProviderMock(t)
   184  	provideMock.GetIndexStorageMock.Return(indexMock)
   185  	provideMock.GetPendingStorageMock.Return(pendingMock)
   186  	provideMock.CountMock.Return(0)
   187  
   188  	handler.RecentStorageProvider = provideMock
   189  
   190  	err = handler.Init(ctx)
   191  	if err != nil {
   192  		panic(err)
   193  	}
   194  
   195  	if closeJets {
   196  		err := pm.HotDataWaiter.Unlock(ctx, *jet.NewID(0, nil))
   197  		require.NoError(t, err)
   198  	}
   199  
   200  	// Create ledger.
   201  	l := ledger.NewTestLedger(db, am, pm, jc)
   202  
   203  	return l, db, dbcancel
   204  }