Subversion Repositories HelenOS

Rev

Rev 4327 | 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.     const char *retval = NULL;
  123.    
  124.     /* Register new driver */
  125.     int rc = devmap_driver_register("TestDriver", driver_client_connection);
  126.     if (rc < 0) {
  127.         retval = "Error: Cannot register driver.\n";
  128.         goto out;
  129.     }
  130.    
  131.     /* Register new device dev1. */
  132.     dev_handle_t dev1_handle;
  133.     rc = devmap_device_register(TEST_DEVICE1, &dev1_handle);
  134.     if (rc != EOK) {
  135.         retval = "Error: cannot register device.\n";
  136.         goto out;
  137.     }
  138.    
  139.     /*
  140.      * Get handle for dev2 (Should fail unless device is already registered
  141.      * by someone else).
  142.      */
  143.     dev_handle_t handle;
  144.     rc = devmap_device_get_handle(TEST_DEVICE2, &handle, 0);
  145.     if (rc == EOK) {
  146.         retval = "Error: got handle for dev2 before it was registered.\n";
  147.         goto out;
  148.     }
  149.    
  150.     /* Register new device dev2. */
  151.     dev_handle_t dev2_handle;
  152.     rc = devmap_device_register(TEST_DEVICE2, &dev2_handle);
  153.     if (rc != EOK) {
  154.         retval = "Error: cannot register device dev2.\n";
  155.         goto out;
  156.     }
  157.    
  158.     /* Register device dev1 again. */
  159.     dev_handle_t dev3_handle;
  160.     rc = devmap_device_register(TEST_DEVICE1, &dev3_handle);
  161.     if (rc == EOK) {
  162.         retval = "Error: dev1 registered twice.\n";
  163.         goto out;
  164.     }
  165.    
  166.     /* Get handle for dev1. */
  167.     rc = devmap_device_get_handle(TEST_DEVICE1, &handle, 0);
  168.     if (rc != EOK) {
  169.         retval = "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
  170.         goto out;
  171.     }
  172.    
  173.     if (handle != dev1_handle) {
  174.         retval = "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n";
  175.         goto out;
  176.     }
  177.    
  178.     if (device_client(dev1_handle) != EOK) {
  179.         retval = "Error: failed client test for 'DEVMAP_DEVICE1'.\n";
  180.         goto out;
  181.     }
  182.    
  183. out:
  184.     devmap_hangup_phone(DEVMAP_DRIVER);
  185.     devmap_hangup_phone(DEVMAP_CLIENT);
  186.    
  187.     return NULL;
  188. }
  189.  
  190. char *test_devmap2(bool quiet)
  191. {
  192.     /*TODO: Full automatic test */
  193.     return NULL;
  194. }
  195.  
  196. char *test_devmap3(bool quiet)
  197. {
  198.     /* TODO: allow user to call test functions in random order */
  199.     return NULL;
  200. }
  201.  
  202.