Esempio n. 1
0
        public async Task WorksCorrectlyForOneThread_InvalidateCacheAsync()
        {
            // arrange
            var(h3, y1) = MakeFakeHttpClientHandler();

            // act

            var httpBuilder   = HttpClientGenerator.BuildForUrl("http://fake.host");
            var cacheManager  = new ClientCacheManager();
            var testInterface = httpBuilder
                                .WithCachingStrategy(new AttributeBasedCachingStrategy())
                                .WithAdditionalDelegatingHandler(h3)
                                .Create(cacheManager)
                                .Generate <ITestInterface>();

            var result = await testInterface.TestMethodWithCache();

            var result1 = await testInterface.TestMethodWithCache();

            cacheManager.InvalidateCacheAsync().Wait();
            var result2 = await testInterface.TestMethodWithCache();

            cacheManager.Dispose();
            // assert
            result.Should().Be(_result1Str);
            result1.Should().Be(_result1Str);
            result2.Should().Be(_result2Str);
        }
Esempio n. 2
0
        private static T GetApi <T>(ClientSettings apiSettings)
        {
            var generator = HttpClientGenerator.BuildForUrl(apiSettings.ServiceUrl)
                            .WithoutCaching().WithoutRetries().Create();

            return(generator.Generate <T>());
        }
Esempio n. 3
0
        protected override void Load(ContainerBuilder builder)
        {
            var dataReaderHttpGenerator = HttpClientGenerator
                                          .BuildForUrl(_settings.Services.DataReader.Url)
                                          .WithApiKey(_settings.Services.DataReader.ApiKey)
                                          .Create();

            builder.RegisterInstance(dataReaderHttpGenerator.Generate <Backend.Contracts.IAccountsApi>())
            .As <Backend.Contracts.IAccountsApi>()
            .SingleInstance();
            builder.RegisterInstance(dataReaderHttpGenerator.Generate <Backend.Contracts.ITradeMonitoringReadingApi>())
            .As <Backend.Contracts.ITradeMonitoringReadingApi>()
            .SingleInstance();
            builder.RegisterInstance(dataReaderHttpGenerator.Generate <Backend.Contracts.IAccountHistoryApi>())
            .As <Backend.Contracts.IAccountHistoryApi>()
            .SingleInstance();
            builder.RegisterInstance(dataReaderHttpGenerator.Generate <Backend.Contracts.IAssetPairsReadingApi>())
            .As <Backend.Contracts.IAssetPairsReadingApi>()
            .SingleInstance();

            builder.RegisterLykkeServiceClient(_settings.Services.ClientAccount.Url);

            builder.Register <IEmailSender>(ctx => new EmailSenderClient(_settings.Services.EmailSender.Url, _log))
            .SingleInstance();
        }
        /// <summary>
        /// Registers <see cref="IChestClient"/> in service collection.
        /// </summary>
        /// <param name="services">The collection of service descriptors.</param>
        /// <param name="serviceUrl">The service URL.</param>
        /// <param name="apiKey">The authentication API key.</param>
        /// <param name="timeout">The request timeout in second.</param>
        public static void AddChestClient(this IServiceCollection services, string serviceUrl, string apiKey = null,
                                          int?timeout = null)
        {
            if (string.IsNullOrWhiteSpace(serviceUrl))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(serviceUrl));
            }

            var builder = HttpClientGenerator
                          .BuildForUrl(serviceUrl);

            if (timeout.HasValue)
            {
                builder.WithTimeout(TimeSpan.FromSeconds(timeout.Value));
            }

            if (!string.IsNullOrEmpty(apiKey))
            {
                builder.WithApiKey(apiKey);
            }

            var clientGenerator = builder.Create();

            services.AddSingleton <IChestClient>(provider => new ChestClientAdapter(clientGenerator));
        }
Esempio n. 5
0
        public async Task Always_WorksWithoutTimeout()
        {
            // arrange
            var log            = new List <string>();
            var fakeHttpClient = new FakeHttpClientHandler(r =>
            {
                Thread.Sleep(333);

                return(new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new ByteArrayContent(Encoding.UTF8.GetBytes("the result"))
                });
            });
            TimeSpan timeout = TimeSpan.FromMilliseconds(50);

            // act && assert

            var httpClient = HttpClientGenerator.BuildForUrl("http://google.com")
                             //Should be skipped because of timeout
                             .WithRetriesStrategy(new LinearRetryStrategy(TimeSpan.FromSeconds(1), 20))
                             .Create()
                             .Generate <IRealInterface>();

            var result = await httpClient.GetHtmlAsync();
        }
        /// <summary>
        /// Registers <see cref="ISmartVouchersClient"/> in Autofac container using <see cref="SmartVouchersServiceClientSettings"/>.
        /// </summary>
        /// <param name="builder">Autofac container builder.</param>
        /// <param name="settings">SmartVouchers client settings.</param>
        /// <param name="builderConfigure">Optional <see cref="HttpClientGeneratorBuilder"/> configure handler.</param>
        public static void RegisterSmartVouchersClient(
            [NotNull] this ContainerBuilder builder,
            [NotNull] SmartVouchersServiceClientSettings settings,
            [CanBeNull] Func <HttpClientGeneratorBuilder, HttpClientGeneratorBuilder> builderConfigure)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }
            if (string.IsNullOrWhiteSpace(settings.ServiceUrl))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(SmartVouchersServiceClientSettings.ServiceUrl));
            }

            var clientBuilder = HttpClientGenerator.BuildForUrl(settings.ServiceUrl)
                                .WithAdditionalCallsWrapper(new ExceptionHandlerCallsWrapper());

            clientBuilder = builderConfigure?.Invoke(clientBuilder) ?? clientBuilder.WithoutRetries();

            builder.RegisterInstance(new SmartVouchersClient(clientBuilder.Create()))
            .As <ISmartVouchersClient>()
            .SingleInstance();
        }
        private static IAccountsApi GetClient()
        {
            var generator = HttpClientGenerator.BuildForUrl(
                SettingsUtil.Settings.MarginTradingAccountManagementServiceClient.ServiceUrl)
                            .WithoutCaching().WithoutRetries().Create();

            return(generator.Generate <IAccountsApi>());
        }
        private void InitializeClient()
        {
            var clientBuilder = HttpClientGenerator.BuildForUrl(_serviceUrl)
                                .WithAdditionalCallsWrapper(new ExceptionHandlerCallsWrapper())
                                .WithRetriesStrategy(new LinearRetryStrategy(_timeout, _retriesCount));

            Api = clientBuilder.Create().Generate <IPushProviderApi>();
        }
