public void TestMerge() // Test statefule attributes of already present rule in cache is carried to new rules.
        {
            RuleCache           ruleCache         = new RuleCache();
            List <SamplingRule> newRules          = new List <SamplingRule>();
            SamplingRule        rule1             = GetSamplingRule("a", 2);
            Statistics          expectedStatistic = new Statistics(2, 1, 1);

            rule1.Statistics = expectedStatistic;
            SamplingRule rule2 = GetSamplingRule("b", 1);

            newRules.Add(rule1);
            newRules.Add(rule2);

            ruleCache.LoadRules(newRules);

            IList <SamplingRule> rulesInCache = ruleCache.GetRules();

            Assert.AreEqual(2, rulesInCache.Count);
            Assert.AreEqual(rule2.RuleName, rulesInCache[0].RuleName);
            Assert.AreEqual(rule1.RuleName, rulesInCache[1].RuleName);

            // Load Targets
            DateTime  dateTime    = TimeStamp.CurrentDateTime();
            TimeStamp currentTime = new TimeStamp(dateTime);

            Target        t1         = new Target("a", 0.9, 10, dateTime, 10);
            Target        t2         = new Target("b", 0.5, 10, dateTime, 10);
            List <Target> newTargets = new List <Target>();

            newTargets.Add(t1);
            newTargets.Add(t2);

            ruleCache.LoadTargets(newTargets);
            rulesInCache = ruleCache.GetRules();
            rule1        = GetSamplingRule("a", 1);
            newRules     = new List <SamplingRule>();
            newRules.Add(rule1);

            ruleCache.LoadRules(newRules); // In the next iteration, rule a with update prioirty and rule b is deleted.

            rulesInCache = ruleCache.GetRules();

            Assert.AreEqual(1, rulesInCache.Count);       // only one rule should be present and statefule info should be carried from old rule
            Assert.AreEqual(1, rulesInCache[0].Priority); // implies new rule is added to cache

            Reservoir actualReservoir1 = rulesInCache[0].Reservoir;

            Assert.AreEqual(currentTime.Time, actualReservoir1.TTL.Time);
            Assert.AreEqual(t1.Interval, actualReservoir1.Interval);
            Assert.AreEqual(t1.ReservoirQuota, actualReservoir1.Quota);

            Statistics statistics = rulesInCache[0].Statistics;

            Assert.AreEqual(expectedStatistic.RequestCount, statistics.RequestCount);
            Assert.AreEqual(expectedStatistic.BorrowCount, statistics.BorrowCount);
            Assert.AreEqual(expectedStatistic.SampledCount, statistics.SampledCount);
        }
        public void TestLoadTargets() // Test statefule attributes of already present rule in cache is carried to new rules.
        {
            RuleCache           ruleCache = new RuleCache();
            List <SamplingRule> newRules  = new List <SamplingRule>();
            SamplingRule        rule1     = GetSamplingRule("a", 2);
            SamplingRule        rule2     = GetSamplingRule("b", 1);

            newRules.Add(rule1);
            newRules.Add(rule2);

            ruleCache.LoadRules(newRules);

            IList <SamplingRule> rulesInCache = ruleCache.GetRules();

            Assert.AreEqual(2, rulesInCache.Count);
            Assert.AreEqual(rule2.RuleName, rulesInCache[0].RuleName);
            Assert.AreEqual(rule1.RuleName, rulesInCache[1].RuleName);

            // Load Targets
            DateTime  dateTime    = TimeStamp.CurrentDateTime();
            TimeStamp currentTime = new TimeStamp(dateTime);

            Target        t1         = new Target("a", 0.9, 10, dateTime, 10);
            Target        t2         = new Target("b", 0.5, 10, dateTime, 10);
            List <Target> newTargets = new List <Target>();

            newTargets.Add(t1);
            newTargets.Add(t2);

            ruleCache.LoadTargets(newTargets);

            rulesInCache = ruleCache.GetRules(); // check targets value is copied

            Reservoir actualReservoir2 = rulesInCache[0].Reservoir;

            Assert.AreEqual(currentTime.Time, actualReservoir2.TTL.Time);
            Assert.AreEqual(t2.Interval, actualReservoir2.Interval);
            Assert.AreEqual(t2.ReservoirQuota, actualReservoir2.Quota);

            Reservoir actualReservoir1 = rulesInCache[1].Reservoir;

            Assert.AreEqual(currentTime.Time, actualReservoir1.TTL.Time);
            Assert.AreEqual(t1.Interval, actualReservoir1.Interval);
            Assert.AreEqual(t1.ReservoirQuota, actualReservoir1.Quota);
        }