summaryrefslogtreecommitdiff
path: root/test/utils.c
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2013-08-07 15:36:21 -0700
committerChromeBot <chrome-bot@google.com>2013-08-09 15:44:09 -0700
commit0c8c2e453ab3960f315050fbb9808f438398624f (patch)
tree472f7677ac3738338bea389a42d9c1b7f6703bda /test/utils.c
parent71a3bb0c0746d17e55e1e08322258e555ac80682 (diff)
downloadchrome-ec-0c8c2e453ab3960f315050fbb9808f438398624f.tar.gz
Add abstract "cond_t" type to detect state transitions.
We often need to watch for transitions between one state and another, so that we can issue warnings or take action ONCE. This abstracts that "have I already reacted to this" stuff into a single set of functions. For example, this code reads a GPIO every time through the loop, but it only generates an event when the GPIO value changes from 0 to 1: cond_t c; cond_init_false(&c); while(1) { int val = read_some_gpio(); cond_set(&c, val); if (cond_went_true(&c)) host_event(SOMETHING_HAPPENED); sleep(1); } BUG=none BRANCH=falco,peppy TEST=manual make BOARD=falco runtests Change-Id: I42393fcf3c4eb71b9551118a0f442d55c0691315 Signed-off-by: Bill Richardson <wfrichar@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/65071
Diffstat (limited to 'test/utils.c')
-rw-r--r--test/utils.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/test/utils.c b/test/utils.c
index 3c92846417..e2230bfd44 100644
--- a/test/utils.c
+++ b/test/utils.c
@@ -185,6 +185,103 @@ static int test_scratchpad(void)
return EC_SUCCESS;
}
+static int test_cond_t(void)
+{
+ cond_t c;
+
+ /* one-shot? */
+ cond_init_false(&c);
+ cond_set_true(&c);
+ TEST_ASSERT(cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ cond_set_false(&c);
+ TEST_ASSERT(cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+
+ /* one-shot when initially true? */
+ cond_init_true(&c);
+ cond_set_false(&c);
+ TEST_ASSERT(cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+ cond_set_true(&c);
+ TEST_ASSERT(cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+
+ /* still one-shot even if set multiple times? */
+ cond_init_false(&c);
+ cond_set_true(&c);
+ cond_set_true(&c);
+ cond_set_true(&c);
+ cond_set_true(&c);
+ cond_set_true(&c);
+ cond_set_true(&c);
+ TEST_ASSERT(cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ cond_set_true(&c);
+ cond_set_false(&c);
+ cond_set_false(&c);
+ cond_set_false(&c);
+ cond_set_false(&c);
+ cond_set_false(&c);
+ TEST_ASSERT(cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+
+ /* only the detected transition direction resets it */
+ cond_set_true(&c);
+ TEST_ASSERT(!cond_went_false(&c));
+ TEST_ASSERT(cond_went_true(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ cond_set_false(&c);
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+
+ /* multiple transitions between checks should notice both edges */
+ cond_set_true(&c);
+ cond_set_false(&c);
+ cond_set_true(&c);
+ cond_set_false(&c);
+ cond_set_true(&c);
+ cond_set_false(&c);
+ TEST_ASSERT(cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(!cond_went_true(&c));
+ TEST_ASSERT(!cond_went_false(&c));
+
+ /* Still has last value? */
+ cond_set_true(&c);
+ cond_set_false(&c);
+ cond_set_true(&c);
+ cond_set_false(&c);
+ TEST_ASSERT(cond_is_false(&c));
+ cond_set_false(&c);
+ cond_set_true(&c);
+ cond_set_false(&c);
+ cond_set_true(&c);
+ TEST_ASSERT(cond_is_true(&c));
+
+ /* well okay then */
+ return EC_SUCCESS;
+}
+
void run_test(void)
{
test_reset();
@@ -204,6 +301,7 @@ void run_test(void)
RUN_TEST(test_uint64divmod_2);
RUN_TEST(test_shared_mem);
RUN_TEST(test_scratchpad);
+ RUN_TEST(test_cond_t);
test_print_result();
}