Esempio n. 1
0
        public void Raise_error_for_non_existing_file()
        {
            var    logger = Substitute.For <ILogEvents>();
            string file   = "does_not_exists";

            TFSAggregatorSettings.LoadFromFile(file, logger);
        }
        /// <summary>
        /// Return a proper context
        /// </summary>
        /// <returns></returns>
        public static RuntimeContext GetContext(Func <string> settingsPathGetter, IRequestContext requestContext, ILogEvents logger)
        {
            var runtime = (RuntimeContext)Cache.Get(CacheKey);

            if (runtime == null)
            {
                string settingsPath = settingsPathGetter();
                var    settings     = TFSAggregatorSettings.LoadFromFile(settingsPath, logger);
                runtime = MakeRuntimeContext(settingsPath, settings, requestContext, logger);

                var itemPolicy = new CacheItemPolicy();
                itemPolicy.Priority = CacheItemPriority.NotRemovable;
                itemPolicy.ChangeMonitors.Add(new HostFileChangeMonitor(new List <string>()
                {
                    settingsPath
                }));

                Cache.Set(CacheKey, runtime, itemPolicy);
            }
            else
            {
                runtime.RequestContext = requestContext;
            }

            return(runtime.Clone() as RuntimeContext);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="EventProcessor"/> class.
        /// </summary>
        public EventProcessor(IWorkItemRepository workItemStore, IRuntimeContext runtime)
        {
            this.logger   = runtime.Logger;
            this.store    = workItemStore;
            this.settings = runtime.Settings;

            this.engine = runtime.GetEngine(workItemStore);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="EventProcessor"/> class.
        /// </summary>
        public EventProcessor(IRuntimeContext runtime)
        {
            this.logger   = runtime.Logger;
            this.settings = runtime.Settings;
            this.limiter  = runtime.RateLimiter;

            this.store  = runtime.WorkItemRepository;
            this.engine = runtime.GetEngine();
        }
        public static RuntimeContext MakeRuntimeContext(string settingsPath, TFSAggregatorSettings settings, IRequestContext requestContext, ILogEvents logger)
        {
            var runtime = new RuntimeContext();

            runtime.Logger         = logger;
            runtime.RequestContext = requestContext;
            runtime.SettingsPath   = settingsPath;
            runtime.Settings       = settings;
            logger.MinimumLogLevel = runtime.Settings.LogLevel;

            runtime.HasErrors = false;
            return(runtime);
        }
Esempio n. 6
0
        public void Log_error_for_configuration_invalid_loglevel()
        {
            var    logger = Substitute.For <ILogEvents>();
            string config = @"<AggregatorConfiguration><runtime><logging level='Diag'/></runtime></AggregatorConfiguration>";

            var settings = TFSAggregatorSettings.LoadXml(config, logger);

            Assert.IsNull(settings);
            logger.Received().InvalidConfiguration(
                XmlSeverityType.Error,
                "The 'level' attribute is invalid - The value 'Diag' is invalid according to its datatype 'String' - The Enumeration constraint failed.",
                1, 44);
        }
Esempio n. 7
0
        public void Log_warning_for_unused_rule()
        {
            var    logger = Substitute.For <ILogEvents>();
            string config = @"
<AggregatorConfiguration>
    <rule name='r1'/>
    <rule name='r2'/>
    <policy name='p1'>
        <ruleRef name='r2'/>
    </policy>   
</AggregatorConfiguration>";

            var settings = TFSAggregatorSettings.LoadXml(config, logger);

            Assert.IsNotNull(settings);
            logger.Received().UnreferencedRule("r1");
        }
        /// <summary>
        /// Return a proper context
        /// </summary>
        /// <returns></returns>
        public static RuntimeContext GetContext(
            Func <string> settingsPathGetter,
            IRequestContext requestContext,
            ILogEvents logger,
            Func <IRuntimeContext, IWorkItemRepository> repoBuilder,
            Func <IRuntimeContext, IScriptLibrary> scriptLibraryBuilder)
        {
            string settingsPath = settingsPathGetter();
            string cacheKey     = CacheKey + settingsPath;
            var    runtime      = (RuntimeContext)Cache.Get(cacheKey);

            if (runtime == null)
            {
                logger.HelloWorld();

                logger.LoadingConfiguration(settingsPath);

                var settings = TFSAggregatorSettings.LoadFromFile(settingsPath, logger);
                runtime = MakeRuntimeContext(settingsPath, settings, requestContext, logger, repoBuilder, scriptLibraryBuilder);

                if (!runtime.HasErrors)
                {
                    var itemPolicy = new CacheItemPolicy();
                    itemPolicy.Priority = CacheItemPriority.NotRemovable;
                    itemPolicy.ChangeMonitors.Add(new HostFileChangeMonitor(new List <string>()
                    {
                        settingsPath
                    }));

                    Cache.Set(cacheKey, runtime, itemPolicy);
                }

                logger.ConfigurationLoaded(settingsPath);
            }
            else
            {
                logger.UsingCachedConfiguration(settingsPath);
            }

            runtime = runtime.Clone() as RuntimeContext;

            // as it changes at each invocation, must be set again here
            runtime.RequestContext     = requestContext;
            runtime.workItemRepository = null;
            return(runtime);
        }
Esempio n. 9
0
        public void Log_error_for_policy_with_no_rules()
        {
            var    logger = Substitute.For <ILogEvents>();
            string config = @"
<AggregatorConfiguration>
    <rule name='r1'/>
    <policy name='p1'/>
</AggregatorConfiguration>";

            var settings = TFSAggregatorSettings.LoadXml(config, logger);

            Assert.IsNull(settings);
            logger.Received().InvalidConfiguration(
                XmlSeverityType.Error,
                "The element 'policy' has incomplete content. List of possible elements expected: 'collectionScope, templateScope, projectScope, ruleRef'.",
                4, 6);
        }
Esempio n. 10
0
        public void Log_error_for_mismatched_rule_name()
        {
            var    logger = Substitute.For <ILogEvents>();
            string config = @"
<AggregatorConfiguration>
    <rule name='r1'/>
    <policy name='p1'>
        <ruleRef name='r2'/>
    </policy>   
</AggregatorConfiguration>";

            var settings = TFSAggregatorSettings.LoadXml(config, logger);

            Assert.IsNull(settings);
            logger.Received().InvalidConfiguration(
                XmlSeverityType.Error,
                "Reference to undeclared ID is 'r2'.",
                5, 18);
        }
Esempio n. 11
0
        public void Policy_ServerBaseUrl_succeed()
        {
            var logger = Substitute.For <ILogEvents>();

            string config = @"
<AggregatorConfiguration>
    <runtime>
        <server baseUrl = ""http://tfs.example.local:8080/"" />
    </runtime>
    <rule name='dummy' />
    <policy name='dummy' >
        <ruleRef name='dummy' />
    </policy>
</AggregatorConfiguration>";

            var settings = TFSAggregatorSettings.LoadXml(config, logger);

            Assert.AreEqual(settings.ServerBaseUrl, new Uri("http://tfs.example.local:8080/"));
        }
Esempio n. 12
0
        public void LoadsGivenrateLimitsWhenInteralAttributeIsPresent()
        {
            var logger = Substitute.For <ILogEvents>();

            string config = @"
<AggregatorConfiguration>
    <runtime>
        <rateLimiting interval=""01:00:00.0"" />
    </runtime>
    <rule name='dummy' />
    <policy name='dummy' >
        <ruleRef name='dummy' />
    </policy>
</AggregatorConfiguration>";

            var settings = TFSAggregatorSettings.LoadXml(config, logger);

            Assert.AreEqual(settings.RateLimit?.Interval, TimeSpan.FromHours(1));
        }
Esempio n. 13
0
        public void LoadsGivenrateLimitsWhenChangesAttributesIsPresent()
        {
            var logger = Substitute.For <ILogEvents>();

            string config = @"
<AggregatorConfiguration>
    <runtime>
        <rateLimiting changes=""100"" />
    </runtime>
    <rule name='dummy' />
    <policy name='dummy' >
        <ruleRef name='dummy' />
    </policy>
</AggregatorConfiguration>";

            var settings = TFSAggregatorSettings.LoadXml(config, logger);

            Assert.AreEqual(settings.RateLimit?.Changes, 100);
        }
Esempio n. 14
0
        public static RuntimeContext MakeRuntimeContext(
            string settingsPath,
            TFSAggregatorSettings settings,
            IRequestContext requestContext,
            ILogEvents logger,
            Func <Uri, Microsoft.TeamFoundation.Framework.Client.IdentityDescriptor, IRuntimeContext, IWorkItemRepository> repoBuilder)
        {
            var runtime = new RuntimeContext();

            runtime.Logger         = logger;
            runtime.RequestContext = requestContext;
            runtime.SettingsPath   = settingsPath;
            runtime.Settings       = settings;
            runtime.RateLimiter    = new RateLimiter(runtime);
            logger.MinimumLogLevel = runtime.Settings?.LogLevel ?? LogLevel.Normal;
            runtime.repoBuilder    = repoBuilder;

            runtime.HasErrors = settings == null;
            return(runtime);
        }
        public static RuntimeContext MakeRuntimeContext(
            string settingsPath,
            TFSAggregatorSettings settings,
            IRequestContext requestContext,
            ILogEvents logger,
            Func <IRuntimeContext, IWorkItemRepository> repoBuilder,
            Func <IRuntimeContext, IScriptLibrary> scriptLibraryBuilder)
        {
            var runtime = new RuntimeContext();

            runtime.Logger               = logger;
            runtime.RequestContext       = requestContext;
            runtime.SettingsPath         = settingsPath;
            runtime.Settings             = settings;
            runtime.RateLimiter          = new RateLimiter(runtime);
            logger.MinimumLogLevel       = runtime.Settings?.LogLevel ?? LogLevel.Normal;
            runtime.repoBuilder          = repoBuilder;
            runtime.scriptLibraryBuilder = scriptLibraryBuilder;

            runtime.HasErrors = settings == null;
            return(runtime);
        }
Esempio n. 16
0
        public void LoadDefaultRateLimitsWhenTagIsPresentButEmpty()
        {
            var logger = Substitute.For <ILogEvents>();

            string config = @"
<AggregatorConfiguration>
    <runtime>
        <rateLimiting />
    </runtime>
    <rule name='dummy' />
    <policy name='dummy' >
        <ruleRef name='dummy' />
    </policy>
</AggregatorConfiguration>";

            var settings = TFSAggregatorSettings.LoadXml(config, logger);

            Assert.IsNotNull(settings);

            Assert.IsNotNull(settings.RateLimit);
            Assert.AreEqual(settings.RateLimit?.Interval, TimeSpan.FromSeconds(1));
            Assert.AreEqual(settings.RateLimit?.Changes, 5);
        }
Esempio n. 17
0
        public static TFSAggregatorSettings LoadConfigFromResourceFile(string fileName, ILogEvents logger)
        {
            var configXml = LoadTextFromEmbeddedResource(fileName);

            return(TFSAggregatorSettings.LoadXml(configXml, logger));
        }