| 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) |