Esempio n. 9
0
        /// <summary>C-tor</summary>
        public PaymentIntegrationPluginClient(string serviceUrl)
        {
            var clientBuilder = HttpClientGenerator.BuildForUrl(serviceUrl)
                                .WithAdditionalCallsWrapper(new ExceptionHandlerCallsWrapper())
                                .WithoutRetries();
            var httpClientGenerator = clientBuilder.Create();

            Api = httpClientGenerator.Generate <IPaymentIntegrationPluginApi>();
        }
Esempio n. 10
0
        // NOTE: Use Demo instances for tests
        private static async Task Run()
        {
            var retryStrategy = new LinearRetryStrategy(TimeSpan.FromSeconds(10), 50);
            var generator     = HttpClientGenerator.BuildForUrl("http://localhost:5000").WithApiKey("margintrading")
                                .WithRetriesStrategy(retryStrategy).Create();

            await CheckMarginParametersAsync(generator);

            //await CheckAccountsAsync(generator);
            //await CheckOrdersAsync(generator);
            //await CheckPricesAsync(generator);

            Console.WriteLine("Successfuly finished");
        }
        /// <summary>C-tor</summary>
        public PayrexxIntegrationClient(
            string payrexxBaseUrl,
            string instance,
            string apiKey)
        {
            var clientBuilder = HttpClientGenerator.BuildForUrl(payrexxBaseUrl)
                                .WithAdditionalDelegatingHandler(new QueryParamsHandler(instance, apiKey))
                                .WithAdditionalCallsWrapper(new ExceptionHandlerCallsWrapper());

            clientBuilder = clientBuilder.WithoutRetries();
            var httpClientGenerator = clientBuilder.Create();

            Api = httpClientGenerator.Generate <IPayrexxIntegrationApi>();
        }
Esempio n. 12
0
        protected override void Load(ContainerBuilder builder)
        {
            var settingsClientGeneratorBuilder = HttpClientGenerator
                                                 .BuildForUrl(_settings.CurrentValue.MarginTradingSettingsServiceClient.ServiceUrl)
                                                 .WithServiceName <LykkeErrorResponse>(
                $"MT Settings [{_settings.CurrentValue.MarginTradingSettingsServiceClient.ServiceUrl}]");

            if (!string.IsNullOrWhiteSpace(_settings.CurrentValue.MarginTradingSettingsServiceClient.ApiKey))
            {
                settingsClientGeneratorBuilder = settingsClientGeneratorBuilder
                                                 .WithApiKey(_settings.CurrentValue.MarginTradingSettingsServiceClient.ApiKey);
            }

            var settingsClientGenerator = settingsClientGeneratorBuilder.Create();

            builder.RegisterInstance(settingsClientGenerator.Generate <IAssetsApi>());
            builder.RegisterInstance(settingsClientGenerator.Generate <ITradingConditionsApi>());
            builder.RegisterInstance(settingsClientGenerator.Generate <ITradingInstrumentsApi>());
            builder.RegisterInstance(settingsClientGenerator.Generate <IScheduleSettingsApi>());

            var mtCoreClientGenerator = HttpClientGenerator
                                        .BuildForUrl(_settings.CurrentValue.MtBackendServiceClient.ServiceUrl)
                                        .WithApiKey(_settings.CurrentValue.MtBackendServiceClient.ApiKey)
                                        .WithServiceName <LykkeErrorResponse>(
                $"MT Trading Core [{_settings.CurrentValue.MtBackendServiceClient.ServiceUrl}]")
                                        .Create();

            builder.RegisterInstance(mtCoreClientGenerator.Generate <IOrdersApi>());
            builder.RegisterInstance(mtCoreClientGenerator.Generate <IPositionsApi>());
            builder.RegisterInstance(mtCoreClientGenerator.Generate <IAccountsApi>());

            var mtTradingHistoryClientGenerator = HttpClientGenerator
                                                  .BuildForUrl(_settings.CurrentValue.TradingHistoryClient.ServiceUrl)
                                                  .WithServiceName <LykkeErrorResponse>("MT Core History Service")
                                                  .WithOptionalApiKey(_settings.CurrentValue.TradingHistoryClient.ApiKey)
                                                  .Create();

            builder.RegisterInstance(mtTradingHistoryClientGenerator.Generate <IDealsApi>());

            var mdmClientGenerator = HttpClientGenerator
                                     .BuildForUrl(_settings.CurrentValue.MdmServiceClient.ServiceUrl)
                                     .WithServiceName <LykkeErrorResponse>("Mdm Service")
                                     .WithOptionalApiKey(_settings.CurrentValue.MdmServiceClient.ApiKey)
                                     .Create();

            builder.RegisterInstance(mdmClientGenerator.Generate <IBrokerSettingsApi>());

            builder.Populate(_services);
        }
