From 0944a8db529a01a9a7a770b1dd2833311ec8f212 Mon Sep 17 00:00:00 2001 From: kierancyphus Date: Fri, 10 Nov 2023 15:25:02 +0800 Subject: [PATCH] gs-common/modem: clock manager interface A lot of modem code requires sleeping while vendor services do some background processing. Since we don't want to actually sleep for unit tests, an interface is provided here so that a fake sleep can be injected. Test: N/A. Directly forwards methods or does nothing. Bug: 302435001 Change-Id: I3bcf0307156d93756d69cd9f749c88b508ba9466 --- modem/clock_manager/Android.bp | 9 ++++++ modem/clock_manager/fake/Android.bp | 15 ++++++++++ .../fake/include/fake_clock_manager.h | 21 ++++++++++++++ modem/clock_manager/impl/Android.bp | 16 +++++++++++ .../clock_manager/impl/clock_manager_impl.cpp | 9 ++++++ .../impl/include/clock_manager_impl.h | 13 +++++++++ modem/clock_manager/include/clock_manager.h | 28 +++++++++++++++++++ 7 files changed, 111 insertions(+) create mode 100644 modem/clock_manager/Android.bp create mode 100644 modem/clock_manager/fake/Android.bp create mode 100644 modem/clock_manager/fake/include/fake_clock_manager.h create mode 100644 modem/clock_manager/impl/Android.bp create mode 100644 modem/clock_manager/impl/clock_manager_impl.cpp create mode 100644 modem/clock_manager/impl/include/clock_manager_impl.h create mode 100644 modem/clock_manager/include/clock_manager.h diff --git a/modem/clock_manager/Android.bp b/modem/clock_manager/Android.bp new file mode 100644 index 0000000..98aff6f --- /dev/null +++ b/modem/clock_manager/Android.bp @@ -0,0 +1,9 @@ +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_library { + name: "modem_clock_manager", + export_include_dirs: [ "include" ], + vendor_available: true, +} diff --git a/modem/clock_manager/fake/Android.bp b/modem/clock_manager/fake/Android.bp new file mode 100644 index 0000000..eb16445 --- /dev/null +++ b/modem/clock_manager/fake/Android.bp @@ -0,0 +1,15 @@ +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_defaults { + name: "fake_modem_clock_manager_defaults", + shared_libs: [ "modem_clock_manager" ], +} + +cc_library_static { + name: "fake_modem_clock_manager", + export_include_dirs: [ "include" ], + defaults: [ "fake_modem_clock_manager_defaults" ], + vendor_available: true, +} diff --git a/modem/clock_manager/fake/include/fake_clock_manager.h b/modem/clock_manager/fake/include/fake_clock_manager.h new file mode 100644 index 0000000..8956777 --- /dev/null +++ b/modem/clock_manager/fake/include/fake_clock_manager.h @@ -0,0 +1,21 @@ +#include "clock_manager.h" + +namespace pixel_modem { + +/** + * @brief Fake implementation of clock manager that doesn't actually sleep. + * + * A lot of vendor code don't have return values and instead force the client + * codes to sleep for a specified period of time before checking some system + * properties. However, since unit tests don't rely on the real vendor + * implementations, these sleeps should be ignored and so a fake clock should be + * used. + * + * Since this definition is unlikely to change, it will be defined in the header + * and not an implementation file. + */ +struct FakeClockManager : public ClockManager { + void Sleep(size_t /*seconds*/) const override{}; +}; + +} // namespace pixel_modem diff --git a/modem/clock_manager/impl/Android.bp b/modem/clock_manager/impl/Android.bp new file mode 100644 index 0000000..13f4cc6 --- /dev/null +++ b/modem/clock_manager/impl/Android.bp @@ -0,0 +1,16 @@ +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +modem_clock_manager_impl_public_deps = [ + "modem_clock_manager", +] + +cc_library { + name: "modem_clock_manager_impl", + export_include_dirs: [ "include" ], + srcs: [ "clock_manager_impl.cpp" ], + shared_libs: modem_clock_manager_impl_public_deps, + export_shared_lib_headers: modem_clock_manager_impl_public_deps, + vendor_available: true, +} diff --git a/modem/clock_manager/impl/clock_manager_impl.cpp b/modem/clock_manager/impl/clock_manager_impl.cpp new file mode 100644 index 0000000..dc61a63 --- /dev/null +++ b/modem/clock_manager/impl/clock_manager_impl.cpp @@ -0,0 +1,9 @@ +#include "clock_manager_impl.h" + +#include + +namespace pixel_modem { + +void ClockManagerImpl::Sleep(size_t seconds) const { sleep(seconds); } + +} // namespace pixel_modem diff --git a/modem/clock_manager/impl/include/clock_manager_impl.h b/modem/clock_manager/impl/include/clock_manager_impl.h new file mode 100644 index 0000000..d626b98 --- /dev/null +++ b/modem/clock_manager/impl/include/clock_manager_impl.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +#include "clock_manager.h" + +namespace pixel_modem { + +struct ClockManagerImpl : public ClockManager { + void Sleep(size_t seconds) const override; +}; + +} // namespace pixel_modem diff --git a/modem/clock_manager/include/clock_manager.h b/modem/clock_manager/include/clock_manager.h new file mode 100644 index 0000000..1db88c5 --- /dev/null +++ b/modem/clock_manager/include/clock_manager.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +namespace pixel_modem { + +/** + * @brief Interface for time based operations. + * + * This interface was intentionally not called `Clock`, like the Java side + * counterpart since it's likely that clients would call the local variable + * `clock(_)`, which would clash with the C defined `clock` method. + */ +struct ClockManager { + virtual ~ClockManager() = default; + + /** + * @brief Sleep the thread for a given number of seconds. + * + * @param seconds Minimum number of seconds to sleep for. Note, this is + * different than the Java android clock which accepts seconds. This was done + * because C++ developers are likely more familiar with the `sleep` command, + * which accepts seconds. + */ + virtual void Sleep(size_t seconds) const = 0; +}; + +} // namespace pixel_modem