[dv,chip,clkmgr] Improve checks for clock measurements

Change clkmgr_testutils_check_measurement_counts to return status
instead of failing right away.
Create clkmgr_testutils_check_measurement_enables to avoid replicating
the checks in multiple tests.

Signed-off-by: Guillermo Maturana <maturana@google.com>
diff --git a/sw/device/lib/testing/clkmgr_testutils.c b/sw/device/lib/testing/clkmgr_testutils.c
index 8e2f506..79ca6a4 100644
--- a/sw/device/lib/testing/clkmgr_testutils.c
+++ b/sw/device/lib/testing/clkmgr_testutils.c
@@ -155,6 +155,23 @@
   }
 }
 
+bool clkmgr_testutils_check_measurement_enables(const dif_clkmgr_t *clkmgr,
+                                                dif_toggle_t expected_status) {
+  bool success = true;
+  for (int i = kDifClkmgrMeasureClockIo; i <= kDifClkmgrMeasureClockUsb; ++i) {
+    dif_clkmgr_measure_clock_t clock = (dif_clkmgr_measure_clock_t)i;
+    dif_toggle_t actual_status;
+    CHECK_DIF_OK(
+        dif_clkmgr_measure_counts_get_enable(clkmgr, clock, &actual_status));
+    if (actual_status != expected_status) {
+      LOG_INFO("Unexpected enable for clock %d: expected %s", i,
+               (expected_status == kDifToggleEnabled ? "enabled" : "disabled"));
+      success = false;
+    }
+  }
+  return success;
+}
+
 void clkmgr_testutils_disable_clock_counts(const dif_clkmgr_t *clkmgr) {
   LOG_INFO("Disabling all clock count measurements");
   for (int i = 0; i <= kDifClkmgrMeasureClockUsb; ++i) {
@@ -163,16 +180,19 @@
   }
 }
 
