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

  1 yi.zhou 1.1 //%2006////////////////////////////////////////////////////////////////////////
  2             //
  3             // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4             // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5             // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6             // IBM Corp.; EMC Corporation, The Open Group.
  7             // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8             // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9             // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10             // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11             // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12             // EMC Corporation; Symantec Corporation; The Open Group.
 13             //
 14             // Permission is hereby granted, free of charge, to any person obtaining a copy
 15             // of this software and associated documentation files (the "Software"), to
 16             // deal in the Software without restriction, including without limitation the
 17             // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 18             // sell copies of the Software, and to permit persons to whom the Software is
 19             // furnished to do so, subject to the following conditions:
 20             // 
 21             // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 22 yi.zhou 1.1 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 23             // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 24             // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 25             // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 26             // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 27             // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 28             // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 29             //
 30             //==============================================================================
 31             //
 32             // Author: Yi Zhou, Hewlett-Packard Company (Yi.Zhou@hp.com) 
 33             //
 34             // Modified By: 
 35             //
 36             //%/////////////////////////////////////////////////////////////////////////////
 37             
 38             #include <Pegasus/Common/PegasusAssert.h>
 39             #include <Pegasus/Common/Thread.h>
 40             #include <Pegasus/Common/Constants.h>
 41             #include <Pegasus/Common/FileSystem.h>
 42             #include <Pegasus/Common/Stopwatch.h>
 43 yi.zhou 1.1 #include <Pegasus/Client/CIMClient.h>
 44             
 45             PEGASUS_USING_PEGASUS;
 46             PEGASUS_USING_STD;
 47             
 48             const CIMNamespaceName INTEROP_NAMESPACE = CIMNamespaceName ("root/PG_InterOp");
 49             const CIMNamespaceName SOURCE_NAMESPACE = 
 50                 CIMNamespaceName ("root/SampleProvider");
 51             
 52             const String INDICATION_CLASS_NAME = String ("RT_TestIndication");
 53             
 54             const String SNMPV1_HANDLER_NAME = String ("SNMPHandler01");
 55             const String SNMPV2C_HANDLER_NAME = String ("SNMPHandler02");
 56             const String FILTER_NAME = String ("IPFilter01");
 57             
 58             enum SNMPVersion {_SNMPV1_TRAP = 2, _SNMPV2C_TRAP = 3};
 59             enum TargetHostFormat {_HOST_NAME = 2, _IPV4_ADDRESS = 3};
 60             
 61             #define PORT_NUMBER 2006
 62             
 63             Uint32 indicationSendCountTotal = 0;
 64 yi.zhou 1.1 
 65             AtomicInt errorsEncountered(0);
 66             
 67             ////////////////////////////////////////////////////////////////////////////////
 68             //
 69             // Thread Parameters Class
 70             //
 71             ////////////////////////////////////////////////////////////////////////////////
 72             
 73             class T_Parms{
 74                public:
 75                 AutoPtr<CIMClient> client;
 76                 Uint32 indicationSendCount;
 77                 Uint32 uniqueID;
 78             };
 79             
 80             ///////////////////////////////////////////////////////////////////////////
 81             
 82             CIMObjectPath _getFilterObjectPath
 83                 (const String & name)
 84             {
 85 yi.zhou 1.1     Array<CIMKeyBinding> keyBindings;
 86                 keyBindings.append (CIMKeyBinding ("SystemCreationClassName",
 87                     System::getSystemCreationClassName (), CIMKeyBinding::STRING));
 88                 keyBindings.append (CIMKeyBinding ("SystemName",
 89                     System::getFullyQualifiedHostName (), CIMKeyBinding::STRING));
 90                 keyBindings.append (CIMKeyBinding ("CreationClassName",
 91                     PEGASUS_CLASSNAME_INDFILTER.getString(), CIMKeyBinding::STRING));
 92                 keyBindings.append (CIMKeyBinding ("Name", name,
 93                     CIMKeyBinding::STRING));
 94                 return(CIMObjectPath("", CIMNamespaceName (),
 95                     PEGASUS_CLASSNAME_INDFILTER, keyBindings));
 96             }
 97             
 98             CIMObjectPath _getHandlerObjectPath
 99                 (const String & name)
