예제 #1
0
        public void TestVolatileSetAddExpired()
        {
            var clock = new MemoryClock();
            var set = new VolatileSet<int>(clock);

            set.Add(0, TimeSpan.FromSeconds(100));

            clock.UtcNow += TimeSpan.FromSeconds(101);

            set.Add(0, TimeSpan.FromSeconds(10)).Should().BeTrue("Adding for an expired entry should return true (as if the entry was missing)");
        }
예제 #2
0
        public void TestVolatileSet()
        {
            var clock = new MemoryClock();
            var set = new VolatileSet<int>(clock);

            set.Add(0, TimeSpan.FromSeconds(100));
            set.Add(1, TimeSpan.FromSeconds(10));

            set.Contains(1).Should().BeTrue();

            // Increment time to invalidate item
            clock.UtcNow += TimeSpan.FromSeconds(11);

            // Item 1 should be invalidated, but 0 should remain
            set.Contains(1).Should().BeFalse();
            set.Contains(0).Should().BeTrue();

            // Explicitly invalidating item should remove it
            set.Invalidate(0);
            set.Contains(0).Should().BeFalse();

            set = new VolatileSet<int>(clock);

            set.Add(1, TimeSpan.FromSeconds(10));
            set.Add(2, TimeSpan.FromSeconds(20));
            set.Add(3, TimeSpan.FromSeconds(30));
            set.Add(4, TimeSpan.FromSeconds(40));
            set.Add(5, TimeSpan.FromSeconds(50));

            clock.UtcNow += TimeSpan.FromSeconds(25);

            // Should only be able to remove items 1 and 2 since they have expired
            set.CleanStaleItems(20).Should().Be(2);

            set.Contains(1).Should().BeFalse();
            set.Contains(2).Should().BeFalse();
            set.Contains(3).Should().BeTrue();
            set.Contains(4).Should().BeTrue();
            set.Contains(5).Should().BeTrue();

            // Move time past original timeout for 3 but add with 20 seconds from current time
            // 3 should be retained
            set.Add(3, TimeSpan.FromSeconds(20));
            clock.UtcNow += TimeSpan.FromSeconds(10);
            set.Contains(3).Should().BeTrue();
        }
예제 #3
0
        public async Task EmitIncidentAsync(IcmIncident incident)
        {
            if (incident.CacheTimeToLive is not null)
            {
                if (_cachedIcms.Contains(incident.Title))
                {
                    // Update TTL and return.
                    _cachedIcms.Add(incident.Title, incident.CacheTimeToLive.Value);
                    return;
                }
                else
                {
                    // Add to cached incidents.
                    _cachedIcms.Add(incident.Title, incident.CacheTimeToLive.Value);
                }
            }

            var cert = await _keyVault.GetCertificateAsync(_connectorCertificateName);

            var incidentToSend = GetIncidentToSend(incident);

            using var client = ConnectorClientFactory.CreateClient(_uri, cert);
            try
            {
                var result = client.AddOrUpdateIncident2(_connectorId, incidentToSend, RoutingOptions.None);
                if (result.Status != IncidentAddUpdateStatus.AddedNew &&
                    // Discarded means that we're updating hit count or it was suppressed because it's too soon
                    // since we updated hit count last and the incident is still active.
                    result.Status != IncidentAddUpdateStatus.Discarded)
                {
                    throw new Exception($"Result status does not indicate success: {result.Status}.");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Failed to submit incident to IcM:\n" + e.ToString());
                throw;
            }
        }
예제 #4
0
        public void TestVolatileWithShortHashSet()
        {
            var clock = new MemoryClock();
            var set   = new VolatileSet <ShortHash>(clock);

            for (int i = 0; i < 500_000; i++)
            {
                var hash      = ContentHash.Random(HashType.Vso0);
                var shortHash = new ShortHash(hash);

                set.Add(shortHash, TimeSpan.FromMinutes(30));
                set.Contains(shortHash).Should().BeTrue();
            }
        }