summaryrefslogtreecommitdiff
path: root/cesar/lib/test/trace
diff options
context:
space:
mode:
authorschodet2009-11-12 12:46:51 +0000
committerschodet2009-11-12 12:46:51 +0000
commit8ccf0d21935462f902789f4c13f6cf7b30501ff8 (patch)
treea6e7ffcfa27d5d49db141805defbf179ecba835a /cesar/lib/test/trace
parent90ff45b527e0ac48f12b2cf69af1dd8317fb4bf3 (diff)
cesar/lib/trace: add bare trace buffer support, closes #736
This is a lightweight trace buffer to be used from assembly sources. git-svn-id: svn+ssh://pessac/svn/cesar/trunk@6359 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/lib/test/trace')
-rw-r--r--cesar/lib/test/trace/src/test_trace.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/cesar/lib/test/trace/src/test_trace.c b/cesar/lib/test/trace/src/test_trace.c
index 7caa7c0f05..8543e4152c 100644
--- a/cesar/lib/test/trace/src/test_trace.c
+++ b/cesar/lib/test/trace/src/test_trace.c
@@ -394,10 +394,129 @@ trace_basic_test_case (test_t t)
}
void
+trace_bare_test_case (test_t t)
+{
+ trace_buffer_t trace_buf;
+ trace_buffer_bare_t trace_buf_bare;
+ uint i;
+ u32 data[1024];
+ /* Initialise. */
+ test_case_begin (t, "bare");
+ trace_init ();
+ /* Test. */
+ enum
+ {
+ TEST_TRACE_BARE_TRACE_ONE,
+ TEST_TRACE_BARE_TRACE_TWO,
+ };
+ static const trace_event_id_t ei[] = {
+ TRACE_EVENT (TEST_TRACE_BARE_TRACE_ONE, "bare one %d %d %d"),
+ TRACE_EVENT (TEST_TRACE_BARE_TRACE_TWO, "bare two %d %d", TIMESTAMP),
+ };
+ trace_namespace_t ns;
+ trace_namespace_init (&ns, ei, COUNT (ei));
+ test_begin (t, "short dump")
+ {
+ i = 42;
+ trace_buffer_add_bare (&trace_buf, "trace", &trace_buf_bare, data,
+ COUNT (data), &ns);
+ /* Trace and record expected trace. */
+ growing_buffer_t expected_dump;
+ growing_init (&expected_dump);
+ growing_sprintf (&expected_dump, "---trace-begin[%s]---\n", "trace");
+ /* Simulate assembly code. */
+ *trace_buf_bare.data_tail++ = TEST_TRACE_BARE_TRACE_ONE << 8 | 3;
+ *trace_buf_bare.data_tail++ = i;
+ *trace_buf_bare.data_tail++ = i + 1;
+ *trace_buf_bare.data_tail++ = i + 2;
+ if (trace_buf_bare.data_tail == trace_buf_bare.data_end)
+ trace_buf_bare.data_tail = trace_buf_bare.data;
+ *trace_buf_bare.data_tail++ = TEST_TRACE_BARE_TRACE_TWO << 8 | 3;
+ *trace_buf_bare.data_tail++ = i + 3;
+ *trace_buf_bare.data_tail++ = i + 4;
+ *trace_buf_bare.data_tail++ = i + 5;
+ if (trace_buf_bare.data_tail == trace_buf_bare.data_end)
+ trace_buf_bare.data_tail = trace_buf_bare.data;
+ /* Expected result. */
+ growing_sprintf (&expected_dump, "[.] bare one %d %d %d\n",
+ i, i + 1, i + 2);
+ growing_sprintf (&expected_dump, "[0x%08x] bare two %d %d\n",
+ i + 3, i + 4, i + 5);
+ growing_sprintf (&expected_dump, "---trace-end---\n");
+ test_verbose_print ("%s", expected_dump.buf);
+ /* Dump to memory. */
+ growing_buffer_t dump;
+ growing_init (&dump);
+ int ret = trace_buffer_dump (&trace_buf, dump_callback, &dump);
+ /* Check dump. */
+ test_fail_unless (expected_dump.buf_pos == dump.buf_pos);
+ test_fail_unless ((int) dump.buf_pos == ret);
+ test_fail_unless (memcmp (expected_dump.buf, dump.buf, dump.buf_pos)
+ == 0);
+ /* Cleanup. */
+ growing_uninit (&expected_dump);
+ growing_uninit (&dump);
+ trace_buffer_remove (&trace_buf);
+ } test_end;
+ test_begin (t, "dump")
+ {
+ trace_buffer_add_bare (&trace_buf, "trace", &trace_buf_bare, data,
+ COUNT (data), &ns);
+ /* Trace and record expected trace. */
+ growing_buffer_t expected_dump;
+ growing_init (&expected_dump);
+ growing_sprintf (&expected_dump, "---trace-begin[%s]---\n", "trace");
+ for (i = 0; i < NB_PRINT; i++)
+ {
+ /* Simulate assembly code. */
+ *trace_buf_bare.data_tail++ = TEST_TRACE_BARE_TRACE_ONE << 8 | 3;
+ *trace_buf_bare.data_tail++ = i;
+ *trace_buf_bare.data_tail++ = i + 1;
+ *trace_buf_bare.data_tail++ = i + 2;
+ if (trace_buf_bare.data_tail == trace_buf_bare.data_end)
+ trace_buf_bare.data_tail = trace_buf_bare.data;
+ *trace_buf_bare.data_tail++ = TEST_TRACE_BARE_TRACE_TWO << 8 | 3;
+ *trace_buf_bare.data_tail++ = i + 3;
+ *trace_buf_bare.data_tail++ = i + 4;
+ *trace_buf_bare.data_tail++ = i + 5;
+ if (trace_buf_bare.data_tail == trace_buf_bare.data_end)
+ trace_buf_bare.data_tail = trace_buf_bare.data;
+ /* Expected result, only last events as this is a circular
+ * buffer. */
+ if (NB_PRINT - i <= COUNT (data) / 8)
+ {
+ growing_sprintf (&expected_dump, "[.] bare one %d %d %d\n",
+ i, i + 1, i + 2);
+ growing_sprintf (&expected_dump, "[0x%08x] bare two %d %d\n",
+ i + 3, i + 4, i + 5);
+ }
+ }
+ growing_sprintf (&expected_dump, "---trace-end---\n");
+ test_verbose_print ("%s", expected_dump.buf);
+ /* Dump to memory. */
+ growing_buffer_t dump;
+ growing_init (&dump);
+ int ret = trace_buffer_dump (&trace_buf, dump_callback, &dump);
+ /* Check dump. */
+ test_fail_unless (expected_dump.buf_pos == dump.buf_pos);
+ test_fail_unless ((int) dump.buf_pos == ret);
+ test_fail_unless (memcmp (expected_dump.buf, dump.buf, dump.buf_pos)
+ == 0);
+ /* Cleanup. */
+ growing_uninit (&expected_dump);
+ growing_uninit (&dump);
+ trace_buffer_remove (&trace_buf);
+ } test_end;
+ /* Uninit. */
+ trace_uninit ();
+}
+
+void
trace_test_suite (test_t t)
{
test_suite_begin (t, "trace");
trace_basic_test_case (t);
+ trace_bare_test_case (t);
}
int