public TestResultBase Test(Options o)
        {
            var testResult = new GenericTestResult
            {
                ShortDescription = "Performance (uptime) " + RelativeUrl,
                Status = TestResult.INCONCLUSIVE
            };


            DateTime current = DateTime.Now; // to check if we elapsed total seconds.
            var results = new List<Tuple<long, TestResult>>();
            //long lastMessageTime = 0;

            while (true)
            {
                var test = new CheckCompletenessResponseTest
                {
                    RelativeUrl = RelativeUrl, //string.Format(RelativeUrl, lastMessageTime)
                    FieldsThatShouldBePresent = FieldsThatShouldBePresent
                };
                TestResultBase res = test.Test(o);
                results.Add(new Tuple<long, TestResult>(test.RequestDuration, res.Status));

                //if (test.ResponseData != null)
                //{
                //    // now store the last updated time from the previous
                //    string data = test.ResponseData;
                //}
                Thread.Sleep(IntervalTime);
                if (DateTime.Now.Subtract(current).TotalSeconds >= TestDuration)
                    break;
            }

            IEnumerable<Tuple<long, TestResult>> succesCount = results.Where(t => t.Item2 == TestResult.OK).ToList();

            var totalResultCount = results.Count;
            double percentageSuccess = totalResultCount == 0 ? 0 : succesCount.Count() / (double)totalResultCount;
            double avgTime = succesCount.Any() ? succesCount.Select(t => t.Item1).Average() : -1;

            testResult.ExtraInformation = Math.Round(avgTime, 0) + " ms average time";

            if (percentageSuccess >= 0.95)
            {
                testResult.Status = TestResult.OK;
            }
            else
            {
                testResult.Status = TestResult.FAIL;
                testResult.CauseOfFailure = "Percentage success: " + Math.Round(percentageSuccess * 100)  + "%";
            }

            return testResult;
        }
        public TestResultBase Test(Options o)
        {
            var testResult = new GenericTestResult
            {
                ShortDescription = "Performance (uptime) " + RelativeUrl,
                Status = TestResult.INCONCLUSIVE
            };

            DateTime current = DateTime.Now; // to check if we elapsed total seconds.
            var results = new List<Tuple<long, TestResult>>();
            long lastMessageTime = 0;

            while (true)
            {
                var test = new CheckCompletenessResponseTest
                {
                    RelativeUrl = string.Format("/fcd?last_message_time={0}", lastMessageTime),
                    FieldsThatShouldBePresent = FieldTester.FieldsThatShouldBePresentInFCD(),
                    TestResultWhenNoData = TestResult.OK
                };
               
                TestResultBase res = test.Test(o);
                results.Add(new Tuple<long, TestResult>(test.RequestDuration, res.Status));

                if (test.ResponseData != null)
                {
                    // now store the last updated time from the previous
                    string data = test.ResponseData;
                    // deserialize
                    var fcdMsg = JsonConvert.DeserializeObject<FcdMessage>(data);

                    if (lastMessageTime == fcdMsg.message_time)
                    {
                        GenerationTimeValid = false;
                    }
                    else
                    {
                        if (!GenerationTimeValid.HasValue)
                            GenerationTimeValid = true;
                    }
                    lastMessageTime = fcdMsg.message_time;
                }
                else
                {
                    GenerationTimeValid = false;
                }
                Thread.Sleep(IntervalTime);
                if (DateTime.Now.Subtract(current).TotalSeconds >= TestDuration)
                    break;
            }

            IEnumerable<Tuple<long, TestResult>> succesCount = results.Where(t => t.Item2 == TestResult.OK);
            double percentageSuccess = succesCount.Count()/(double) results.Count;
            double avgTime = results.Select(t => t.Item1).Average();

            testResult.ExtraInformation = Math.Round(avgTime, 0) + " ms average time";

            if (percentageSuccess >= 0.95)
            {
                testResult.Status = TestResult.OK;
            }
            else
            {
                testResult.Status = TestResult.FAIL;
                testResult.CauseOfFailure = "Percentage success: " + Math.Round(percentageSuccess * 100, 0) + " %";
            }

            return testResult;
        }