Changeset dd655970 in mainline for uspace/tester/tester.c


Ignore:
Timestamp:
2007-04-06T14:01:46Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
69e9dd2
Parents:
3ce7f082
Message:

new user space testing framework (unfinished)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/tester/tester.c

    r3ce7f082 rdd655970  
    11/*
    22 * Copyright (c) 2006 Ondrej Palkovsky
     3 * Copyright (c) 2007 Martin Decky
    34 * All rights reserved.
    45 *
     
    2728 */
    2829
    29 /** @addtogroup ippc IPC Tester
    30  * @brief       IPC tester and task faulter.
     30/** @addtogroup tester User space Tester
     31 * @brief       User space testing infrastructure.
    3132 * @{
    3233 */
     
    3536 */
    3637
     38#include <unistd.h>
    3739#include <stdio.h>
    38 #include <async.h>
    39 #include <ipc/ipc.h>
    40 #include <ipc/services.h>
    41 #include <errno.h>
     40#include "tester.h"
    4241
    43 #define TEST_START       10000
    44 #define MAXLIST          4
     42int myservice = 0;
     43int phones[MAX_PHONES];
     44int connections[MAX_CONNECTIONS];
     45ipc_callid_t callids[MAX_CONNECTIONS];
    4546
    46 #define MSG_HANG_ME_UP   2000
     47test_t tests[] = {
     48#include "thread/thread1.def"
     49#include "print/print1.def"
     50#include "ipc/register.def"
     51#include "ipc/connect.def"
     52        {NULL, NULL, NULL}
     53};
    4754
    48 static int connections[50];
    49 static ipc_callid_t callids[50];
    50 static int phones[20];
    51 static int myservice = 0;
     55static bool run_test(test_t *test)
     56{
     57        printf("%s\t\t%s\n", test->name, test->desc);
     58       
     59        /* Execute the test */
     60        char * ret = test->entry(false);
     61       
     62        if (ret == NULL) {
     63                printf("Test passed\n\n");
     64                return true;
     65        }
    5266
    53 static void client_connection(ipc_callid_t iid, ipc_call_t *icall)
    54 {
    55         ipc_callid_t callid;
    56         ipc_call_t call;
    57         ipcarg_t phonehash = icall->in_phone_hash;
    58         int retval;
    59         int i;
    60 
    61         printf("Connected phone: %P, accepting\n", icall->in_phone_hash);
    62         ipc_answer_fast(iid, 0, 0, 0);
    63         for (i=0;i < 1024;i++)
    64                 if (!connections[i]) {
    65                         connections[i] = phonehash;
    66                         break;
    67                 }
    68        
    69         while (1) {
    70                 callid = async_get_call(&call);
    71                 switch (IPC_GET_METHOD(call)) {
    72                 case IPC_M_PHONE_HUNGUP:
    73                         printf("Phone (%P) hung up.\n", phonehash);
    74                         retval = 0;
    75                         break;
    76                 default:
    77                         printf("Received message from %P: %X\n", phonehash,callid);
    78                         for (i = 0; i < 1024; i++)
    79                                 if (!callids[i]) {
    80                                         callids[i] = callid;
    81                                         break;
    82                                 }
    83                         continue;
    84                 }
    85                 ipc_answer_fast(callid, retval, 0, 0);
    86         }
     67        printf("%s\n\n", ret);
     68        return false;
    8769}
    8870
    89 static void printhelp(void)
     71static void run_safe_tests(void)
    9072{
    91         printf("? - help\n");
    92         printf("c - connect to other service\n");
    93         printf("h - hangup connection\n");
    94         printf("a - send async message to other service\n");
    95         printf("s - send sync message to other service\n");
    96         printf("d - answer message that we have received\n");
    97         printf("j - jump to endless loop\n");
    98         printf("p - page fault\n");
    99         printf("u - unaligned read\n");
    10073}
    10174
    102 static void callback(void *private, int retval, ipc_call_t *data)
     75static void list_tests(void)
    10376{
    104         printf("Received response to msg %d - retval: %d.\n", private,
    105                retval);
    106 }
    107 
    108 static void do_answer_msg(void)
    109 {
    110         int i,cnt, errn = 0;
    111         char c;
    112 
    113         cnt = 0;
    114         for (i = 0;i < 50; i++) {
    115                 if (callids[i]) {
    116                         printf("%d: %P\n", cnt, callids[i]);
    117                         cnt++;
    118                 }
    119                 if (cnt >= 10)
    120                         break;
    121         }
    122         if (!cnt)
    123                 return;
    124         printf("Choose message:\n");
    125         do {
    126                 c = getchar();
    127         } while (c < '0' || (c-'0') >= cnt);
    128         cnt = c - '0' + 1;
     77        test_t *test;
     78        char c = 'a';
    12979       
    130         for (i = 0; cnt; i++)
    131                 if (callids[i])
    132                         cnt--;
    133         i -= 1;
    134 
    135         printf("Normal (n) or hangup (h) or error(e) message?\n");
    136         do {
    137                 c = getchar();
    138         } while (c != 'n' && c != 'h' && c != 'e');
    139         if (c == 'n')
    140                 errn = 0;
    141         else if (c == 'h')
    142                 errn = EHANGUP;
    143         else if (c == 'e')
    144                 errn = ENOENT;
    145         printf("Answering %P\n", callids[i]);
    146         ipc_answer_fast(callids[i], errn, 0, 0);
    147         callids[i] = 0;
    148 }
    149 
    150 static void do_send_msg(int async)
    151 {
    152         int phoneid;
    153         int res;
    154         static int msgid = 1;
    155         char c;
    156 
    157         printf("Select phoneid to send msg: 2-9\n");
    158         do {
    159                 c = getchar();
    160         } while (c < '2' || c > '9');
    161         phoneid = c - '0';
    162 
    163         if (async) {
    164                 ipc_call_async(phoneid, 2000, 0, (void *)msgid, callback, 1);
    165                 printf("Async sent - msg %d\n", msgid);
    166                 msgid++;
    167         } else {
    168                 printf("Sending msg...");
    169                 res = ipc_call_sync_2(phoneid, 2000, 0, 0, NULL, NULL);
    170                 printf("done: %d\n", res);
    171         }
    172 }
    173 
    174 static void do_hangup(void)
    175 {
    176         char c;
    177         int res;
    178         int phoneid;
    179 
    180         printf("Select phoneid to hangup: 2-9\n");
    181         do {
    182                 c = getchar();
    183         } while (c < '2' || c > '9');
    184         phoneid = c - '0';
     80        for (test = tests; test->name != NULL; test++, c++)
     81                printf("%c\t%s\t\t%s%s\n", c, test->name, test->desc, (test->safe ? "" : " (unsafe)"));
    18582       
    186         printf("Hanging up...");
    187         res = ipc_hangup(phoneid);
    188         printf("done: %d\n", phoneid);
    189 }
    190 
    191 static void do_connect(void)
    192 {
    193         char c;
    194         int svc;
    195         int phid;
    196 
    197         printf("Choose one service: 0:10000....9:10009\n");
    198         do {
    199                 c = getchar();
    200         } while (c < '0' || c > '9');
    201         svc = TEST_START + c - '0';
    202         if (svc == myservice) {
    203                 printf("Currently cannot connect to myself, update test\n");
    204                 return;
    205         }
    206         printf("Connecting to %d..", svc);
    207         phid = ipc_connect_me_to(PHONE_NS, svc, 0);
    208         if (phid > 0) {
    209                 printf("phoneid: %d\n", phid);
    210                 phones[phid] = 1;
    211         } else
    212                 printf("error: %d\n", phid);
     83        printf("*\t\t\tRun all safe tests\n");
    21384}
    21485
    21586int main(void)
    21687{
    217         ipcarg_t phonead;
    218         int i;
    219         char c;
    220         int res;
    221         volatile long long var;
    222         volatile int var1;
    223        
    224         printf("********************************\n");
    225         printf("***********IPC Tester***********\n");
    226         printf("********************************\n");
    227        
    228         async_set_client_connection(client_connection);
    229 
    230         for (i = TEST_START; i < TEST_START + 10; i++) {
    231                 res = ipc_connect_to_me(PHONE_NS, i, 0, &phonead);
    232                 if (!res)
    233                         break;
    234                 printf("Failed registering as %d..:%d\n", i, res);
    235         }
    236         printf("Registered as service: %d\n", i);
    237         myservice = i;
    238 
    239         printhelp();
    24088        while (1) {
     89                char c;
     90                test_t *test;
     91               
     92                list_tests();
     93                printf("> ");
     94               
    24195                c = getchar();
    242                 switch (c) {
    243                 case '?':
    244                         printhelp();
    245                         break;
    246                 case 'h':
    247                         do_hangup();
    248                         break;
    249                 case 'c':
    250                         do_connect();
    251                         break;
    252                 case 'a':
    253                         do_send_msg(1);
    254                         break;
    255                 case 's':
    256                         do_send_msg(0);
    257                         break;
    258                 case 'd':
    259                         do_answer_msg();
    260                         break;
    261                 case 'j':
    262                         printf("Entering infinite loop\n");
    263                         while (1)
    264                                 ;
    265                         break;
    266                 case 'p':
    267                         printf("Doing page fault\n");
    268                         *((char *)0) = 1;
    269                         printf("done\n");
    270                         break;
    271                 case 'u':
    272                         var1=*( (int *) ( ( (char *)(&var) ) + 1 ) );
    273                         break;
    274                 }
     96                printf("%c\n", c);
     97               
     98                if ((c >= 'a') && (c <= 'z')) {
     99                        for (test = tests; test->name != NULL; test++, c--)
     100                                if (c == 'a')
     101                                        break;
     102                       
     103                        if (c > 'a')
     104                                printf("Unknown test\n\n");
     105                        else
     106                                run_test(test);
     107                } else if (c == '*')
     108                        run_safe_tests();
     109                else
     110                        printf("Invalid test\n\n");
    275111        }
    276112}
     
    278114/** @}
    279115 */
    280 
Note: See TracChangeset for help on using the changeset viewer.