Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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();
            }
        }
Esempio n. 4
0
        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();
                    }
                }
            }
        }
Esempio n. 5
0
 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));
 }
Esempio n. 6
0
 public void Setup()
 {
     transport = new HttpTransport(new Uri("http://localhost:56123/listener/"));
 }
Esempio n. 7
0
 /// <summary>
 /// Creates an instance of an AdkHttpApplicationServer
 /// </summary>
 /// <param name="transport">The Http transport</param>
 public AdkHttpApplicationServer(HttpTransport transport)
 {
     fTransport = transport;
 }
Esempio n. 8
0
        public void Factory()
        {
            var httptransport = HttpTransport.Create();

            Assert.That(httptransport, Is.InstanceOf <IHttpTransport>());
        }
Esempio n. 9
0
 internal AdkHttpPushProtocolHandler(AdkHttpApplicationServer server, HttpTransport transport) : base(transport)
 {
     fServer = server;
 }
Esempio n. 10
0
 protected override IPurchase CreateGateway()
 {
     var http = new HttpTransport();
     return (new DataCashPaymentGateway(http, CLIENT_ID, PASSWORD, GATEWAY_URI));
 }