Subversion Repositories HelenOS

Rev

Rev 4264 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (c) 2007 Josef Cejka
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. #include <stdio.h>
  30. #include <unistd.h>
  31. #include <ipc/ipc.h>
  32. #include <ipc/services.h>
  33. #include <async.h>
  34. #include <errno.h>
  35. #include <devmap.h>
  36. #include "../tester.h"
  37.  
  38. #include <time.h>
  39.  
  40. #define TEST_DEVICE1 "TestDevice1"
  41. #define TEST_DEVICE2 "TestDevice2"
  42.  
  43. /** Handle requests from clients
  44.  *
  45.  */
  46. static void driver_client_connection(ipc_callid_t iid, ipc_call_t *icall)
  47. {
  48.     ipc_callid_t callid;
  49.     ipc_call_t call;
  50.     int retval;
  51.    
  52.     printf("connected: method=%u arg1=%u, arg2=%u arg3=%u.\n",
  53.         IPC_GET_METHOD(*icall), IPC_GET_ARG1(*icall), IPC_GET_ARG2(*icall),
  54.         IPC_GET_ARG3(*icall));
  55.  
  56.     printf("driver_client_connection.\n");
  57.     ipc_answer_0(iid, EOK);
  58.  
  59.     /* Ignore parameters, the connection is already opened */
  60.     while (1) {
  61.         callid = async_get_call(&call);
  62.         retval = EOK;
  63.         printf("method=%u arg1=%u, arg2=%u arg3=%u.\n",
  64.             IPC_GET_METHOD(call), IPC_GET_ARG1(call),
  65.             IPC_GET_ARG2(call), IPC_GET_ARG3(call));
  66.         switch (IPC_GET_METHOD(call)) {
  67.         case IPC_M_PHONE_HUNGUP:
  68.             /* TODO: Handle hangup */
  69.             return;
  70.         default:
  71.             printf("Unknown device method %u.\n",
  72.                 IPC_GET_METHOD(call));
  73.             retval = ENOENT;
  74.         }
  75.         ipc_answer_0(callid, retval);
  76.     }
  77.     return;
  78. }
  79.  
  80. static int device_client_fibril(void *arg)
  81. {
  82.     int handle;
  83.     int device_phone;
  84.  
  85.     handle = (int)arg;
  86.  
  87.     device_phone = devmap_device_connect(handle, 0);
  88.     if (device_phone < 0) {
  89.         printf("Failed to connect to device (handle = %u).\n",
  90.             handle);
  91.         return -1;
  92.     }
  93.  
  94.     printf("Connected to device.\n");
  95.     ipc_hangup(device_phone);
  96.  
  97.     return EOK;
  98. }
  99.  
  100. /** Communication test with device.
  101.  * @param handle handle to tested instance.
  102.  */
  103. static int device_client(int handle)
  104. {
  105. /*  fid_t fid;
  106.     ipc_call_t call;
  107.     ipc_callid_t callid;
  108.  
  109.     fid = fibril_create(device_client_fibril, (void *)handle);
  110.     fibril_add_ready(fid);
  111.  
  112. */
  113.     return EOK;
  114. }
  115.  
  116. /** Test DevMap from the driver's point of view.
  117.  *
  118.  *
  119.  */
  120. char * test_devmap1(bool quiet)
  121. {
  122.     int driver_phone;
  123.     int dev1_handle;
  124.     int dev2_handle;
  125.     int dev3_handle;
  126.     int handle;
  127.     int rc;
  128.  
  129.     /* Register new driver */
  130.     driver_phone = devmap_driver_register("TestDriver",
  131.         driver_client_connection);
  132.  
  133.     if (driver_phone < 0) {
  134.         return "Error: Cannot register driver.\n"; 
  135.     }
  136.  
  137.     /* Register new device dev1. */
  138.     rc = devmap_device_register(driver_phone, TEST_DEVICE1, &dev1_handle);
  139.     if (rc != EOK) {
  140.         ipc_hangup(driver_phone);
  141.         return "Error: cannot register device.\n";
  142.     }
  143.  
  144.     /*
  145.      * Get handle for dev2 (Should fail unless device is already registered
  146.      * by someone else).
  147.      */
  148.     rc = devmap_device_get_handle(TEST_DEVICE2, &handle, 0);
  149.     if (rc == EOK) {
  150.         ipc_hangup(driver_phone);
  151.         return "Error: got handle for dev2 before it was registered.\n";
  152.     }
  153.  
  154.     /* Register new device dev2. */
  155.     rc = devmap_device_register(driver_phone, TEST_DEVICE2, &dev2_handle);
  156.     if (rc != EOK) {
  157.         ipc_hangup(driver_phone);
  158.         return "Error: cannot register device dev2.\n";
  159.     }
  160.  
  161.     /* Register device dev1 again. */
  162.     rc = devmap_device_register(driver_phone, TEST_DEVICE1, &dev3_handle);
  163.     if (rc == EOK) {
  164.         return "Error: dev1 registered twice.\n";
  165.     }
  166.  
  167.     /* Get handle for dev1. */
  168.     rc = devmap_device_get_handle(TEST_DEVICE1, &handle, 0);
  169.     if (rc != EOK) {
  170.         ipc_hangup(driver_phone);
  171.         return "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
  172.     }
  173.  
  174.     if (handle != dev1_handle) {
  175.         ipc_hangup(driver_phone);
  176.         return "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
  177.     }
  178.  
  179.     if (device_client(dev1_handle) != EOK) {
  180.         ipc_hangup(driver_phone);
  181.         return "Error: failed client test for 'DEVMAP_DEVICE1'.\n";
  182.     }
  183.  
  184.     /* TODO: */
  185.  
  186.     ipc_hangup(driver_phone);
  187.  
  188.     return NULL;
  189. }
  190.  
  191. char *test_devmap2(bool quiet)
  192. {
  193.     /*TODO: Full automatic test */
  194.     return NULL;
  195. }
  196.  
  197. char *test_devmap3(bool quiet)
  198. {
  199.     /* TODO: allow user to call test functions in random order */
  200.     return NULL;
  201. }
  202.  
  203.