From bec5a4d26a9ffa7615c0745e043f442088468e7d Mon Sep 17 00:00:00 2001 From: Arjun Suresh Date: Sun, 25 Dec 2022 15:20:22 +0000 Subject: [PATCH 01/10] Added option to avoid ranging mode run, fixes #270 --- ptd_client_server/lib/client.py | 20 +++++++++++++++++-- ptd_client_server/lib/common.py | 1 + ptd_client_server/lib/server.py | 34 +++++++++++++++++++++++++++++---- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/ptd_client_server/lib/client.py b/ptd_client_server/lib/client.py index 47f0b16f..cb3b701a 100644 --- a/ptd_client_server/lib/client.py +++ b/ptd_client_server/lib/client.py @@ -199,6 +199,12 @@ def main() -> None: parser.add_argument( "-S", "--stop-server", action="store_true", help="stop the server after processing this client") + parser.add_argument( + "-A", "--max-amps", type=float, default=0, + help="Use the given current value (in Amperes) as the max limit") + parser.add_argument( + "-V", "--max-volts", type=float, default=0, + help="Use the given current voltage (in Volts) as the max limit") # fmt: on common.log_redirect.start() @@ -281,14 +287,22 @@ def sync_check() -> None: power_dir = os.path.join(args.output, session, "power") os.mkdir(power_dir) - for mode in ["ranging", "testing"]: + if args.max_amps > 0 and args.max_volts > 0: + needed_modes = [ "testing" ] + else: + needed_modes = [ "ranging", "testing" ] + + for mode in needed_modes: logging.info(f"Running workload in {mode} mode") out = os.path.join(out_dir, "run_1" if mode == "testing" else mode) sync_check() summary.phase(mode, 0) - command(f"session,{session},start,{mode}", check=True) + if args.max_amps > 0 and args.max_volts > 0: + command(f"session,{session},start,{mode},{args.max_volts},{args.max_amps}", check=True) + else: + command(f"session,{session},start,{mode}", check=True) summary.phase(mode, 1) logging.info(f"Running the workload {args.run_workload!r}") @@ -332,6 +346,8 @@ def sync_check() -> None: command(f"session,{session},done", check=True) for fname in common.FETCH_FILES_LIST: + if 'ranging' in fname and args.max_amps > 0 and args.max_volts > 0: + continue command.download(f"download,{session},{fname}", os.path.join(out_dir, fname)) command(f"cleanup,{session}", check=True) diff --git a/ptd_client_server/lib/common.py b/ptd_client_server/lib/common.py index 3cd3778e..c1201798 100644 --- a/ptd_client_server/lib/common.py +++ b/ptd_client_server/lib/common.py @@ -42,6 +42,7 @@ "power/server.json", "power/server.log", "run_1/spl.txt", + "run_1/ptd_out.txt", ] diff --git a/ptd_client_server/lib/server.py b/ptd_client_server/lib/server.py index e5c994ec..b6dddae6 100644 --- a/ptd_client_server/lib/server.py +++ b/ptd_client_server/lib/server.py @@ -644,8 +644,14 @@ def _handle_cmd(self, cmd: str, p: common.Proto) -> Optional[str]: if cmd == ["start", "ranging"]: return unbool[self.session.start(Mode.RANGING)] - elif cmd == ["start", "testing"]: + elif cmd[0] == "start" and cmd[1] == "testing" and len(cmd) == 2: return unbool[self.session.start(Mode.TESTING)] + elif cmd[0] == "start" and cmd[1] == "testing" and len(cmd) == 4: + self.session._maxVolts = cmd[2] + self.session._maxAmps = cmd[3] + self.session._manual_limits = True + r = self.session.start(Mode.TESTING) + return unbool[r] if type(r) == bool else r if cmd == ["stop", "ranging"]: return unbool[self.session.stop(Mode.RANGING)] @@ -769,6 +775,7 @@ def __init__(self, server: Server, label: str) -> None: self._state = SessionState.INITIAL self._maxAmps: Optional[str] = None self._maxVolts: Optional[str] = None + self._manual_limits = False def start(self, mode: Mode) -> bool: if mode == Mode.RANGING and self._state == SessionState.RANGING: @@ -808,14 +815,28 @@ def start(self, mode: Mode) -> bool: self._server._summary.phase("ranging", 1) return True - if mode == Mode.TESTING and self._state == SessionState.RANGING_DONE: + if mode == Mode.TESTING and ((self._state == SessionState.INITIAL and self._maxVolts and self._maxAmps) or self._state == SessionState.RANGING_DONE): self._server._summary.phase("testing", 0) self._ptd.start() - self._ptd.cmd(f"SR,V,{self._maxVolts}") - self._ptd.cmd(f"SR,A,{self._maxAmps}") + + r = self._ptd.cmd(f"SR,V,{self._maxVolts}") + if r and 'Error' in r: + error=f"Error setting voltage range: {self._maxVolts}" + logging.error(error) + self.drop() + return r + + r = self._ptd.cmd(f"SR,A,{self._maxAmps}") + if r and 'Error' in r: + error=f"Error setting voltage range: {self._maxVolts}" + logging.error(error) + self.drop() + return r + with common.sig: time.sleep(ANALYZER_SLEEP_SECONDS) logging.info("Starting testing mode") + logging.info(f"maxAmps: {self._maxAmps}, maxVolts: {self._maxVolts}") self._ptd.cmd(f"Go,1000,0,{self._id}_testing") self._state = SessionState.TESTING @@ -888,6 +909,8 @@ def stop(self, mode: Mode) -> bool: if mode == Mode.TESTING and self._state == SessionState.TESTING: self._state = SessionState.TESTING_DONE + watts=self._ptd.cmd("Watts") + uncertainty=self._ptd.cmd("Uncertainty") self._ptd.stop() dirname = os.path.join(self.log_dir_path, "run_1") os.mkdir(dirname) @@ -895,6 +918,9 @@ def stop(self, mode: Mode) -> bool: f.write( read_log(self._server._config.ptd_logfile, self._id + "_testing") ) + with open(os.path.join(dirname, "ptd_out.txt"), "w") as f: + f.write( "Power: " + watts+ "\nUncertainty: "+ uncertainty + ) self._server._summary.phase("testing", 3) return True From ac8844162f8e0958d97226792bf4ba9414303c34 Mon Sep 17 00:00:00 2001 From: Arjun Suresh Date: Sun, 25 Dec 2022 15:49:51 +0000 Subject: [PATCH 02/10] Fix formatting --- ptd_client_server/lib/client.py | 11 +++++++---- ptd_client_server/lib/server.py | 26 ++++++++++++++------------ 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/ptd_client_server/lib/client.py b/ptd_client_server/lib/client.py index cb3b701a..5577ee25 100644 --- a/ptd_client_server/lib/client.py +++ b/ptd_client_server/lib/client.py @@ -288,9 +288,9 @@ def sync_check() -> None: os.mkdir(power_dir) if args.max_amps > 0 and args.max_volts > 0: - needed_modes = [ "testing" ] + needed_modes = ["testing"] else: - needed_modes = [ "ranging", "testing" ] + needed_modes = ["ranging", "testing"] for mode in needed_modes: logging.info(f"Running workload in {mode} mode") @@ -300,7 +300,10 @@ def sync_check() -> None: summary.phase(mode, 0) if args.max_amps > 0 and args.max_volts > 0: - command(f"session,{session},start,{mode},{args.max_volts},{args.max_amps}", check=True) + command( + f"session,{session},start,{mode},{args.max_volts},{args.max_amps}", + check=True + ) else: command(f"session,{session},start,{mode}", check=True) @@ -346,7 +349,7 @@ def sync_check() -> None: command(f"session,{session},done", check=True) for fname in common.FETCH_FILES_LIST: - if 'ranging' in fname and args.max_amps > 0 and args.max_volts > 0: + if "ranging" in fname and args.max_amps > 0 and args.max_volts > 0: continue command.download(f"download,{session},{fname}", os.path.join(out_dir, fname)) diff --git a/ptd_client_server/lib/server.py b/ptd_client_server/lib/server.py index b6dddae6..b49238ee 100644 --- a/ptd_client_server/lib/server.py +++ b/ptd_client_server/lib/server.py @@ -644,9 +644,9 @@ def _handle_cmd(self, cmd: str, p: common.Proto) -> Optional[str]: if cmd == ["start", "ranging"]: return unbool[self.session.start(Mode.RANGING)] - elif cmd[0] == "start" and cmd[1] == "testing" and len(cmd) == 2: + elif cmd[0] == "start" and cmd[1] == "testing" and len(cmd) == 2: return unbool[self.session.start(Mode.TESTING)] - elif cmd[0] == "start" and cmd[1] == "testing" and len(cmd) == 4: + elif cmd[0] == "start" and cmd[1] == "testing" and len(cmd) == 4: self.session._maxVolts = cmd[2] self.session._maxAmps = cmd[3] self.session._manual_limits = True @@ -815,23 +815,26 @@ def start(self, mode: Mode) -> bool: self._server._summary.phase("ranging", 1) return True - if mode == Mode.TESTING and ((self._state == SessionState.INITIAL and self._maxVolts and self._maxAmps) or self._state == SessionState.RANGING_DONE): + if mode == Mode.TESTING and ( + (self._state == SessionState.INITIAL and self._maxVolts and self._maxAmps) + or self._state == SessionState.RANGING_DONE + ): self._server._summary.phase("testing", 0) self._ptd.start() r = self._ptd.cmd(f"SR,V,{self._maxVolts}") - if r and 'Error' in r: + if r and "Error" in r: error=f"Error setting voltage range: {self._maxVolts}" logging.error(error) self.drop() - return r + return error r = self._ptd.cmd(f"SR,A,{self._maxAmps}") - if r and 'Error' in r: - error=f"Error setting voltage range: {self._maxVolts}" + if r and "Error" in r: + error=f"Error setting current range: {self._maxAmps}" logging.error(error) self.drop() - return r + return error with common.sig: time.sleep(ANALYZER_SLEEP_SECONDS) @@ -909,8 +912,8 @@ def stop(self, mode: Mode) -> bool: if mode == Mode.TESTING and self._state == SessionState.TESTING: self._state = SessionState.TESTING_DONE - watts=self._ptd.cmd("Watts") - uncertainty=self._ptd.cmd("Uncertainty") + watts = self._ptd.cmd("Watts") + uncertainty = self._ptd.cmd("Uncertainty") self._ptd.stop() dirname = os.path.join(self.log_dir_path, "run_1") os.mkdir(dirname) @@ -919,8 +922,7 @@ def stop(self, mode: Mode) -> bool: read_log(self._server._config.ptd_logfile, self._id + "_testing") ) with open(os.path.join(dirname, "ptd_out.txt"), "w") as f: - f.write( "Power: " + watts+ "\nUncertainty: "+ uncertainty - ) + f.write(f"Power: {watts} \nUncertainty: {uncertainty}") self._server._summary.phase("testing", 3) return True From 7cf893ec8762af775baf84a487c68f6a0f96f40a Mon Sep 17 00:00:00 2001 From: Arjun Suresh Date: Sun, 25 Dec 2022 15:52:34 +0000 Subject: [PATCH 03/10] Fix formatting --- ptd_client_server/lib/client.py | 2 +- ptd_client_server/lib/server.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ptd_client_server/lib/client.py b/ptd_client_server/lib/client.py index 5577ee25..a141c8c7 100644 --- a/ptd_client_server/lib/client.py +++ b/ptd_client_server/lib/client.py @@ -302,7 +302,7 @@ def sync_check() -> None: if args.max_amps > 0 and args.max_volts > 0: command( f"session,{session},start,{mode},{args.max_volts},{args.max_amps}", - check=True + check=True, ) else: command(f"session,{session},start,{mode}", check=True) diff --git a/ptd_client_server/lib/server.py b/ptd_client_server/lib/server.py index b49238ee..36db23a2 100644 --- a/ptd_client_server/lib/server.py +++ b/ptd_client_server/lib/server.py @@ -824,14 +824,14 @@ def start(self, mode: Mode) -> bool: r = self._ptd.cmd(f"SR,V,{self._maxVolts}") if r and "Error" in r: - error=f"Error setting voltage range: {self._maxVolts}" + error = f"Error setting voltage range: {self._maxVolts}" logging.error(error) self.drop() return error r = self._ptd.cmd(f"SR,A,{self._maxAmps}") if r and "Error" in r: - error=f"Error setting current range: {self._maxAmps}" + error = f"Error setting current range: {self._maxAmps}" logging.error(error) self.drop() return error From aa0d749b46f52c2f649917a33bc86af37942e6af Mon Sep 17 00:00:00 2001 From: Arjun Suresh Date: Sun, 25 Dec 2022 15:58:31 +0000 Subject: [PATCH 04/10] Fix formatting --- ptd_client_server/lib/server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ptd_client_server/lib/server.py b/ptd_client_server/lib/server.py index 36db23a2..c9b8d171 100644 --- a/ptd_client_server/lib/server.py +++ b/ptd_client_server/lib/server.py @@ -17,7 +17,7 @@ from decimal import Decimal from enum import Enum from ipaddress import ip_address -from typing import Any, Callable, Optional, Dict, Tuple, List, Set, NoReturn +from typing import Any, Callable, Optional, Dict, Tuple, List, Set, NoReturn, Union import argparse import atexit import builtins @@ -777,7 +777,7 @@ def __init__(self, server: Server, label: str) -> None: self._maxVolts: Optional[str] = None self._manual_limits = False - def start(self, mode: Mode) -> bool: + def start(self, mode: Mode) -> Union[bool, str]: if mode == Mode.RANGING and self._state == SessionState.RANGING: return True if mode == Mode.TESTING and self._state == SessionState.TESTING: From f9c768b9f4a9d4437fc8cb53d0736dc1cf12c7fa Mon Sep 17 00:00:00 2001 From: Arjun Suresh Date: Sun, 25 Dec 2022 16:00:54 +0000 Subject: [PATCH 05/10] Fix formatting --- ptd_client_server/lib/server.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ptd_client_server/lib/server.py b/ptd_client_server/lib/server.py index c9b8d171..ef5ba4f7 100644 --- a/ptd_client_server/lib/server.py +++ b/ptd_client_server/lib/server.py @@ -643,9 +643,9 @@ def _handle_cmd(self, cmd: str, p: common.Proto) -> Optional[str]: unbool = ["Error", "OK"] if cmd == ["start", "ranging"]: - return unbool[self.session.start(Mode.RANGING)] + return unbool[int(self.session.start(Mode.RANGING))] elif cmd[0] == "start" and cmd[1] == "testing" and len(cmd) == 2: - return unbool[self.session.start(Mode.TESTING)] + return unbool[int(self.session.start(Mode.TESTING))] elif cmd[0] == "start" and cmd[1] == "testing" and len(cmd) == 4: self.session._maxVolts = cmd[2] self.session._maxAmps = cmd[3] @@ -654,9 +654,9 @@ def _handle_cmd(self, cmd: str, p: common.Proto) -> Optional[str]: return unbool[r] if type(r) == bool else r if cmd == ["stop", "ranging"]: - return unbool[self.session.stop(Mode.RANGING)] + return unbool[int(self.session.stop(Mode.RANGING))] if cmd == ["stop", "testing"]: - return unbool[self.session.stop(Mode.TESTING)] + return unbool[int(self.session.stop(Mode.TESTING))] if cmd == ["done"]: self._drop_session() From b6e3403c861178154886916682ebc6296727083f Mon Sep 17 00:00:00 2001 From: Arjun Suresh Date: Sun, 25 Dec 2022 16:03:25 +0000 Subject: [PATCH 06/10] Fix formatting --- ptd_client_server/lib/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ptd_client_server/lib/server.py b/ptd_client_server/lib/server.py index ef5ba4f7..9f450756 100644 --- a/ptd_client_server/lib/server.py +++ b/ptd_client_server/lib/server.py @@ -651,7 +651,7 @@ def _handle_cmd(self, cmd: str, p: common.Proto) -> Optional[str]: self.session._maxAmps = cmd[3] self.session._manual_limits = True r = self.session.start(Mode.TESTING) - return unbool[r] if type(r) == bool else r + return unbool[int(r)] if type(r) == bool else str(r) if cmd == ["stop", "ranging"]: return unbool[int(self.session.stop(Mode.RANGING))] From 94e9cd51fabcdd61ff715a5db44490e5a21e6e7a Mon Sep 17 00:00:00 2001 From: Arjun Date: Thu, 26 Jan 2023 23:22:50 +0000 Subject: [PATCH 07/10] Restrict manual range setting for experimental purpose --- ptd_client_server/lib/client.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ptd_client_server/lib/client.py b/ptd_client_server/lib/client.py index a141c8c7..d76a78e0 100644 --- a/ptd_client_server/lib/client.py +++ b/ptd_client_server/lib/client.py @@ -201,10 +201,10 @@ def main() -> None: help="stop the server after processing this client") parser.add_argument( "-A", "--max-amps", type=float, default=0, - help="Use the given current value (in Amperes) as the max limit") + help="Use the given current value (in Amperes) as the max limit (Experimental)") parser.add_argument( "-V", "--max-volts", type=float, default=0, - help="Use the given current voltage (in Volts) as the max limit") + help="Use the given current voltage (in Volts) as the max limit (Experimental)") # fmt: on common.log_redirect.start() @@ -288,6 +288,7 @@ def sync_check() -> None: os.mkdir(power_dir) if args.max_amps > 0 and args.max_volts > 0: + logging.warning(f"Providing manual ranges are only for experimental purpose and the produced results won't be valid for submission") needed_modes = ["testing"] else: needed_modes = ["ranging", "testing"] From d3106676acb5c510898e0b54926a0d0d919fe82f Mon Sep 17 00:00:00 2001 From: Arjun Date: Thu, 26 Jan 2023 23:29:07 +0000 Subject: [PATCH 08/10] Format fix --- ptd_client_server/lib/client.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ptd_client_server/lib/client.py b/ptd_client_server/lib/client.py index d76a78e0..f017f886 100644 --- a/ptd_client_server/lib/client.py +++ b/ptd_client_server/lib/client.py @@ -288,7 +288,9 @@ def sync_check() -> None: os.mkdir(power_dir) if args.max_amps > 0 and args.max_volts > 0: - logging.warning(f"Providing manual ranges are only for experimental purpose and the produced results won't be valid for submission") + logging.warning( + f"Providing manual ranges are only for experimental purpose and the produced results won't be valid for submission" + ) needed_modes = ["testing"] else: needed_modes = ["ranging", "testing"] From 6fde5c8a54520774669bdfe6771311e76d0490bf Mon Sep 17 00:00:00 2001 From: Arjun Suresh Date: Fri, 3 Feb 2023 17:42:14 +0000 Subject: [PATCH 09/10] Fix test failure --- ptd_client_server/lib/server.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ptd_client_server/lib/server.py b/ptd_client_server/lib/server.py index d5409ba2..3c629a6a 100644 --- a/ptd_client_server/lib/server.py +++ b/ptd_client_server/lib/server.py @@ -703,7 +703,6 @@ def _handle_cmd(self, cmd: str, p: common.Proto) -> Optional[str]: elif cmd[0] == "start" and cmd[1] == "testing" and len(cmd) == 4: self.session._maxVolts = cmd[2] self.session._maxAmps = cmd[3] - self.session._manual_limits = True r = self.session.start(Mode.TESTING) return unbool[int(r)] if type(r) == bool else str(r) From 22abdaf3843b8bea6e9b127a97932998ab057b11 Mon Sep 17 00:00:00 2001 From: Arjun Suresh Date: Fri, 3 Feb 2023 17:50:52 +0000 Subject: [PATCH 10/10] Fix the source checksums, removed old checksums --- compliance/sources_checksums.json | 63 +++---------------------------- 1 file changed, 6 insertions(+), 57 deletions(-) diff --git a/compliance/sources_checksums.json b/compliance/sources_checksums.json index e282bd5f..8789088f 100644 --- a/compliance/sources_checksums.json +++ b/compliance/sources_checksums.json @@ -1,70 +1,19 @@ [ { - "__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "client.py": "33ca4f26368777ac06e01f9567b714a4b8063886", - "lib/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "lib/client.py": "4c2b78fb4849a7e5b584ef792d82aaed20b17f57", - "lib/common.py": "624d0c0acc7c39aaff3674f0b99d6a09da53d1dc", - "lib/external/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "lib/external/ntplib.py": "4da8f970656505a40483206ef2b5d3dd5e81711d", - "lib/server.py": "24ae49fb193809cf47f2c18b1c9c7c866244be4d", - "lib/source_hashes.py": "60a2e02193209e8d392803326208d5466342da18", - "lib/summary.py": "aa92f0a3f975eecd44d3c0cd0236342ccc9f941d", - "lib/time_sync.py": "3210db56eb0ff0df57bf4293dc4d4b03fffd46f1", - "server.py": "c3f90f2f7eeb4db30727556d0c815ebc89b3d28b", - "tests/unit/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "tests/unit/test_server.py": "99ae15aef722f2000ee6ed1ae1523637bf1ae42b", - "tests/unit/test_source_hashes.py": "00468a2907583c593e6574a1f6b404e4651c221a" - }, - { - "__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "client.py": "33ca4f26368777ac06e01f9567b714a4b8063886", - "lib/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "lib/client.py": "4c2b78fb4849a7e5b584ef792d82aaed20b17f57", - "lib/common.py": "624d0c0acc7c39aaff3674f0b99d6a09da53d1dc", - "lib/external/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "lib/external/ntplib.py": "4da8f970656505a40483206ef2b5d3dd5e81711d", - "lib/server.py": "24ae49fb193809cf47f2c18b1c9c7c866244be4d", - "lib/source_hashes.py": "60a2e02193209e8d392803326208d5466342da18", - "lib/summary.py": "aa92f0a3f975eecd44d3c0cd0236342ccc9f941d", - "lib/time_sync.py": "3210db56eb0ff0df57bf4293dc4d4b03fffd46f1", - "server.py": "c3f90f2f7eeb4db30727556d0c815ebc89b3d28b", - "tests/unit/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "tests/unit/test_server.py": "99ae15aef722f2000ee6ed1ae1523637bf1ae42b", - "tests/unit/test_source_hashes.py": "00468a2907583c593e6574a1f6b404e4651c221a" - }, - { - "client.py": "33ca4f26368777ac06e01f9567b714a4b8063886", "server.py": "c3f90f2f7eeb4db30727556d0c815ebc89b3d28b", "__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "lib/summary.py": "aa92f0a3f975eecd44d3c0cd0236342ccc9f941d", - "lib/client.py": "4c2b78fb4849a7e5b584ef792d82aaed20b17f57", - "lib/server.py": "59c9fb92908260d3e9f81a895c7aa009742275e4", - "lib/source_hashes.py": "60a2e02193209e8d392803326208d5466342da18", - "lib/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "lib/common.py": "624d0c0acc7c39aaff3674f0b99d6a09da53d1dc", - "lib/time_sync.py": "3210db56eb0ff0df57bf4293dc4d4b03fffd46f1", - "lib/external/ntplib.py": "4da8f970656505a40483206ef2b5d3dd5e81711d", - "lib/external/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "tests/unit/test_server.py": "99ae15aef722f2000ee6ed1ae1523637bf1ae42b", - "tests/unit/test_source_hashes.py": "00468a2907583c593e6574a1f6b404e4651c221a", - "tests/unit/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709" - }, - { - "server.py": "c3f90f2f7eeb4db30727556d0c815ebc89b3d28b", "client.py": "33ca4f26368777ac06e01f9567b714a4b8063886", - "__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "tests/unit/test_source_hashes.py": "00468a2907583c593e6574a1f6b404e4651c221a", "tests/unit/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "tests/unit/test_server.py": "99ae15aef722f2000ee6ed1ae1523637bf1ae42b", + "tests/unit/test_server.py": "948c1995d4008bc2aa6c4046a34ffa3858d6d671", + "lib/time_sync.py": "3210db56eb0ff0df57bf4293dc4d4b03fffd46f1", "lib/source_hashes.py": "60a2e02193209e8d392803326208d5466342da18", - "lib/server.py": "cda0cdfaee9bfa1249c64a7dd4f89b7bf1b279f0", - "lib/client.py": "4c2b78fb4849a7e5b584ef792d82aaed20b17f57", + "lib/common.py": "611d8b29633d331eb19c9455ea3b5fa3284ed6df", + "lib/server.py": "8054263a14dedddcf8e1c01adc19596c21bad591", "lib/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "lib/summary.py": "aa92f0a3f975eecd44d3c0cd0236342ccc9f941d", - "lib/time_sync.py": "3210db56eb0ff0df57bf4293dc4d4b03fffd46f1", - "lib/common.py": "624d0c0acc7c39aaff3674f0b99d6a09da53d1dc", + "lib/client.py": "c146491755e219a28d440b31f83998dbd5532483", "lib/external/ntplib.py": "4da8f970656505a40483206ef2b5d3dd5e81711d", "lib/external/__init__.py": "da39a3ee5e6b4b0d3255bfef95601890afd80709" } -] \ No newline at end of file +]