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 TestLoadRules1() // Test basic LoadRules
        {
            RuleCache           ruleCache = new RuleCache();
            List <SamplingRule> newRules  = new List <SamplingRule>();
            SamplingRule        rule      = GetSamplingRule("a", 1, 0.5, 10, "test", "test", "GET", "/api/5");

            newRules.Add(rule);
            ruleCache.LoadRules(newRules);
            IList <SamplingRule> rulesInCache = ruleCache.GetRules();

            Assert.AreEqual(1, rulesInCache.Count);
        }
        public void TestDefaultSamplingRuleWhenNoConfigurationSpecified()
        {
            var strategy = new LocalizedSamplingStrategy();

            Assert.AreEqual(0, strategy.Rules.Count);
            SamplingRule rule = strategy.DefaultRule;

            Assert.AreEqual("*", rule.ServiceName);
            Assert.AreEqual("*", rule.UrlPath);
            Assert.AreEqual("*", rule.HttpMethod);
            Assert.AreEqual(1, rule.FixedTarget);
            Assert.AreEqual("0.05", rule.Rate.ToString("0.00"));
        }
        public void TestGetMatchedRuleNotMatching() // Rule not matched
        {
            RuleCache           ruleCache     = new RuleCache();
            List <SamplingRule> newRules      = new List <SamplingRule>();
            SamplingInput       samplingInput = new SamplingInput("elasticbeanstalk", "/api/1", "GET", "dynamo", "*");
            SamplingRule        rule          = GetSamplingRule("a", 1, 0.5, 10, "j", samplingInput.ServiceName, samplingInput.Method, samplingInput.Url);

            newRules.Add(rule);
            ruleCache.LoadRules(newRules);
            TimeStamp current = TimeStamp.CurrentTime();

            ruleCache.LastUpdated = current;

            var actualRule = ruleCache.GetMatchedRule(samplingInput, current);

            Assert.IsNull(actualRule);
        }
        public void TestGetMatchedRule3() // sampling input ServiceName and ServiceType is null - it should be ignored for rule matching
        {
            RuleCache           ruleCache     = new RuleCache();
            List <SamplingRule> newRules      = new List <SamplingRule>();
            SamplingInput       samplingInput = new SamplingInput("elasticbeanstalk", "/api/1", "GET", "", "");
            SamplingRule        expectedRule  = GetSamplingRule("a", 1, 0.5, 10, samplingInput.Host, "test", samplingInput.Method, samplingInput.Url, serviceType: "XYZ");

            newRules.Add(expectedRule);
            ruleCache.LoadRules(newRules);
            TimeStamp current = TimeStamp.CurrentTime();

            ruleCache.LastUpdated = current;

            var actualRule = ruleCache.GetMatchedRule(samplingInput, current);

            Assert.IsTrue(actualRule.Equals(expectedRule));
        }
        public void TestGetMatchedRule2() // ServiceType is different
        {
            RuleCache           ruleCache     = new RuleCache();
            List <SamplingRule> newRules      = new List <SamplingRule>();
            SamplingInput       samplingInput = new SamplingInput("elasticbeanstalk", "/api/1", "GET", "dynamo", "AWS::ECS::Container");
            SamplingRule        expectedRule  = GetSamplingRule("a", 1, 0.5, 10, samplingInput.Host, samplingInput.ServiceName, samplingInput.Method, samplingInput.Url, serviceType: "XYZ");

            newRules.Add(expectedRule);
            ruleCache.LoadRules(newRules);
            TimeStamp current = TimeStamp.CurrentTime();

            ruleCache.LastUpdated = current;

            var actualRule = ruleCache.GetMatchedRule(samplingInput, current);

            Assert.IsNull(actualRule);
        }
        public void TestGetMatchedRuleNotMatching2() // SamplingInput with only ServiceName - Rule not matched
        {
            RuleCache           ruleCache     = new RuleCache();
            List <SamplingRule> newRules      = new List <SamplingRule>();
            SamplingInput       samplingInput = new SamplingInput("elasticbeanstalk");
            SamplingRule        rule          = GetSamplingRule("a", 1, 0.5, 10, serviceName: "XYZ");

            newRules.Add(rule);
            ruleCache.LoadRules(newRules);
            TimeStamp current = TimeStamp.CurrentTime();

            ruleCache.LastUpdated = current;

            var actualRule = ruleCache.GetMatchedRule(samplingInput, current);

            Assert.IsNull(actualRule);
        }
        public void TestGetMatchedRule4() // sampling input has only ServiceName - the rule should be matched
        {
            RuleCache           ruleCache     = new RuleCache();
            List <SamplingRule> newRules      = new List <SamplingRule>();
            SamplingInput       samplingInput = new SamplingInput("elasticbeanstalk");
            SamplingRule        expectedRule  = GetSamplingRule("a", 1, 0.5, 10, serviceName: samplingInput.ServiceName);

            newRules.Add(expectedRule);
            ruleCache.LoadRules(newRules);
            TimeStamp current = TimeStamp.CurrentTime();

            ruleCache.LastUpdated = current;

            var actualRule = ruleCache.GetMatchedRule(samplingInput, current);

            Assert.IsTrue(actualRule.Equals(expectedRule));
        }
        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);
        }
        public void TestGetMatchedRuleForExpiredCache2() // Expired cache should not match rule.
        {
            RuleCache           ruleCache     = new RuleCache();
            List <SamplingRule> newRules      = new List <SamplingRule>();
            SamplingInput       samplingInput = new SamplingInput("elasticbeanstalk", "/api/1", "GET", "dynamo", "*");
            SamplingRule        expectedRule  = GetSamplingRule("a", 1, 0.5, 10, samplingInput.Host, samplingInput.ServiceName, samplingInput.Method, samplingInput.Url);

            newRules.Add(expectedRule);
            ruleCache.LoadRules(newRules);
            TimeStamp current = TimeStamp.CurrentTime();

            ruleCache.LastUpdated.Time = current.Time;
            current.Time += RuleCache.TTL + 1;

            var actualRule = ruleCache.GetMatchedRule(samplingInput, current); // cache is expired, though matching rule is present

            Assert.IsNull(actualRule);
        }
        public void TestGetMatchedRuleWithDefaultRule() // Matching with default Rule;
        {
            RuleCache           ruleCache     = new RuleCache();
            List <SamplingRule> newRules      = new List <SamplingRule>();
            SamplingInput       samplingInput = new SamplingInput("elasticbeanstalk", "/api/1", "GET", "dynamo", "*");
            SamplingRule        rule          = GetSamplingRule("a", 1, 0.5, 10, "j", "test", samplingInput.Method, samplingInput.Url);

            newRules.Add(rule);
            SamplingRule expectedRule = GetSamplingRule(SamplingRule.Default, 10000, 0.5, 1, "j", "*", "*", "*"); // should match to default rule

            newRules.Add(expectedRule);
            ruleCache.LoadRules(newRules);
            TimeStamp current = TimeStamp.CurrentTime();

            ruleCache.LastUpdated = current;

            var actualRule = ruleCache.GetMatchedRule(samplingInput, current);

            Assert.IsTrue(actualRule.Equals(expectedRule));
        }
        public void TestGetMatchedRuleWithDefaultRule2() // SamplingInput with only ServiceName - Matching with default Rule;
        {
            RuleCache           ruleCache     = new RuleCache();
            List <SamplingRule> newRules      = new List <SamplingRule>();
            SamplingInput       samplingInput = new SamplingInput("elasticbeanstalk");
            SamplingRule        rule          = GetSamplingRule("a", 1, 0.5, 10, serviceName: "XYZ");

            newRules.Add(rule);
            SamplingRule expectedRule = GetSamplingRule(SamplingRule.Default, 10000, 0.5, 1, "j", "*", "*", "*"); // should match to default rule

            newRules.Add(expectedRule);
            ruleCache.LoadRules(newRules);
            TimeStamp current = TimeStamp.CurrentTime();

            ruleCache.LastUpdated = current;

            var actualRule = ruleCache.GetMatchedRule(samplingInput, current);

            Assert.IsTrue(actualRule.Equals(expectedRule));
        }
        public void TestLoadRulesSort() // Test whether cache is sorted after LoadRules by priority and then by ruleName
        {
            RuleCache           ruleCache = new RuleCache();
            List <SamplingRule> newRules  = new List <SamplingRule>();
            SamplingRule        rule1     = GetSamplingRule("a", 2);
            SamplingRule        rule2     = GetSamplingRule("b", 1);
            SamplingRule        rule3     = GetSamplingRule("c", 3);
            SamplingRule        rule4     = GetSamplingRule("d", 3);

            newRules.Add(rule1);
            newRules.Add(rule2);
            newRules.Add(rule3);
            newRules.Add(rule4);
            ruleCache.LoadRules(newRules);

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

            Assert.AreEqual(4, rulesInCache.Count);
            Assert.AreEqual(rule2.RuleName, rulesInCache[0].RuleName);
            Assert.AreEqual(rule1.RuleName, rulesInCache[1].RuleName);
            Assert.AreEqual(rule3.RuleName, rulesInCache[2].RuleName);
            Assert.AreEqual(rule4.RuleName, rulesInCache[3].RuleName);
        }