diff options
author | Douglas Bagnall <douglas.bagnall@catalyst.net.nz> | 2021-03-27 09:09:56 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2021-03-29 23:20:37 +0000 |
commit | 146c23fb7d98515c4dd0349d0406b7f459d3b696 (patch) | |
tree | 7c6ae847d9423a47300db6f185c509eff06ebe6d /python | |
parent | 2b9279bd31dfb13209d828dd57f92beb67ba2f71 (diff) | |
download | samba-146c23fb7d98515c4dd0349d0406b7f459d3b696.tar.gz |
pydns: expose dns timestamp utils to python, and test
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'python')
-rw-r--r-- | python/samba/tests/dsdb_dns.py | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/python/samba/tests/dsdb_dns.py b/python/samba/tests/dsdb_dns.py new file mode 100644 index 00000000000..8c7fc343278 --- /dev/null +++ b/python/samba/tests/dsdb_dns.py @@ -0,0 +1,86 @@ +# Unix SMB/CIFS implementation. Tests for dsdb_dns module +# Copyright © Catalyst IT 2021 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +from samba.tests import TestCase +from samba import dsdb_dns +import time + + +def unix2nttime(t): + # here we reimplement unix_to_nt_time from lib/util/time.c + if t == -1: + return t + if t == (1 << 63) - 1: + return (1 << 63) - 1 + if t == 0: + return 0 + t += 11644473600 + t *= 1e7 + return int(t) + + +def unix2dns_timestamp(t): + nt = unix2nttime(t) + if nt < 0: + # because NTTIME is a uint64_t. + nt += 1 << 64 + return nt // int(3.6e10) + + +def timestamp2nttime(ts): + nt = ts * int(3.6e10) + if nt >= 1 << 63: + raise OverflowError("nt time won't fit this") + return nt + + +class DsdbDnsTestCase(TestCase): + def test_unix_to_dns_timestamp(self): + unixtimes = [1616829393, + 1, + 0, + -1, + 1 << 31 - 1] + + for t in unixtimes: + expected = unix2dns_timestamp(t) + result = dsdb_dns.unix_to_dns_timestamp(t) + self.assertEqual(result, expected) + + def test_dns_timestamp_to_nt_time(self): + timestamps = [16168393, + 1, + 0, + (1 << 32) - 1, + (1 << 63) - 1, + int((1 << 63) / 3.6e10), + int((1 << 63) / 3.6e10) + 1, # overflows + ] + + for t in timestamps: + overflows = False + try: + expected = timestamp2nttime(t) + except OverflowError: + overflows = True + try: + result = dsdb_dns.dns_timestamp_to_nt_time(t) + except ValueError: + self.assertTrue(overflows, f"timestamp {t} should not overflow") + continue + self.assertFalse(overflows, f"timestamp {t} should overflow") + + self.assertEqual(result, expected) |