LCOV - code coverage report
Current view: directory - tests/unittests/shared/srpc - simple_srpc_test.c (source / functions) Found Hit Coverage
Test: coverage.lcov Lines: 82 52 63.4 %
Date: 2014-06-18 Functions: 0 0 -

       1                 : /*
       2                 :  * Copyright (c) 2012 The Native Client Authors. All rights reserved.
       3                 :  * Use of this source code is governed by a BSD-style license that can be
       4                 :  * found in the LICENSE file.
       5                 :  */
       6                 : 
       7                 : #include "native_client/src/shared/imc/nacl_imc_c.h"
       8                 : #include "native_client/src/shared/srpc/nacl_srpc.h"
       9                 : #include "native_client/src/shared/platform/nacl_threads.h"
      10                 : 
      11                 : #if !defined(__native_client__)
      12                 : #include "native_client/src/trusted/desc/nacl_desc_imc.h"
      13                 : #include "native_client/src/trusted/desc/nrd_all_modules.h"
      14                 : #endif
      15                 : 
      16                 : 
      17                 : #define TEST_NUM 42
      18                 : 
      19                 : /* Writes the last error message to the standard error. */
      20               0 : static void failWithErrno(const char* message) {
      21               0 :   char buffer[256];
      22                 : 
      23               0 :   if (0 == NaClGetLastErrorString(buffer, sizeof(buffer))) {
      24               0 :     fprintf(stderr, "%s: %s", message, buffer);
      25               0 :   }
      26               0 :   exit(EXIT_FAILURE);
      27               0 : }
      28                 : 
      29               1 : static void handleGetNum(NaClSrpcRpc* rpc,
      30               1 :                          NaClSrpcArg** ins,
      31               1 :                          NaClSrpcArg** outs,
      32               1 :                          NaClSrpcClosure* done) {
      33               2 :   UNREFERENCED_PARAMETER(ins);
      34               1 :   outs[0]->u.ival = TEST_NUM;
      35               1 :   rpc->result = NACL_SRPC_RESULT_OK;
      36               1 :   done->Run(done);
      37               1 : }
      38                 : 
      39                 : struct ServiceThreadArgs {
      40                 :   NaClSrpcImcDescType desc;
      41                 : };
      42                 : 
      43               1 : void WINAPI serviceThread(void* arg) {
      44               1 :   struct ServiceThreadArgs* typedArg;
      45               1 :   NaClSrpcImcDescType desc;
      46               1 :   NaClSrpcHandlerDesc handlers[] = {
      47                 :     { "getNum::i", handleGetNum },
      48                 :     { NULL, NULL }
      49                 :   };
      50               1 :   typedArg = (struct ServiceThreadArgs*) arg;
      51               1 :   desc = typedArg->desc;
      52               1 :   free(typedArg);
      53                 : 
      54               1 :   if (!NaClSrpcServerLoop(desc, handlers, 0)) {
      55               0 :     failWithErrno("NaClSrpcServerLoop");
      56               0 :     exit(EXIT_FAILURE);
      57                 :   }
      58                 : #ifdef __native_client__
      59                 :   close(desc);
      60                 : #else
      61               1 :   NaClDescUnref(desc);
      62                 : #endif
      63               1 :   NaClThreadExit();
      64               1 : }
      65                 : 
      66               1 : int main(int argc, char* argv[]) {
      67               1 :   int result;
      68               1 :   NaClHandle pair[2];
      69                 : #ifdef __native_client__
      70                 :   int imc_desc[2];
      71                 : #else
      72               1 :   struct NaClDescImcDesc* imc_desc[2];
      73                 : #endif
      74               1 :   struct NaClThread thr;
      75               1 :   NaClSrpcChannel channel;
      76               1 :   NaClSrpcError error;
      77               1 :   struct ServiceThreadArgs* threadArg;
      78                 : 
      79               2 :   UNREFERENCED_PARAMETER(argc);
      80               2 :   UNREFERENCED_PARAMETER(argv);
      81                 : 
      82               1 :   NaClSrpcModuleInit();
      83                 : 
      84               1 :   if (0 != NaClSocketPair(pair)) {
      85               0 :     failWithErrno("SocketPair");
      86               0 :   }
      87                 : 
      88                 : #ifdef __native_client__
      89                 :   imc_desc[0] = pair[0];
      90                 :   imc_desc[1] = pair[1];
      91                 : #else
      92               1 :   NaClNrdAllModulesInit();
      93                 : 
      94               1 :   imc_desc[0] = (struct NaClDescImcDesc*) calloc(1, sizeof(*imc_desc[0]));
      95               1 :   if (0 == imc_desc[0]) {
      96               0 :     failWithErrno("calloc");
      97               0 :   }
      98               1 :   imc_desc[1] = (struct NaClDescImcDesc*) calloc(1, sizeof(*imc_desc[1]));
      99               1 :   if (0 == imc_desc[1]) {
     100               0 :     failWithErrno("calloc");
     101               0 :   }
     102                 : 
     103               1 :   if (!NaClDescImcDescCtor(imc_desc[0], pair[0])) {
     104               0 :     failWithErrno("NaClDescImcDescCtor");
     105               0 :   }
     106                 : 
     107               1 :   if (!NaClDescImcDescCtor(imc_desc[1], pair[1])) {
     108               0 :     failWithErrno("NaClDescImcDescCtor");
     109               0 :   }
     110                 : #endif
     111                 : 
     112               1 :   threadArg = (struct ServiceThreadArgs*) calloc(1, sizeof(*threadArg));
     113               1 :   if (NULL == threadArg) {
     114               0 :     failWithErrno("calloc for threadArg");
     115               0 :   }
     116               1 :   threadArg->desc = (NaClSrpcImcDescType)imc_desc[0];
     117                 : 
     118               1 :   if (!NaClThreadCreateJoinable(&thr, serviceThread, threadArg, 128*1024)) {
     119               0 :     failWithErrno("NaClThreadCtor");
     120               0 :   }
     121                 : 
     122               1 :   if (!NaClSrpcClientCtor(&channel, (NaClSrpcImcDescType) imc_desc[1])) {
     123               0 :     failWithErrno("NaClSrpcClientCtor");
     124               0 :   }
     125                 : 
     126               1 :   error = NaClSrpcInvokeBySignature(&channel, "getNum::i", &result);
     127               1 :   if (NACL_SRPC_RESULT_OK != error) {
     128               0 :     fprintf(stderr,
     129                 :             "SRPC call to getNum::i failed: %s\n",
     130               0 :             NaClSrpcErrorString(error));
     131               0 :     exit(EXIT_FAILURE);
     132                 :   }
     133                 : 
     134               1 :   if (TEST_NUM != result) {
     135               0 :     fprintf(stderr, "expected: %d, got: %d\n", TEST_NUM, result);
     136               0 :     exit(EXIT_FAILURE);
     137                 :   }
     138                 : 
     139               1 :   NaClSrpcDtor(&channel);
     140                 : #ifdef __native_client__
     141                 :   close(imc_desc[1]);
     142                 : #else
     143               1 :   NaClDescUnref((NaClSrpcImcDescType)imc_desc[1]);
     144                 : #endif
     145                 : 
     146               1 :   NaClThreadJoin(&thr);
     147                 : 
     148               1 :   NaClSrpcModuleFini();
     149               1 :   return 0;
     150                 : }

Generated by: LCOV version 1.7