Esempio n. 13
0
        private static async Task Run()
        {
            var clientGenerator = HttpClientGenerator.BuildForUrl("http://localhost:5010").Create();

            await CheckAssetPairsApiWorking(clientGenerator);
            await CheckAssetsApiWorking(clientGenerator);
            await CheckMarketsApiWorking(clientGenerator);
            await CheckScheduleSettingsApiWorking(clientGenerator);
            await CheckServiceMaintenanceApiWorking(clientGenerator);
            await CheckTradingConditionsApiWorking(clientGenerator);
            await CheckTradingInstrumentsApiWorking(clientGenerator);
            await CheckTradingRoutesApiWorking(clientGenerator);

            Console.WriteLine("Successfully finished");
        }
Esempio n. 14
0
        private HttpClientGenerator BuildAccountManagementClientGenerator(IComponentContext ctx)
        {
            var accountManagementClientGeneratorBuilder = HttpClientGenerator
                                                          .BuildForUrl(_settings.CurrentValue.AccountsManagementServiceClient.ServiceUrl)
                                                          .WithAdditionalDelegatingHandler(ctx.Resolve <HttpCorrelationHandler>())
                                                          .WithServiceName <LykkeErrorResponse>(
                $"MT Account Management [{_settings.CurrentValue.AccountsManagementServiceClient.ServiceUrl}]");

            if (!string.IsNullOrWhiteSpace(_settings.CurrentValue.AccountsManagementServiceClient.ApiKey))
            {
                accountManagementClientGeneratorBuilder = accountManagementClientGeneratorBuilder
                                                          .WithApiKey(_settings.CurrentValue.AccountsManagementServiceClient.ApiKey);
            }

            return(accountManagementClientGeneratorBuilder.Create());
        }
Esempio n. 15
0
        private HttpClientGenerator BuildSettingsClientGenerator(IComponentContext ctx)
        {
            var settingsClientGeneratorBuilder = HttpClientGenerator
                                                 .BuildForUrl(_settings.CurrentValue.SettingsServiceClient.ServiceUrl)
                                                 .WithAdditionalDelegatingHandler(ctx.Resolve <HttpCorrelationHandler>())
                                                 .WithServiceName <LykkeErrorResponse>(
                $"MT Settings [{_settings.CurrentValue.SettingsServiceClient.ServiceUrl}]")
                                                 .WithRetriesStrategy(new LinearRetryStrategy(TimeSpan.FromMilliseconds(300), 3));

            if (!string.IsNullOrWhiteSpace(_settings.CurrentValue.SettingsServiceClient.ApiKey))
            {
                settingsClientGeneratorBuilder = settingsClientGeneratorBuilder
                                                 .WithApiKey(_settings.CurrentValue.SettingsServiceClient.ApiKey);
            }

            return(settingsClientGeneratorBuilder.Create());
        }
Esempio n. 16
0
        public async Task ShouldLogRequestResponse()
        {
            // Arrange

            var fakeHttpClientHandler = new FakeHttpClientHandler(r =>
                                                                  new HttpResponseMessage(HttpStatusCode.BadRequest)
            {
                Content = new StringContent("testError")
            }
                                                                  );
            var logFactory = new Mock <ILogFactory>();
            var log        = new Mock <ILog>();

            logFactory
            .Setup(x => x.CreateLog(It.IsAny <object>()))
            .Returns(log.Object);

            var client = HttpClientGenerator.BuildForUrl("http://fake.host")
                         .WithoutCaching()
                         .WithoutRetries()
                         .WithRequestErrorLogging(logFactory.Object)
                         .WithAdditionalDelegatingHandler(fakeHttpClientHandler)
                         .Create()
                         .Generate <ITestInterface>();

            // Act

            try
            {
                await client.TestMethod();
            }
            catch (ApiException ex) when(ex.StatusCode == HttpStatusCode.BadRequest)
            {
            }

            // Arrange

            log.Verify(x =>
                       x.Log <LogEntryParameters>(
                           It.Is <LogLevel>(v => v == LogLevel.Warning),
                           It.IsAny <EventId>(),
                           It.IsAny <LogEntryParameters>(),
                           It.IsAny <Exception>(),
                           It.IsAny <Func <LogEntryParameters, Exception, string> >()),
                       Times.Exactly(2));
        }
Esempio n. 17
0
        private Process StartChest()
        {
            var path = string.Format(
                CultureInfo.InvariantCulture,
                "..{0}..{0}..{0}..{0}Chest{0}Chest.csproj",
                Path.DirectorySeparatorChar);

            Process.Start(
                new ProcessStartInfo("dotnet", $"run -p {path} --connectionStrings:chest \"{_connectionString}\"")
            {
                UseShellExecute = true,
            });

            var processId       = default(int);
            var clientGenerator = HttpClientGenerator
                                  .BuildForUrl(ServiceUrl)
                                  .Create();

            var client = clientGenerator.Generate <IIsAlive>();

            var attempt = 0;

            while (true)
            {
                Thread.Sleep(500);
                try
                {
                    throw new NotImplementedException();//todo it's all not working..
                    var response = client.Get().GetAwaiter().GetResult();
                    processId = response.ProcessId;
                    break;
                }
                catch (HttpRequestException)
                {
                    if (++attempt >= 20)
                    {
                        throw;
                    }
                }
            }

            return(Process.GetProcessById(processId));
        }
