Beispiel #1
0
        /// <summary>
        /// A constructor
        /// </summary>
        /// <param name="handler">A handler to be called when resources are updated</param>
        /// <param name="resources">A set of resources to be monitored</param>
        public ResourceMonitoringData(ResourceUpdatedHandler handler, IList <IResource> resources)
        {
            OnSomeOfTrackedResourcesUpdated = Code.ExpectsArgument(handler, nameof(handler), TaggingUtilities.ReserveTag(0x238208c4 /* tag_9669e */));
            m_trackedResources = Code.ExpectsArgument(resources, nameof(resources), TaggingUtilities.ReserveTag(0x238208c5 /* tag_9669f */));

            m_wasCalledAtLeastOnce = false;
        }
Beispiel #2
0
        /// <summary>
        /// Start monitoring the resources.
        /// </summary>
        /// <param name="resourcesToMonitor">The resources to be monitored.</param>
        /// <param name="callbackAction">Handler to call when any of the resources is uptdated</param>
        /// <returns><c>true</c> if the operation succeeded; <c>false</c> otherwise.</returns>
        public bool TryStartMonitoring(IEnumerable <IResource> resourcesToMonitor, ResourceUpdatedHandler callbackAction)
        {
            if (!Code.ValidateArgument(resourcesToMonitor, nameof(resourcesToMonitor), TaggingUtilities.ReserveTag(0x238208c9 /* tag_9669j */)) ||
                !Code.ValidateArgument(callbackAction, nameof(callbackAction), TaggingUtilities.ReserveTag(0x238208ca /* tag_9669k */)))
            {
                return(false);
            }

            IList <IResource>      resources      = resourcesToMonitor.ToList();
            ResourceMonitoringData monitoringData = new ResourceMonitoringData(callbackAction, resources);

            if (!TryPerformInitialLoad(resources, monitoringData))
            {
                return(false);
            }

            if (!m_resourceMonitoringData.TryAdd(callbackAction, monitoringData))
            {
                return(false);
            }

            foreach (IResource resource in resources)
            {
                if (!resource.IsStatic)
                {
                    m_monitoredResources.TryAdd(resource, true);
                }
            }

            StartExclusiveAction();

            return(true);
        }
Beispiel #3
0
 /// <summary>
 /// Stop monitoring the resources.
 /// </summary>
 public void StopMonitoring(ResourceUpdatedHandler callback)
 {
     if (!m_resourceMonitoringData.TryRemove(callback, out ResourceMonitoringData monitoringInstance))
     {
         ULSLogging.LogTraceTag(0x238208cb /* tag_9669l */, Categories.ConfigurationDataSet, Levels.Verbose,
                                "An attempt to remove a non-existing handler");
     }
 }
        public void ResourceMonitor_WhenResourceMonitoredByMultipleParties_CorrectCallbacksAreCalled()
        {
            using (UnitTestFileResourceMonitor monitor = new UnitTestFileResourceMonitor())
            {
                UnitTestTextFile file1     = new UnitTestTextFile(true, true, "contents1");
                FileResource     resource1 = new FileResource(file1, "folder", "name1");
                UnitTestTextFile file2     = new UnitTestTextFile(true, true, "contents2");
                FileResource     resource2 = new FileResource(file2, "folder", "name2");

                bool handlerCalled1              = false;
                bool handlerCalled12             = false;
                bool handlerCalled2              = false;
                ResourceUpdatedHandler handler1  = eventArgs => { handlerCalled1 = true; };
                ResourceUpdatedHandler handler12 = eventArgs => { handlerCalled12 = true; };
                ResourceUpdatedHandler handler2  = eventArgs => { handlerCalled2 = true; };

                Assert.True(monitor.TryStartMonitoring(new[] { resource1 }, handler1));
                Assert.True(monitor.TryStartMonitoring(new[] { resource1, resource2 }, handler12));
                Assert.True(monitor.TryStartMonitoring(new[] { resource2 }, handler2));
                DateTime monitoringStartMoment = DateTime.UtcNow;
                while (!handlerCalled1 || !handlerCalled2 || !handlerCalled12)
                {
                    if (DateTime.UtcNow >= monitoringStartMoment + m_monitoringMaxTime)
                    {
                        break;
                    }
                }

                Assert.True(handlerCalled1 && handlerCalled2 && handlerCalled12);
                handlerCalled1  = false;
                handlerCalled12 = false;
                handlerCalled2  = false;

                monitoringStartMoment = DateTime.UtcNow;
                file1.WriteAllBytes("", new byte[] { 1 });
                while (!handlerCalled1 || !handlerCalled12)
                {
                    if (DateTime.UtcNow >= monitoringStartMoment + m_monitoringMaxTime)
                    {
                        break;
                    }
                }

                Assert.True(handlerCalled1);
                Assert.True(handlerCalled12);
                Assert.False(handlerCalled2);
            }
        }
Beispiel #5
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="cache">The cache object.</param>
 /// <param name="resourceMonitor">Resource Monitor instance</param>
 /// <param name="dataSetOverride">The data set override.</param>
 /// <param name="resourceUpdatedHandler">Handler to be called when the resource is updates</param>
 public UnitTestConfigurationDataSetLoader(ICache cache, IResourceMonitor resourceMonitor, TConfigurationDataSet dataSetOverride = null, ResourceUpdatedHandler resourceUpdatedHandler = null)
     : base(cache, resourceMonitor, dataSetOverride) => m_resourceUpdatedHandler = resourceUpdatedHandler;