|
@@ -0,0 +1,86 @@
|
|
|
+import os
|
|
|
+import re
|
|
|
+import time
|
|
|
+
|
|
|
+import infra.basetest
|
|
|
+
|
|
|
+
|
|
|
+class TestNtp(infra.basetest.BRTest):
|
|
|
+ rootfs_overlay = \
|
|
|
+ infra.filepath("tests/package/test_ntp/rootfs-overlay")
|
|
|
+ config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \
|
|
|
+ f"""
|
|
|
+ BR2_PACKAGE_NTP=y
|
|
|
+ BR2_PACKAGE_NTP_NTPD=y
|
|
|
+ BR2_PACKAGE_NTP_NTPQ=y
|
|
|
+ BR2_ROOTFS_OVERLAY="{rootfs_overlay}"
|
|
|
+ BR2_TARGET_ROOTFS_CPIO=y
|
|
|
+ # BR2_TARGET_ROOTFS_TAR is not set
|
|
|
+ """
|
|
|
+
|
|
|
+ def dict_from_ntpq_output(self, output):
|
|
|
+ d = {}
|
|
|
+ for line in output:
|
|
|
+ if ':' not in line:
|
|
|
+ continue
|
|
|
+ fields = re.split(r":", line, maxsplit=2)
|
|
|
+ name = fields[0].strip()
|
|
|
+ value = fields[1].strip()
|
|
|
+ d[name] = value
|
|
|
+ return d
|
|
|
+
|
|
|
+ def test_run(self):
|
|
|
+ cpio_file = os.path.join(self.builddir, "images", "rootfs.cpio")
|
|
|
+ self.emulator.boot(arch="armv5",
|
|
|
+ kernel="builtin",
|
|
|
+ options=["-initrd", cpio_file])
|
|
|
+ self.emulator.login()
|
|
|
+
|
|
|
+ # Check our binaries can execute.
|
|
|
+ self.assertRunOk("ntpd --version")
|
|
|
+ self.assertRunOk("ntpq --version")
|
|
|
+
|
|
|
+ # The ntp daemon is expected to be started from init startup
|
|
|
+ # scripts, for the Buildroot package recipe. We wait a bit
|
|
|
+ # here to let the daemon settle. The next test step checks for
|
|
|
+ # the local peer to be the system peer (by checking the
|
|
|
+ # '*'). If querying the peers too soon after startup the peer
|
|
|
+ # will not be marked as such.
|
|
|
+ time.sleep(3 * self.timeout_multiplier)
|
|
|
+
|
|
|
+ # We query the ntp daemon peers. From our test configuration
|
|
|
+ # file, we should have exactly one.
|
|
|
+ out, ret = self.emulator.run("ntpq --peers")
|
|
|
+ self.assertEqual(ret, 0)
|
|
|
+ # ntpq --peers produces two lines of headers. So we check we
|
|
|
+ # have at least 3 lines of output.
|
|
|
+ self.assertGreaterEqual(len(out), 3)
|
|
|
+ # We check we see our undisciplined local clock and it's the
|
|
|
+ # system peer.
|
|
|
+ self.assertTrue(out[2].startswith("*LOCAL(0)"))
|
|
|
+
|
|
|
+ # We query the refid variable. We expect to see our
|
|
|
+ # undisciplined local clock.
|
|
|
+ out, ret = self.emulator.run("ntpq -c 'readvar 0 refid'")
|
|
|
+ self.assertEqual(ret, 0)
|
|
|
+ self.assertEqual(out[0], "refid=LOCAL(0)")
|
|
|
+
|
|
|
+ # We query the ntp system info. We check the reference ID is
|
|
|
+ # the same as in the test configuration file.
|
|
|
+ out, ret = self.emulator.run("ntpq -c sysinfo")
|
|
|
+ self.assertEqual(ret, 0)
|
|
|
+ sysinfo = self.dict_from_ntpq_output(out)
|
|
|
+ refid = "reference ID"
|
|
|
+ self.assertIn(refid, sysinfo)
|
|
|
+ self.assertEqual(sysinfo[refid], "127.127.1.0")
|
|
|
+
|
|
|
+ # Finally, we query the ntp system statistics. We check we can
|
|
|
+ # see some uptime. We waited a bit at the beginning of this
|
|
|
+ # test, plus the few queries we previously did should have
|
|
|
+ # accumulated some uptime.
|
|
|
+ out, ret = self.emulator.run("ntpq -c sysstats")
|
|
|
+ self.assertEqual(ret, 0)
|
|
|
+ sysstats = self.dict_from_ntpq_output(out)
|
|
|
+ up = "uptime"
|
|
|
+ self.assertIn(up, sysstats)
|
|
|
+ self.assertGreater(int(sysstats[up]), 0)
|