Skip to content

Commit 7a24b88

Browse files
authored
chore: add get_percentage_remaining_ttl helper to DNSRecord (#1343)
1 parent 6f23656 commit 7a24b88

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

src/zeroconf/_dns.pxd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ cdef class DNSRecord(DNSEntry):
5454

5555
cpdef get_remaining_ttl(self, double now)
5656

57+
cpdef unsigned int get_percentage_remaining_ttl(self, double now)
58+
5759
cpdef double get_expiration_time(self, cython.uint percent)
5860

5961
cpdef bint is_expired(self, double now)

src/zeroconf/_dns.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,11 @@ def get_expiration_time(self, percent: _int) -> float:
193193
by a certain percentage."""
194194
return self.created + (percent * self.ttl * 10)
195195

196+
def get_percentage_remaining_ttl(self, now: _float) -> _int:
197+
"""Returns the percentage remaining of the ttl between 0-100."""
198+
remain = (self.created + (_EXPIRE_FULL_TIME_MS * self.ttl) - now) / self.ttl / 10
199+
return 0 if remain <= 0 else round(remain)
200+
196201
# TODO: Switch to just int here
197202
def get_remaining_ttl(self, now: _float) -> Union[int, float]:
198203
"""Returns the remaining TTL in seconds."""

tests/test_dns.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import logging
77
import os
88
import socket
9-
import time
109
import unittest
1110
import unittest.mock
1211

@@ -86,19 +85,32 @@ def test_dns_record_abc(self):
8685
record.write(None) # type: ignore[arg-type]
8786

8887
def test_dns_record_reset_ttl(self):
89-
record = r.DNSRecord('irrelevant', const._TYPE_SRV, const._CLASS_IN, const._DNS_HOST_TTL)
90-
time.sleep(1)
91-
record2 = r.DNSRecord('irrelevant', const._TYPE_SRV, const._CLASS_IN, const._DNS_HOST_TTL)
88+
start = r.current_time_millis()
89+
record = r.DNSRecord(
90+
'irrelevant', const._TYPE_SRV, const._CLASS_IN, const._DNS_HOST_TTL, created=start
91+
)
92+
later = start + 1000
93+
record2 = r.DNSRecord(
94+
'irrelevant', const._TYPE_SRV, const._CLASS_IN, const._DNS_HOST_TTL, created=later
95+
)
9296
now = r.current_time_millis()
9397

9498
assert record.created != record2.created
9599
assert record.get_remaining_ttl(now) != record2.get_remaining_ttl(now)
100+
assert record.get_percentage_remaining_ttl(now) != record2.get_percentage_remaining_ttl(now)
101+
assert record2.get_percentage_remaining_ttl(later) == 100
102+
assert record2.get_percentage_remaining_ttl(later + (const._DNS_HOST_TTL * 1000 / 2)) == 50
96103

97104
record.reset_ttl(record2)
98105

99106
assert record.ttl == record2.ttl
100107
assert record.created == record2.created
101108
assert record.get_remaining_ttl(now) == record2.get_remaining_ttl(now)
109+
assert record.get_percentage_remaining_ttl(now) == record2.get_percentage_remaining_ttl(now)
110+
assert record.get_percentage_remaining_ttl(later) == 100
111+
assert record2.get_percentage_remaining_ttl(later) == 100
112+
assert record.get_percentage_remaining_ttl(later + (const._DNS_HOST_TTL * 1000 / 2)) == 50
113+
assert record2.get_percentage_remaining_ttl(later + (const._DNS_HOST_TTL * 1000 / 2)) == 50
102114

103115
def test_service_info_dunder(self):
104116
type_ = "_test-srvc-type._tcp.local."

0 commit comments

Comments
 (0)