(file) Return to testSnmpHandler.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Handler / snmpIndicationHandler / tests / testclient

   1 martin 1.17 //%LICENSE////////////////////////////////////////////////////////////////
   2 martin 1.18 //
   3 martin 1.17 // Licensed to The Open Group (TOG) under one or more contributor license
   4             // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
   5             // this work for additional information regarding copyright ownership.
   6             // Each contributor licenses this file to you under the OpenPegasus Open
   7             // Source License; you may not use this file except in compliance with the
   8             // License.
   9 martin 1.18 //
  10 martin 1.17 // Permission is hereby granted, free of charge, to any person obtaining a
  11             // copy of this software and associated documentation files (the "Software"),
  12             // to deal in the Software without restriction, including without limitation
  13             // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14             // and/or sell copies of the Software, and to permit persons to whom the
  15             // Software is furnished to do so, subject to the following conditions:
  16 martin 1.18 //
  17 martin 1.17 // The above copyright notice and this permission notice shall be included
  18             // in all copies or substantial portions of the Software.
  19 martin 1.18 //
  20 martin 1.17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21 martin 1.18 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22 martin 1.17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  23             // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  24             // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  25             // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  26             // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27 martin 1.18 //
  28 martin 1.17 //////////////////////////////////////////////////////////////////////////
  29 yi.zhou 1.1  //
  30              //%/////////////////////////////////////////////////////////////////////////////
  31              
  32              #include <Pegasus/Common/PegasusAssert.h>
  33              #include <Pegasus/Common/Thread.h>
  34              #include <Pegasus/Common/Constants.h>
  35              #include <Pegasus/Common/FileSystem.h>
  36 thilo.boehm 1.20 #include <Pegasus/General/Stopwatch.h>
  37 yi.zhou     1.1  #include <Pegasus/Client/CIMClient.h>
  38 dave.sudlik 1.6  #include <Pegasus/Common/HostAddress.h>
  39 sahana.prabhakar 1.22 #ifdef PEGASUS_USE_NET_SNMP
  40                       # include <net-snmp/net-snmp-config.h>
  41                       # include <net-snmp/net-snmp-includes.h>
  42                       #endif
  43 yi.zhou          1.1  
  44                       PEGASUS_USING_PEGASUS;
  45                       PEGASUS_USING_STD;
  46                       
  47 karl             1.4  // Interop namespace used with PEGASUS_NAMESPACENAME_INTEROP in Constants.h
  48 kumpf            1.7  const CIMNamespaceName SOURCE_NAMESPACE =
  49 kumpf            1.9      CIMNamespaceName ("test/TestProvider");
  50 yi.zhou          1.1  
  51 kumpf            1.9  const String INDICATION_CLASS_NAME = "Test_IndicationProviderClass";
  52 yi.zhou          1.1  
  53 kumpf            1.9  const String SNMPV1_HANDLER_NAME = "SNMPHandler01";
  54                       const String SNMPV2C_HANDLER_NAME = "SNMPHandler02";
  55                       const String SNMPV2C_IPV6_HANDLER_NAME = "SNMPHandler03";
  56 sahana.prabhakar 1.21 const String SNMPV3_HANDLER_NAME = "SNMPHandler04";
  57 denise.eckstein  1.16 const String FILTER_NAME = "SNMPIPFilter01";
  58 yi.zhou          1.1  
  59 sahana.prabhakar 1.21 enum SNMPVersion {_SNMPV1_TRAP = 2, _SNMPV2C_TRAP = 3, _SNMPV3_TRAP=5};
  60 dave.sudlik      1.6  enum TargetHostFormat {_HOST_NAME = 2, _IPV4_ADDRESS = 3, _IPV6_ADDRESS = 4};
  61 yi.zhou          1.1  
  62                       #define PORT_NUMBER 2006
  63                       
  64                       AtomicInt errorsEncountered(0);
  65                       
  66                       ////////////////////////////////////////////////////////////////////////////////
  67                       //
  68                       // Thread Parameters Class
  69                       //
  70                       ////////////////////////////////////////////////////////////////////////////////
  71                       
  72 kumpf            1.7  class T_Parms
  73                       {
  74                       public:
  75 kumpf            1.15     CIMClient* client;
  76 yi.zhou          1.1      Uint32 indicationSendCount;
  77                           Uint32 uniqueID;
  78                       };
  79                       
  80                       ///////////////////////////////////////////////////////////////////////////
  81                       
  82 kumpf            1.7  CIMObjectPath _getFilterObjectPath(const String & name)
  83 yi.zhou          1.1  {
  84                           Array<CIMKeyBinding> keyBindings;
  85                           keyBindings.append (CIMKeyBinding ("SystemCreationClassName",
  86                               System::getSystemCreationClassName (), CIMKeyBinding::STRING));
  87                           keyBindings.append (CIMKeyBinding ("SystemName",
  88                               System::getFullyQualifiedHostName (), CIMKeyBinding::STRING));
  89                           keyBindings.append (CIMKeyBinding ("CreationClassName",
  90                               PEGASUS_CLASSNAME_INDFILTER.getString(), CIMKeyBinding::STRING));
  91                           keyBindings.append (CIMKeyBinding ("Name", name,
  92                               CIMKeyBinding::STRING));
  93                           return(CIMObjectPath("", CIMNamespaceName (),
  94                               PEGASUS_CLASSNAME_INDFILTER, keyBindings));
  95                       }
  96                       
  97 kumpf            1.7  CIMObjectPath _getHandlerObjectPath(const String & name)
  98 yi.zhou          1.1  {
  99                           Array<CIMKeyBinding> keyBindings;
 100                           keyBindings.append (CIMKeyBinding ("SystemCreationClassName",
 101                               System::getSystemCreationClassName (), CIMKeyBinding::STRING));
 102                           keyBindings.append (CIMKeyBinding ("SystemName",
 103                               System::getFullyQualifiedHostName (), CIMKeyBinding::STRING));
 104                           keyBindings.append (CIMKeyBinding ("CreationClassName",
 105                               PEGASUS_CLASSNAME_INDHANDLER_SNMP.getString(),
 106                               CIMKeyBinding::STRING));
 107                           keyBindings.append (CIMKeyBinding ("Name", name,
 108                               CIMKeyBinding::STRING));
 109                           return(CIMObjectPath("", CIMNamespaceName (),
 110                               PEGASUS_CLASSNAME_INDHANDLER_SNMP, keyBindings));
 111                       }
 112                       
 113 kumpf            1.7  CIMObjectPath _getSubscriptionObjectPath(
 114                           const String & filterName,
 115                           const String & handlerName)
 116 yi.zhou          1.1  {
 117                           CIMObjectPath filterObjectPath = _getFilterObjectPath(filterName);
 118                       
 119                           CIMObjectPath handlerObjectPath = _getHandlerObjectPath(handlerName);
 120                       
 121                           Array<CIMKeyBinding> subscriptionKeyBindings;
 122                           subscriptionKeyBindings.append (CIMKeyBinding ("Filter",
 123                               CIMValue(filterObjectPath)));
 124                           subscriptionKeyBindings.append (CIMKeyBinding ("Handler",
 125                               CIMValue(handlerObjectPath)));
 126                           return(CIMObjectPath("", CIMNamespaceName (),
 127                               PEGASUS_CLASSNAME_INDSUBSCRIPTION, subscriptionKeyBindings));
 128                       }
 129                       
 130 kumpf            1.7  CIMObjectPath _createHandlerInstance(
 131                           CIMClient & client,
 132                           const String & name,
 133                           const String & targetHost,
 134                           const String & securityName,
 135                           const Uint16 targetHostFormat,
 136 sahana.prabhakar 1.21     const Uint16 snmpVersion,
 137                           const String & snmpEngineID,
 138                           const Uint8 & snmpSecLevel,
 139                           const Uint8 & snmpSecAuthProto,
 140                           const String & snmpSecAuthKey,
 141                           const Uint8 & snmpSecPrivProto,
 142                           const String & snmpSecPrivKey)
 143 yi.zhou          1.1  {
 144                           CIMInstance handlerInstance (PEGASUS_CLASSNAME_INDHANDLER_SNMP);
 145                           handlerInstance.addProperty (CIMProperty (CIMName
 146                               ("SystemCreationClassName"), System::getSystemCreationClassName ()));
 147                           handlerInstance.addProperty (CIMProperty (CIMName ("SystemName"),
 148                               System::getFullyQualifiedHostName ()));
 149                           handlerInstance.addProperty (CIMProperty (CIMName ("CreationClassName"),
 150                               PEGASUS_CLASSNAME_INDHANDLER_SNMP.getString ()));
 151                           handlerInstance.addProperty (CIMProperty (CIMName ("Name"), name));
 152                           handlerInstance.addProperty (CIMProperty (CIMName ("TargetHost"),
 153                               targetHost));
 154                           handlerInstance.addProperty (CIMProperty (CIMName ("TargetHostFormat"),
 155                               CIMValue ((Uint16) targetHostFormat)));
 156                           handlerInstance.addProperty (CIMProperty (CIMName ("SNMPSecurityName"),
 157                               securityName));
 158                           handlerInstance.addProperty (CIMProperty (CIMName ("SnmpVersion"),
 159                               CIMValue ((Uint16) snmpVersion)));
 160                           handlerInstance.addProperty (CIMProperty (CIMName ("PortNumber"),
 161                               CIMValue ((Uint32) PORT_NUMBER)));
 162 sahana.prabhakar 1.22 
 163                       #ifdef PEGASUS_ENABLE_NET_SNMPV3
 164 sahana.prabhakar 1.21     if(snmpVersion == _SNMPV3_TRAP)
 165                           {
 166                       
 167                               handlerInstance.addProperty (CIMProperty (
 168                                   CIMName ("SNMPEngineID"),snmpEngineID));
 169                               handlerInstance.addProperty (CIMProperty (
 170                                   CIMName ("SNMPSecurityLevel"),snmpSecLevel)); //AuthPriv
 171                               handlerInstance.addProperty (CIMProperty (
 172                                   CIMName ("SNMPSecurityAuthProtocol"),snmpSecAuthProto));
 173                       
 174                               size_t snmpSecAuthProtoLen=0;
 175                        
 176 lawrence.luo     1.23.10.1         oid *snmpSecAuthProtoOid = NULL;
 177 sahana.prabhakar 1.21              if(snmpSecAuthKey.size() > 0)
 178                                    {
 179                                       if(snmpSecAuthProto == 1)
 180                                        {
 181                                            snmpSecAuthProtoOid = snmp_duplicate_objid(
 182                                                usmHMACMD5AuthProtocol,
 183                                                USM_AUTH_PROTO_MD5_LEN);
 184                                            snmpSecAuthProtoLen = USM_AUTH_PROTO_MD5_LEN;
 185                                        }
 186                                        else if(snmpSecAuthProto == 2)
 187                                        {
 188                                            snmpSecAuthProtoOid = snmp_duplicate_objid(
 189                                                usmHMACSHA1AuthProtocol,
 190                                                USM_AUTH_PROTO_SHA_LEN);
 191                                            snmpSecAuthProtoLen = USM_AUTH_PROTO_SHA_LEN;
 192                                        }
 193                                        else 
 194                                        {
 195                                            cout << "Invalid authentication protocol specified to " << 
 196                                                "create handler." << endl;
 197                                            PEGASUS_TEST_ASSERT(false);
 198 sahana.prabhakar 1.21                  }
 199                            
 200                                        CString snmpSecAuthKeyCstr = snmpSecAuthKey.getCString();
 201                                        size_t authKeyLen = snmpSecAuthKey.size();
 202                                        u_char * snmpSecAuthKeyPtr = (u_char *)malloc(authKeyLen);
 203                                        u_char * encryptedSecurityAuthKey = (u_char *)malloc(authKeyLen);
 204                                        size_t securityAuthKeyLen = USM_AUTH_KU_LEN;
 205                                        memcpy(snmpSecAuthKeyPtr,(const char *)snmpSecAuthKeyCstr,
 206                                            strlen(snmpSecAuthKeyCstr));
 207                                        snmpSecAuthKeyPtr[authKeyLen] = '\0';
 208                             
 209                                        if(generate_Ku(snmpSecAuthProtoOid,
 210                                            snmpSecAuthProtoLen,
 211                                            snmpSecAuthKeyPtr,
 212                                            strlen(snmpSecAuthKeyCstr),
 213                                            encryptedSecurityAuthKey,
 214                                            &securityAuthKeyLen) != SNMPERR_SUCCESS)
 215                                        {
 216                                            cout << "Failed to generate the snmp authentication key" 
 217                                                << endl;
 218                                            free(snmpSecAuthKeyPtr);
 219 sahana.prabhakar 1.21                      free(encryptedSecurityAuthKey);
 220                                            PEGASUS_TEST_ASSERT(false);
 221                                        }
 222                            
 223                                        Array<Uint8> authKey;
 224                                        for(Uint32 i=0; i<securityAuthKeyLen; i++)
 225                                        {
 226                                            authKey.append(encryptedSecurityAuthKey[i]);
 227                                        }
 228                                        handlerInstance.addProperty (CIMProperty (
 229                                            CIMName ("SNMPSecurityAuthKey"),
 230                                            authKey));
 231                                        free(snmpSecAuthKeyPtr);
 232                                        free(encryptedSecurityAuthKey);
 233                                    }
 234                            
 235                                    handlerInstance.addProperty (CIMProperty (
 236                                        CIMName ("SNMPSecurityPrivProtocol"),snmpSecPrivProto)); 
 237                             
 238                                    if(snmpSecPrivKey.size() > 0 )
 239                                    {
 240 sahana.prabhakar 1.21                  CString snmpSecPrivKeyCstr = snmpSecPrivKey.getCString();
 241                                        u_char * snmpSecPrivKeyPtr = (u_char *)malloc(USM_PRIV_KU_LEN);
 242                                        u_char * encryptedSecurityPrivKey = 
 243                                            (u_char *)malloc(USM_PRIV_KU_LEN);
 244                                        size_t securityPrivKeyLen = USM_PRIV_KU_LEN;
 245                                        memcpy(snmpSecPrivKeyPtr,(const char *)snmpSecPrivKeyCstr,
 246                                            USM_PRIV_KU_LEN);
 247                                        if(generate_Ku(snmpSecAuthProtoOid,
 248                                            snmpSecAuthProtoLen,
 249                                            snmpSecPrivKeyPtr,
 250                                            strlen(snmpSecPrivKeyCstr),
 251                                            encryptedSecurityPrivKey,
 252                                            &securityPrivKeyLen) != SNMPERR_SUCCESS)
 253                                        {
 254                                            cout << "Failed to generate the snmp privacy key" 
 255                                                << endl;
 256                                            free(snmpSecPrivKeyPtr);
 257                                            free(encryptedSecurityPrivKey);
 258                                            PEGASUS_TEST_ASSERT(false);
 259                                        }
 260                                 
 261 sahana.prabhakar 1.21                  Array<Uint8> privKey;
 262                                        for(Uint32 i=0; i<securityPrivKeyLen; i++)
 263                                        {
 264                                            privKey.append(encryptedSecurityPrivKey[i]);
 265                                        }
 266                            
 267                                        handlerInstance.addProperty (CIMProperty (
 268                                            CIMName ("SNMPSecurityPrivKey"),
 269                                            privKey));
 270                                        free(snmpSecPrivKeyPtr);
 271                                        free(encryptedSecurityPrivKey);
 272                                    }  
 273                                }
 274 sahana.prabhakar 1.22      #endif // ifdef PEGASUS_ENABLE_NET_SNMPV3
 275 yi.zhou          1.1       
 276 kumpf            1.7           return client.createInstance(
 277                                    PEGASUS_NAMESPACENAME_INTEROP, handlerInstance);
 278 yi.zhou          1.1       }
 279                            
 280 kumpf            1.7       CIMObjectPath _createFilterInstance(
 281                                CIMClient & client,
 282                                const String & name,
 283                                const String & query,
 284                                const String & qlang)
 285 yi.zhou          1.1       {
 286                                CIMInstance filterInstance (PEGASUS_CLASSNAME_INDFILTER);
 287                                filterInstance.addProperty (CIMProperty (CIMName
 288                                    ("SystemCreationClassName"), System::getSystemCreationClassName ()));
 289                                filterInstance.addProperty (CIMProperty (CIMName ("SystemName"),
 290                                    System::getFullyQualifiedHostName ()));
 291                                filterInstance.addProperty (CIMProperty (CIMName ("CreationClassName"),
 292                                    PEGASUS_CLASSNAME_INDFILTER.getString ()));
 293                                filterInstance.addProperty (CIMProperty (CIMName ("Name"), name));
 294                                filterInstance.addProperty (CIMProperty (CIMName ("Query"), query));
 295                                filterInstance.addProperty (CIMProperty (CIMName ("QueryLanguage"),
 296                                    String (qlang)));
 297                                filterInstance.addProperty (CIMProperty (CIMName ("SourceNamespace"),
 298                                    SOURCE_NAMESPACE.getString ()));
 299                            
 300 kumpf            1.7           return client.createInstance(PEGASUS_NAMESPACENAME_INTEROP, filterInstance);
 301 yi.zhou          1.1       }
 302                            
 303 kumpf            1.7       CIMObjectPath _createSubscriptionInstance(
 304                                CIMClient & client,
 305                                const CIMObjectPath & filterPath,
 306                                const CIMObjectPath & handlerPath)
 307 yi.zhou          1.1       {
 308                                CIMInstance subscriptionInstance (PEGASUS_CLASSNAME_INDSUBSCRIPTION);
 309                                subscriptionInstance.addProperty (CIMProperty (CIMName ("Filter"),
 310                                    filterPath, 0, PEGASUS_CLASSNAME_INDFILTER));
 311                                subscriptionInstance.addProperty (CIMProperty (CIMName ("Handler"),
 312                                    handlerPath, 0, PEGASUS_CLASSNAME_INDHANDLER_SNMP));
 313                                subscriptionInstance.addProperty (CIMProperty
 314                                    (CIMName ("SubscriptionState"), CIMValue ((Uint16) 2)));
 315                            
 316 kumpf            1.7           return client.createInstance(
 317                                    PEGASUS_NAMESPACENAME_INTEROP, subscriptionInstance);
 318 yi.zhou          1.1       }
 319                            
 320 kumpf            1.7       void _sendTestIndication(
 321                                CIMClient* client,
 322                                const CIMName & methodName,
 323                                Uint32 indicationSendCount)
 324 yi.zhou          1.1       {
 325                                //
 326                                //  Invoke method to send test indication
 327                                //
 328                                Array <CIMParamValue> inParams;
 329                                Array <CIMParamValue> outParams;
 330                                Array <CIMKeyBinding> keyBindings;
 331                                Sint32 result;
 332                            
 333                                CIMObjectPath className (String::EMPTY, CIMNamespaceName (),
 334 kumpf            1.9               CIMName ("Test_IndicationProviderClass"), keyBindings);
 335 yi.zhou          1.1       
 336 kumpf            1.7           inParams.append(CIMParamValue(String("indicationSendCount"),
 337 yi.zhou          1.1               CIMValue(indicationSendCount)));
 338                            
 339                                CIMValue retValue = client->invokeMethod
 340                                    (SOURCE_NAMESPACE,
 341                                     className,
 342                                     methodName,
 343                                     inParams,
 344                                     outParams);
 345                            
 346                                retValue.get (result);
 347                                PEGASUS_TEST_ASSERT (result == 0);
 348                            }
 349                            
 350 kumpf            1.7       void _deleteSubscriptionInstance(
 351                                CIMClient & client,
 352                                const String & filterName,
 353                                const String & handlerName)
 354 yi.zhou          1.1       {
 355                                CIMObjectPath subscriptionObjectPath =
 356                                   _getSubscriptionObjectPath(filterName, handlerName);
 357 kumpf            1.7           client.deleteInstance(
 358                                    PEGASUS_NAMESPACENAME_INTEROP, subscriptionObjectPath);
 359 yi.zhou          1.1       }
 360                            
 361 kumpf            1.7       void _deleteHandlerInstance(
 362                                CIMClient & client,
 363                                const String & name)
 364 yi.zhou          1.1       {
 365                                CIMObjectPath handlerObjectPath = _getHandlerObjectPath(name);
 366 karl             1.4           client.deleteInstance (PEGASUS_NAMESPACENAME_INTEROP, handlerObjectPath);
 367 yi.zhou          1.1       }
 368                            
 369 kumpf            1.7       void _deleteFilterInstance(
 370                                CIMClient & client,
 371                                const String & name)
 372 yi.zhou          1.1       {
 373                                CIMObjectPath filterObjectPath = _getFilterObjectPath(name);
 374 karl             1.4           client.deleteInstance (PEGASUS_NAMESPACENAME_INTEROP, filterObjectPath);
 375 yi.zhou          1.1       }
 376                            
 377 kumpf            1.7       void _usage()
 378 yi.zhou          1.1       {
 379                               cerr << endl
 380                                    << "Usage:" << endl
 381                                    << "    TestSnmpHandler setup [ WQL | DMTF:CQL ]\n"
 382                                    << "    TestSnmpHandler run <indicationSendCount> "
 383                                    << "[<threads>]\n"
 384                                    << "    where: " << endl
 385                                    << "       <indicationSendCount> is the number of indications to\n"
 386                                    << "            generate and has to be greater than zero." << endl
 387                                    << "       <threads> is an optional number of client threads to\n"
 388                                    << "            create, default is one." << endl
 389                                    << "    TestSnmpHandler cleanup\n"
 390 sahana.prabhakar 1.21              << "    TestSnmpHandler removelog\n\n"
 391                                    << "Note :\n"
 392                                    << "For running snmp v3 tests create an user by name \"sahana\" in\n"
 393                                    << "smpd.conf and snmptrapd.conf with the following credentials :- \n"
 394                                    << "engineId = 0x80001f88808a67e858ee38ec4c \n"
 395                                    << "Authentication protocol = MD5 \n"
 396                                    << "Privacy Protocol = DES \n"
 397                                    << "Authentication key = setup_passphrase \n"
 398 yi.zhou          1.1               << endl << endl;
 399                            }
 400                            
 401                            void _setup (CIMClient & client, const String& qlang)
 402                            {
 403                                CIMObjectPath filterObjectPath;
 404                                CIMObjectPath snmpv1HandlerObjectPath;
 405                                CIMObjectPath snmpv2HandlerObjectPath;
 406 yi.zhou          1.8           CIMObjectPath snmpv2IPV6HandlerObjectPath;
 407 sahana.prabhakar 1.21          CIMObjectPath snmpv3HandlerObjectPath;
 408 yi.zhou          1.1       
 409                                try
 410                                {
 411                                    filterObjectPath = _createFilterInstance (client, FILTER_NAME,
 412 kumpf            1.9                   String ("SELECT * FROM Test_IndicationProviderClass"),
 413 yi.zhou          1.1                   qlang);
 414                                }
 415                                catch (CIMException& e)
 416                                {
 417                                    if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
 418                                    {
 419                                        filterObjectPath = _getFilterObjectPath(FILTER_NAME);
 420                                        cerr << "----- Warning: Filter Instance Not Created: "
 421                                            << e.getMessage () << endl;
 422                                    }
 423                                    else
 424                                    {
 425                                        cerr << "----- Error: Filter Instance Not Created: " << endl;
 426                                        throw;
 427                                    }
 428                                }
 429                            
 430                                try
 431                                {
 432 kumpf            1.7               // Create SNMPv1 trap handler
 433 yi.zhou          1.1               snmpv1HandlerObjectPath = _createHandlerInstance (client,
 434                                        SNMPV1_HANDLER_NAME,
 435                                        System::getFullyQualifiedHostName(),
 436                                        "",
 437                                        _HOST_NAME,
 438 sahana.prabhakar 1.21                  _SNMPV1_TRAP,
 439                                        String(),0,1,String(),1,String());
 440 yi.zhou          1.1           }
 441                                catch (CIMException& e)
 442                                {
 443                                    if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
 444                                    {
 445                                        snmpv1HandlerObjectPath = _getHandlerObjectPath(
 446                                            SNMPV1_HANDLER_NAME);
 447                                        cerr << "----- Warning: SNMPv1 Trap Handler Instance Not Created: "
 448                                            << e.getMessage () << endl;
 449                                    }
 450                                    else
 451                                    {
 452                                        cerr << "----- Error: SNMPv1 Trap Handler Instance Not Created: "
 453                                            << endl;
 454                                        throw;
 455                                    }
 456                                }
 457                            
 458                                try
 459                                {
 460                                    _createSubscriptionInstance (client, filterObjectPath,
 461 yi.zhou          1.1                    snmpv1HandlerObjectPath);
 462                                }
 463                                catch (CIMException& e)
 464                                {
 465                                    if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
 466                                    {
 467                                        cerr << "----- Warning: Client Subscription Instance: "
 468                                            << e.getMessage () << endl;
 469                                    }
 470                                    else
 471                                    {
 472                                        cerr << "----- Error: Client Subscription Instance: " << endl;
 473                                        throw;
 474                                    }
 475                                }
 476                            
 477                                try
 478                                {
 479 dave.sudlik      1.6               String ipAddress;
 480                                    int af;
 481                                    System::getHostIP(System::getFullyQualifiedHostName (), &af, ipAddress);
 482 kumpf            1.7               // Create SNMPv2 trap handler
 483 yi.zhou          1.1               snmpv2HandlerObjectPath = _createHandlerInstance (client,
 484                                        SNMPV2C_HANDLER_NAME,
 485 dave.sudlik      1.6                   ipAddress,
 486 yi.zhou          1.1                   "public",
 487 dave.sudlik      1.6                   af == AF_INET ? _IPV4_ADDRESS : _IPV6_ADDRESS,
 488 sahana.prabhakar 1.21                  _SNMPV2C_TRAP,
 489                                        String(),0,1,String(),1,String());
 490 yi.zhou          1.1           }
 491                                catch (CIMException& e)
 492                                {
 493                                    if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
 494                                    {
 495                                        snmpv2HandlerObjectPath = _getHandlerObjectPath(
 496                                            SNMPV2C_HANDLER_NAME);
 497                                        cerr << "----- Warning: SNMPv2c Trap Handler Instance Not Created: "
 498                                            << e.getMessage () << endl;
 499                                    }
 500                                    else
 501                                    {
 502                                        cerr << "----- Error: SNMPv2c Trap Handler Instance Not Created: "
 503                                            << endl;
 504                                        throw;
 505                                    }
 506                                }
 507                            
 508                                try
 509                                {
 510                                    _createSubscriptionInstance (client, filterObjectPath,
 511 yi.zhou          1.1                    snmpv2HandlerObjectPath);
 512                                }
 513                                catch (CIMException& e)
 514                                {
 515                                    if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
 516                                    {
 517                                        cerr << "----- Warning: Client Subscription Instance: "
 518                                            << e.getMessage () << endl;
 519                                    }
 520                                    else
 521                                    {
 522                                        cerr << "----- Error: Client Subscription Instance: " << endl;
 523                                        throw;
 524                                    }
 525                                }
 526 yi.zhou          1.8       
 527                            #if defined(PEGASUS_ENABLE_IPV6)
 528                                // create a subscription with trap destination of IPV6 address format
 529                                try
 530                                {
 531                                    // Create SNMPv2 IPV6 trap handler
 532                                    snmpv2IPV6HandlerObjectPath = _createHandlerInstance (client,
 533                                        SNMPV2C_IPV6_HANDLER_NAME,
 534                                        String("::1"),
 535                                        "public",
 536                                        _IPV6_ADDRESS,
 537 sahana.prabhakar 1.21                  _SNMPV2C_TRAP,
 538                                        String(),0,1,String(),1,String());
 539 kumpf            1.19          }
 540 yi.zhou          1.8           catch (CIMException& e)
 541                                {
 542                                    if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
 543                                    {
 544                                        snmpv2IPV6HandlerObjectPath = _getHandlerObjectPath(
 545                                            SNMPV2C_IPV6_HANDLER_NAME);
 546                                        cerr << "----- Warning: SNMPv2c IPV6 Trap Handler Instance "
 547                                            "Not Created: " << e.getMessage () << endl;
 548                                    }
 549                                    else
 550                                    {
 551                                        cerr << "----- Error: SNMPv2c IPV6 Trap Handler Instance Not "
 552                                            "Created: " << endl;
 553                                        throw;
 554                                    }
 555                                }
 556                            
 557                                try
 558                                {
 559                                    _createSubscriptionInstance (client, filterObjectPath,
 560                                         snmpv2IPV6HandlerObjectPath);
 561 yi.zhou          1.8           }
 562                                catch (CIMException& e)
 563                                {
 564                                    if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
 565                                    {
 566                                        cerr << "----- Warning: Client Subscription Instance: "
 567                                            << e.getMessage () << endl;
 568                                    }
 569                                    else
 570                                    {
 571                                        cerr << "----- Error: Client Subscription Instance: " << endl;
 572                                        throw;
 573                                    }
 574                                }
 575                            #endif
 576 sahana.prabhakar 1.21      
 577 sahana.prabhakar 1.22      #ifdef PEGASUS_ENABLE_NET_SNMPV3
 578 sahana.prabhakar 1.21          // create a snmp V3 trap handler.
 579                                try
 580                                {
 581                                    String ipAddress;
 582                                    int af;
 583                                    System::getHostIP(System::getFullyQualifiedHostName (), &af, ipAddress);
 584                                    // Create SNMPv3 trap handler
 585                                    snmpv3HandlerObjectPath = _createHandlerInstance (client,
 586                                        SNMPV3_HANDLER_NAME,
 587                                        System::getFullyQualifiedHostName(),
 588                                        "sahana",
 589                                        _HOST_NAME,
 590                                        _SNMPV3_TRAP, 
 591                                        "0x80001f88808a67e858ee38ec4c",
 592                                        3,
 593                                        1,
 594                                        "setup_passphrase",
 595                                        1,
 596                                        "setup_passphrase");
 597                            
 598                                }
 599 sahana.prabhakar 1.21          catch (CIMException& e)
 600                                {
 601                                    if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
 602                                    {
 603                                        snmpv3HandlerObjectPath = _getHandlerObjectPath(
 604                                            SNMPV2C_IPV6_HANDLER_NAME);
 605                                        cerr << "----- Warning: SNMPv3 Trap Handler Instance "
 606                                            "Not Created: " << e.getMessage () << endl;
 607                                    }
 608                                    else
 609                                    {
 610                                        cerr << "----- Error: SNMPv3 Trap Handler Instance Not "
 611                                            "Created: " << endl;
 612                                        throw;
 613                                    }
 614                                }
 615                            
 616                                try
 617                                {
 618                                    _createSubscriptionInstance (client, filterObjectPath,
 619                                         snmpv3HandlerObjectPath);
 620 sahana.prabhakar 1.21          }
 621                                catch (CIMException& e)
 622                                {
 623                                    if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
 624                                    {
 625                                        cerr << "----- Warning: Client Subscription Instance: "
 626                                            << e.getMessage () << endl;
 627                                    }
 628                                    else
 629                                    {
 630                                        cerr << "----- Error: Client Subscription Instance: " << endl;
 631                                        throw;
 632                                    }
 633                                }
 634 sahana.prabhakar 1.22      #endif // ifdef PEGASUS_ENABLE_NET_SNMPV3
 635 yi.zhou          1.1       }
 636                            
 637                            void _cleanup (CIMClient & client)
 638                            {
 639                                try
 640                                {
 641                                    _deleteSubscriptionInstance (client, FILTER_NAME,
 642                                        SNMPV1_HANDLER_NAME);
 643                                }
 644                                catch (CIMException& e)
 645                                {
 646                                    if (e.getCode() != CIM_ERR_NOT_FOUND)
 647                                    {
 648                                        cerr << "----- Error: deleteSubscriptionInstance failure: "
 649                                             << endl;
 650                                        throw;
 651                                    }
 652                                }
 653                                try
 654                                {
 655                                    _deleteSubscriptionInstance (client, FILTER_NAME,
 656 yi.zhou          1.1                   SNMPV2C_HANDLER_NAME);
 657                                }
 658                                catch (CIMException& e)
 659                                {
 660                                    if (e.getCode() != CIM_ERR_NOT_FOUND)
 661                                    {
 662                                        cerr << "----- Error: deleteSubscriptionInstance failure: "
 663                                             << endl;
 664                                        throw;
 665                                    }
 666                                }
 667 yi.zhou          1.8       
 668                            #if defined(PEGASUS_ENABLE_IPV6)
 669 kumpf            1.19          try
 670 yi.zhou          1.8           {
 671                                    _deleteSubscriptionInstance (client, FILTER_NAME,
 672                                        SNMPV2C_IPV6_HANDLER_NAME);
 673                                }
 674                                catch (CIMException& e)
 675                                {
 676                                    if (e.getCode() != CIM_ERR_NOT_FOUND)
 677                                    {
 678                                        cerr << "----- Error: deleteSubscriptionInstance failure: "
 679                                             << endl;
 680                                        throw;
 681                                    }
 682                                }
 683                            #endif
 684                            
 685 sahana.prabhakar 1.22      #ifdef PEGASUS_ENABLE_NET_SNMPV3
 686 yi.zhou          1.1           try
 687                                {
 688 sahana.prabhakar 1.21              _deleteSubscriptionInstance (client, FILTER_NAME,
 689                                        SNMPV3_HANDLER_NAME);
 690                                }
 691                                catch (CIMException& e)
 692                                {
 693                                    if (e.getCode() != CIM_ERR_NOT_FOUND)
 694                                    {
 695                                        cerr << "----- Error: deleteSubscriptionInstance failure: "
 696                                             << endl;
 697                                        throw;
 698                                    }
 699                                }
 700 sahana.prabhakar 1.22      #endif
 701 sahana.prabhakar 1.21      
 702                                try
 703                                {
 704 yi.zhou          1.1               _deleteFilterInstance (client, FILTER_NAME);
 705                                }
 706                                catch (CIMException& e)
 707                                {
 708                                    if (e.getCode() != CIM_ERR_NOT_FOUND)
 709                                    {
 710                                        cerr << "----- Error: deleteFilterInstance failure: " << endl;
 711                                        throw;
 712                                    }
 713                                }
 714                            
 715                                try
 716                                {
 717                                    _deleteHandlerInstance (client, SNMPV1_HANDLER_NAME);
 718                                }
 719                                catch (CIMException& e)
 720                                {
 721                                    if (e.getCode() != CIM_ERR_NOT_FOUND)
 722                                    {
 723                                        cerr << "----- Error: deleteHandlerInstance failure: " << endl;
 724                                        throw;
 725 yi.zhou          1.1               }
 726                                }
 727                                try
 728                                {
 729                                    _deleteHandlerInstance (client, SNMPV2C_HANDLER_NAME);
 730                                }
 731                                catch (CIMException& e)
 732                                {
 733                                    if (e.getCode() != CIM_ERR_NOT_FOUND)
 734                                    {
 735                                        cerr << "----- Error: deleteHandlerInstance failure: " << endl;
 736                                        throw;
 737                                    }
 738                                }
 739 yi.zhou          1.8       #if defined(PEGASUS_ENABLE_IPV6)
 740                                try
 741                                {
 742                                    _deleteHandlerInstance (client, SNMPV2C_IPV6_HANDLER_NAME);
 743                                }
 744                                catch (CIMException& e)
 745                                {
 746                                    if (e.getCode() != CIM_ERR_NOT_FOUND)
 747                                    {
 748                                        cerr << "----- Error: deleteHandlerInstance failure: " << endl;
 749                                        throw;
 750                                    }
 751                                }
 752                            #endif
 753 sahana.prabhakar 1.21      
 754 sahana.prabhakar 1.22      #ifdef PEGASUS_ENABLE_NET_SNMPV3
 755 sahana.prabhakar 1.21          try
 756                                {
 757                                    _deleteHandlerInstance (client, SNMPV3_HANDLER_NAME);
 758                                }
 759                                catch (CIMException& e)
 760                                {
 761                                    if (e.getCode() != CIM_ERR_NOT_FOUND)
 762                                    {
 763                                        cerr << "----- Error: deleteHandlerInstance failure: " << endl;
 764                                        throw;
 765                                    }
 766                                }
 767 sahana.prabhakar 1.22      #endif
 768 yi.zhou          1.1       }
 769                            
 770                            static void _testEnd(const String& uniqueID, const double elapsedTime)
 771                            {
 772                                cout << "+++++ thread" << uniqueID << ": passed in " << elapsedTime
 773                                    << " seconds" << endl;
 774                            }
 775                            
 776 mike             1.3       ThreadReturnType PEGASUS_THREAD_CDECL _executeTests(void *parm)
 777 yi.zhou          1.1       {
 778                                Thread *my_thread = (Thread *)parm;
 779 kumpf            1.15          AutoPtr<T_Parms> parms((T_Parms *)my_thread->get_parm());
 780                                CIMClient* client = parms->client;
 781 yi.zhou          1.1           Uint32 indicationSendCount = parms->indicationSendCount;
 782                                Uint32 id = parms->uniqueID;
 783                                char id_[4];
 784                                memset(id_,0x00,sizeof(id_));
 785 kumpf            1.14          sprintf(id_,"%u",id);
 786 yi.zhou          1.1           String uniqueID = "_";
 787                                uniqueID.append(id_);
 788                            
 789                                try
 790                                {
 791                                    Stopwatch elapsedTime;
 792                            
 793                                    elapsedTime.start();
 794                                    try
 795                                    {
 796                                        _sendTestIndication (client, CIMName ("SendTestIndicationTrap"),
 797                                        indicationSendCount);
 798                                    }
 799                                    catch (Exception & e)
 800                                    {
 801 kumpf            1.7                   cerr << "----- sendTestIndication failed: " << e.getMessage () <<
 802                                            endl;
 803 yi.zhou          1.1                   exit (-1);
 804                                    }
 805                                    elapsedTime.stop();
 806                                    _testEnd(uniqueID, elapsedTime.getElapsed());
 807                                }
 808                                catch(Exception  & e)
 809                                {
 810                                    cout << e.getMessage() << endl;
 811                                }
 812 kumpf            1.12      
 813                                return ThreadReturnType(0);
 814 yi.zhou          1.1       }
 815                            
 816                            Thread * _runTestThreads(
 817                                CIMClient* client,
 818                                Uint32 indicationSendCount,
 819                                Uint32 uniqueID)
 820                            {
 821                                // package parameters, create thread and run...
 822                                AutoPtr<T_Parms> parms(new T_Parms());
 823 kumpf            1.15          parms->client = client;
 824 yi.zhou          1.1           parms->indicationSendCount = indicationSendCount;
 825                                parms->uniqueID = uniqueID;
 826                                AutoPtr<Thread> t(new Thread(_executeTests, (void*)parms.release(), false));
 827                                t->run();
 828                                return t.release();
 829                            }
 830                            
 831 yi.zhou          1.13      Uint32 _getReceivedTrapCount(Uint16 snmpVersion, const String& logFile)
 832 yi.zhou          1.1       {
 833                                String trap1 = "Trap Info: TRAP, SNMP v1, community public";
 834                                String trap2 = "Trap Info: TRAP2, SNMP v2c, community public";
 835 sahana.prabhakar 1.21          String trap3 = "Trap Info: TRAP2, SNMP v3, user sahana, context ";
 836 yi.zhou          1.1       
 837                                Uint32 receivedTrap1Count = 0;
 838                                Uint32 receivedTrap2Count = 0;
 839 marek            1.23      #ifdef PEGASUS_ENABLE_NET_SNMPV3
 840 sahana.prabhakar 1.21          Uint32 receivedTrap3Count = 0;
 841 marek            1.23      #endif
 842 kumpf            1.7       
 843 yi.zhou          1.13          ifstream ifs(logFile.getCString());
 844 yi.zhou          1.1           if (!ifs)
 845                                {
 846                                    return (0);
 847                                }
 848                            
 849                                String line;
 850                                while (GetLine(ifs, line))
 851                                {
 852                                    if (String::compare(line, trap1) == 0)
 853                                    {
 854                                        receivedTrap1Count++;
 855                                    }
 856                                    if (String::compare(line, trap2) == 0)
 857                                    {
 858                                        receivedTrap2Count++;
 859                                    }
 860 sahana.prabhakar 1.22      #ifdef PEGASUS_ENABLE_NET_SNMPV3
 861 sahana.prabhakar 1.21              if (String::compare(line, trap3) == 0)
 862                                    {
 863                                        receivedTrap3Count++;
 864                                    }
 865 sahana.prabhakar 1.22      #endif
 866 yi.zhou          1.1           }
 867                            
 868                                ifs.close();
 869                            
 870                                switch (snmpVersion)
 871                                {
 872                                    case _SNMPV1_TRAP:
 873                                    {
 874                                        return (receivedTrap1Count);
 875                                    }
 876                                    case _SNMPV2C_TRAP:
 877                                    {
 878                                        return (receivedTrap2Count);
 879                                    }
 880 sahana.prabhakar 1.22      #ifdef PEGASUS_ENABLE_NET_SNMPV3
 881 sahana.prabhakar 1.21              case _SNMPV3_TRAP:
 882                                    {
 883                                        return (receivedTrap3Count);
 884                                    }
 885 sahana.prabhakar 1.22      #endif
 886 yi.zhou          1.1               default:
 887                                    {
 888                                        return (0);
 889                                    }
 890                                }
 891                            
 892                            }
 893                            
 894                            #ifdef PEGASUS_USE_NET_SNMP
 895 kumpf            1.7       // Stop snmptrapd process if it is running and remove
 896 yi.zhou          1.1       // procIdFile file if it exists
 897 kumpf            1.7       //
 898 yi.zhou          1.13      void _stopSnmptrapd(const String& processIdFile)
 899 yi.zhou          1.1       {
 900                                Uint32 receiverPid;
 901                                FILE *fd;
 902 yi.zhou          1.13          if ((fd = fopen(processIdFile.getCString(), "r")) != NULL)
 903 yi.zhou          1.1           {
 904 kumpf            1.10              if (fscanf(fd, "%d\n", &receiverPid) != 1)
 905                                    {
 906                                        throw Exception("Failed to read trapd pid from procIdFile.");
 907                                    }
 908 kumpf            1.7       
 909 yi.zhou          1.1               kill(receiverPid, SIGTERM);
 910                            
 911                                    fclose(fd);
 912                                }
 913                            
 914 yi.zhou          1.13          if (FileSystem::exists(processIdFile))
 915 yi.zhou          1.1           {
 916 yi.zhou          1.13              FileSystem::removeFile(processIdFile);
 917 yi.zhou          1.1           }
 918                            }
 919                            
 920                            static Boolean _startSnmptrapd(
 921 yi.zhou          1.13          FILE **trapInfo,
 922                                const String& processIdFile,
 923                                const String& logFile)
 924 yi.zhou          1.1       {
 925                                String snmptrapdCmd;
 926                            
 927                                Uint32 portNumber = PORT_NUMBER;
 928                                char portNumberStr[32];
 929                                sprintf(portNumberStr, "%lu", (unsigned long) portNumber);
 930                            
 931                                //
 932                                // build snmptrapd cmd options
 933                                //
 934                            
 935 kumpf            1.7           // Specify logging incoming traps to trapLogFile
 936 yi.zhou          1.1           // Save the process ID of the snmptrapd in procIdFile
 937                                snmptrapdCmd.append(
 938 yi.zhou          1.13              "/usr/sbin/snmptrapd -f -Lf ");
 939                                snmptrapdCmd.append(logFile);
 940                                snmptrapdCmd.append(" -p ");
 941                                snmptrapdCmd.append(processIdFile);
 942 yi.zhou          1.1       
 943                                // Specify incoming trap format
 944                                snmptrapdCmd.append( " -F \"\nTrap Info: %P\nVariable: %v\n\"");
 945                            
 946                                // Specify listening address
 947 yi.zhou          1.8       #if defined(PEGASUS_ENABLE_IPV6)
 948                                snmptrapdCmd.append(" UDP6:");
 949                                snmptrapdCmd.append(portNumberStr);
 950                                snmptrapdCmd.append(",UDP:");
 951                            #else
 952 yi.zhou          1.1           snmptrapdCmd.append(" UDP:");
 953 yi.zhou          1.8       #endif
 954 yi.zhou          1.1           snmptrapdCmd.append(System::getFullyQualifiedHostName ());
 955                            
 956                                snmptrapdCmd.append(":");
 957                                snmptrapdCmd.append(portNumberStr);
 958                            
 959                                if ((*trapInfo = popen(snmptrapdCmd.getCString(), "r")) == NULL)
 960                                {
 961                                    throw Exception ("snmptrapd can not be started");
 962                                }
 963                            
 964                            #define MAX_ITERATIONS 300
 965                            #define SLEEP_SEC 1
 966                            
 967                                Uint32 iterations = 0;
 968                            
 969 kumpf            1.7           // Wait until snmptrapd started
 970 yi.zhou          1.1           while (iterations < MAX_ITERATIONS)
 971                                {
 972                                    iterations++;
 973 yi.zhou          1.13              if (FileSystem::exists(processIdFile))
 974 yi.zhou          1.1               {
 975                                        return (true);
 976                                    }
 977                                    else
 978                                    {
 979                                        System::sleep(SLEEP_SEC);
 980 kumpf            1.7       
 981 yi.zhou          1.1               }
 982                                }
 983                            
 984                                throw Exception ("snmptrapd can not be started");
 985                            }
 986                            #endif
 987                            
 988 yi.zhou          1.13      void _removeTrapLogFile(const String& logFile)
 989 yi.zhou          1.1       {
 990                                // if trapLogFile exists, remove it
 991                                if (FileSystem::exists(logFile))
 992                                {
 993                                    FileSystem::removeFile(logFile);
 994                                }
 995                            }
 996                            
 997 kumpf            1.7       void _receiveExpectedTraps(
 998                                CIMClient& workClient,
 999 yi.zhou          1.1           Uint32 indicationSendCount,
1000 yi.zhou          1.13          Uint32 runClientThreadCount,
1001                                const String& logFile)
1002 yi.zhou          1.1       {
1003 yi.zhou          1.8           Uint32 indicationTrapV1SendCount = 0;
1004                                Uint32 indicationTrapV2SendCount = 0;
1005 sahana.prabhakar 1.21          Uint32 indicationTrapV3SendCount = 0;
1006 yi.zhou          1.8       
1007 yi.zhou          1.1           CIMClient * clientConnections = new CIMClient[runClientThreadCount];
1008                            
1009                                // determine total number of indication send count
1010 yi.zhou          1.8           indicationTrapV1SendCount =
1011                                    indicationSendCount * runClientThreadCount;
1012                            
1013                                // if IPV6 is enabled, an additional SNMPv2c trap is sent to IPV6 address
1014                            #if defined(PEGASUS_ENABLE_IPV6)
1015 kumpf            1.19          indicationTrapV2SendCount = 2 * indicationTrapV1SendCount;
1016 yi.zhou          1.8       #else
1017                                indicationTrapV2SendCount = indicationTrapV1SendCount;
1018                            #endif
1019 yi.zhou          1.1       
1020 sahana.prabhakar 1.22      #ifdef PEGASUS_ENABLE_NET_SNMPV3
1021 sahana.prabhakar 1.21          indicationTrapV3SendCount =
1022                                    indicationSendCount * runClientThreadCount;
1023 sahana.prabhakar 1.22      #endif
1024 sahana.prabhakar 1.21      
1025 yi.zhou          1.1           // calculate the timeout based on the total send count allowing
1026 kumpf            1.7           // using the MSG_PER_SEC rate
1027                                // allow 20 seconds of test overhead for very small tests
1028 yi.zhou          1.1       
1029                            #define MSG_PER_SEC 4
1030                            
1031 marek            1.5           Uint32 testTimeout = PEGASUS_DEFAULT_CLIENT_TIMEOUT_MILLISECONDS
1032 yi.zhou          1.8                               + (indicationTrapV2SendCount/MSG_PER_SEC)*1000;
1033 yi.zhou          1.1       
1034                                // connect the clients
1035                                for(Uint32 i = 0; i < runClientThreadCount; i++)
1036                                {
1037                                    clientConnections[i].setTimeout(testTimeout);
1038                                    clientConnections[i].connectLocal();
1039                                }
1040                            
1041                                // run tests
1042                                Thread ** clientThreads = new Thread *[runClientThreadCount];
1043                            
1044                                Stopwatch trapReceiverElapsedTime;
1045                            
1046                                trapReceiverElapsedTime.start();
1047                            
1048                                for(Uint32 i = 0; i < runClientThreadCount; i++)
1049                                {
1050                                    clientThreads[i] = _runTestThreads(&clientConnections[i],
1051                                        indicationSendCount, i);
1052                                }
1053                            
1054 yi.zhou          1.1           for(Uint32 i=0; i< runClientThreadCount; i++)
1055                                {
1056                                    clientThreads[i]->join();
1057 kumpf            1.15              delete clientThreads[i];
1058 yi.zhou          1.1           }
1059                            
1060                                delete[] clientConnections;
1061                                delete[] clientThreads;
1062                            
1063                                //
1064                                //  Allow time for the trap to be received
1065                                //  Wait in SLEEP_SEC second intervals.
1066                                //  Put msg out every MSG_SEC intervals
1067                                //
1068                            
1069                            #define SLEEP_SEC 1
1070                            #define COUT_TIME_INTERVAL 30
1071                            #define MAX_NO_CHANGE_ITERATIONS COUT_TIME_INTERVAL*3
1072                            
1073                                Uint32 noChangeIterations = 0;
1074                                Uint32 priorReceivedTrap1Count = 0;
1075                                Uint32 priorReceivedTrap2Count = 0;
1076 sahana.prabhakar 1.21          Uint32 priorReceivedTrap3Count = 0;
1077 yi.zhou          1.1           Uint32 currentReceivedTrap1Count = 0;
1078                                Uint32 currentReceivedTrap2Count = 0;
1079 sahana.prabhakar 1.21          Uint32 currentReceivedTrap3Count = 0;
1080 yi.zhou          1.1           Uint32 totalIterations = 0;
1081                            
1082                                //
1083                                // Wait for the trap receiver to receive the expected
1084 yi.zhou          1.8           // number of Indication traps, indicationTrapV1SendCount
1085                                // and indicationTrapV2SendCount.
1086 yi.zhou          1.1           //
1087 yi.zhou          1.8           // We will continue to wait until either (indicationTrapV1SendCount
1088                                // and indicationTrapV2SendCount) Indications have been received
1089                                // by the trap receiver or no new
1090 yi.zhou          1.1           // Indications have been received in the previous
1091                                // MAX_NO_CHANGE_ITERATIONS.
1092 kumpf            1.7           // iterations.
1093 yi.zhou          1.1           //
1094                            
1095                                Boolean receivedTrapCountComplete = false;
1096                                Boolean receiverTrap1NoChange = true;
1097                                Boolean receiverTrap2NoChange = true;
1098 sahana.prabhakar 1.21          Boolean receiverTrap3NoChange = true;
1099 yi.zhou          1.1       
1100                                while (noChangeIterations <= MAX_NO_CHANGE_ITERATIONS)
1101                                {
1102                                    totalIterations++;
1103                            
1104 kumpf            1.19              currentReceivedTrap1Count =
1105 yi.zhou          1.13                  _getReceivedTrapCount(_SNMPV1_TRAP, logFile);
1106 kumpf            1.19              currentReceivedTrap2Count =
1107 yi.zhou          1.13                  _getReceivedTrapCount(_SNMPV2C_TRAP, logFile);
1108 sahana.prabhakar 1.21              currentReceivedTrap3Count =
1109                                        _getReceivedTrapCount(_SNMPV3_TRAP,logFile);
1110 yi.zhou          1.1       
1111                                    if (totalIterations % COUT_TIME_INTERVAL == 1 &&
1112                                        !(receivedTrapCountComplete))
1113                                    {
1114                                        cout << "++++ The trap receiver has received "
1115                                        << currentReceivedTrap1Count << " of "
1116 yi.zhou          1.8                   << indicationTrapV1SendCount << " SNMPv1 trap."
1117 yi.zhou          1.1                   << endl;
1118                                        cout << "++++ The trap receiver has received "
1119                                        << currentReceivedTrap2Count << " of "
1120 yi.zhou          1.8                   << indicationTrapV2SendCount << " SNMPv2c trap."
1121 yi.zhou          1.1                   << endl;
1122 sahana.prabhakar 1.21                  cout << "++++ The trap receiver has received "
1123                                        << currentReceivedTrap3Count<< " of "
1124                                        << indicationTrapV3SendCount << " SNMPv3 trap."
1125                                        << endl;
1126 yi.zhou          1.1               }
1127                            
1128 yi.zhou          1.8               if ((indicationTrapV1SendCount == currentReceivedTrap1Count) &&
1129 sahana.prabhakar 1.21                  (indicationTrapV2SendCount == currentReceivedTrap2Count) &&
1130                                        (indicationTrapV3SendCount == currentReceivedTrap3Count))
1131 yi.zhou          1.1               {
1132                                         receivedTrapCountComplete = true;
1133                                         trapReceiverElapsedTime.stop();
1134                                    }
1135                                    if (!(receiverTrap1NoChange =
1136                                            (priorReceivedTrap1Count == currentReceivedTrap1Count)))
1137                                    {
1138                                         priorReceivedTrap1Count = currentReceivedTrap1Count;
1139                                    }
1140                            
1141                                    if (!(receiverTrap2NoChange =
1142                                            (priorReceivedTrap2Count == currentReceivedTrap2Count)))
1143                                    {
1144                                         priorReceivedTrap2Count = currentReceivedTrap2Count;
1145                                    }
1146 sahana.prabhakar 1.21              if (!(receiverTrap3NoChange =
1147                                            (priorReceivedTrap3Count == currentReceivedTrap3Count)))
1148                                    {
1149                                         priorReceivedTrap3Count = currentReceivedTrap3Count;
1150                                    }
1151 yi.zhou          1.1       
1152                                    if (receivedTrapCountComplete)
1153                                    {
1154                                        cout << "++++ The trap receiver has received "
1155                                        << currentReceivedTrap1Count << " of "
1156 yi.zhou          1.8                   << indicationTrapV1SendCount << " SNMPv1 trap."
1157 yi.zhou          1.1                   << endl;
1158                                        cout << "++++ The trap receiver has received "
1159                                        << currentReceivedTrap2Count << " of "
1160 yi.zhou          1.8                   << indicationTrapV2SendCount << " SNMPv2c trap."
1161 yi.zhou          1.1                   << endl;
1162 sahana.prabhakar 1.21                  cout << "++++ The trap receiver has received "
1163                                        << currentReceivedTrap3Count << " of "
1164                                        << indicationTrapV3SendCount<< " SNMPv3 trap."
1165                                        << endl;
1166 yi.zhou          1.1       
1167                                        break;
1168                                    }
1169 sahana.prabhakar 1.21              if (receiverTrap1NoChange || 
1170                                        receiverTrap2NoChange || 
1171                                        receiverTrap3NoChange)
1172 yi.zhou          1.1               {
1173                                       noChangeIterations++;
1174                                    }
1175                                    else
1176                                    {
1177                                       noChangeIterations = 0;
1178                                    }
1179                            
1180                                    System::sleep (SLEEP_SEC);
1181                                }
1182                            
1183                                if (!receivedTrapCountComplete)
1184                                {
1185                                    trapReceiverElapsedTime.stop();
1186                                }
1187                            
1188 kumpf            1.7           // assert that all indications sent have been received.
1189 yi.zhou          1.8           PEGASUS_TEST_ASSERT(indicationTrapV1SendCount ==
1190 yi.zhou          1.1              currentReceivedTrap1Count);
1191 yi.zhou          1.8           PEGASUS_TEST_ASSERT(indicationTrapV2SendCount ==
1192 yi.zhou          1.1              currentReceivedTrap2Count);
1193 sahana.prabhakar 1.21          PEGASUS_TEST_ASSERT(indicationTrapV3SendCount ==
1194                                   currentReceivedTrap3Count);
1195 yi.zhou          1.2       }
1196                            
1197 kumpf            1.7       int _beginTest(CIMClient& workClient,
1198 yi.zhou          1.2           Uint32 indicationSendCount,
1199 yi.zhou          1.13          Uint32 runClientThreadCount,
1200                                const String& processIdFile,
1201                                const String& logFile)
1202 yi.zhou          1.2       {
1203 yi.zhou          1.1       
1204                            #ifdef PEGASUS_USE_NET_SNMP
1205 yi.zhou          1.2       
1206                                // Stop snmptrapd process if it is running
1207 yi.zhou          1.13          _stopSnmptrapd(processIdFile);
1208 yi.zhou          1.2       
1209                                // if trapLogFile exists, remove it
1210 yi.zhou          1.13          _removeTrapLogFile(logFile);
1211 yi.zhou          1.2       
1212                                FILE * trapInfo;
1213                            
1214                                try
1215                                {
1216 yi.zhou          1.13              _startSnmptrapd(&trapInfo, processIdFile, logFile);
1217 yi.zhou          1.2           }
1218                                catch (Exception & e)
1219                                {
1220                                    cerr << e.getMessage() << endl;
1221                                    return (-1);
1222                                }
1223                            
1224                                // Extended for all snmp implementation
1225 kumpf            1.7           _receiveExpectedTraps(workClient, indicationSendCount,
1226 yi.zhou          1.13              runClientThreadCount, logFile);
1227 yi.zhou          1.2       
1228 yi.zhou          1.1           // Stop snmptrapd process if it is running and remove procIdFile
1229 yi.zhou          1.13          _stopSnmptrapd(processIdFile);
1230 yi.zhou          1.1       
1231                                pclose(trapInfo);
1232                            
1233                                // if error encountered then fail the test.
1234                                if (errorsEncountered.get())
1235 kumpf            1.7           {
1236 yi.zhou          1.1               cout << "+++++ test failed" << endl;
1237                                    return (-1);
1238                                }
1239                                else
1240                                {
1241                                    cout << "+++++ passed all tests" << endl;
1242                                }
1243 yi.zhou          1.2       
1244                                return (0);
1245                            
1246                            #else
1247                                cerr << "Cannot create a trap receiver." << endl;
1248                                return (-1);
1249                            #endif
1250 yi.zhou          1.1       }
1251                            
1252                            int main (int argc, char** argv)
1253                            {
1254                                // This client connection is used solely to create and delete subscriptions.
1255                                CIMClient workClient;
1256                                try
1257                                {
1258                                    workClient.connectLocal();
1259                            
1260 yi.zhou          1.13              String processIdFile = TRAP_DIR;
1261                                    processIdFile.append("/procIdFile");
1262                            
1263                                    String logFile = TRAP_DIR;
1264                                    logFile.append("/trapLogFile");
1265                            
1266 yi.zhou          1.1               if (argc <= 1 || argc > 4)
1267                                    {
1268                                        cerr << "Invalid argument count: " << argc << endl;
1269                                        _usage();
1270                                        return 1;
1271                                    }
1272                                    else if (strcmp(argv[1], "setup") == 0)
1273                                    {
1274                                        if (argc < 3)
1275                                        {
1276                                            cerr << "Missing query language" << endl;
1277                                            _usage();
1278                                            return -1;
1279                                        }
1280                            
1281                                        if ((strcmp(argv[2], "WQL") != 0) &&
1282                                            (strcmp(argv[2], "DMTF:CQL") != 0))
1283                                        {
1284                                            cerr << "Invalid query language: '" << argv[2] << "'" << endl;
1285                                            _usage();
1286                                            return -1;
1287 yi.zhou          1.1                   }
1288 kumpf            1.7       
1289 yi.zhou          1.1                   _setup(workClient, argv[2]);
1290                            
1291                                        cout << "+++++ setup completed successfully" << endl;
1292                                        return 0;
1293 kumpf            1.7               }
1294 yi.zhou          1.1               else if (String::equalNoCase(argv[1], "run"))
1295                                    {
1296                                        if (argc < 3)
1297                                        {
1298                                            cerr << "Invalid indicationSendCount." << endl;
1299                                            _usage ();
1300                                            return -1;
1301                                        }
1302                            
1303                                        Uint32 indicationSendCount = atoi(argv[2]);
1304                            
1305                                        Uint32 runClientThreadCount = 1;
1306                            
1307 kumpf            1.7                   if (argc == 4)
1308 yi.zhou          1.1                   {
1309                                            runClientThreadCount = atoi(argv[3]);
1310                                        }
1311                            
1312 kumpf            1.7                   int rc = _beginTest(workClient, indicationSendCount,
1313 yi.zhou          1.13                      runClientThreadCount, processIdFile, logFile);
1314 yi.zhou          1.1                   return rc;
1315 kumpf            1.7               }
1316 yi.zhou          1.1               else if (String::equalNoCase(argv[1], "cleanup"))
1317                                    {
1318                                        if (argc > 2)
1319                                        {
1320                                            cerr << "Invalid argument count." << endl;
1321                                            _usage ();
1322                                            return -1;
1323                                        }
1324 kumpf            1.7       
1325 yi.zhou          1.1                   _cleanup (workClient);
1326                            
1327                                        cout << "+++++ cleanup completed successfully" << endl;
1328                                        return 0;
1329                                    }
1330                                    else if (String::equalNoCase(argv[1], "removelog"))
1331                                    {
1332                                        if (argc > 2)
1333                                        {
1334                                            cerr << "Invalid argument count." << endl;
1335                                            _usage ();
1336                                            return -1;
1337                                        }
1338 kumpf            1.7       
1339 yi.zhou          1.13                  _removeTrapLogFile(logFile);
1340 yi.zhou          1.1                   cout << "+++++ removelog completed successfully" << endl;
1341                                        return 0;
1342                                    }
1343                                    else
1344                                    {
1345                                        cerr << "Invalid option: " << argv[1] << endl;
1346                                        _usage ();
1347                                        return -1;
1348                                    }
1349                                }
1350                                catch (Exception & e)
1351                                {
1352                                    cerr << "Error: " << e.getMessage() << endl;
1353                                }
1354                            
1355 kumpf            1.11          return -1;
1356 yi.zhou          1.1       }

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2