public async Task Cache_EntriesLowestTT_Expires() { var cache = new ResponseCache(); var record = new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 1000, 100)); var recordB = new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 100, 100)); var recordC = new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 1, 100)); var response = new DnsResponseMessage(new DnsResponseHeader(1, 256, 1, 1, 0, 0), 0) { Audit = new LookupClientAudit() }; response.AddAnswer(record); response.AddAdditional(recordB); response.AddAuthority(recordC); cache.Add("key", response.AsQueryResponse(new NameServer(IPAddress.Any))); await Task.Delay(200); var item = cache.Get("key", out var effectiveTtl); Assert.NotNull(item); Assert.Equal(1 * 1000, effectiveTtl); await Task.Delay(1100); var item3 = cache.Get("key", out _); Assert.Null(item3); }
public void Add_KeyIsNotNullValueIsNull_AddsNullValue() { ResponseCache.Clear(); ResponseCache.Add("test", null); var item = ResponseCache.Get("test"); Assert.That(string.IsNullOrEmpty(item), Is.True); }
public void Add_KeyIsNotNullValueIsNotNull_AddsNonNullValue() { ResponseCache.Clear(); ResponseCache.Add("test", "value"); var item = ResponseCache.Get("test"); Assert.That(item, Is.EqualTo("value")); }
public void Cache_GetOrAddExists() { var cache = new ResponseCache(); var record = new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 100, 100)); var response = new DnsResponseMessage(new DnsResponseHeader(1, 256, 1, 1, 0, 0), 0) { Audit = new LookupClientAudit() }; response.AddAnswer(record); var success = cache.Add("key", response.AsQueryResponse(new NameServer(IPAddress.Any))); Assert.True(success); response.AddAnswer(new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 100, 100))); var fail = cache.Add("key", response.AsQueryResponse(new NameServer(IPAddress.Any))); Assert.False(fail); }
public void Cache_DoesNotCacheFailureIfDisabled() { var cache = new ResponseCache(true); var failureStatus = DnsResponseCode.NotExistentDomain; var response = new DnsResponseMessage(new DnsResponseHeader(1, (ushort)failureStatus, 0, 0, 0, 0), 0); cache.Add("key", response.AsQueryResponse(new NameServer(IPAddress.Any), null)); var item = cache.Get("key", out _); // Should be null because cache does not accept failure responses by default. Assert.Null(item); }
public void TestAddNewCacheableResponse() { _mockResponse.Setup(m => m.Ttl).Returns(50); _sut.Add(_mockCommand.Object, _mockResponse.Object); var result = _sut.Get(_mockCommand.Object.GetType()); Assert.That(_sut.HasValidResponse(_mockCommand.Object.GetType()), Is.True); Assert.That(result, Is.Not.Null); Assert.That(result, Is.EqualTo(_mockResponse.Object)); }
public void Cache_DoesNotCacheIfZeroTTL() { var cache = new ResponseCache(); var record = new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 0, 100)); var response = new DnsResponseMessage(new DnsResponseHeader(1, 256, 1, 1, 0, 0), 0) { Audit = new LookupClientAudit() }; response.AddAnswer(record); cache.Add("key", response.AsQueryResponse(new NameServer(IPAddress.Any))); var item = cache.Get("key", out var effectiveTtl); // should be null because ttl of the record is 0 which disables caching for this record Assert.Null(item); Assert.Null(effectiveTtl); }
public void Cache_DoesNotCacheIfDisabled() { var cache = new ResponseCache(false); var record = new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 100, 100)); var response = new DnsResponseMessage(new DnsResponseHeader(1, 256, 1, 1, 0, 0), 0) { Audit = new LookupClientAudit() }; response.AddAnswer(record); cache.Add("key", response.AsQueryResponse(new NameServer(IPAddress.Any))); var item = cache.Get("key", out var effectiveTtl); // should be null because cache is disabled and we create null in the second call of GetOrAdd Assert.Null(item); Assert.Null(effectiveTtl); }
public void Cache_SupportsInfinite() { var cache = new ResponseCache(true, Timeout.InfiniteTimeSpan); var record = new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 0, 100)); var response = new DnsResponseMessage(new DnsResponseHeader(1, 256, 1, 1, 0, 0), 0) { Audit = new LookupClientAudit() }; response.AddAnswer(record); cache.Add("key", response.AsQueryResponse(new NameServer(IPAddress.Any))); var item = cache.Get("key", out var effectiveTtl); // should not be null although TTL is zero, mimimum timeout is set to infinite Assert.Equal(item, response.AsQueryResponse(new NameServer(IPAddress.Any))); Assert.Equal(int.MaxValue, effectiveTtl); }
public void Cache_EntriesLowestTTLWins() { var cache = new ResponseCache(); var record = new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 1000, 100)); var recordB = new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 100, 100)); var recordC = new EmptyRecord(new ResourceRecord(DnsString.Parse("a"), ARecord.ResourceRecordType, QueryClass.In, 0, 100)); var response = new DnsResponseMessage(new DnsResponseHeader(1, 256, 1, 1, 0, 0), 0) { Audit = new LookupClientAudit() }; response.AddAnswer(record); response.AddAdditional(recordB); response.AddAuthority(recordC); cache.Add("key", response.AsQueryResponse(new NameServer(IPAddress.Any))); var item = cache.Get("key", out var effectiveTtl); // should be null because recordC has zero TTL which wins Assert.Null(item); Assert.Null(effectiveTtl); }
public void Add_KeyIsNull_ThrowsArgumentNullException() { Assert.Throws(typeof(ArgumentNullException), () => ResponseCache.Add(null, null)); }