public async Task SendEnvelopeAsync_AttachmentTooLarge_DropsItem() { // Arrange using var httpHandler = new RecordingHttpMessageHandler( new FakeHttpMessageHandler() ); var logger = new InMemoryDiagnosticLogger(); var httpTransport = new HttpTransport( new SentryOptions { Dsn = DsnSamples.ValidDsnWithSecret, MaxAttachmentSize = 1, DiagnosticLogger = logger, Debug = true }, new HttpClient(httpHandler) ); var attachmentNormal = new Attachment( AttachmentType.Default, new StreamAttachmentContent(new MemoryStream(new byte[] { 1 })), "test1.txt", null ); var attachmentTooBig = new Attachment( AttachmentType.Default, new StreamAttachmentContent(new MemoryStream(new byte[] { 1, 2, 3, 4, 5 })), "test2.txt", null ); using var envelope = Envelope.FromEvent( new SentryEvent(), new[] { attachmentNormal, attachmentTooBig } ); // Act await httpTransport.SendEnvelopeAsync(envelope); var lastRequest = httpHandler.GetRequests().Last(); var actualEnvelopeSerialized = await lastRequest.Content.ReadAsStringAsync(); // Assert // (the envelope should have only one item) logger.Entries.Should().Contain(e => e.Message == "Attachment '{0}' dropped because it's too large ({1} bytes)." && e.Args[0].ToString() == "test2.txt" && e.Args[1].ToString() == "5" ); actualEnvelopeSerialized.Should().NotContain("test2.txt"); }
public Fixture(Action <SentryOptions> configureOptions = null) { Logger = new InMemoryDiagnosticLogger(); Options = new SentryOptions { Dsn = DsnSamples.ValidDsnWithoutSecret, CacheDirectoryPath = _cacheDirectory.Path, Release = "test", Debug = true, DiagnosticLogger = Logger }; configureOptions?.Invoke(Options); }
public async Task SendEnvelopeAsync_AttachmentFail_DropsItem() { // Arrange using var httpHandler = new RecordingHttpMessageHandler( new FakeHttpMessageHandler()); var logger = new InMemoryDiagnosticLogger(); var httpTransport = new HttpTransport( new SentryOptions { Dsn = DsnSamples.ValidDsnWithSecret, MaxAttachmentSize = 1, DiagnosticLogger = logger, Debug = true }, new HttpClient(httpHandler)); var attachment = new Attachment( AttachmentType.Default, new FileAttachmentContent("test1.txt"), "test1.txt", null); using var envelope = Envelope.FromEvent( new SentryEvent(), logger, new[] { attachment }); // Act await httpTransport.SendEnvelopeAsync(envelope); var lastRequest = httpHandler.GetRequests().Last(); var actualEnvelopeSerialized = await lastRequest.Content.ReadAsStringAsync(); // Assert // (the envelope should have only one item) logger.Entries.Should().Contain(e => e.Message == "Failed to add attachment: {0}." && (string)e.Args[0] == "test1.txt"); actualEnvelopeSerialized.Should().NotContain("test2.txt"); }
public async Task SendEnvelopeAsync_ResponseNotOkWithJsonMessage_LogsError() { // Arrange const HttpStatusCode expectedCode = HttpStatusCode.BadGateway; const string expectedMessage = "Bad Gateway!"; var expectedCauses = new[] { "invalid file", "wrong arguments" }; var expectedCausesFormatted = string.Join(", ", expectedCauses); var httpHandler = Substitute.For <MockableHttpMessageHandler>(); httpHandler.VerifiableSendAsync(Arg.Any <HttpRequestMessage>(), Arg.Any <CancellationToken>()) .Returns(_ => SentryResponses.GetJsonErrorResponse(expectedCode, expectedMessage, expectedCauses)); var logger = new InMemoryDiagnosticLogger(); var httpTransport = new HttpTransport( new SentryOptions { Dsn = DsnSamples.ValidDsnWithSecret, Debug = true, DiagnosticLogger = logger }, new HttpClient(httpHandler) ); var envelope = Envelope.FromEvent(new SentryEvent()); // Act await httpTransport.SendEnvelopeAsync(envelope); // Assert logger.Entries.Any(e => e.Level == SentryLevel.Error && e.Message == "Sentry rejected the envelope {0}. Status code: {1}. Error detail: {2}. Error causes: {3}." && e.Exception == null && e.Args[0].ToString() == envelope.TryGetEventId().ToString() && e.Args[1].ToString() == expectedCode.ToString() && e.Args[2].ToString() == expectedMessage && e.Args[3].ToString() == expectedCausesFormatted ).Should().BeTrue(); }
public async Task SendEnvelopeAsync_ResponseNotOkWithStringMessage_LogsError() { // Arrange const HttpStatusCode expectedCode = HttpStatusCode.RequestEntityTooLarge; const string expectedMessage = "413 Request Entity Too Large"; var httpHandler = Substitute.For <MockableHttpMessageHandler>(); _ = httpHandler.VerifiableSendAsync(Arg.Any <HttpRequestMessage>(), Arg.Any <CancellationToken>()) .Returns(_ => SentryResponses.GetTextErrorResponse(expectedCode, expectedMessage)); var logger = new InMemoryDiagnosticLogger(); var httpTransport = new HttpTransport( new SentryOptions { Dsn = DsnSamples.ValidDsnWithSecret, Debug = true, DiagnosticLogger = logger }, new HttpClient(httpHandler) ); var envelope = Envelope.FromEvent(new SentryEvent()); // Act await httpTransport.SendEnvelopeAsync(envelope); // Assert _ = logger.Entries.Any(e => e.Level == SentryLevel.Error && e.Message == "Sentry rejected the envelope {0}. Status code: {1}. Error detail: {2}." && e.Exception == null && e.Args[0].ToString() == envelope.TryGetEventId().ToString() && e.Args[1].ToString() == expectedCode.ToString() && e.Args[2].ToString() == expectedMessage ).Should().BeTrue(); }
public Fixture() { Logger = new InMemoryDiagnosticLogger(); Options = new SentryOptions { Debug = true, DiagnosticLogger = Logger, DiagnosticLevel = SentryLevel.Debug, TracesSampleRate = 1, }; Tracer = new TransactionTracer(Hub, "foo", "bar") { IsSampled = true }; _scope = new Scope { Transaction = Tracer }; Hub = Substitute.For <IHub>(); Hub.When(hub => hub.ConfigureScope(Arg.Any <Action <Scope> >())) .Do(callback => callback.Arg <Action <Scope> >().Invoke(_scope)); }
public async Task SendEnvelopeAsync_ResponseRequestEntityTooLargeWithoutPathDefined_DoesNotStoreFile() { // 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> >(); func(Arg.Any <string>()).Returns(null as string); var httpTransport = new HttpTransport( new SentryOptions { Dsn = DsnSamples.ValidDsnWithSecret, Debug = true, DiagnosticLogger = logger }, new HttpClient(httpHandler), func); // Act await httpTransport.SendEnvelopeAsync(Envelope.FromEvent(new SentryEvent())); // Assert logger.Entries.Any(e => e.Message == "Environment variable '{0}' set. Writing envelope to {1}") .Should() .BeFalse(); logger.Entries.Any(e => e.Message == "Envelope's {0} bytes written to: {1}") .Should() .BeFalse(); }
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(); } }