def test_bad_trace_demos(self): """Ensure that bad demo traces produce errors.""" check = CheckNTPMon() # for d in demodata: # self.assertEqual(check.trace(d.split("\n")), 2, 'Demo data not detected as bad trace') for d in baddemotrace: self.assertEqual(check.trace(d.split("\n")), 2, 'Invalid trace not detected')
def test_NTPPeer1(self): # check the parsing done by NTPPeers ntp = NTPPeers(testdata[1].split("\n")) self.assertEqual(ntp.ntpdata['syncpeer'], '202.60.94.11') self.assertEqual(ntp.ntpdata['offsetsyncpeer'], 0.259) self.assertEqual(ntp.ntpdata['survivors'], 3) self.assertEqual(ntp.ntpdata['averageoffsetsurvivors'], 0.21133333333333335) self.assertEqual(ntp.ntpdata['discards'], 3) self.assertEqual(ntp.ntpdata['averageoffsetdiscards'], 1.024) self.assertEqual(ntp.ntpdata['peers'], 6) self.assertEqual(ntp.ntpdata['averageoffset'], 0.6176666666666667) self.assertEqual(ntp.ntpdata['reachability'], 100) # run checks on the data check = CheckNTPMon() self.assertEqual(check.sync(ntp.ntpdata['syncpeer']), 0, 'Sync peer not detected') self.assertEqual(check.offset(ntp.ntpdata['offsetsyncpeer']), 0, 'Low offset non-OK') self.assertEqual(check.offset(ntp.ntpdata['averageoffsetsurvivors']), 0, 'Low offset non-OK') self.assertEqual(check.offset(ntp.ntpdata['averageoffsetdiscards']), 0, 'Low offset non-OK') self.assertEqual(check.offset(ntp.ntpdata['averageoffset']), 0, 'Low offset non-OK') self.assertEqual(check.peers(ntp.ntpdata['peers']), 0, 'High peers non-OK') self.assertEqual(check.reachability(ntp.ntpdata['reachability']), 0, 'High reachability non-OK') # run overall health checks self.assertEqual(ntp.check_sync(), 0, 'Sync peer not detected') self.assertEqual(ntp.check_offset(), 0, 'Low offset non-OK') self.assertEqual(ntp.check_peers(), 0, 'High peers non-OK') self.assertEqual(ntp.check_reachability(), 0, 'High reachability non-OK')
def test_peers(self): check = CheckNTPMon() for i in [-100, -10, -1, 0, 1]: self.assertEqual(check.peers(i), 2, 'Low peers non-critical') for i in [2, 3]: self.assertEqual(check.peers(i), 1, 'Few peers non-warning') for i in [4, 5, 6, 10, 100]: self.assertEqual(check.peers(i), 0, 'High peers non-OK')
def test_clone(self): ch = CheckNTPMon() self.assertFalse(ch.is_silent()) c = CheckNTPMonSilent.clone(ch) self.assertTrue(c.is_silent()) self.assertEqual(c.warnpeers, 2) self.assertEqual(c.okpeers, 4) self.assertEqual(c.warnoffset, 10) self.assertEqual(c.critoffset, 50) self.assertEqual(c.warnreach, 75) self.assertEqual(c.critreach, 50)
def test_clone_non_default(self): ch = CheckNTPMon(1, 2, 9, 49, 80, 60) self.assertFalse(ch.is_silent()) c = CheckNTPMonSilent.clone(ch) self.assertTrue(c.is_silent()) self.assertEqual(c.warnpeers, 1) self.assertEqual(c.okpeers, 2) self.assertEqual(c.warnoffset, 9) self.assertEqual(c.critoffset, 49) self.assertEqual(c.warnreach, 80) self.assertEqual(c.critreach, 60)
def test_reach(self): check = CheckNTPMon() for i in [0, 0.01, 1, 25, 49, 49.99, 50]: self.assertEqual(check.reachability(i), 2, 'Low reachability non-critical') for i in [50.01, 50.1, 74.99, 75]: self.assertEqual(check.reachability(i), 1, 'Moderate reachability non-warning') for i in [75.01, 76, 99, 100]: self.assertEqual(check.reachability(i), 0, 'High reachability non-OK') # check that invalid percentage causes exception for i in [-100, -1, 100.01, 101, 1000]: self.assertRaises(ValueError, check.reachability, (i))
def test_NTPPeer2(self): # check the parsing done by NTPPeers ntp = NTPPeers(testdata[2].split("\n")) self.assertEqual(ntp.ntpdata['syncpeer'], '91.189.94.4') self.assertEqual(ntp.ntpdata['offsetsyncpeer'], 194.54) self.assertEqual(ntp.ntpdata['survivors'], 1) self.assertEqual(ntp.ntpdata['averageoffsetsurvivors'], 194.54) self.assertEqual(ntp.ntpdata['discards'], 0) self.assertEqual(ntp.ntpdata.get('averageoffsetdiscards'), None) self.assertEqual(ntp.ntpdata['peers'], 1) self.assertEqual(ntp.ntpdata['averageoffset'], 194.54) self.assertEqual(ntp.ntpdata['reachability'], 100) # run checks on the data check = CheckNTPMon() self.assertEqual(check.sync(ntp.ntpdata['syncpeer']), 0, 'Sync peer not detected') self.assertEqual(check.offset(ntp.ntpdata['offsetsyncpeer']), 2, 'High offset non-critical') self.assertEqual(check.offset(ntp.ntpdata['averageoffsetsurvivors']), 2, 'High offset non-critical') self.assertEqual(ntp.ntpdata.get('averageoffsetdiscards'), None) self.assertEqual(check.offset(ntp.ntpdata['averageoffset']), 2, 'High offset non-critical') self.assertEqual(check.peers(ntp.ntpdata['peers']), 2, 'Low peers non-critical') self.assertEqual(check.reachability(ntp.ntpdata['reachability']), 0, 'High reachability non-OK') # run overall health checks self.assertEqual(ntp.check_sync(), 0, 'Sync peer not detected') self.assertEqual(ntp.check_offset(), 2, 'High offset non-critical') self.assertEqual(ntp.check_peers(), 2, 'Low peers non-critical') self.assertEqual(ntp.check_reachability(), 0, 'High reachability non-OK')
def test_sync(self): check = CheckNTPMon() self.assertEqual(check.sync(''), 2, 'Invalid sync peer not detected') self.assertEqual(check.sync(' '), 2, 'Invalid sync peer not detected') self.assertEqual(check.sync('!@#$%^&*()'), 2, 'Invalid sync peer not detected') self.assertEqual(check.sync('blah.example.com'), 0, 'Sync peer not detected') self.assertEqual(check.sync('192.168.2.1'), 0, 'Sync peer not detected') self.assertEqual(check.sync('fe80::1'), 0, 'Sync peer not detected') self.assertEqual(check.sync('ds002.dedicated'), 0, 'Sync peer not detected') self.assertEqual(check.sync('node01.au.serve'), 0, 'Sync peer not detected')
def test_non_default(self): c = CheckNTPMon(1, 2, 9, 49, 80, 60) self.assertEqual(c.warnpeers, 1) self.assertEqual(c.okpeers, 2) self.assertEqual(c.warnoffset, 9) self.assertEqual(c.critoffset, 49) self.assertEqual(c.warnreach, 80) self.assertEqual(c.critreach, 60)
def test_defaults(self): c = CheckNTPMon() self.assertEqual(c.warnpeers, 2) self.assertEqual(c.okpeers, 4) self.assertEqual(c.warnoffset, 10) self.assertEqual(c.critoffset, 50) self.assertEqual(c.warnreach, 75) self.assertEqual(c.critreach, 50)
def test_NTPPeer4(self): # check the parsing done by NTPPeers ntp = NTPPeers(testdata[4].split("\n")) self.assertEqual(ntp.ntpdata.get('syncpeer'), None) self.assertEqual(ntp.ntpdata.get('offsetsyncpeer'), None) self.assertEqual(ntp.ntpdata['survivors'], 2) self.assertEqual(ntp.ntpdata.get('averageoffsetsurvivors'), 2.7969999999999997) self.assertEqual(ntp.ntpdata['discards'], 2) self.assertEqual(ntp.ntpdata['averageoffsetdiscards'], 14.9545) self.assertEqual(ntp.ntpdata['peers'], 4) self.assertEqual(ntp.ntpdata['averageoffset'], 8.87575) self.assertEqual(ntp.ntpdata['reachability'], 62.5) # run checks on the data check = CheckNTPMon() self.assertEqual(check.offset(ntp.ntpdata['averageoffsetdiscards']), 1, 'Discards offset non-warning') self.assertEqual(check.offset(ntp.ntpdata['averageoffset']), 0, 'Offset non-OK') self.assertEqual(check.peers(ntp.ntpdata['peers']), 0, 'Peers non-OK') self.assertEqual(check.reachability(ntp.ntpdata['reachability']), 1, 'Reachability non-warning') # run overall health checks self.assertEqual(ntp.check_sync(), 1, 'Missing sync peer non-warning') self.assertEqual(ntp.check_offset(), 0, 'Normal offset non-OK') self.assertEqual(ntp.check_peers(), 0, 'OK peer count non-OK') self.assertEqual(ntp.check_reachability(), 1, 'Low reachability non-critical')
def test_NTPPeer3(self): # check the parsing done by NTPPeers ntp = NTPPeers(testdata[3].split("\n")) self.assertEqual(ntp.ntpdata.get('syncpeer'), None) self.assertEqual(ntp.ntpdata.get('offsetsyncpeer'), None) self.assertEqual(ntp.ntpdata['survivors'], 0) self.assertEqual(ntp.ntpdata.get('averageoffsetsurvivors'), None) self.assertEqual(ntp.ntpdata['discards'], 1) self.assertEqual(ntp.ntpdata['averageoffsetdiscards'], 0.913) self.assertEqual(ntp.ntpdata['peers'], 1) self.assertEqual(ntp.ntpdata['averageoffset'], 0.913) self.assertEqual(ntp.ntpdata['reachability'], 37.5) # run checks on the data check = CheckNTPMon() self.assertEqual(check.offset(ntp.ntpdata['averageoffsetdiscards']), 0, 'Low offset non-OK') self.assertEqual(check.offset(ntp.ntpdata['averageoffset']), 0, 'Low offset non-OK') self.assertEqual(check.peers(ntp.ntpdata['peers']), 2, 'Low peers non-critical') self.assertEqual(check.reachability(ntp.ntpdata['reachability']), 2, 'Low reachability non-critical') # run overall health checks self.assertEqual(ntp.check_sync(), 2, 'Missing sync peer not detected') self.assertEqual(ntp.check_offset(), 1, 'Missing sync peer/survivor offset non-warning') self.assertEqual(ntp.check_peers(), 2, 'Low peers non-critical') self.assertEqual(ntp.check_reachability(), 2, 'Low reachability non-critical')
def test_offset(self): check = CheckNTPMon() for i in [50.01, 50.1, 51, 99, 100, 999]: self.assertEqual(check.offset(i), 2, 'High offset non-critical') self.assertEqual(check.offset(-i), 2, 'High offset non-critical') for i in [10.01, 10.1, 11, 49, 49.99, 50]: self.assertEqual(check.offset(i), 1, 'Moderate offset non-warning') self.assertEqual(check.offset(-i), 1, 'Moderate offset non-warning') for i in [0, 0.01, 1, 1.01, 9, 9.99, 10]: self.assertEqual(check.offset(i), 0, 'Low offset non-OK') self.assertEqual(check.offset(-i), 0, 'Low offset non-OK')
def test_bad_trace(self): check = CheckNTPMon() self.assertEqual(check.trace(''), 1, 'Invalid trace not detected') self.assertEqual(check.trace(' '), 1, 'Invalid trace not detected') self.assertEqual(check.trace('!@#$%^&*()'), 1, 'Invalid trace not detected') self.assertEqual(check.trace('blah.example.com'), 1, 'Invalid trace not detected')
def test_trace_demos(self): """Ensure that demo traces are parsed successfully and don't produce exceptions or unknown results.""" for d in demotrace: check = CheckNTPMon() self.assertEqual(check.trace(d.split("\n")), 0, 'Error parsing demo trace data')
"""Duplicate of test_demos which shows full output""" i = 0 for d in demodata: print("Parsing demo data %d: %s" % (i, d)) ntp = NTPPeers(d.split("\n")) i += 1 ntp.dump() methods = [ntp.check_offset, ntp.check_peers, ntp.check_reachability, ntp.check_sync, ntp.checks] for method in methods: ret = method() if ret not in [0, 1, 2]: print("Method %s returned invalid result parsing demo data:\n%s" % (method, d)) sys.exit(3) if __name__ == "__main__": # object to store parsed arguments test_checkntpmon = CheckNTPMon() # parse command line parser = argparse.ArgumentParser(description='NTPmon test class') parser.add_argument('--show-demos', action='store_true', help='Show demo output.') args = parser.parse_args(namespace=test_checkntpmon) if test_checkntpmon.show_demos: demo() else: unittest.main()