-void clkmgr_testutils_check_measurement_counts(const dif_clkmgr_t *clkmgr) {
+bool clkmgr_testutils_check_measurement_counts(const dif_clkmgr_t *clkmgr) {
+  bool success = true;
   dif_clkmgr_recov_err_codes_t err_codes;
   CHECK_DIF_OK(dif_clkmgr_recov_err_code_get_codes(clkmgr, &err_codes));
   if (err_codes != 0) {
     LOG_ERROR("Unexpected recoverable error codes 0x%x", err_codes);
+    success = false;
   } else {
     LOG_INFO("Clock measurements are okay");
   }
-  // clear recoverable errors
+  // Clear recoverable errors.
   CHECK_DIF_OK(dif_clkmgr_recov_err_code_clear_codes(clkmgr, ~0u));
+  return success;
 }
 
 void clkmgr_testutils_enable_external_clock_and_wait_for_completion(
diff --git a/sw/device/lib/testing/clkmgr_testutils.h b/sw/device/lib/testing/clkmgr_testutils.h
index 6de696a..e4a2e18 100644
--- a/sw/device/lib/testing/clkmgr_testutils.h
+++ b/sw/device/lib/testing/clkmgr_testutils.h
@@ -89,8 +89,21 @@
  * Checks that there are no clock measurement errors.
  *
  * @param clkmgr A clkmgr DIF handle.
+ * @return False if any measurement has errors.
  */
-void clkmgr_testutils_check_measurement_counts(const dif_clkmgr_t *clkmgr);
+OT_WARN_UNUSED_RESULT
+bool clkmgr_testutils_check_measurement_counts(const dif_clkmgr_t *clkmgr);
+
+/**
+ * Check all measurement enables.
+ *
+ * @param clkmgr A clkmgr DIF handle.
+ * @param expected_status The expected status of the enables.
+ * @return False if any enable status is unexpected.
+ */
+OT_WARN_UNUSED_RESULT
+bool clkmgr_testutils_check_measurement_enables(const dif_clkmgr_t *clkmgr,
+                                                dif_toggle_t expected_status);
 
 /**
  * Disable all clock measurements.
diff --git a/sw/device/tests/ast_clk_outs_test.c b/sw/device/tests/ast_clk_outs_test.c
index fe75f2b..d8974c4 100644
--- a/sw/device/tests/ast_clk_outs_test.c
+++ b/sw/device/tests/ast_clk_outs_test.c
@@ -40,16 +40,6 @@
 static dif_clkmgr_t clkmgr;
 static dif_pwrmgr_t pwrmgr;
 
-// Will flag a failure if any measurements are enabled.
-void check_all_measurements_are_disabled(const dif_clkmgr_t *clkmgr) {
-  dif_toggle_t status;
-  for (int i = kDifClkmgrMeasureClockIo; i <= kDifClkmgrMeasureClockUsb; ++i) {
-    dif_clkmgr_measure_clock_t clock = (dif_clkmgr_measure_clock_t)i;
-    CHECK_DIF_OK(dif_clkmgr_measure_counts_get_enable(clkmgr, clock, &status));
-    CHECK(status == kDifToggleDisabled);
-  }
-}
-
 bool test_main(void) {
   dif_sensor_ctrl_t sensor_ctrl;
   dif_aon_timer_t aon_timer;
@@ -89,7 +79,7 @@
     busy_spin_micros(kMeasurementDelayMicros);
 
     // check results
-    clkmgr_testutils_check_measurement_counts(&clkmgr);
+    CHECK(clkmgr_testutils_check_measurement_counts(&clkmgr));
     clkmgr_testutils_disable_clock_counts(&clkmgr);
 
     // Set wakeup timer to 100 us to have enough down time, and also wait before
@@ -120,7 +110,8 @@
   } else if (pwrmgr_testutils_is_wakeup_reason(
                  &pwrmgr, kDifPwrmgrWakeupRequestSourceFive)) {
     // Fail if some measurements are enabled.
-    check_all_measurements_are_disabled(&clkmgr);
+    CHECK(clkmgr_testutils_check_measurement_enables(&clkmgr,
+                                                     kDifToggleDisabled));
     // Check measurement control regwen is enabled.
     dif_toggle_t state;
     CHECK_DIF_OK(dif_clkmgr_measure_ctrl_get_enable(&clkmgr, &state));
@@ -141,7 +132,7 @@
         &clkmgr, /*jitter_enabled=*/false, /*external_clk=*/false,
         /*low_speed=*/false);
     busy_spin_micros(kMeasurementDelayMicros);
-    clkmgr_testutils_check_measurement_counts(&clkmgr);
+    CHECK(clkmgr_testutils_check_measurement_counts(&clkmgr));
     clkmgr_testutils_disable_clock_counts(&clkmgr);
 
     LOG_INFO("TEST: done");
diff --git a/sw/device/tests/clkmgr_external_clk_src_for_sw_impl.c b/sw/device/tests/clkmgr_external_clk_src_for_sw_impl.c
index 1990716..9d801f4 100644
--- a/sw/device/tests/clkmgr_external_clk_src_for_sw_impl.c
+++ b/sw/device/tests/clkmgr_external_clk_src_for_sw_impl.c
@@ -49,7 +49,7 @@
       &clkmgr, /*jitter_enabled=*/false, /*external_clk=*/false,
       /*low_speed=*/false);
   busy_spin_micros(kMeasurementDelayMicros);
-  clkmgr_testutils_check_measurement_counts(&clkmgr);
+  CHECK(clkmgr_testutils_check_measurement_counts(&clkmgr));
   clkmgr_testutils_disable_clock_counts(&clkmgr);
 
   // Configure external clock:
@@ -70,6 +70,6 @@
       &clkmgr, /*jitter_enabled=*/false, /*external_clk=*/true,
       /*low_speed=*/!fast_ext_clk);
   busy_spin_micros(kMeasurementDelayMicros);
-  clkmgr_testutils_check_measurement_counts(&clkmgr);
+  CHECK(clkmgr_testutils_check_measurement_counts(&clkmgr));
   clkmgr_testutils_disable_clock_counts(&clkmgr);
 }
diff --git a/sw/device/tests/clkmgr_reset_frequency_test.c b/sw/device/tests/clkmgr_reset_frequency_test.c
index 3bcfe1c..9dfb677 100644
--- a/sw/device/tests/clkmgr_reset_frequency_test.c
+++ b/sw/device/tests/clkmgr_reset_frequency_test.c
@@ -34,16 +34,6 @@
   kMeasurementsPerRound = 100,
 };
 