Esempio n. 18
0
        protected override void Load(ContainerBuilder builder)
        {
            var services = new ServiceCollection();

            services.RegisterMtDataReaderClientsPair(
                HttpClientGenerator.BuildForUrl(_settings.CurrentValue.MtDataReaderDemoServiceClient.ServiceUrl)
                .WithApiKey(_settings.CurrentValue.MtDataReaderDemoServiceClient.ApiKey)
                .Create(),
                HttpClientGenerator.BuildForUrl(_settings.CurrentValue.MtDataReaderLiveServiceClient.ServiceUrl)
                .WithApiKey(_settings.CurrentValue.MtDataReaderLiveServiceClient.ApiKey)
                .Create());

            builder.RegisterLykkeServiceClient(_settings.CurrentValue.ClientAccountServiceClient.ServiceUrl);

            var personalDataServiceMock = new Mock <IPersonalDataService>(MockBehavior.Strict);

            builder.RegisterInstance(personalDataServiceMock.Object).As <IPersonalDataService>();

            builder.Populate(services);
        }
        public static void AddMtCoreDalRepositories(this IServiceCollection services,
                                                    string mtCoreAccountManagementEndpoint,
                                                    string mtCoreAccountsApiKey,
                                                    bool backofficeSupportMode)
        {
            if (backofficeSupportMode)
            {
                services.AddSingleton <IAccountsMgmtApi, EmptyAccountsApiStub>();

                return;
            }

            var mtCoreAccountsMgmtClientGenerator = HttpClientGenerator
                                                    .BuildForUrl(mtCoreAccountManagementEndpoint)
                                                    .WithServiceName <MtCoreHttpErrorResponse>("MT Core Account Management Service")
                                                    .WithOptionalApiKey(mtCoreAccountsApiKey)
                                                    .WithoutRetries()
                                                    .Create();

            services.AddSingleton(mtCoreAccountsMgmtClientGenerator.Generate <IAccountsMgmtApi>());
        }
Esempio n. 20
0
        public async Task WorksCorrectlyForManyThreads_InvalidateCacheAsync()
        {
            // arrange
            var(h3, y1) = MakeFakeHttpClientHandler();

            var bag           = new ConcurrentBag <List <string> >();
            var httpBuilder   = HttpClientGenerator.BuildForUrl("http://fake.host");
            var cacheManager  = new ClientCacheManager();
            var testInterface = httpBuilder
                                .WithCachingStrategy(new AttributeBasedCachingStrategy())
                                .WithAdditionalDelegatingHandler(h3)
                                .Create(cacheManager)
                                .Generate <ITestInterface>();

            var cacheModifyingTasks = Enumerable
                                      .Range(0, 100)
                                      .Select(x => Task.Factory.StartNew(async() =>
            {
                var list    = new List <string>(2);
                var result1 = await testInterface.TestMethodWithCache();
                await cacheManager.InvalidateCacheAsync();
                var result2 = await testInterface.TestMethodWithCache();

                list.Add($"{Thread.CurrentThread.Name} {result1}");
                list.Add($"{Thread.CurrentThread.Name} {result2}");
                bag.Add(list);
            }).Unwrap());

            // act

            await Task.WhenAll(cacheModifyingTasks);

            cacheManager.Dispose();
            var results   = bag.ToArray().SelectMany(x => x);
            var res2Count = results.Count(x => x.Contains(_result2Str));

            // assert
            res2Count.Should().BeGreaterThan(0);
        }
Esempio n. 21
0
        /// <summary>
        /// Registers <see cref="IEncryptedFileStorageClient"/> in Autofac container using <see cref="EncryptedFileStorageServiceClientSettings"/>.
        /// </summary>
        /// <param name="builder">Autofac container builder.</param>
        /// <param name="settings">EncryptedFileStorage client settings.</param>
        /// <param name="builderConfigure">Optional <see cref="HttpClientGeneratorBuilder"/> configure handler.</param>
        public static void RegisterEncryptedFileStorageClient(
            [NotNull] this ContainerBuilder builder,
            [NotNull] EncryptedFileStorageServiceClientSettings settings,
            [CanBeNull] Func <HttpClientGeneratorBuilder, HttpClientGeneratorBuilder> builderConfigure)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }
            if (string.IsNullOrWhiteSpace(settings.ServiceUrl))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(EncryptedFileStorageServiceClientSettings.ServiceUrl));
            }

            var clientBuilder = HttpClientGenerator.BuildForUrl(settings.ServiceUrl)
                                .WithAdditionalCallsWrapper(new ExceptionHandlerCallsWrapper());

            var apiKey = Environment.GetEnvironmentVariable("EfsApiKey");

            if (string.IsNullOrEmpty(apiKey))
            {
                apiKey = settings.ApiKey;
            }

            if (!string.IsNullOrWhiteSpace(apiKey))
            {
                clientBuilder = clientBuilder.WithApiKey(apiKey);
            }

            clientBuilder = builderConfigure?.Invoke(clientBuilder) ?? clientBuilder.WithoutRetries();

            builder.RegisterInstance(new EncryptedFileStorageClient(clientBuilder.Create()))
            .As <IEncryptedFileStorageClient>()
            .SingleInstance();
        }
