public async Task SendEnvelopeAsync_ItemRateLimit_DropsItem() { // Arrange using var httpHandler = new RecordingHttpMessageHandler( new FakeHttpMessageHandler( () => SentryResponses.GetRateLimitResponse("1234:event, 897:transaction") ) ); var httpTransport = new HttpTransport( new SentryOptions { Dsn = DsnSamples.ValidDsnWithSecret }, new HttpClient(httpHandler) ); // First request always goes through await httpTransport.SendEnvelopeAsync(Envelope.FromEvent(new SentryEvent())); var envelope = new Envelope( new Dictionary <string, object>(), new[] { // Should be dropped new EnvelopeItem( new Dictionary <string, object> { ["type"] = "event" }, new EmptySerializable()), new EnvelopeItem( new Dictionary <string, object> { ["type"] = "event" }, new EmptySerializable()), new EnvelopeItem( new Dictionary <string, object> { ["type"] = "transaction" }, new EmptySerializable()), // Should stay new EnvelopeItem( new Dictionary <string, object> { ["type"] = "other" }, new EmptySerializable()) } ); var expectedEnvelope = new Envelope( new Dictionary <string, object>(), new[] { new EnvelopeItem( new Dictionary <string, object> { ["type"] = "other" }, new EmptySerializable()) } ); var expectedEnvelopeSerialized = await expectedEnvelope.SerializeToStringAsync(); // Act await httpTransport.SendEnvelopeAsync(envelope); var lastRequest = httpHandler.GetRequests().Last(); var actualEnvelopeSerialized = await lastRequest.Content.ReadAsStringAsync(); // Assert actualEnvelopeSerialized.Should().BeEquivalentTo(expectedEnvelopeSerialized); }
/// <summary> /// Создать устройство на базе optionAgregator. /// Созданное ус-во добавляется в StorageDevice. /// Если для создания ус-ва нужно создать ОБМЕН и/или ТРАНСПОРТ, то созданные объекты тоже добавляются в StorageExchange или StorageTransport /// </summary> /// <param name="optionAgregator">Цепочка настроек одного устройства. Настройкам этим полностью доверяем (не валидируем).</param> /// <returns> Новое созданное ус-во, добавленное в хранилище</returns> public Device <TIn> BuildAndAddDevice(OptionAgregator optionAgregator) { var deviceOption = optionAgregator.DeviceOptions.First(); if (_deviceStorageService.IsExist(deviceOption.Name)) { throw new StorageHandlerException($"Устройство с таким именем уже существует: {deviceOption.Name}"); } //ДОБАВИТЬ НОВЫЙ ТРАНСПОРТ----------------------------------------------------------------------- foreach (var spOption in optionAgregator.TransportOptions.SerialOptions) { var keyTransport = new KeyTransport(spOption.Port, TransportType.SerialPort); var sp = _transportStorageService.Get(keyTransport); if (sp == null) { sp = new SpWinSystemIo(spOption, keyTransport); _transportStorageService.AddNew(keyTransport, sp); var bg = new HostingBackgroundTransport(keyTransport, spOption.AutoStart); _backgroundStorageService.AddNew(keyTransport, bg); } } foreach (var tcpIpOption in optionAgregator.TransportOptions.TcpIpOptions) { var keyTransport = new KeyTransport(tcpIpOption.Name, TransportType.TcpIp); var tcpIp = _transportStorageService.Get(keyTransport); if (tcpIp == null) { tcpIp = new TcpIpTransport(tcpIpOption, keyTransport, _logger); _transportStorageService.AddNew(keyTransport, tcpIp); var bg = new HostingBackgroundTransport(keyTransport, tcpIpOption.AutoStart); _backgroundStorageService.AddNew(keyTransport, bg); } } foreach (var httpOption in optionAgregator.TransportOptions.HttpOptions) { var keyTransport = new KeyTransport(httpOption.Name, TransportType.Http); var http = _transportStorageService.Get(keyTransport); if (http == null) { http = new HttpTransport(httpOption, keyTransport); _transportStorageService.AddNew(keyTransport, http); var bg = new HostingBackgroundTransport(keyTransport, httpOption.AutoStart); _backgroundStorageService.AddNew(keyTransport, bg); } } //ДОБАВИТЬ НОВЫЕ ОБМЕНЫ--------------------------------------------------------------------------- foreach (var exchOption in optionAgregator.ExchangeOptions) { var exch = _exchangeStorageService.Get(exchOption.Key); if (exch != null) { continue; } var keyTransport = exchOption.KeyTransport; var bg = _backgroundStorageService.Get(keyTransport); var transport = _transportStorageService.Get(keyTransport); try { var dataProvider = _dataProviderFactory[exchOption.Provider.Name](exchOption.Provider); exch = new ExchangeUniversal <TIn>(exchOption, transport, bg, dataProvider, _logger); _exchangeStorageService.AddNew(exchOption.Key, exch); } catch (Exception) { throw new StorageHandlerException($"Провайдер данных не найденн в системе: {exchOption.Provider.Name}"); } } //ДОБАВИТЬ УСТРОЙСТВО-------------------------------------------------------------------------- var excanges = _exchangeStorageService.GetMany(deviceOption.ExchangeKeys).ToList(); var device = new Device <TIn>(deviceOption, excanges, _eventBus, _produser4DeviceRespFactory, _appConfigWrapper.GetProduser4DeviceOption, _logger); _deviceStorageService.AddNew(device.Option.Name, device); return(device); }
public async Task SendEnvelopeAsync_ResponseRequestEntityTooLargeWithPathDefined_StoresFile() { // Arrange var httpHandler = Substitute.For <MockableHttpMessageHandler>(); httpHandler.VerifiableSendAsync(Arg.Any <HttpRequestMessage>(), Arg.Any <CancellationToken>()) .Returns(_ => SentryResponses.GetJsonErrorResponse(HttpStatusCode.RequestEntityTooLarge, "")); var logger = new InMemoryDiagnosticLogger(); var func = Substitute.For <Func <string, string> >(); var path = Path.GetTempPath(); const string expectedEnvVar = "SENTRY_KEEP_LARGE_ENVELOPE_PATH"; func(expectedEnvVar).Returns(path); var httpTransport = new HttpTransport( new SentryOptions { Dsn = DsnSamples.ValidDsnWithSecret, Debug = true, DiagnosticLogger = logger }, new HttpClient(httpHandler), func); var envelope = Envelope.FromEvent(new SentryEvent()); // Act await httpTransport.SendEnvelopeAsync(envelope); // Assert logger.Entries.Any(e => e.Level == SentryLevel.Debug && e.Message == "Environment variable '{0}' set. Writing envelope to {1}" && e.Exception == null && e.Args[0].ToString() == expectedEnvVar && e.Args[1].ToString() == path) .Should() .BeTrue(); var fileStoredLogEntry = logger.Entries.FirstOrDefault(e => e.Level == SentryLevel.Info && e.Message == "Envelope's {0} bytes written to: {1}"); Assert.NotNull(fileStoredLogEntry); var expectedFile = new FileInfo(fileStoredLogEntry.Args[1].ToString()); Assert.True(expectedFile.Exists); try { Assert.Null(fileStoredLogEntry.Exception); // // Path is based on the provided path: Assert.Contains(path, fileStoredLogEntry.Args[1] as string); // // Path contains the envelope id in its name: Assert.Contains(envelope.TryGetEventId().ToString(), fileStoredLogEntry.Args[1] as string); Assert.Equal(expectedFile.Length, (long)fileStoredLogEntry.Args[0]); } finally { // It's in the temp folder but just to keep things tidy: expectedFile.Delete(); } }
private static void Main(string[] args) { var options = new TailFeatherCommandLineOptions(); if (Parser.Default.ParseArguments(args, options) == false) { var autoBuild = HelpText.AutoBuild(options); HelpText.DefaultParsingErrorsHandler(options, autoBuild); Console.WriteLine(autoBuild.ToString()); return; } var nodeName = options.NodeName ?? (Environment.MachineName + ":" + options.Port); Console.Title = string.Format("Node name: {0}, port: {1}", nodeName, options.Port); var kvso = StorageEnvironmentOptions.ForPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, options.DataPath, "KeyValue")); using (var statemachine = new KeyValueStateMachine(kvso)) { var storageEnvironmentOptions = StorageEnvironmentOptions.ForPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, options.DataPath, "Raft")); var httpTransport = new HttpTransport(nodeName); var raftEngineOptions = new RaftEngineOptions( new NodeConnectionInfo { Name = nodeName, Uri = new Uri("http://" + Environment.MachineName + ":" + options.Port), }, storageEnvironmentOptions, httpTransport, statemachine ) { ElectionTimeout = 5 * 1000, HeartbeatTimeout = 1000, MaxLogLengthBeforeCompaction = 25 }; if (options.Boostrap) { PersistentState.ClusterBootstrap(raftEngineOptions); Console.WriteLine("Setup node as the cluster seed, exiting..."); return; } using (var raftEngine = new RaftEngine(raftEngineOptions)) { using (WebApp.Start(new StartOptions { Urls = { "http://+:" + options.Port + "/" } }, builder => { var httpConfiguration = new HttpConfiguration(); httpConfiguration.Formatters.Remove(httpConfiguration.Formatters.XmlFormatter); httpConfiguration.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; httpConfiguration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); RaftWebApiConfig.Load(); httpConfiguration.MapHttpAttributeRoutes(); httpConfiguration.Properties[typeof(HttpTransportBus)] = httpTransport.Bus; httpConfiguration.Properties[typeof(RaftEngine)] = raftEngine; builder.UseWebApi(httpConfiguration); })) { Console.WriteLine("Ready @ http://" + Environment.MachineName + ":" + options.Port + "/, press ENTER to stop"); Console.ReadLine(); } } } }
protected override IPurchase CreateGateway() { var http = new HttpTransport(); throw (new Exception("You can't run these tests without a live SagePay test account - sorry.")); // return (new SagePayPaymentGateway(http, "myVendor", 2.23m, GatewayMode.Simulator)); }
public void Setup() { transport = new HttpTransport(new Uri("http://localhost:56123/listener/")); }
/// <summary> /// Creates an instance of an AdkHttpApplicationServer /// </summary> /// <param name="transport">The Http transport</param> public AdkHttpApplicationServer(HttpTransport transport) { fTransport = transport; }
public void Factory() { var httptransport = HttpTransport.Create(); Assert.That(httptransport, Is.InstanceOf <IHttpTransport>()); }
internal AdkHttpPushProtocolHandler(AdkHttpApplicationServer server, HttpTransport transport) : base(transport) { fServer = server; }
protected override IPurchase CreateGateway() { var http = new HttpTransport(); return (new DataCashPaymentGateway(http, CLIENT_ID, PASSWORD, GATEWAY_URI)); }