summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/build.mk2
-rw-r--r--test/timer_dos.c32
-rw-r--r--test/timer_dos.py41
3 files changed, 32 insertions, 43 deletions
diff --git a/test/build.mk b/test/build.mk
index 170b0e37b0..b1efd12134 100644
--- a/test/build.mk
+++ b/test/build.mk
@@ -22,7 +22,7 @@ test-list-$(BOARD_SAMUS)=
test-list-host=mutex pingpong utils kb_scan kb_mkbp lid_sw power_button hooks
test-list-host+=thermal flash queue kb_8042 extpwr_gpio console_edit system
test-list-host+=sbs_charging adapter host_command thermal_falco led_spring
-test-list-host+=bklight_lid bklight_passthru interrupt
+test-list-host+=bklight_lid bklight_passthru interrupt timer_dos
adapter-y=adapter.o
bklight_lid-y=bklight_lid.o
diff --git a/test/timer_dos.c b/test/timer_dos.c
index f941adea51..0c0f48c0a2 100644
--- a/test/timer_dos.c
+++ b/test/timer_dos.c
@@ -17,11 +17,28 @@
#define TEST_TIME (3 * SECOND)
+#define ERROR_MARGIN 5
+
+static int calculate_golden(uint32_t seed)
+{
+ int golden = 0;
+ uint32_t elapsed = 0;
+ while (1) {
+ elapsed += PERIOD_US(seed);
+ ++golden;
+ if (elapsed >= TEST_TIME)
+ return golden;
+ seed = prng(seed);
+ }
+}
+
int task_timer(void *seed)
{
- uint32_t num = (uint32_t)seed;
+ uint32_t num = (uint32_t)(uintptr_t)seed;
+ int golden_cnt = calculate_golden(num);
task_id_t id = task_get_current();
timestamp_t start;
+ int cnt = 0;
while (1) {
task_wait_event(-1);
@@ -33,9 +50,19 @@ int task_timer(void *seed)
/* Wait for a "random" period */
task_wait_event(PERIOD_US(num));
ccprintf("%01d\n", id);
+ cnt++;
/* next pseudo random delay */
num = prng(num);
}
+ ccprintf("Task %d: Count=%d Golden=%d\n", id, cnt, golden_cnt);
+ cnt -= golden_cnt;
+ if (cnt < 0)
+ cnt = -cnt;
+ if (cnt > ERROR_MARGIN) {
+ ccprintf("Count differs from Golden by more than %d!\n",
+ ERROR_MARGIN);
+ test_fail();
+ }
}
return EC_SUCCESS;
@@ -43,8 +70,11 @@ int task_timer(void *seed)
void run_test(void)
{
+ wait_for_task_started();
task_wake(TASK_ID_TMRD);
task_wake(TASK_ID_TMRC);
task_wake(TASK_ID_TMRB);
task_wake(TASK_ID_TMRA);
+ usleep(TEST_TIME + SECOND);
+ test_pass();
}
diff --git a/test/timer_dos.py b/test/timer_dos.py
deleted file mode 100644
index 5b7e1f7d40..0000000000
--- a/test/timer_dos.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# Timers test
-#
-
-import time
-
-# Test during 5s
-DURATION=5
-
-# Linear congruential pseudo random number generator*/
-def prng(x):
- return (22695477 * x + 1) & 0xffffffff
-
-# period between 500us and 128ms
-def period_us(num):
- return (((num % 256) + 1) * 500)
-
-# build the same pseudo random sequence as the target
-def build_sequence():
- # TODO(crosbug.com/p/23800): implement
- return []
-
-def test(helper):
- helper.wait_output("[Timer task ")
- deadline = time.time() + DURATION
- seq = []
- while time.time() < deadline:
- tmr = helper.wait_output("(?P<t>[0-9])", use_re=True,
- timeout=1)["t"]
- seq.append(tmr)
-
- # Check the results
- model = build_sequence()
- # TODO(crosbug.com/p/23800): implement
-
- helper.trace("Got %d timer IRQ\n" % len(seq))
-
- return True # PASS !