Esempio n. 22
0
        // NOTE: Use Demo instances for tests
        private static async Task Run()
        {
            var services      = new ServiceCollection();
            var builder       = new ContainerBuilder();
            var retryStrategy = new LinearRetryStrategy(TimeSpan.FromSeconds(10), 50);

            services.RegisterMtBackendClient(HttpClientGenerator.BuildForUrl("http://localhost:5000")
                                             .WithApiKey("margintrading").WithRetriesStrategy(retryStrategy).Create());
            services.RegisterMtDataReaderClient(HttpClientGenerator.BuildForUrl("http://localhost:5008")
                                                .WithApiKey("margintrading").WithRetriesStrategy(retryStrategy).Create());
            builder.Populate(services);
            var container     = builder.Build();
            var backendClient = container.Resolve <IMtBackendClient>();

            await backendClient.ScheduleSettings.ListExclusions().Dump();

            var excl = await backendClient.ScheduleSettings.CreateExclusion(new DayOffExclusionInputContract
            {
                AssetPairRegex = "lol",
                Start          = DateTime.Now.AddDays(-1),
                End            = DateTime.Now.Date,
                IsTradeEnabled = false,
            }).Dump();

            var id = excl.Id;
            var ex = await backendClient.ScheduleSettings.GetExclusion(id).Dump();

            ex.AssetPairRegex = "^btc";
            await backendClient.ScheduleSettings.UpdateExclusion(id, ex).Dump();

            await backendClient.ScheduleSettings.GetExclusion(id).Dump();

            await backendClient.ScheduleSettings.ListCompiledExclusions().Dump();

            await backendClient.ScheduleSettings.DeleteExclusion(id).Dump();

            await backendClient.ScheduleSettings.GetExclusion(id).Dump();

            var s = await backendClient.ScheduleSettings.GetSchedule().Dump();

            s.AssetPairsWithoutDayOff.Add("BTCRABBIT");
            await backendClient.ScheduleSettings.SetSchedule(s).Dump();

            s.AssetPairsWithoutDayOff.Remove("BTCRABBIT");
            await backendClient.ScheduleSettings.SetSchedule(s).Dump();

            var assetPairSettingsInputContract = new AssetPairContract
            {
                Id                     = "BTCUSD.test",
                BasePairId             = "BTCUSD",
                LegalEntity            = "LYKKETEST",
                StpMultiplierMarkupBid = 0.9m,
                StpMultiplierMarkupAsk = 1.1m,
                MatchingEngineMode     = MatchingEngineModeContract.MarketMaker,
                Name                   = "BTCUSD.test name",
                Accuracy               = 123,
                BaseAssetId            = "BTC",
                QuoteAssetId           = "USD",
            };

            await backendClient.AssetPairsEdit.Delete("BTCUSD.test").Dump();

            var result = await backendClient.AssetPairsEdit.Insert("BTCUSD.test", assetPairSettingsInputContract)
                         .Dump();

            CheckAssetPair(result, assetPairSettingsInputContract);

            assetPairSettingsInputContract.MatchingEngineMode = MatchingEngineModeContract.Stp;
            var result2 = await backendClient.AssetPairsEdit.Update("BTCUSD.test", assetPairSettingsInputContract)
                          .Dump();

            CheckAssetPair(result2, assetPairSettingsInputContract);


            var dataReaderClient = container.Resolve <IMtDataReaderClient>();

            var list = await dataReaderClient.AssetPairsRead.List().Dump();

            var ours = list.First(e => e.Id == "BTCUSD.test");

            CheckAssetPair(ours, assetPairSettingsInputContract);

            var get = await dataReaderClient.AssetPairsRead.Get("BTCUSD.test").Dump();

            CheckAssetPair(get, assetPairSettingsInputContract);

            var nonexistentGet = await dataReaderClient.AssetPairsRead.Get("nonexistent").Dump();

            nonexistentGet.RequiredEqualsTo(null, nameof(nonexistentGet));

            var getByMode = await dataReaderClient.AssetPairsRead.List("LYKKETEST", MatchingEngineModeContract.Stp)
                            .Dump();

            var ours2 = getByMode.First(e => e.Id == "BTCUSD.test");

            CheckAssetPair(ours2, assetPairSettingsInputContract);

            var getByOtherMode = await dataReaderClient.AssetPairsRead
                                 .List("LYKKETEST", MatchingEngineModeContract.MarketMaker).Dump();

            getByOtherMode.Count(e => e.Id == "BTCUSD.test").RequiredEqualsTo(0, "getByOtherMode.Count");

            var result3 = await backendClient.AssetPairsEdit.Delete("BTCUSD.test").Dump();

            CheckAssetPair(result3, assetPairSettingsInputContract);

            var nonexistentDelete = await backendClient.AssetPairsEdit.Delete("nonexistent").Dump();

            nonexistentDelete.RequiredEqualsTo(null, nameof(nonexistentDelete));

            #region TradeMonitoring

            var assetSumary = await dataReaderClient.TradeMonitoringRead.AssetSummaryList().Dump();

            var openPositions = await dataReaderClient.TradeMonitoringRead.OpenPositions().Dump();

            var openPosition = openPositions.FirstOrDefault();
            if (openPosition != null)
            {
                string clientId = openPosition.ClientId;
                var    openPositionsByClient =
                    await dataReaderClient.TradeMonitoringRead.OpenPositionsByClient(clientId).Dump();
            }

            var openPositionsByDate = await dataReaderClient.TradeMonitoringRead
                                      .OpenPositionsByDate(DateTime.UtcNow.AddDays(-30), DateTime.UtcNow).Dump();

            var openPositionsByVolume = await dataReaderClient.TradeMonitoringRead.OpenPositionsByVolume(100).Dump();

            var pendingOrders = await dataReaderClient.TradeMonitoringRead.PendingOrders().Dump();

            var pendingOrder = pendingOrders.FirstOrDefault();
            if (pendingOrder != null)
            {
                string clientId = pendingOrder.ClientId;
                var    pendingOrdersByClient =
                    await dataReaderClient.TradeMonitoringRead.PendingOrdersByClient(clientId).Dump();
            }

            var pendingOrdersByDate = await dataReaderClient.TradeMonitoringRead
                                      .PendingOrdersByDate(DateTime.UtcNow.AddDays(-30), DateTime.UtcNow).Dump();

            var pendingOrdersByVolume = await dataReaderClient.TradeMonitoringRead.PendingOrdersByVolume(100).Dump();

            var orderBooksByInstrument = await dataReaderClient.TradeMonitoringRead.OrderBooksByInstrument("BTCUSD");

            #endregion

            var accountAssetPairs = await dataReaderClient.AccountAssetPairsRead
                                    .List()
                                    .Dump();

            var firstAccountAssetPair  = accountAssetPairs.First();
            var secondAccountAssetPair = await dataReaderClient.AccountAssetPairsRead
                                         .Get(firstAccountAssetPair.TradingConditionId, firstAccountAssetPair.BaseAssetId,
                                              firstAccountAssetPair.Instrument)
                                         .Dump();

            firstAccountAssetPair.Should().BeEquivalentTo(secondAccountAssetPair);

            var accountAssetPairsGetByTradingCondition = await dataReaderClient.AccountAssetPairsRead
                                                         .Get(firstAccountAssetPair.TradingConditionId, firstAccountAssetPair.BaseAssetId)
                                                         .Dump();

            foreach (var accountAssetPair in accountAssetPairsGetByTradingCondition)
            {
                var item = accountAssetPairs
                           .Single(x => x.TradingConditionId == accountAssetPair.TradingConditionId &&
                                   x.BaseAssetId == accountAssetPair.BaseAssetId &&
                                   x.Instrument == accountAssetPair.Instrument);
                item.Should().BeEquivalentTo(accountAssetPair);
            }

            firstAccountAssetPair.OvernightSwapLong = 0.1m;
            var updatedAccountAssetPair = await backendClient.TradingConditionsEdit
                                          .InsertOrUpdateAccountAsset(firstAccountAssetPair)
                                          .Dump();

            updatedAccountAssetPair.Result.Should().BeEquivalentTo(firstAccountAssetPair);

            var tc = await backendClient.TradingConditionsEdit.InsertOrUpdate(
                new Contracts.TradingConditions.TradingConditionContract
            {
                Id          = "LYKKETEST",
                LegalEntity = "LYKKEVA",
                IsDefault   = false,
                Name        = "Test Trading Condition",
            }).Dump();

            tc.Result.Id.RequiredEqualsTo("LYKKETEST", "tc.Result.Id");

            var ag = await backendClient.TradingConditionsEdit.InsertOrUpdateAccountGroup(
                new Contracts.TradingConditions.AccountGroupContract
            {
                BaseAssetId           = "BTC",
                TradingConditionId    = tc.Result.Id,
                DepositTransferLimit  = 0.1m,
                ProfitWithdrawalLimit = 0.2m,
                MarginCall            = 0.3m,
                StopOut = 0.4m
            })
                     .Dump();

            ag.Result.StopOut.RequiredEqualsTo(0.4m, "ag.Result.StopOut");

            var aa = await backendClient.TradingConditionsEdit.InsertOrUpdateAccountAsset(new AccountAssetPairContract
            {
                Instrument         = "TSTLKK",
                BaseAssetId        = "BTC",
                TradingConditionId = tc.Result.Id
            })
                     .Dump();

            aa.Result.Instrument.RequiredEqualsTo("TSTLKK", "aa.Result.Instrument");

            var ai = await backendClient.TradingConditionsEdit.AssignInstruments(
                new Contracts.TradingConditions.AssignInstrumentsContract
            {
                BaseAssetId        = "BTC",
                TradingConditionId = tc.Result.Id,
                Instruments        = new string[] { "TSTLKK" }
            })
                     .Dump();

            ai.IsOk.RequiredEqualsTo(true, "ai.IsOk");

            var tclist = await dataReaderClient.TradingConditionsRead.List().Dump();

            await dataReaderClient.TradingConditionsRead.Get(tclist.First().Id).Dump();

            var manualCharge = await backendClient.AccountsBalance.ChargeManually(
                new Contracts.AccountBalance.AccountChargeManuallyRequest
            {
                ClientId  = "232b3b04-7479-44e7-a6b3-ac131d8e6ccd",
                AccountId = "d_f4c745f19c834145bcf2d6b5f1a871f3",
                Amount    = 1,
                Reason    = "API TEST"
            })
                               .Dump();

            var accountGroups = await dataReaderClient.AccountGroups.List().Dump();

            var accountGroup1 = accountGroups.FirstOrDefault();
            if (accountGroup1 != null)
            {
                var accountGroup =
                    (await dataReaderClient.AccountGroups.GetByBaseAsset(accountGroup1.TradingConditionId,
                                                                         accountGroup1.BaseAssetId)).Dump();
                accountGroup.Should().BeEquivalentTo(accountGroup1);
            }

            var assetPairs = await dataReaderClient.Dictionaries.AssetPairs().Dump();

            var matchingEngines = await dataReaderClient.Dictionaries.MatchingEngines().Dump();

            var orderTypes = await dataReaderClient.Dictionaries.OrderTypes().Dump();


            var routes = await dataReaderClient.Routes.List().Dump();

            var route1 = routes.FirstOrDefault();
            if (route1 != null)
            {
                var route = await dataReaderClient.Routes.GetById(route1.Id).Dump();

                route.Should().BeEquivalentTo(route1);
            }

            var isEnabled =
                await dataReaderClient.Settings.IsMarginTradingEnabled("232b3b04-7479-44e7-a6b3-ac131d8e6ccd");

            Console.WriteLine("Successfuly finished");
        }
