xref: /aosp_15_r20/trusty/kernel/app/consoletest/consoletest.c (revision 344aa361028b423587d4ef3fa52a23d194628137)
1*344aa361SAndroid Build Coastguard Worker /*
2*344aa361SAndroid Build Coastguard Worker  * Copyright (c) 2019, Google Inc. All rights reserved
3*344aa361SAndroid Build Coastguard Worker  *
4*344aa361SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining
5*344aa361SAndroid Build Coastguard Worker  * a copy of this software and associated documentation files
6*344aa361SAndroid Build Coastguard Worker  * (the "Software"), to deal in the Software without restriction,
7*344aa361SAndroid Build Coastguard Worker  * including without limitation the rights to use, copy, modify, merge,
8*344aa361SAndroid Build Coastguard Worker  * publish, distribute, sublicense, and/or sell copies of the Software,
9*344aa361SAndroid Build Coastguard Worker  * and to permit persons to whom the Software is furnished to do so,
10*344aa361SAndroid Build Coastguard Worker  * subject to the following conditions:
11*344aa361SAndroid Build Coastguard Worker  *
12*344aa361SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be
13*344aa361SAndroid Build Coastguard Worker  * included in all copies or substantial portions of the Software.
14*344aa361SAndroid Build Coastguard Worker  *
15*344aa361SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*344aa361SAndroid Build Coastguard Worker  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*344aa361SAndroid Build Coastguard Worker  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18*344aa361SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19*344aa361SAndroid Build Coastguard Worker  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20*344aa361SAndroid Build Coastguard Worker  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21*344aa361SAndroid Build Coastguard Worker  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22*344aa361SAndroid Build Coastguard Worker  */
23*344aa361SAndroid Build Coastguard Worker 
24*344aa361SAndroid Build Coastguard Worker #include <assert.h>
25*344aa361SAndroid Build Coastguard Worker #include <kernel/spinlock.h>
26*344aa361SAndroid Build Coastguard Worker #include <lib/unittest/unittest.h>
27*344aa361SAndroid Build Coastguard Worker #include <lk/init.h>
28*344aa361SAndroid Build Coastguard Worker #include <stdio.h>
29*344aa361SAndroid Build Coastguard Worker #include <string.h>
30*344aa361SAndroid Build Coastguard Worker #if LK_LIBC_IMPLEMENTATION_IS_MUSL
31*344aa361SAndroid Build Coastguard Worker #include <trusty/io_handle.h>
32*344aa361SAndroid Build Coastguard Worker #endif
33*344aa361SAndroid Build Coastguard Worker 
34*344aa361SAndroid Build Coastguard Worker static size_t print_count;
35*344aa361SAndroid Build Coastguard Worker static size_t print_bytes;
36*344aa361SAndroid Build Coastguard Worker static size_t commit_count;
37*344aa361SAndroid Build Coastguard Worker 
38*344aa361SAndroid Build Coastguard Worker /*
39*344aa361SAndroid Build Coastguard Worker  * NOTE: we're just looking for a general sense these functions are being
40*344aa361SAndroid Build Coastguard Worker  * called. The kernel could be logging from other threads.
41*344aa361SAndroid Build Coastguard Worker  * TODO: modularize logging so it can be tested in isolation.
42*344aa361SAndroid Build Coastguard Worker  */
43*344aa361SAndroid Build Coastguard Worker 
test_print_callback(print_callback_t * cb,const char * str,size_t len)44*344aa361SAndroid Build Coastguard Worker static void test_print_callback(print_callback_t* cb,
45*344aa361SAndroid Build Coastguard Worker                                 const char* str,
46*344aa361SAndroid Build Coastguard Worker                                 size_t len) {
47*344aa361SAndroid Build Coastguard Worker     print_count += 1;
48*344aa361SAndroid Build Coastguard Worker     print_bytes += len;
49*344aa361SAndroid Build Coastguard Worker }
50*344aa361SAndroid Build Coastguard Worker 
test_commit_callback(print_callback_t * cb)51*344aa361SAndroid Build Coastguard Worker static void test_commit_callback(print_callback_t* cb) {
52*344aa361SAndroid Build Coastguard Worker     commit_count += 1;
53*344aa361SAndroid Build Coastguard Worker }
54*344aa361SAndroid Build Coastguard Worker 
clear_stats(void)55*344aa361SAndroid Build Coastguard Worker static void clear_stats(void) {
56*344aa361SAndroid Build Coastguard Worker     print_count = 0;
57*344aa361SAndroid Build Coastguard Worker     print_bytes = 0;
58*344aa361SAndroid Build Coastguard Worker     commit_count = 0;
59*344aa361SAndroid Build Coastguard Worker }
60*344aa361SAndroid Build Coastguard Worker 
61*344aa361SAndroid Build Coastguard Worker /* Did we print something like "Hello, test!" ? */
check_standard_stats(void)62*344aa361SAndroid Build Coastguard Worker static void check_standard_stats(void) {
63*344aa361SAndroid Build Coastguard Worker     EXPECT_LE(1, print_count);
64*344aa361SAndroid Build Coastguard Worker     EXPECT_LE(13, print_bytes);
65*344aa361SAndroid Build Coastguard Worker     EXPECT_LE(1, commit_count);
66*344aa361SAndroid Build Coastguard Worker }
67*344aa361SAndroid Build Coastguard Worker 
68*344aa361SAndroid Build Coastguard Worker /*
69*344aa361SAndroid Build Coastguard Worker  * Most of these tests are smoke tests - making sure there are no trivial
70*344aa361SAndroid Build Coastguard Worker  * deadlocks or crashes.
71*344aa361SAndroid Build Coastguard Worker  */
72*344aa361SAndroid Build Coastguard Worker 
TEST(consoletest,puts)73*344aa361SAndroid Build Coastguard Worker TEST(consoletest, puts) {
74*344aa361SAndroid Build Coastguard Worker     clear_stats();
75*344aa361SAndroid Build Coastguard Worker 
76*344aa361SAndroid Build Coastguard Worker     /* puts will have a slightly different code path than printf. */
77*344aa361SAndroid Build Coastguard Worker     puts("Hello, test!\n");
78*344aa361SAndroid Build Coastguard Worker 
79*344aa361SAndroid Build Coastguard Worker     check_standard_stats();
80*344aa361SAndroid Build Coastguard Worker }
81*344aa361SAndroid Build Coastguard Worker 
TEST(consoletest,threading)82*344aa361SAndroid Build Coastguard Worker TEST(consoletest, threading) {
83*344aa361SAndroid Build Coastguard Worker     clear_stats();
84*344aa361SAndroid Build Coastguard Worker 
85*344aa361SAndroid Build Coastguard Worker     printf("Hello, %s!\n", "test");
86*344aa361SAndroid Build Coastguard Worker 
87*344aa361SAndroid Build Coastguard Worker     check_standard_stats();
88*344aa361SAndroid Build Coastguard Worker }
89*344aa361SAndroid Build Coastguard Worker 
TEST(consoletest,irq_disabled)90*344aa361SAndroid Build Coastguard Worker TEST(consoletest, irq_disabled) {
91*344aa361SAndroid Build Coastguard Worker     spin_lock_saved_state_t state;
92*344aa361SAndroid Build Coastguard Worker     clear_stats();
93*344aa361SAndroid Build Coastguard Worker 
94*344aa361SAndroid Build Coastguard Worker     arch_interrupt_save(&state, SPIN_LOCK_FLAG_INTERRUPTS);
95*344aa361SAndroid Build Coastguard Worker     printf("Hello, %s!\n", "test");
96*344aa361SAndroid Build Coastguard Worker     arch_interrupt_restore(state, SPIN_LOCK_FLAG_INTERRUPTS);
97*344aa361SAndroid Build Coastguard Worker 
98*344aa361SAndroid Build Coastguard Worker     check_standard_stats();
99*344aa361SAndroid Build Coastguard Worker }
100*344aa361SAndroid Build Coastguard Worker 
TEST(consoletest,steal_lock)101*344aa361SAndroid Build Coastguard Worker TEST(consoletest, steal_lock) {
102*344aa361SAndroid Build Coastguard Worker     spin_lock_saved_state_t state;
103*344aa361SAndroid Build Coastguard Worker     clear_stats();
104*344aa361SAndroid Build Coastguard Worker 
105*344aa361SAndroid Build Coastguard Worker     io_lock(file_io_handle(stdout));
106*344aa361SAndroid Build Coastguard Worker     arch_interrupt_save(&state, SPIN_LOCK_FLAG_INTERRUPTS);
107*344aa361SAndroid Build Coastguard Worker     printf("Hello, %s!\n", "test");
108*344aa361SAndroid Build Coastguard Worker     arch_interrupt_restore(state, SPIN_LOCK_FLAG_INTERRUPTS);
109*344aa361SAndroid Build Coastguard Worker     io_unlock(file_io_handle(stdout));
110*344aa361SAndroid Build Coastguard Worker 
111*344aa361SAndroid Build Coastguard Worker     check_standard_stats();
112*344aa361SAndroid Build Coastguard Worker }
113*344aa361SAndroid Build Coastguard Worker 
run_console_test(struct unittest * test)114*344aa361SAndroid Build Coastguard Worker static bool run_console_test(struct unittest* test) {
115*344aa361SAndroid Build Coastguard Worker     bool tests_passed;
116*344aa361SAndroid Build Coastguard Worker     print_callback_t cb;
117*344aa361SAndroid Build Coastguard Worker     /* Set a stub callback so all paths get exercised. */
118*344aa361SAndroid Build Coastguard Worker     memset(&cb, 0, sizeof(cb));
119*344aa361SAndroid Build Coastguard Worker     cb.print = test_print_callback;
120*344aa361SAndroid Build Coastguard Worker     cb.commit = test_commit_callback;
121*344aa361SAndroid Build Coastguard Worker     register_print_callback(&cb);
122*344aa361SAndroid Build Coastguard Worker     tests_passed = RUN_ALL_TESTS();
123*344aa361SAndroid Build Coastguard Worker     unregister_print_callback(&cb);
124*344aa361SAndroid Build Coastguard Worker     return tests_passed;
125*344aa361SAndroid Build Coastguard Worker }
126*344aa361SAndroid Build Coastguard Worker 
console_test_init(uint level)127*344aa361SAndroid Build Coastguard Worker static void console_test_init(uint level) {
128*344aa361SAndroid Build Coastguard Worker     static struct unittest console_unittest = {
129*344aa361SAndroid Build Coastguard Worker             .port_name = "com.android.kernel.console-unittest",
130*344aa361SAndroid Build Coastguard Worker             .run_test = run_console_test,
131*344aa361SAndroid Build Coastguard Worker     };
132*344aa361SAndroid Build Coastguard Worker 
133*344aa361SAndroid Build Coastguard Worker     unittest_add(&console_unittest);
134*344aa361SAndroid Build Coastguard Worker }
135*344aa361SAndroid Build Coastguard Worker 
136*344aa361SAndroid Build Coastguard Worker LK_INIT_HOOK(console_test, console_test_init, LK_INIT_LEVEL_APPS);
137