/// <summary>
        /// Report the current statistics of sampling rules and
        /// get back the new assigned quota/TTL/Interval from the X-Ray service.
        /// The call is proxied and signed via X-Ray Daemon.
        /// </summary>
        /// <param name="rules">List of <see cref="SamplingRule"/>.</param>
        /// <returns>Instance of <see cref="GetSamplingRulesResponse"/>.</returns>
        public async Task <GetSamplingTargetsResponse> GetSamplingTargets(List <SamplingRule> rules)
        {
            DateTime currentTime = TimeStamp.CurrentDateTime();
            List <SamplingStatisticsDocumentModel> samplingStatisticsDocumentModels = GetSamplingStatisticsDocuments(rules, currentTime);
            var samplingStatisticsModel = new SamplingStatisticsModel();

            samplingStatisticsModel.SamplingStatisticsDocuments = samplingStatisticsDocumentModels;

            string requestContent = JsonMapper.ToJson(samplingStatisticsModel); // Marshall SamplingStatisticsDocument to json

            Task <string> responseTask;

            lock (_xrayClientLock)
            {
                RefreshEndPoint();
                responseTask = GetSamplingInfoAsync(_xrayConfig.ServiceURL + "/SamplingTargets", requestContent);
            }
            var responseContent = await responseTask;

            var samplingTargetResponse = UnmarshallSamplingTargetResponse(responseContent);

            var targetList = ConvertTargetList(samplingTargetResponse.SamplingTargetDocuments);

            GetSamplingTargetsResponse result = new GetSamplingTargetsResponse(targetList);

            result.RuleFreshness = new TimeStamp(ConvertDoubleToDateTime(samplingTargetResponse.LastRuleModification));
            return(result);
        }
        public void TestMarshallSamplingStatisticsDocumentsWithEmptyItems()
        {
            var samplingStatisticsModel = new SamplingStatisticsModel();

            var expected = "{\"SamplingStatisticsDocuments\":[]}";
            var actual   = JsonMapper.ToJson(samplingStatisticsModel);

            Assert.AreEqual(expected, actual);
        }
        public void TestMarshallSamplingStatisticsDocumentsWithEmptyValues()
        {
            var samplingStatisticsModel         = new SamplingStatisticsModel();
            var samplingStatisticsDocumentModel = new SamplingStatisticsDocumentModel();

            samplingStatisticsModel.SamplingStatisticsDocuments.Add(samplingStatisticsDocumentModel);

            var expected = "{\"SamplingStatisticsDocuments\":[{\"ClientID\":null,\"RuleName\":null,\"RequestCount\":null,\"SampledCount\":null,\"BorrowCount\":null,\"Timestamp\":null}]}";
            var actual   = JsonMapper.ToJson(samplingStatisticsModel);

            Assert.AreEqual(expected, actual);
        }
        public void TestMarshallSamplingStatisticsDocuments()
        {
            var samplingStatisticsModel         = new SamplingStatisticsModel();
            var samplingStatisticsDocumentModel = new SamplingStatisticsDocumentModel
            {
                ClientID     = "07492221d7fd13a86e750de2",
                RuleName     = "Test",
                RequestCount = 108,
                SampledCount = 4,
                BorrowCount  = 6,
                Timestamp    = 1604297926.362
            };

            samplingStatisticsModel.SamplingStatisticsDocuments.Add(samplingStatisticsDocumentModel);

            var expected = "{\"SamplingStatisticsDocuments\":[{\"ClientID\":\"07492221d7fd13a86e750de2\",\"RuleName\":\"Test\",\"RequestCount\":108,\"SampledCount\":4,\"BorrowCount\":6,\"Timestamp\":1604297926.362}]}";
            var actual   = JsonMapper.ToJson(samplingStatisticsModel);

            Assert.AreEqual(expected, actual);
        }