100             {
101                 Array<CIMKeyBinding> keyBindings;
102                 keyBindings.append (CIMKeyBinding ("SystemCreationClassName",
103                     System::getSystemCreationClassName (), CIMKeyBinding::STRING));
104                 keyBindings.append (CIMKeyBinding ("SystemName",
105                     System::getFullyQualifiedHostName (), CIMKeyBinding::STRING));
106 yi.zhou 1.1     keyBindings.append (CIMKeyBinding ("CreationClassName",
107                     PEGASUS_CLASSNAME_INDHANDLER_SNMP.getString(),
108                     CIMKeyBinding::STRING));
109                 keyBindings.append (CIMKeyBinding ("Name", name,
110                     CIMKeyBinding::STRING));
111                 return(CIMObjectPath("", CIMNamespaceName (),
112                     PEGASUS_CLASSNAME_INDHANDLER_SNMP, keyBindings));
113             }
114             
115             CIMObjectPath _getSubscriptionObjectPath
116                 (const String & filterName,
117                  const String & handlerName)
118             {
119                 CIMObjectPath filterObjectPath = _getFilterObjectPath(filterName);
120             
121                 CIMObjectPath handlerObjectPath = _getHandlerObjectPath(handlerName);
122             
123                 Array<CIMKeyBinding> subscriptionKeyBindings;
124                 subscriptionKeyBindings.append (CIMKeyBinding ("Filter",
125                     CIMValue(filterObjectPath)));
126                 subscriptionKeyBindings.append (CIMKeyBinding ("Handler",
127 yi.zhou 1.1         CIMValue(handlerObjectPath)));
128                 return(CIMObjectPath("", CIMNamespaceName (),
129                     PEGASUS_CLASSNAME_INDSUBSCRIPTION, subscriptionKeyBindings));
130             }
131             
132             CIMObjectPath _createHandlerInstance
133                 (CIMClient & client,
134                  const String & name,
135                  const String & targetHost,
136                  const String & securityName,
137                  const Uint16 targetHostFormat,
138                  const Uint16 snmpVersion)
139             {
140                 CIMInstance handlerInstance (PEGASUS_CLASSNAME_INDHANDLER_SNMP);
141                 handlerInstance.addProperty (CIMProperty (CIMName
142                     ("SystemCreationClassName"), System::getSystemCreationClassName ()));
143                 handlerInstance.addProperty (CIMProperty (CIMName ("SystemName"),
144                     System::getFullyQualifiedHostName ()));
145                 handlerInstance.addProperty (CIMProperty (CIMName ("CreationClassName"),
146                     PEGASUS_CLASSNAME_INDHANDLER_SNMP.getString ()));
147                 handlerInstance.addProperty (CIMProperty (CIMName ("Name"), name));
148 yi.zhou 1.1     handlerInstance.addProperty (CIMProperty (CIMName ("TargetHost"),
149                     targetHost));
150                 handlerInstance.addProperty (CIMProperty (CIMName ("TargetHostFormat"),
151                     CIMValue ((Uint16) targetHostFormat)));
152                 handlerInstance.addProperty (CIMProperty (CIMName ("SNMPSecurityName"),
153                     securityName));
154                 handlerInstance.addProperty (CIMProperty (CIMName ("SnmpVersion"),
155                     CIMValue ((Uint16) snmpVersion)));
156                 handlerInstance.addProperty (CIMProperty (CIMName ("PortNumber"),
157                     CIMValue ((Uint32) PORT_NUMBER)));
158             
159                 return(client.createInstance (INTEROP_NAMESPACE, handlerInstance));
160             }
161             
162             CIMObjectPath _createFilterInstance
163                 (CIMClient & client,
164                  const String & name,
165                  const String & query,
166                  const String & qlang)
167             {
168                 CIMInstance filterInstance (PEGASUS_CLASSNAME_INDFILTER);
169 yi.zhou 1.1     filterInstance.addProperty (CIMProperty (CIMName
170                     ("SystemCreationClassName"), System::getSystemCreationClassName ()));
171                 filterInstance.addProperty (CIMProperty (CIMName ("SystemName"),
172                     System::getFullyQualifiedHostName ()));
173                 filterInstance.addProperty (CIMProperty (CIMName ("CreationClassName"),
174                     PEGASUS_CLASSNAME_INDFILTER.getString ()));
175                 filterInstance.addProperty (CIMProperty (CIMName ("Name"), name));
176                 filterInstance.addProperty (CIMProperty (CIMName ("Query"), query));
177                 filterInstance.addProperty (CIMProperty (CIMName ("QueryLanguage"),
178                     String (qlang)));
179                 filterInstance.addProperty (CIMProperty (CIMName ("SourceNamespace"),
180                     SOURCE_NAMESPACE.getString ()));
181             
182                 return(client.createInstance (INTEROP_NAMESPACE, filterInstance));
183             }
184             
185             CIMObjectPath _createSubscriptionInstance
186                 (CIMClient & client,
187                  const CIMObjectPath & filterPath,
188                  const CIMObjectPath & handlerPath)
189             {
190 yi.zhou 1.1     CIMInstance subscriptionInstance (PEGASUS_CLASSNAME_INDSUBSCRIPTION);
191                 subscriptionInstance.addProperty (CIMProperty (CIMName ("Filter"),
192                     filterPath, 0, PEGASUS_CLASSNAME_INDFILTER));
193                 subscriptionInstance.addProperty (CIMProperty (CIMName ("Handler"),
194                     handlerPath, 0, PEGASUS_CLASSNAME_INDHANDLER_SNMP));
195                 subscriptionInstance.addProperty (CIMProperty
196                     (CIMName ("SubscriptionState"), CIMValue ((Uint16) 2)));
197             
198                 return(client.createInstance (INTEROP_NAMESPACE, subscriptionInstance));
199             }
200             
201             void _sendTestIndication(CIMClient* client, const CIMName & methodName, 
202                                      Uint32 indicationSendCount)
203             {
204                 //
205                 //  Invoke method to send test indication
206                 //
207                 Array <CIMParamValue> inParams;
208                 Array <CIMParamValue> outParams;
209                 Array <CIMKeyBinding> keyBindings;
210                 Sint32 result;
211 yi.zhou 1.1 
212                 CIMObjectPath className (String::EMPTY, CIMNamespaceName (),
213                     CIMName ("RT_TestIndication"), keyBindings);
214             
215                 inParams.append(CIMParamValue(String("indicationSendCount"), 
216                     CIMValue(indicationSendCount)));
217             
218                 CIMValue retValue = client->invokeMethod
219                     (SOURCE_NAMESPACE,
220                      className,
221                      methodName,
222                      inParams,
223                      outParams);
224             
225                 retValue.get (result);
226                 PEGASUS_TEST_ASSERT (result == 0);
227             }
228             
229             void _deleteSubscriptionInstance
230                 (CIMClient & client,
231                  const String & filterName,
232 yi.zhou 1.1      const String & handlerName)
233             {
234                 CIMObjectPath subscriptionObjectPath =
235                    _getSubscriptionObjectPath(filterName, handlerName);
236                 client.deleteInstance (INTEROP_NAMESPACE, subscriptionObjectPath);
237             }
238             
239             void _deleteHandlerInstance
240                 (CIMClient & client,
241                  const String & name)
242             {
243                 CIMObjectPath handlerObjectPath = _getHandlerObjectPath(name);
244                 client.deleteInstance (INTEROP_NAMESPACE, handlerObjectPath);
245             }
246             
247             void _deleteFilterInstance
248                 (CIMClient & client,
249                  const String & name)
250             {
251                 CIMObjectPath filterObjectPath = _getFilterObjectPath(name);
252                 client.deleteInstance (INTEROP_NAMESPACE, filterObjectPath);
253 yi.zhou 1.1 }
254             
255             void _usage ()
256             {
257                cerr << endl
258                     << "Usage:" << endl
259                     << "    TestSnmpHandler setup [ WQL | DMTF:CQL ]\n"
260                     << "    TestSnmpHandler run <indicationSendCount> "
261                     << "[<threads>]\n"
262                     << "    where: " << endl
263                     << "       <indicationSendCount> is the number of indications to\n"
264                     << "            generate and has to be greater than zero." << endl
265                     << "       <threads> is an optional number of client threads to\n"
266                     << "            create, default is one." << endl
267                     << "    TestSnmpHandler cleanup\n"
268                     << "    TestSnmpHandler removelog"
269                     << endl << endl;
270             }
271             
272             void _setup (CIMClient & client, const String& qlang)
273             {
274 yi.zhou 1.1     CIMObjectPath filterObjectPath;
275                 CIMObjectPath snmpv1HandlerObjectPath;
276                 CIMObjectPath snmpv2HandlerObjectPath;
277             
278                 try
279                 {
280                     filterObjectPath = _createFilterInstance (client, FILTER_NAME,
281                         String ("SELECT * FROM RT_TestIndication"),
282                         qlang);
283                 }
284                 catch (CIMException& e)
285                 {
286                     if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
287                     {
288                         filterObjectPath = _getFilterObjectPath(FILTER_NAME);
289                         cerr << "----- Warning: Filter Instance Not Created: "
290                             << e.getMessage () << endl;
291                     }
292                     else
293                     {
294                         cerr << "----- Error: Filter Instance Not Created: " << endl;
295 yi.zhou 1.1             throw;
296                     }
297                 }
298             
299                 try
300                 {
301                     // Create SNMPv1 trap handler 
302                     snmpv1HandlerObjectPath = _createHandlerInstance (client,
303                         SNMPV1_HANDLER_NAME,
304                         System::getFullyQualifiedHostName(),
305                         "",
306                         _HOST_NAME,
307                         _SNMPV1_TRAP);
308                 }
309                 catch (CIMException& e)
310                 {
311                     if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
312                     {
313                         snmpv1HandlerObjectPath = _getHandlerObjectPath(
314                             SNMPV1_HANDLER_NAME);
315                         cerr << "----- Warning: SNMPv1 Trap Handler Instance Not Created: "
316 yi.zhou 1.1                 << e.getMessage () << endl;
317                     }
318                     else
319                     {
320                         cerr << "----- Error: SNMPv1 Trap Handler Instance Not Created: "
321                             << endl;
322                         throw;
323                     }
324                 }
325             
326                 try
327                 {
328                     _createSubscriptionInstance (client, filterObjectPath,
329                          snmpv1HandlerObjectPath);
330                 }
331                 catch (CIMException& e)
332                 {
333                     if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
334                     {
335                         cerr << "----- Warning: Client Subscription Instance: "
336                             << e.getMessage () << endl;
337 yi.zhou 1.1         }
338                     else
339                     {
340                         cerr << "----- Error: Client Subscription Instance: " << endl;
341                         throw;
342                     }
343                 }
344             
345                 try
346                 {
347                     // Create SNMPv2 trap handler 
348                     snmpv2HandlerObjectPath = _createHandlerInstance (client,
349                         SNMPV2C_HANDLER_NAME,
350                         System::getHostIP(System::getFullyQualifiedHostName ()),
351                         "public",
352                         _IPV4_ADDRESS,
353                         _SNMPV2C_TRAP);
354                 }
355                 catch (CIMException& e)
356                 {
357                     if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
358 yi.zhou 1.1         {
359                         snmpv2HandlerObjectPath = _getHandlerObjectPath(
360                             SNMPV2C_HANDLER_NAME);
361                         cerr << "----- Warning: SNMPv2c Trap Handler Instance Not Created: "
362                             << e.getMessage () << endl;
363                     }
364                     else
365                     {
366                         cerr << "----- Error: SNMPv2c Trap Handler Instance Not Created: "
367                             << endl;
368                         throw;
369                     }
370                 }
371             
372                 try
373                 {
374                     _createSubscriptionInstance (client, filterObjectPath,
375                          snmpv2HandlerObjectPath);
376                 }
377                 catch (CIMException& e)
378                 {
379 yi.zhou 1.1         if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
380                     {
381                         cerr << "----- Warning: Client Subscription Instance: "
382                             << e.getMessage () << endl;
383                     }
384                     else
385                     {
386                         cerr << "----- Error: Client Subscription Instance: " << endl;
387                         throw;
388                     }
389                 }
390             }
391             
392             void _cleanup (CIMClient & client)
393             {
394                 try
395                 {
396                     _deleteSubscriptionInstance (client, FILTER_NAME,
397                         SNMPV1_HANDLER_NAME);
398                 }
399                 catch (CIMException& e)
400 yi.zhou 1.1     {
401                     if (e.getCode() != CIM_ERR_NOT_FOUND)
402                     {
403                         cerr << "----- Error: deleteSubscriptionInstance failure: "
404                              << endl;
405                         throw;
406                     }
407                 }
408                 try
409                 {
410                     _deleteSubscriptionInstance (client, FILTER_NAME,
411                         SNMPV2C_HANDLER_NAME);
412                 }
413                 catch (CIMException& e)
414                 {
415                     if (e.getCode() != CIM_ERR_NOT_FOUND)
416                     {
417                         cerr << "----- Error: deleteSubscriptionInstance failure: "
418                              << endl;
419                         throw;
420                     }
421 yi.zhou 1.1     }
422                 try
423                 {
424                     _deleteFilterInstance (client, FILTER_NAME);
425                 }
426                 catch (CIMException& e)
427                 {
428                     if (e.getCode() != CIM_ERR_NOT_FOUND)
429                     {
430                         cerr << "----- Error: deleteFilterInstance failure: " << endl;
431                         throw;
432                     }
433                 }
434             
435                 try
436                 {
437                     _deleteHandlerInstance (client, SNMPV1_HANDLER_NAME);
438                 }
439                 catch (CIMException& e)
440                 {
441                     if (e.getCode() != CIM_ERR_NOT_FOUND)
442 yi.zhou 1.1         {
443                         cerr << "----- Error: deleteHandlerInstance failure: " << endl;
444                         throw;
445                     }
446                 }
447                 try
448                 {
449                     _deleteHandlerInstance (client, SNMPV2C_HANDLER_NAME);
450                 }
451                 catch (CIMException& e)
452                 {
453                     if (e.getCode() != CIM_ERR_NOT_FOUND)
454                     {
455                         cerr << "----- Error: deleteHandlerInstance failure: " << endl;
456                         throw;
457                     }
458                 }
459             }
460             
461             static void _testEnd(const String& uniqueID, const double elapsedTime)
462             {
463 yi.zhou 1.1     cout << "+++++ thread" << uniqueID << ": passed in " << elapsedTime
464                     << " seconds" << endl;
465             }
466             
467 mike    1.2.14.1 ThreadReturnType PEGASUS_THREAD_CDECL _executeTests(void *parm)
468 yi.zhou 1.1      {
469                      Thread *my_thread = (Thread *)parm;
470                      T_Parms *parms = (T_Parms *)my_thread->get_parm();
471                      CIMClient *client = parms->client.get();
472                      Uint32 indicationSendCount = parms->indicationSendCount;
473                      Uint32 id = parms->uniqueID;
474                      char id_[4];
475                      memset(id_,0x00,sizeof(id_));
476                      sprintf(id_,"%i",id);
477                      String uniqueID = "_";
478                      uniqueID.append(id_);
479                  
480                      try
481                      {
482                          Stopwatch elapsedTime;
483                  
484                          elapsedTime.start();
485                          try
486                          {
487                              _sendTestIndication (client, CIMName ("SendTestIndicationTrap"),
488                              indicationSendCount);
489 yi.zhou 1.1              }
490                          catch (Exception & e)
491                          {
492                              cerr << "----- sendTestIndication failed: " << e.getMessage () << endl;
493                              exit (-1);
494                          }
495                          elapsedTime.stop();
496                          _testEnd(uniqueID, elapsedTime.getElapsed());
497                      }
498                      catch(Exception  & e)
499                      {
500                          cout << e.getMessage() << endl;
501                      }
502 mike    1.2.14.1     my_thread->exit_self((ThreadReturnType)1);
503 yi.zhou 1.1          return(0);
504                  }
505                  
506                  Thread * _runTestThreads(
507                      CIMClient* client,
508                      Uint32 indicationSendCount,
509                      Uint32 uniqueID)
510                  {
511                      // package parameters, create thread and run...
512                      AutoPtr<T_Parms> parms(new T_Parms());
513                      parms->client.reset(client);
514                      parms->indicationSendCount = indicationSendCount;
515                      parms->uniqueID = uniqueID;
516                      AutoPtr<Thread> t(new Thread(_executeTests, (void*)parms.release(), false));
517                      t->run();
518                      return t.release();
519                  }
520                  
521                  String _getLogFile()
522                  {
523                      return("trapLogFile");
524 yi.zhou 1.1      }
525                  
526                  Uint32 _getReceivedTrapCount(Uint16 snmpVersion)
527                  {
528                      String trap1 = "Trap Info: TRAP, SNMP v1, community public";
529                      String trap2 = "Trap Info: TRAP2, SNMP v2c, community public";
530                  
531                      Uint32 receivedTrap1Count = 0;
532                      Uint32 receivedTrap2Count = 0;
533                   
534                      ifstream ifs(_getLogFile().getCString());
535                      if (!ifs)
536                      {
537                          return (0);
538                      }
539                  
540                      String line;
541                      while (GetLine(ifs, line))
542                      {
543                          if (String::compare(line, trap1) == 0)
544                          {
545 yi.zhou 1.1                  receivedTrap1Count++;
546                          }
547                          if (String::compare(line, trap2) == 0)
548                          {
549                              receivedTrap2Count++;
550                          }
551                      }
552                  
553                      ifs.close();
554                  
555                      switch (snmpVersion)
556                      {
557                          case _SNMPV1_TRAP:
558                          {
559                              return (receivedTrap1Count);
560                          }
561                          case _SNMPV2C_TRAP:
562                          {
563                              return (receivedTrap2Count);
564                          }
565                          default:
566 yi.zhou 1.1              {
567                              return (0);
568                          }
569                      }
570                  
571                  }
572                  
573                  #ifdef PEGASUS_USE_NET_SNMP
574                  // Stop snmptrapd process if it is running and remove 
575                  // procIdFile file if it exists
576                  // 
577                  void _stopSnmptrapd()
578                  {
579                      String procIdFileName = "procIdFile";
580                  
581                      Uint32 receiverPid;
582                      FILE *fd;
583                      if ((fd = fopen(procIdFileName.getCString(), "r")) != NULL)
584                      {
585                          fscanf(fd, "%d\n", &receiverPid);
586                          
587 yi.zhou 1.1              kill(receiverPid, SIGTERM);
588                  
589                          fclose(fd);
590                      }
591                  
592                      if (FileSystem::exists(procIdFileName))
593                      {
594                          FileSystem::removeFile(procIdFileName);
595                      }
596                  }
597                  
598                  static Boolean _startSnmptrapd(
599                      FILE **trapInfo)
600                  {
601                      String snmptrapdCmd;
602                  
603                      Uint32 portNumber = PORT_NUMBER;
604                      char portNumberStr[32];
605                      sprintf(portNumberStr, "%lu", (unsigned long) portNumber);
606                  
607                      //
608 yi.zhou 1.1          // build snmptrapd cmd options
609                      //
610                  
611                      // Specify logging incoming traps to trapLogFile 
612                      // Save the process ID of the snmptrapd in procIdFile
613                      snmptrapdCmd.append(
614                          "/usr/sbin/snmptrapd -f -Lf trapLogFile -p procIdFile");
615                  
616                      // Specify incoming trap format
617                      snmptrapdCmd.append( " -F \"\nTrap Info: %P\nVariable: %v\n\"");
618                  
619                      // Specify listening address
620                      snmptrapdCmd.append(" UDP:");
621                      snmptrapdCmd.append(System::getFullyQualifiedHostName ());
622                  
623                      snmptrapdCmd.append(":");
624                      snmptrapdCmd.append(portNumberStr);
625                  
626                      if ((*trapInfo = popen(snmptrapdCmd.getCString(), "r")) == NULL)
627                      {
628                          throw Exception ("snmptrapd can not be started");
629 yi.zhou 1.1          }
630                  
631                  #define MAX_ITERATIONS 300
632                  #define SLEEP_SEC 1
633                  
634                      Uint32 iterations = 0;
635                  
636                      // Wait until snmptrapd startted 
637                      while (iterations < MAX_ITERATIONS)
638                      {
639                          iterations++;
640                          if (FileSystem::exists("procIdFile"))
641                          {
642                              return (true);
643                          }
644                          else
645                          {
646                              System::sleep(SLEEP_SEC);
647                          
648                          }
649                      }
650 yi.zhou 1.1      
651                      throw Exception ("snmptrapd can not be started");
652                  }
653                  #endif
654                  
655                  void _removeTrapLogFile ()
656                  {
657                      String logFile = _getLogFile();
658                  
659                      // if trapLogFile exists, remove it
660                      if (FileSystem::exists(logFile))
661                      {
662                          FileSystem::removeFile(logFile);
663                      }
664                  }
665                  
666 yi.zhou 1.2      void _receiveExpectedTraps(CIMClient& workClient, 
667 yi.zhou 1.1          Uint32 indicationSendCount,
668                      Uint32 runClientThreadCount)
669                  {
670                  
671                      CIMClient * clientConnections = new CIMClient[runClientThreadCount];
672                  
673                      // determine total number of indication send count
674                      indicationSendCountTotal = indicationSendCount * runClientThreadCount;
675                  
676                      // calculate the timeout based on the total send count allowing
677                      // using the MSG_PER_SEC rate 
678                      // allow 20 seconds of test overhead for very small tests 
679                  
680                  #define MSG_PER_SEC 4
681                  
682                      Uint32 testTimeout = 20000+(indicationSendCountTotal/MSG_PER_SEC)*1000;
683                  
684                      // connect the clients
685                      for(Uint32 i = 0; i < runClientThreadCount; i++)
686                      {
687                          clientConnections[i].setTimeout(testTimeout);
688 yi.zhou 1.1              clientConnections[i].connectLocal();
689                      }
690                  
691                      // run tests
692                      Thread ** clientThreads = new Thread *[runClientThreadCount];
693                  
694                      Stopwatch trapReceiverElapsedTime;
695                  
696                      trapReceiverElapsedTime.start();
697                  
698                      for(Uint32 i = 0; i < runClientThreadCount; i++)
699                      {
700                          clientThreads[i] = _runTestThreads(&clientConnections[i],
701                              indicationSendCount, i);
702                      }
703                  
704                      for(Uint32 i=0; i< runClientThreadCount; i++)
705                      {
706                          clientThreads[i]->join();
707                      }
708                  
709 yi.zhou 1.1          delete[] clientConnections;
710                      delete[] clientThreads;
711                  
712                      //
713                      //  Allow time for the trap to be received
714                      //  Wait in SLEEP_SEC second intervals.
715                      //  Put msg out every MSG_SEC intervals
716                      //
717                  
718                  #define SLEEP_SEC 1
719                  #define COUT_TIME_INTERVAL 30
720                  #define MAX_NO_CHANGE_ITERATIONS COUT_TIME_INTERVAL*3
721                  
722                      Uint32 noChangeIterations = 0;
723                      Uint32 priorReceivedTrap1Count = 0;
724                      Uint32 priorReceivedTrap2Count = 0;
725                      Uint32 currentReceivedTrap1Count = 0;
726                      Uint32 currentReceivedTrap2Count = 0;
727                      Uint32 totalIterations = 0;
728                  
729                      //
730 yi.zhou 1.1          // Wait for the trap receiver to receive the expected
731                      // number of Indication traps, indicationSendCountTotal. 
732                      //
733                      // We will continue to wait until either indicationSendCountTotal
734                      // Indications have been received by the trap receiver or no new
735                      // Indications have been received in the previous
736                      // MAX_NO_CHANGE_ITERATIONS.
737                      // iterations. 
738                      //
739                  
740                      Boolean receivedTrapCountComplete = false;
741                      Boolean receiverTrap1NoChange = true;
742                      Boolean receiverTrap2NoChange = true;
743                  
744                      while (noChangeIterations <= MAX_NO_CHANGE_ITERATIONS)
745                      {
746                          totalIterations++;
747                  
748                          currentReceivedTrap1Count = _getReceivedTrapCount(_SNMPV1_TRAP); 
749                          currentReceivedTrap2Count = _getReceivedTrapCount(_SNMPV2C_TRAP); 
750                  
751 yi.zhou 1.1              if (totalIterations % COUT_TIME_INTERVAL == 1 &&
752                              !(receivedTrapCountComplete))
753                          {
754                              cout << "++++ The trap receiver has received "
755                              << currentReceivedTrap1Count << " of "
756                              << indicationSendCountTotal << " SNMPv1 trap."
757                              << endl;
758                              cout << "++++ The trap receiver has received "
759                              << currentReceivedTrap2Count << " of "
760                              << indicationSendCountTotal << " SNMPv2c trap."
761                              << endl;
762                          }
763                  
764                          if ((indicationSendCountTotal == currentReceivedTrap1Count) &&
765                              (indicationSendCountTotal == currentReceivedTrap2Count))
766                          {
767                               receivedTrapCountComplete = true;
768                               trapReceiverElapsedTime.stop();
769                          }
770                          if (!(receiverTrap1NoChange =
771                                  (priorReceivedTrap1Count == currentReceivedTrap1Count)))
772 yi.zhou 1.1              {
773                               priorReceivedTrap1Count = currentReceivedTrap1Count;
774                          }
775                  
776                          if (!(receiverTrap2NoChange =
777                                  (priorReceivedTrap2Count == currentReceivedTrap2Count)))
778                          {
779                               priorReceivedTrap2Count = currentReceivedTrap2Count;
780                          }
781                  
782                          if (receivedTrapCountComplete)
783                          {
784                              cout << "++++ The trap receiver has received "
785                              << currentReceivedTrap1Count << " of "
786                              << indicationSendCountTotal << " SNMPv1 trap."
787                              << endl;
788                              cout << "++++ The trap receiver has received "
789                              << currentReceivedTrap2Count << " of "
790                              << indicationSendCountTotal << " SNMPv2c trap."
791                              << endl;
792                  
793 yi.zhou 1.1                  break;
794                          }
795                          if (receiverTrap1NoChange || receiverTrap2NoChange)
796                          {
797                             noChangeIterations++;
798                          }
799                          else
800                          {
801                             noChangeIterations = 0;
802                          }
803                  
804                          System::sleep (SLEEP_SEC);
805                      }
806                  
807                      if (!receivedTrapCountComplete)
808                      {
809                          trapReceiverElapsedTime.stop();
810                      }
811                  
812                      // assert that all indications sent have been received. 
813                      PEGASUS_TEST_ASSERT(indicationSendCountTotal ==
814 yi.zhou 1.1             currentReceivedTrap1Count);
815                      PEGASUS_TEST_ASSERT(indicationSendCountTotal ==
816                         currentReceivedTrap2Count);
817 yi.zhou 1.2      }
818                  
819                  int _beginTest(CIMClient& workClient, 
820                      Uint32 indicationSendCount,
821                      Uint32 runClientThreadCount)
822                  {
823 yi.zhou 1.1      
824                  #ifdef PEGASUS_USE_NET_SNMP
825 yi.zhou 1.2      
826                      // Stop snmptrapd process if it is running
827                      _stopSnmptrapd();
828                  
829                      // if trapLogFile exists, remove it
830                      _removeTrapLogFile();
831                  
832                      FILE * trapInfo;
833                  
834                      try
835                      {
836                          _startSnmptrapd(&trapInfo);
837                      }
838                      catch (Exception & e)
839                      {
840                          cerr << e.getMessage() << endl;
841                          return (-1);
842                      }
843                  
844                      // Extended for all snmp implementation
845                      _receiveExpectedTraps(workClient, indicationSendCount, 
846 yi.zhou 1.2      	runClientThreadCount);
847                  
848 yi.zhou 1.1          // Stop snmptrapd process if it is running and remove procIdFile
849                      _stopSnmptrapd();
850                  
851                      pclose(trapInfo);
852                  
853                      // if error encountered then fail the test.
854                      if (errorsEncountered.get())
855                      {  
856                          cout << "+++++ test failed" << endl;
857                          return (-1);
858                      }
859                      else
860                      {
861                          cout << "+++++ passed all tests" << endl;
862                      }
863 yi.zhou 1.2      
864                      return (0);
865                  
866                  #else
867                      cerr << "Cannot create a trap receiver." << endl;
868                      return (-1);
869                  #endif
870 yi.zhou 1.1      }
871                  
872                  int main (int argc, char** argv)
873                  {
874                      // This client connection is used solely to create and delete subscriptions.
875                      CIMClient workClient;
876                      try
877                      {
878                          workClient.connectLocal();
879                  
880                          if (argc <= 1 || argc > 4)
881                          {
882                              cerr << "Invalid argument count: " << argc << endl;
883                              _usage();
884                              return 1;
885                          }
886                          else if (strcmp(argv[1], "setup") == 0)
887                          {
888                              if (argc < 3)
889                              {
890                                  cerr << "Missing query language" << endl;
891 yi.zhou 1.1                      _usage();
892                                  return -1;
893                              }
894                  
895                              if ((strcmp(argv[2], "WQL") != 0) &&
896                                  (strcmp(argv[2], "DMTF:CQL") != 0))
897                              {
898                                  cerr << "Invalid query language: '" << argv[2] << "'" << endl;
899                                  _usage();
900                                  return -1;
901                              }
902                          
903                              _setup(workClient, argv[2]);
904                  
905                              cout << "+++++ setup completed successfully" << endl;
906                              return 0;
907                          } 
908                          else if (String::equalNoCase(argv[1], "run"))
909                          {
910                              if (argc < 3)
911                              {
912 yi.zhou 1.1                      cerr << "Invalid indicationSendCount." << endl;
913                                  _usage ();
914                                  return -1;
915                              }
916                  
917                              Uint32 indicationSendCount = atoi(argv[2]);
918                  
919                              Uint32 runClientThreadCount = 1;
920                  
921                              if (argc == 4) 
922                              {
923                                  runClientThreadCount = atoi(argv[3]);
924                              }
925                  
926                              int rc = _beginTest(workClient, indicationSendCount, 
927                                  runClientThreadCount);
928                              return rc;
929                          } 
930                          else if (String::equalNoCase(argv[1], "cleanup"))
931                          {
932                              if (argc > 2)
933 yi.zhou 1.1                  {
934                                  cerr << "Invalid argument count." << endl;
935                                  _usage ();
936                                  return -1;
937                              }
938                         
939                              _cleanup (workClient);
940                  
941                              cout << "+++++ cleanup completed successfully" << endl;
942                              return 0;
943                          }
944                          else if (String::equalNoCase(argv[1], "removelog"))
945                          {
946                              if (argc > 2)
947                              {
948                                  cerr << "Invalid argument count." << endl;
949                                  _usage ();
950                                  return -1;
951                              }
952                         
953                              _removeTrapLogFile ();
954 yi.zhou 1.1                  cout << "+++++ removelog completed successfully" << endl;
955                              return 0;
956                          }
957                          else
958                          {
959                              cerr << "Invalid option: " << argv[1] << endl;
960                              _usage ();
961                              return -1;
962                          }
963                      }
964                      catch (Exception & e)
965                      {
966                          cerr << "Error: " << e.getMessage() << endl;
967                      }
968                  
969                      PEGASUS_UNREACHABLE( return 0; )
970                  }

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2