-// Will flag a failure if any measurements are enabled.
-void check_all_measurements_are_disabled(const dif_clkmgr_t *clkmgr) {
-  dif_toggle_t status;
-  for (int i = kDifClkmgrMeasureClockIo; i <= kDifClkmgrMeasureClockUsb; ++i) {
-    dif_clkmgr_measure_clock_t clock = (dif_clkmgr_measure_clock_t)i;
-    CHECK_DIF_OK(dif_clkmgr_measure_counts_get_enable(clkmgr, clock, &status));
-    CHECK(status == kDifToggleDisabled);
-  }
-}
-
 bool test_main(void) {
   dif_clkmgr_t clkmgr;
   dif_rstmgr_t rstmgr;
@@ -90,8 +80,9 @@
     CHECK_DIF_OK(dif_rstmgr_software_device_reset(&rstmgr));
   } else if (rstmgr_testutils_reset_info_any(&rstmgr, kDifRstmgrResetInfoSw)) {
     LOG_INFO("Back from rstmgr SW reset");
-    check_all_measurements_are_disabled(&clkmgr);
-    clkmgr_testutils_check_measurement_counts(&clkmgr);
+    CHECK(clkmgr_testutils_check_measurement_enables(&clkmgr,
+                                                     kDifToggleDisabled));
+    CHECK(clkmgr_testutils_check_measurement_counts(&clkmgr));
     return true;
   } else {
     dif_rstmgr_reset_info_bitfield_t rst_info;
diff --git a/sw/device/tests/clkmgr_sleep_frequency_test.c b/sw/device/tests/clkmgr_sleep_frequency_test.c
index d9706e8..c912b9c 100644
--- a/sw/device/tests/clkmgr_sleep_frequency_test.c
+++ b/sw/device/tests/clkmgr_sleep_frequency_test.c
@@ -52,22 +52,6 @@
 
 static volatile bool isr_entered;
 
-// Will flag a failure if any measurements are disabled.
-static void check_all_measurements_are_enabled(const dif_clkmgr_t *clkmgr) {
-  dif_toggle_t status;
-  bool success = true;
-  for (int i = kDifClkmgrMeasureClockIo; i <= kDifClkmgrMeasureClockUsb; ++i) {
-    dif_clkmgr_measure_clock_t clock = (dif_clkmgr_measure_clock_t)i;
-    CHECK_DIF_OK(dif_clkmgr_measure_counts_get_enable(clkmgr, clock, &status));
-    if (status != kDifToggleEnabled) {
-      LOG_INFO("Expected measurement enabled for clock %s(%d)",
-               clkmgr_testutils_measurement_name(clock), i);
-      success = false;
-    }
-  }
-  CHECK(success);
-}
-
 /**
  * External interrupt handler.
  */
@@ -126,7 +110,7 @@
   busy_spin_micros(kMeasurementDelayMicros);
 
   // check results
-  clkmgr_testutils_check_measurement_counts(&clkmgr);
+  CHECK(clkmgr_testutils_check_measurement_counts(&clkmgr));
   clkmgr_testutils_disable_clock_counts(&clkmgr);
 
   // Start new round of measurements.
@@ -163,8 +147,8 @@
   CHECK(isr_entered);
 
   // Interrupt happened. Check the measurement state.
-  clkmgr_testutils_check_measurement_counts(&clkmgr);
-  check_all_measurements_are_enabled(&clkmgr);
+  CHECK(clkmgr_testutils_check_measurement_counts(&clkmgr));
+  CHECK(clkmgr_testutils_check_measurement_enables(&clkmgr, kDifToggleEnabled));
 
   return true;
 }
diff --git a/sw/device/tests/sim_dv/uart_tx_rx_test.c b/sw/device/tests/sim_dv/uart_tx_rx_test.c
index 8f2aa8b..478e830 100644
--- a/sw/device/tests/sim_dv/uart_tx_rx_test.c
+++ b/sw/device/tests/sim_dv/uart_tx_rx_test.c
@@ -567,7 +567,7 @@
   // Execute the test.
   execute_test(&uart);
 
-  clkmgr_testutils_check_measurement_counts(&clkmgr);
+  CHECK(clkmgr_testutils_check_measurement_counts(&clkmgr));
 
   return true;
 }