internal static void StartOwinTest(string url, LogMeController.TestContext testContext, Action testsFunc)
        {
            // HttpSelfHostConfiguration. So info: http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

            // Start webservice
            using (WebApp.Start(url, (appBuilder) =>
            {
                // Configure Web API for self-host.
                HttpConfiguration config = new HttpConfiguration();

                config.DependencyResolver = new ControllerResolver <LogMeController>(() => new LogMeController()
                {
                    Context = testContext
                });

                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                    );

                appBuilder.UseWebApi(config);
            }))
            {
                testsFunc();

                //wait for all received message, or timeout. There is no exception on timeout, so we have to check carefully in the unit test.
                if (testContext.CountdownEvent != null)
                {
                    testContext.CountdownEvent.Wait(webserviceCheckTimeoutMs);
                    //we need some extra time for completion
                    Thread.Sleep(1000);
                }
            }
        }
        public void WebserviceTest_restapi_httpget_flush()
        {
            string wsAddress  = getNewWsAddress();
            var    logFactory = SetUpHttpGetWebservice(wsAddress, "api/logme");
            var    logger     = logFactory.GetCurrentClassLogger();

            var context = new LogMeController.TestContext();

            context.ResetState(0);

            var message1 = "message with a post";

            StartOwinTest(wsAddress, context, () =>
            {
                for (int i = 0; i < 100; ++i)
                {
                    logger.Info(message1);
                }

                // Make triple-flush to fully exercise the async flushing logic
                try
                {
                    LogManager.Flush(0);
                }
                catch (NLogRuntimeException)
                { }
                logFactory.Flush(); // Waits for flush (Scheduled on top of the previous flush)
                logFactory.Flush(); // Nothing to flush
            });

            Assert.Equal(100, context.ReceivedLogsGetParam1.Count);
        }
        public void WebserviceTest_restapi_httppost_checkingLost()
        {
            RetryingIntegrationTest(3, () =>
            {
                string wsAddress = getNewWsAddress();
                var logFactory   = new LogFactory().Setup()
                                   .SetupExtensions(ext => ext.RegisterAssembly(typeof(WebServiceTarget).Assembly))
                                   .LoadConfigurationFromXml($@"
                    <nlog throwExceptions='true'>
                        <targets>
                            <target type='WebService'
                                    name='ws'
                                    url='{wsAddress}{"api/logme"}'
                                    protocol='HttpPost'
                                    encoding='UTF-8'
                                   >
                                <parameter name='param1' type='System.String' layout='${{message}}'/> 
                                <parameter name='param2' type='System.String' layout='${{level}}'/>
                            </target>
                        </targets>
                        <rules>
                          <logger name='*' writeTo='ws' />
                        </rules>
                    </nlog>").LogFactory;

                var logger = logFactory.GetCurrentClassLogger();

                const int messageCount = 1000;
                var createdMessages    = new List <string>(messageCount);

                for (int i = 0; i < messageCount; i++)
                {
                    var message = "message " + i;
                    createdMessages.Add(message);
                }

                //reset
                var context = new LogMeController.TestContext();
                context.ResetState(messageCount);

                StartOwinTest(wsAddress, context, () =>
                {
                    foreach (var createdMessage in createdMessages)
                    {
                        logger.Info(createdMessage);
                    }
                });

                Assert.Equal(0, context.CountdownEvent.CurrentCount);
                Assert.Equal(createdMessages.Count, context.ReceivedLogsPostParam1.Count);
            });
        }
        public void WebServiceTest_restapi_httpget_querystring()
        {
            string wsAddress = getNewWsAddress();
            var    logger    = SetUpHttpGetWebservice(wsAddress, "api/logme?paramFromConfig=valueFromConfig").GetCurrentClassLogger();

            var context = new LogMeController.TestContext();

            context.ResetState(1);

            StartOwinTest(wsAddress, context, () =>
            {
                logger.Info("another message");
            });

            Assert.Equal(0, context.CountdownEvent.CurrentCount);
            Assert.Single(context.ReceivedLogsGetParam1);
            CheckQueueMessage("another message", context.ReceivedLogsGetParam1);
        }
        public void WebserviceTest_restapi_httppost()
        {
            string wsAddress  = getNewWsAddress();
            var    logFactory = new LogFactory().Setup()
                                .SetupExtensions(ext => ext.RegisterAssembly(typeof(WebServiceTarget).Assembly))
                                .LoadConfigurationFromXml($@"
                <nlog throwExceptions='true'>
                    <targets>
                        <target type='WebService'
                                name='ws'
                                url='{wsAddress}{"api/logme"}'
                                protocol='HttpPost'
                                encoding='UTF-8'
                               >
                            <parameter name='param1' type='System.String' layout='${{message}}'/> 
                            <parameter name='param2' type='System.String' layout='${{level}}'/>    
                        </target>
                    </targets>
                    <rules>
                      <logger name='*' writeTo='ws' />
                    </rules>
                </nlog>").LogFactory;

            var logger = logFactory.GetCurrentClassLogger();

            var context = new LogMeController.TestContext();

            context.ResetState(2);

            var message1 = "message 1 with a post";
            var message2 = "a b c é k è ï ?";

            StartOwinTest(wsAddress, context, () =>
            {
                logger.Info(message1);
                logger.Info(message2);
            });

            Assert.Equal(0, context.CountdownEvent.CurrentCount);
            Assert.Equal(2, context.ReceivedLogsPostParam1.Count);
            CheckQueueMessage(message1, context.ReceivedLogsPostParam1);
            CheckQueueMessage(message2, context.ReceivedLogsPostParam1);
        }
        public void WebserviceTest_restapi_httpget()
        {
            string wsAddress = getNewWsAddress();
            var    logger    = SetUpHttpGetWebservice(wsAddress, "api/logme").GetCurrentClassLogger();

            var context = new LogMeController.TestContext();

            context.ResetState(2);

            var message1 = "message 1 with a post";
            var message2 = "a b c é k è ï ?";

            StartOwinTest(wsAddress, context, () =>
            {
                logger.Info(message1);
                logger.Info(message2);
            });

            Assert.Equal(0, context.CountdownEvent.CurrentCount);
            Assert.Equal(2, context.ReceivedLogsGetParam1.Count);
            CheckQueueMessage(message1, context.ReceivedLogsGetParam1);
            CheckQueueMessage(message2, context.ReceivedLogsGetParam1);
        }