public void FaultyTruncateTest()
        {
            this.Reset();

            RollbarLoggerConfig config = this.ProvideLiveRollbarConfig() as RollbarLoggerConfig;
            RollbarPayloadManipulationOptions payloadManipulationOptions = new RollbarPayloadManipulationOptions();

            payloadManipulationOptions.Truncate = delegate(Payload payload)
            {
                throw new Exception("Buggy truncate delegate!");
            };
            config.RollbarPayloadManipulationOptions.Reconfigure(payloadManipulationOptions);

            using (IRollbar rollbar = this.ProvideDisposableRollbar())
            {
                rollbar.Configure(config);

                rollbar.Critical("This message's Truncate will fail!");

                this.VerifyInstanceOperational(rollbar);
                // one more extra sanity check:
                Assert.AreEqual(0, RollbarQueueController.Instance.GetTotalPayloadCount());
            }

            this.Reset();
        }
        public void ConvenienceMethodsUseAppropriateErrorLevels(ErrorLevel expectedLogLevel)
        {
            var acctualLogLevel = ErrorLevel.Info;

            void Transform(Payload payload)
            {
                acctualLogLevel = payload.Data.Level.Value;
            }

            RollbarDestinationOptions destinationOptions =
                new RollbarDestinationOptions(
                    RollbarUnitTestSettings.AccessToken,
                    RollbarUnitTestSettings.Environment
                    );
            RollbarPayloadManipulationOptions payloadManipulationOptions =
                new RollbarPayloadManipulationOptions(Transform);
            var loggerConfig = new RollbarLoggerConfig();

            loggerConfig.RollbarDestinationOptions.Reconfigure(destinationOptions);
            loggerConfig.RollbarPayloadManipulationOptions.Reconfigure(payloadManipulationOptions);
            using (var logger = RollbarFactory.CreateNew().Configure(loggerConfig))
            {
                try
                {
                    var blockingLogger = logger.AsBlockingLogger(TimeSpan.FromMilliseconds(TIME_OUT));
                    var ex             = new Exception();
                    switch (expectedLogLevel)
                    {
                    case ErrorLevel.Critical:
                        blockingLogger.Critical(ex);
                        break;

                    case ErrorLevel.Error:
                        blockingLogger.Error(ex);
                        break;

                    case ErrorLevel.Warning:
                        blockingLogger.Warning(ex);
                        break;

                    case ErrorLevel.Info:
                        blockingLogger.Info(ex);
                        break;

                    case ErrorLevel.Debug:
                        blockingLogger.Debug(ex);
                        break;
                    }
                }
                catch
                {
                    Assert.Fail();
                }
            }

            Assert.AreEqual(expectedLogLevel, acctualLogLevel);
        }
        public void ExceptionWhileTransformingPayloadAsync()
        {
            this._transformException = false;

            RollbarDestinationOptions destinationOptions =
                new RollbarDestinationOptions(
                    RollbarUnitTestSettings.AccessToken,
                    RollbarUnitTestSettings.Environment
                    );
            RollbarLoggerConfig loggerConfig = new RollbarLoggerConfig();

            loggerConfig.RollbarDestinationOptions.Reconfigure(destinationOptions);

            RollbarPayloadManipulationOptions payloadManipulationOptions = new RollbarPayloadManipulationOptions();

            payloadManipulationOptions.Transform = delegate {
                throw new NullReferenceException();
            };
            loggerConfig.RollbarPayloadManipulationOptions.Reconfigure(payloadManipulationOptions);

            using IRollbar logger = RollbarFactory.CreateNew().Configure(loggerConfig);
            logger.InternalEvent += Logger_InternalEvent;

            try
            {
                this.IncrementCount <CommunicationEventArgs>();
                logger.Log(ErrorLevel.Error, "test message");
            }
            catch
            {
                logger.InternalEvent -= Logger_InternalEvent;
                Assert.Fail("should never get here!");
                throw;
            }

            this._signal.Wait();
            logger.InternalEvent -= Logger_InternalEvent;

            Assert.IsTrue(this._transformException);
        }
        public void LongReportIsAsync()
        {
            const int maxCallLengthInMillisec = 50;
            TimeSpan  payloadSubmissionDelay  = TimeSpan.FromMilliseconds(3 * maxCallLengthInMillisec);

            RollbarDestinationOptions destinationOptions =
                new RollbarDestinationOptions(
                    RollbarUnitTestSettings.AccessToken,
                    RollbarUnitTestSettings.Environment
                    );
            RollbarLoggerConfig loggerConfig = new RollbarLoggerConfig();

            loggerConfig.RollbarDestinationOptions.Reconfigure(destinationOptions);

            RollbarPayloadManipulationOptions payloadManipulationOptions = new RollbarPayloadManipulationOptions();

            payloadManipulationOptions.Transform = delegate
            {
                Thread.Sleep(payloadSubmissionDelay);
            };
            loggerConfig.RollbarPayloadManipulationOptions.Reconfigure(payloadManipulationOptions);

            using IRollbar logger = RollbarFactory.CreateNew().Configure(loggerConfig);
            try
            {
                this.IncrementCount <CommunicationEventArgs>();
                Stopwatch sw = Stopwatch.StartNew();
                logger.Log(ErrorLevel.Error, "test message");
                sw.Stop();
                Assert.IsTrue(sw.ElapsedMilliseconds < maxCallLengthInMillisec);
                Thread.Sleep(payloadSubmissionDelay);
            }
            catch
            {
                Assert.Fail("should never get here!");
            }
        }
        public void ConvenienceMethodsUseAppropriateErrorLevels(ErrorLevel expectedLogLevel)
        {
            var awaitAsyncSend  = new ManualResetEventSlim(false);
            var acctualLogLevel = ErrorLevel.Info;

            void Transform(Payload payload)
            {
                acctualLogLevel = payload.Data.Level.Value;
                awaitAsyncSend.Set();
            }

            RollbarDestinationOptions destinationOptions =
                new RollbarDestinationOptions(
                    RollbarUnitTestSettings.AccessToken,
                    RollbarUnitTestSettings.Environment
                    );
            RollbarLoggerConfig loggerConfig = new RollbarLoggerConfig();

            loggerConfig.RollbarDestinationOptions.Reconfigure(destinationOptions);

            RollbarPayloadManipulationOptions payloadManipulationOptions = new RollbarPayloadManipulationOptions();

            payloadManipulationOptions.Transform = Transform;
            loggerConfig.RollbarPayloadManipulationOptions.Reconfigure(payloadManipulationOptions);

            this.IncrementCount <CommunicationEventArgs>();
            using (var logger = RollbarFactory.CreateNew().Configure(loggerConfig))
            {
                try
                {
                    //TODO: implement and add SynchronousPackage around the payload object!!!
                    var ex = new Exception();
                    switch (expectedLogLevel)
                    {
                    case ErrorLevel.Critical:
                        logger.Critical(ex);
                        break;

                    case ErrorLevel.Error:
                        logger.Error(ex);
                        break;

                    case ErrorLevel.Warning:
                        logger.Warning(ex);
                        break;

                    case ErrorLevel.Info:
                        logger.Info(ex);
                        break;

                    case ErrorLevel.Debug:
                        logger.Debug(ex);
                        break;
                    }
                }
                catch
                {
                    Assert.Fail("should never reach here!");
                }
            }

            awaitAsyncSend.Wait();
            Assert.AreEqual(expectedLogLevel, acctualLogLevel);
        }