Esempio n. 23
0
        protected override void Load(ContainerBuilder builder)
        {
            if (_settings.CurrentValue.MtBackend.ExchangeConnector == ExchangeConnectorType.RealExchangeConnector)
            {
                builder
                .Register(ctx =>
                {
                    var gavelClientGenerator = HttpClientGenerator
                                               .BuildForUrl(_settings.CurrentValue.MtStpExchangeConnectorClient.ServiceUrl)
                                               .WithAdditionalDelegatingHandler(ctx.Resolve <HttpCorrelationHandler>())
                                               .WithServiceName <LykkeErrorResponse>(
                        $"Gavel [{_settings.CurrentValue.MtStpExchangeConnectorClient.ServiceUrl}]")
                                               .WithApiKey(_settings.CurrentValue.MtStpExchangeConnectorClient.ApiKey)
                                               .WithoutRetries()
                                               .Create();
                    return(gavelClientGenerator.Generate <IExchangeConnectorClient>());
                })
                .As <IExchangeConnectorClient>().SingleInstance();
            }
            if (_settings.CurrentValue.MtBackend.ExchangeConnector == ExchangeConnectorType.FakeExchangeConnector)
            {
                builder.RegisterType <FakeExchangeConnectorClient>()
                .As <IExchangeConnectorClient>()
                .SingleInstance();
            }

            #region Client Account Service

            if (_settings.CurrentValue.ClientAccountServiceClient != null)
            {
                builder.RegisterLykkeServiceClient(_settings.CurrentValue.ClientAccountServiceClient.ServiceUrl);

                builder.RegisterType <ClientAccountService>()
                .As <IClientAccountService>()
                .SingleInstance();
            }
            else
            {
                builder.RegisterType <ClientAccountServiceEmptyStub>()
                .As <IClientAccountService>()
                .SingleInstance();
            }

            #endregion

            #region Email Sender

            if (_settings.CurrentValue.EmailSender != null)
            {
                builder.Register <IEmailSender>(ctx =>
                                                new EmailSenderClient(_settings.CurrentValue.EmailSender.ServiceUrl, ctx.Resolve <ILog>())
                                                ).SingleInstance();
            }
            else
            {
                builder.RegisterType <EmailSenderLogStub>().As <IEmailSender>().SingleInstance();
            }

            #endregion

            #region Asset Service

            builder
            .Register(ctx => BuildSettingsClientGenerator(ctx).Generate <IAssetsApi>())
            .As <IAssetsApi>().SingleInstance();

            builder
            .Register(ctx => BuildSettingsClientGenerator(ctx).Generate <IAssetPairsApi>())
            .As <IAssetPairsApi>().SingleInstance();

            builder
            .Register(ctx => BuildSettingsClientGenerator(ctx).Generate <ITradingConditionsApi>())
            .As <ITradingConditionsApi>().SingleInstance();

            builder
            .Register(ctx => BuildSettingsClientGenerator(ctx).Generate <ITradingInstrumentsApi>())
            .As <ITradingInstrumentsApi>().SingleInstance();

            builder
            .Register(ctx => BuildSettingsClientGenerator(ctx).Generate <IScheduleSettingsApi>())
            .As <IScheduleSettingsApi>().SingleInstance();

            builder
            .Register(ctx => BuildSettingsClientGenerator(ctx).Generate <ITradingRoutesApi>())
            .As <ITradingRoutesApi>().SingleInstance();

            builder
            .Register(ctx => BuildSettingsClientGenerator(ctx).Generate <IServiceMaintenanceApi>())
            .As <IServiceMaintenanceApi>().SingleInstance();

            builder
            .Register(ctx => BuildSettingsClientGenerator(ctx).Generate <IClientProfileSettingsApi>())
            .As <IClientProfileSettingsApi>().SingleInstance();

            #endregion

            #region MT Accounts Management

            builder
            .Register(ctx => BuildAccountManagementClientGenerator(ctx).Generate <IAccountsApi>())
            .As <IAccountsApi>().SingleInstance();

            builder
            .Register(ctx => BuildAccountManagementClientGenerator(ctx).Generate <IAccountBalanceHistoryApi>())
            .As <IAccountBalanceHistoryApi>().SingleInstance();

            #endregion

            #region Mdm

            builder
            .Register(ctx =>
            {
                //for feature management
                var mdmGenerator = HttpClientGenerator
                                   .BuildForUrl(_settings.CurrentValue.MdmServiceClient.ServiceUrl)
                                   .WithAdditionalDelegatingHandler(ctx.Resolve <HttpCorrelationHandler>())
                                   .WithServiceName <LykkeErrorResponse>(
                    $"Mdm [{_settings.CurrentValue.MdmServiceClient.ServiceUrl}]");

                if (!string.IsNullOrWhiteSpace(_settings.CurrentValue.MdmServiceClient.ApiKey))
                {
                    mdmGenerator = mdmGenerator
                                   .WithApiKey(_settings.CurrentValue.MdmServiceClient.ApiKey);
                }
                return(mdmGenerator.Create().Generate <IBrokerSettingsApi>());
            })
            .As <IBrokerSettingsApi>().SingleInstance();

            #endregion

            #region OrderBook Service

            builder
            .Register(ctx =>
            {
                var orderBookServiceClientGeneratorBuilder = HttpClientGenerator
                                                             .BuildForUrl(_settings.CurrentValue.OrderBookServiceClient.ServiceUrl)
                                                             .WithAdditionalDelegatingHandler(ctx.Resolve <HttpCorrelationHandler>())
                                                             .WithServiceName <LykkeErrorResponse>(
                    $"MT OrderBook Service [{_settings.CurrentValue.OrderBookServiceClient.ServiceUrl}]");

                if (!string.IsNullOrWhiteSpace(_settings.CurrentValue.OrderBookServiceClient.ApiKey))
                {
                    orderBookServiceClientGeneratorBuilder = orderBookServiceClientGeneratorBuilder
                                                             .WithApiKey(_settings.CurrentValue.OrderBookServiceClient.ApiKey);
                }
                return(orderBookServiceClientGeneratorBuilder.Create().Generate <IOrderBookProviderApi>());
            })
            .As <IOrderBookProviderApi>().SingleInstance();

            #endregion OrderBook Service
        }
