public async Task ProviderInitTests_RocksDbProvider() { var dbProvider = new DbProvider(DbModeHint.Persisted); var rocksDbFactory = new RocksDbFactory(new DbConfig(), LimboLogs.Instance, Path.Combine(_folderWithDbs, "rocks")); var initializer = new NdmDbInitializer(new NdmConfig(), dbProvider, rocksDbFactory, new MemDbFactory()); await initializer.Init(); Assert.NotNull(dbProvider.GetDb <IDb>(NdmDbNames.Configs)); Assert.NotNull(dbProvider.GetDb <IDb>(NdmDbNames.EthRequests)); Assert.AreEqual(2, dbProvider.RegisteredDbs.Count()); Assert.IsTrue(dbProvider.GetDb <IDb>(NdmDbNames.Configs) is DbOnTheRocks); Assert.IsTrue(dbProvider.GetDb <IDb>(NdmDbNames.EthRequests) is DbOnTheRocks); }
public async Task ProviderInitTests_BeamSyncDbProvider() { var syncModeSelector = Substitute.For <ISyncModeSelector>(); var dbProvider = TestMemDbProvider.Init(); var rocksDbFactory = new RocksDbFactory(new DbConfig(), LimboLogs.Instance, Path.Combine(_folderWithDbs, "beam")); IDbProvider beamSyncDbProvider = new BeamSyncDbProvider(syncModeSelector, dbProvider, new SyncConfig(), LimboLogs.Instance); var initializer = new NdmDbInitializer(new NdmConfig(), beamSyncDbProvider, rocksDbFactory, new MemDbFactory()); await initializer.Init(); Assert.NotNull(beamSyncDbProvider.GetDb <IDb>(NdmDbNames.Configs)); Assert.NotNull(beamSyncDbProvider.GetDb <IDb>(NdmDbNames.EthRequests)); Assert.IsTrue(beamSyncDbProvider.GetDb <IDb>(NdmDbNames.Configs) is MemDb); Assert.IsTrue(beamSyncDbProvider.GetDb <IDb>(NdmDbNames.EthRequests) is MemDb); }
public async Task ProviderInitTests_RpcDbProvider() { var dbProvider = new DbProvider(DbModeHint.Persisted); var rocksDbFactory = new RocksDbFactory(new DbConfig(), LimboLogs.Instance, Path.Combine(_folderWithDbs, "rpc")); var serializer = Substitute.For <IJsonSerializer>(); var client = Substitute.For <IJsonRpcClient>(); var rpcDbFactory = new RpcDbFactory(new MemDbFactory(), rocksDbFactory, serializer, client, LimboLogs.Instance); var initializer = new NdmDbInitializer(new NdmConfig(), dbProvider, rpcDbFactory, rpcDbFactory); await initializer.Init(); dbProvider.RegisterDb("test", new MemDb()); Assert.NotNull(dbProvider.GetDb <IDb>(NdmDbNames.Configs)); Assert.NotNull(dbProvider.GetDb <IDb>(NdmDbNames.EthRequests)); Assert.AreEqual(3, dbProvider.RegisteredDbs.Count()); Assert.IsTrue(dbProvider.GetDb <IDb>(NdmDbNames.Configs) is ReadOnlyDb); Assert.IsTrue(dbProvider.GetDb <IDb>(NdmDbNames.EthRequests) is ReadOnlyDb); }
protected async Task PreInitAsync(INdmApi ndmApi) { if (ndmApi == null) { throw new ArgumentNullException(nameof(ndmApi)); } IDbProvider?dbProvider = ndmApi.DbProvider; if (dbProvider == null) { throw new ArgumentNullException(nameof(dbProvider)); } IConfigProvider configProvider = ndmApi.ConfigProvider; ILogManager logManager = ndmApi.LogManager; if (!(configProvider.GetConfig <INdmConfig>() is NdmConfig defaultConfig)) { return; } if (!defaultConfig.Enabled) { return; } if (defaultConfig.StoreConfigInDatabase && string.IsNullOrWhiteSpace(defaultConfig.Id)) { throw new ArgumentException("NDM config stored in database requires an id.", nameof(defaultConfig.Id)); } IConfigRepository configRepository; IEthRequestRepository ethRequestRepository; switch (defaultConfig.Persistence?.ToLowerInvariant()) { case "mongo": ndmApi.MongoProvider = new MongoProvider(configProvider.GetConfig <INdmMongoConfig>(), logManager); IMongoDatabase?database = ndmApi.MongoProvider.GetDatabase(); if (database == null) { throw new ApplicationException("Failed to initialize Mongo database"); } configRepository = new ConfigMongoRepository(database); ethRequestRepository = new EthRequestMongoRepository(database); break; default: ndmApi.MongoProvider = NullMongoProvider.Instance; var ndmDbProvider = new NdmDbInitializer(defaultConfig, ndmApi.DbProvider, ndmApi.RocksDbFactory, ndmApi.MemDbFactory); await ndmDbProvider.Init(); configRepository = new ConfigRocksRepository(ndmApi.DbProvider.GetDb <IDb>(NdmDbNames.Configs), new NdmConfigDecoder()); ethRequestRepository = new EthRequestRocksRepository(ndmApi.DbProvider.GetDb <IDb>(NdmDbNames.EthRequests), new EthRequestDecoder()); break; } ndmApi.ConfigManager = new ConfigManager(defaultConfig, configRepository); ndmApi.NdmConfig = await ndmApi.ConfigManager.GetAsync(defaultConfig.Id); if (ndmApi.NdmConfig is null) { ndmApi.NdmConfig = defaultConfig; if (defaultConfig.StoreConfigInDatabase) { await ndmApi.ConfigManager.UpdateAsync((NdmConfig)ndmApi.NdmConfig); } } IWebSocketsModule webSocketsModule = ndmApi.WebSocketsManager !.GetModule("ndm"); ndmApi.NdmNotifier = new NdmNotifier(webSocketsModule); ndmApi.EthRequestService = new EthRequestService(ndmApi.NdmConfig.FaucetHost, logManager); string baseDbPath = configProvider.GetConfig <IInitConfig>().BaseDbPath; ndmApi.BaseDbPath = DbPath = Path.Combine(baseDbPath, ndmApi.NdmConfig.DatabasePath); await _ndmModule.InitAsync(); if (ndmApi.NdmConfig.FaucetEnabled) { // faucet should be separate from NDM? but it uses MongoDB? // so maybe we could extract Mongo DB beyond NDM? why would it be related? if (string.IsNullOrWhiteSpace(ndmApi.NdmConfig.FaucetAddress)) { ndmApi.NdmFaucet = EmptyFaucet.Instance; _logger.Warn("Faucet cannot be started due to missing faucet address configuration."); } else { Address faucetAddress = new(ndmApi.NdmConfig.FaucetAddress); ndmApi.NdmFaucet = new NdmFaucet( ndmApi.BlockchainBridge, ethRequestRepository, faucetAddress, ndmApi.NdmConfig.FaucetWeiRequestMaxValue, ndmApi.NdmConfig.FaucetEthDailyRequestsTotalValue, ndmApi.NdmConfig.FaucetEnabled, ndmApi.Timestamper, ndmApi.Wallet, logManager); } } else { ndmApi.NdmFaucet = EmptyFaucet.Instance; } ndmApi.ConsumerAddress = string.IsNullOrWhiteSpace(ndmApi.NdmConfig.ConsumerAddress) ? Address.Zero : new Address(ndmApi.NdmConfig.ConsumerAddress); ndmApi.ProviderAddress = string.IsNullOrWhiteSpace(ndmApi.NdmConfig.ProviderAddress) ? Address.Zero : new Address(ndmApi.NdmConfig.ProviderAddress); await _ndmConsumersModule.Init(); }