Esempio n. 24
0
 public IMetadata GetClient() => HttpClientGenerator
 .BuildForUrl(ServiceUrl)
 .Create()
 .Generate <IMetadata>();
Esempio n. 25
0
        protected override void Load(ContainerBuilder builder)
        {
            if (_settings.CurrentValue.MtBackend.ExchangeConnector == ExchangeConnectorType.RealExchangeConnector)
            {
                var settings = new ExchangeConnectorServiceSettings
                {
                    ServiceUrl = _settings.CurrentValue.MtStpExchangeConnectorClient.ServiceUrl,
                    ApiKey     = _settings.CurrentValue.MtStpExchangeConnectorClient.ApiKey
                };

                builder.RegisterType <ExchangeConnectorService>()
                .As <IExchangeConnectorService>()
                .WithParameter("settings", settings)
                .SingleInstance();
            }
            if (_settings.CurrentValue.MtBackend.ExchangeConnector == ExchangeConnectorType.FakeExchangeConnector)
            {
                builder.RegisterType <FakeExchangeConnectorService>()
                .As <IExchangeConnectorService>()
                .SingleInstance();
            }

            #region Client Account Service

            if (_settings.CurrentValue.ClientAccountServiceClient != null)
            {
                builder.RegisterLykkeServiceClient(_settings.CurrentValue.ClientAccountServiceClient.ServiceUrl);

                builder.RegisterType <ClientAccountService>()
                .As <IClientAccountService>()
                .SingleInstance();
            }
            else
            {
                builder.RegisterType <ClientAccountServiceEmptyStub>()
                .As <IClientAccountService>()
                .SingleInstance();
            }

            #endregion

            #region Email Sender

            if (_settings.CurrentValue.EmailSender != null)
            {
                builder.Register <IEmailSender>(ctx =>
                                                new EmailSenderClient(_settings.CurrentValue.EmailSender.ServiceUrl, ctx.Resolve <ILog>())
                                                ).SingleInstance();
            }
            else
            {
                builder.RegisterType <EmailSenderLogStub>().As <IEmailSender>().SingleInstance();
            }

            #endregion

            #region MT Settings

            var settingsClientGeneratorBuilder = HttpClientGenerator
                                                 .BuildForUrl(_settings.CurrentValue.SettingsServiceClient.ServiceUrl)
                                                 .WithServiceName <LykkeErrorResponse>(
                $"MT Settings [{_settings.CurrentValue.SettingsServiceClient.ServiceUrl}]")
                                                 .WithRetriesStrategy(new LinearRetryStrategy(TimeSpan.FromMilliseconds(300), 3))
            ;

            if (!string.IsNullOrWhiteSpace(_settings.CurrentValue.SettingsServiceClient.ApiKey))
            {
                settingsClientGeneratorBuilder = settingsClientGeneratorBuilder
                                                 .WithApiKey(_settings.CurrentValue.SettingsServiceClient.ApiKey);
            }

            var settingsClientGenerator = settingsClientGeneratorBuilder.Create();

            builder.RegisterInstance(settingsClientGenerator.Generate <IAssetsApi>())
            .As <IAssetsApi>().SingleInstance();

            builder.RegisterInstance(settingsClientGenerator.Generate <IAssetPairsApi>())
            .As <IAssetPairsApi>().SingleInstance();

            builder.RegisterInstance(settingsClientGenerator.Generate <ITradingConditionsApi>())
            .As <ITradingConditionsApi>().SingleInstance();

            builder.RegisterInstance(settingsClientGenerator.Generate <ITradingInstrumentsApi>())
            .As <ITradingInstrumentsApi>().SingleInstance();

            builder.RegisterInstance(settingsClientGenerator.Generate <IScheduleSettingsApi>())
            .As <IScheduleSettingsApi>().SingleInstance();

            builder.RegisterInstance(settingsClientGenerator.Generate <ITradingRoutesApi>())
            .As <ITradingRoutesApi>().SingleInstance();

            builder.RegisterInstance(settingsClientGenerator.Generate <IServiceMaintenanceApi>())
            .As <IServiceMaintenanceApi>().SingleInstance();

            #endregion

            #region MT Accounts Management

            var accountsClientGeneratorBuilder = HttpClientGenerator
                                                 .BuildForUrl(_settings.CurrentValue.AccountsManagementServiceClient.ServiceUrl)
                                                 .WithServiceName <LykkeErrorResponse>(
                $"MT Account Management [{_settings.CurrentValue.AccountsManagementServiceClient.ServiceUrl}]");

            if (!string.IsNullOrWhiteSpace(_settings.CurrentValue.AccountsManagementServiceClient.ApiKey))
            {
                accountsClientGeneratorBuilder = accountsClientGeneratorBuilder
                                                 .WithApiKey(_settings.CurrentValue.AccountsManagementServiceClient.ApiKey);
            }

            builder.RegisterInstance(accountsClientGeneratorBuilder.Create().Generate <IAccountsApi>())
            .As <IAccountsApi>().SingleInstance();

            #endregion

            #region OrderBook Service

            var orderBookServiceClientGeneratorBuilder = HttpClientGenerator
                                                         .BuildForUrl(_settings.CurrentValue.OrderBookServiceClient.ServiceUrl)
                                                         .WithServiceName <LykkeErrorResponse>(
                $"MT OrderBook Service [{_settings.CurrentValue.OrderBookServiceClient.ServiceUrl}]");

            if (!string.IsNullOrWhiteSpace(_settings.CurrentValue.OrderBookServiceClient.ApiKey))
            {
                orderBookServiceClientGeneratorBuilder = orderBookServiceClientGeneratorBuilder
                                                         .WithApiKey(_settings.CurrentValue.OrderBookServiceClient.ApiKey);
            }

            builder.RegisterInstance(orderBookServiceClientGeneratorBuilder.Create().Generate <IOrderBookProviderApi>())
            .As <IOrderBookProviderApi>()
            .SingleInstance();

            #endregion OrderBook Service
        }