(file) Return to main.cpp CVS log (file) (dir) Up to [OMI] / omi / tests / miapi

   1 krisbash 1.1 /*============================================================================
   2               * Copyright (C) Microsoft Corporation, All rights reserved. 
   3               *============================================================================
   4               */
   5              #include <ut/ut.h>
   6              #include <MI.h>
   7              #include <miapi/Application.h>
   8              #include <pal/lock.h>
   9              #include <pal/atomic.h>
  10              #include <pal/sem.h>
  11              #include <miapi/Options.h>
  12              #include <tests/util/util.h>
  13              
  14              extern "C"
  15              {
  16              MI_Result OperationOptions_MigrateOptions(
  17                  _In_opt_ MI_OperationOptions *sourceOperation, 
  18                  _Out_ MI_OperationOptions *destination);
  19              }
  20              
  21              struct _TestProtocolHandler
  22 krisbash 1.1 {
  23                  const char *protocolHandlerName;
  24                  const MI_Char *protocolHandlerName_w;
  25                  const char *protocolHandlerDll;
  26                  const char *protocolHandlerEntryPoint;
  27              };
  28              
  29              const struct _TestProtocolHandler g_test1Transport =
  30              {
  31                  "Test1",
  32                  PAL_T("Test1"),
  33              #if defined(_MSC_VER)
  34                  "test_miapi.dll",
  35              #else
  36                  "libtest_miapi."CONFIG_SHLIBEXT,
  37              #endif
  38                  "Test1_Application_Initialize"
  39              } ;
  40              
  41              const struct _TestProtocolHandler g_test2Transport =
  42              {
  43 krisbash 1.1     "Test2",
  44                  PAL_T("Test2"),
  45              #if defined(_MSC_VER)
  46                  "test_miapi.dll",
  47              #else
  48                  "libtest_miapi."CONFIG_SHLIBEXT,
  49              #endif
  50                  "Test2_Application_Initialize"
  51              } ;
  52              
  53              
  54              MI_OperationCallback_ResponseType g_WriteErrorResponseType = MI_OperationCallback_ResponseType_Yes;
  55              MI_OperationCallback_ResponseType g_PromptUserResponseType = MI_OperationCallback_ResponseType_Yes;
  56              
  57              extern "C" MI_CONST MI_ClassDecl MyClass_rtti;
  58              
  59              /* in order to link to test_util.lib */
  60              Batch* g_batch;
  61              FILE* g_logfile;
  62              char* g_dirpath;
  63              
  64 krisbash 1.1 MI_Instance *TestCreateInstance(_Inout_ MI_Application *application, _In_z_ const MI_Char *className)
  65              {
  66                  MI_Instance *instance = NULL;
  67                  if (NitsAssert(MI_Application_NewInstance(application, className, NULL, &instance) == MI_RESULT_OK, PAL_T("failed to create instance")))
  68                  {
  69                      MI_Value value;
  70                      value.uint32 = 1;
  71              
  72                      NitsAssert(MI_Instance_AddElement(instance, PAL_T("key"), &value, MI_UINT32, MI_FLAG_KEY)==MI_RESULT_OK, PAL_T("Failed to add property to instance"));
  73                  }
  74                  return instance;
  75              }
  76              
  77              extern "C" MI_Module* MI_MAIN_CALL MyProvFunction(MI_Server* server)
  78              {
  79                  return NULL;
  80              }
  81              
  82              struct RuntimeTestData
  83              {
  84                  const struct _TestProtocolHandler *transport;
  85 krisbash 1.1 
  86                  MI_Application application;
  87                  MI_Session session;
  88                  MI_Instance *testInstance;
  89              
  90                  ptrdiff_t sessionCloseFinished;
  91                  volatile ptrdiff_t operationFinished;
  92                  MI_Result finialResult;
  93              
  94                  ptrdiff_t session_writeErrorCount;
  95                  ptrdiff_t session_writeMessageCount;
  96              
  97                  ptrdiff_t instanceCount;
  98                  ptrdiff_t classCount;
  99                  ptrdiff_t indicationCount;
 100                  ptrdiff_t methodCount;
 101                  ptrdiff_t promptUserCount;
 102                  ptrdiff_t writeErrorCount;
 103                  ptrdiff_t writeMessageCount;
 104                  ptrdiff_t writeProgressCount;
 105                  ptrdiff_t streamedParameterCount;
 106 krisbash 1.1 };
 107              
 108              // This function resets all counters/flags inside runtime test data
 109              // it is called from beginning of test body for every test which uses this data
 110              // Ideally it should not be required but since nits does not run setup fixtures during fault injection
 111              // we need to initialize this data ourselves again in the body
 112              // supporting running entire test including setup's is a TODO feature request for nits
 113              extern "C" void ResetRuntimeTestData(struct RuntimeTestData *data)
 114              {
 115                  data->sessionCloseFinished = 0;
 116                  data->operationFinished = 0;
 117                  data->finialResult = MI_RESULT_OK;
 118                  data->session_writeErrorCount = 0;
 119                  data->session_writeMessageCount = 0;
 120                  data->instanceCount = 0;
 121                  data->classCount = 0;
 122                  data->indicationCount = 0;
 123                  data->methodCount = 0;
 124                  data->promptUserCount = 0;
 125                  data->writeErrorCount = 0;
 126                  data->writeMessageCount = 0;
 127 krisbash 1.1     data->writeProgressCount = 0;
 128                  data->streamedParameterCount = 0;
 129              }
 130              
 131              NitsSetup0(BaseSetup, RuntimeTestData)
 132              {
 133              }
 134              NitsEndSetup
 135              
 136              struct RuntimeApplicationSetup
 137              {
 138                  const struct _TestProtocolHandler *transport;
 139              };
 140              struct RuntimeApplicationSetup g_RuntimeApplicationSetup_Test1 = { &g_test1Transport };
 141              struct RuntimeApplicationSetup g_RuntimeApplicationSetup_Test2 = { &g_test2Transport };
 142              
 143              NitsSetup1(SetupDefaultApplication, RuntimeApplicationSetup,
 144                          BaseSetup, BaseSetupDefaults)
 145              {
 146                  MI_Application *application = &NitsContext()->_BaseSetup->_RuntimeTestData->application;
 147                  const struct _TestProtocolHandler *transport = NitsContext()->_RuntimeApplicationSetup->transport;
 148 krisbash 1.1 
 149                  NitsContext()->_BaseSetup->_RuntimeTestData->transport = transport;
 150              
 151                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")))
 152                  {
 153                      if (NitsAssert(application->ft != NULL, PAL_T("MI_Application_Initialize returns object with function table")))
 154                      {
 155                          NitsCompare(Application_SetTestTransport(application, transport->protocolHandlerName, transport->protocolHandlerDll, transport->protocolHandlerEntryPoint, 1, 1, MI_TRUE, MI_TRUE), MI_RESULT_OK, PAL_T("Failed to set test transport"));
 156                      }
 157                  }
 158              }
 159              NitsEndSetup
 160              
 161              NitsCleanup(SetupDefaultApplication)
 162              {
 163                  MI_Application *application = &NitsContext()->_BaseSetup->_RuntimeTestData->application;
 164                  NitsCompare(MI_Application_Close(application), MI_RESULT_OK, PAL_T("Failed to close MI_Application"));
 165              }
 166              NitsEndCleanup
 167              
 168              
 169 krisbash 1.1 NitsSetup1(SetupDefaultSession, NitsEmptyStruct,
 170                          BaseSetup, BaseSetupDefaults)
 171              {
 172                  MI_Application *application = &NitsContext()->_BaseSetup->_RuntimeTestData->application;
 173                  MI_Session *session = &NitsContext()->_BaseSetup->_RuntimeTestData->session;
 174                  const struct _TestProtocolHandler *transport = NitsContext()->_BaseSetup->_RuntimeTestData->transport;
 175              
 176                  if (NitsCompare(MI_Application_NewSession(application, transport->protocolHandlerName_w, NULL, NULL, NULL, NULL, session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
 177                      NitsAssert(session->ft != NULL, PAL_T("MI_Session function table should not be NULL")))
 178                  {
 179                  }
 180              }
 181              NitsEndSetup
 182              
 183              NitsCleanup(SetupDefaultSession)
 184              {
 185                  MI_Session *session = &NitsContext()->_BaseSetup->_RuntimeTestData->session;
 186                  NitsCompare(MI_Session_Close(session, NULL, NULL), MI_RESULT_OK, PAL_T("Failed to close MI_Session"));
 187              }
 188              NitsEndCleanup
 189              
 190 krisbash 1.1 
 191              struct SetupTestInstance_Data
 192              {
 193                  const MI_Char *className;
 194              };
 195              
 196              SetupTestInstance_Data g_SetupTestInstance_test = { PAL_T("test") };
 197              SetupTestInstance_Data g_SetupTestInstance_DeliverResultDifferentThread = { PAL_T("DeliverResultDifferentThread") };
 198              SetupTestInstance_Data g_SetupTestInstance_NoResult = { PAL_T("NoResult") };
 199              
 200              NitsSetup1(SetupTestInstance, SetupTestInstance_Data,
 201                          BaseSetup, BaseSetupDefaults)
 202              {
 203                  MI_Application *application = &NitsContext()->_BaseSetup->_RuntimeTestData->application;
 204                  const MI_Char *className = NitsContext()->_SetupTestInstance_Data->className;
 205                  NitsContext()->_BaseSetup->_RuntimeTestData->testInstance = TestCreateInstance(application, className);
 206              }
 207              NitsEndSetup
 208              
 209              NitsCleanup(SetupTestInstance)
 210              {
 211 krisbash 1.1     MI_Instance *instance = NitsContext()->_BaseSetup->_RuntimeTestData->testInstance;
 212                  NitsCompare(MI_Instance_Delete(instance), MI_RESULT_OK, PAL_T("Failed to delete instace"));
 213              }
 214              NitsEndCleanup
 215              
 216              /*==========================================================================================*/
 217              /*==========================================================================================*/
 218              /*==========================================================================================*/
 219              /*============================= MI_Application tests =======================================*/
 220              /*==========================================================================================*/
 221              /*==========================================================================================*/
 222              /*==========================================================================================*/
 223              
 224              /* Manually test successful MI_Application_Initialize and then close it */
 225              NitsTest(MI_Application_Initialize_Success)
 226              {
 227                  MI_Application application = MI_APPLICATION_NULL;
 228                  NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK"));
 229                  NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL"));
 230                  MI_Application_Close(&application);
 231              
 232 krisbash 1.1     NitsCompare(MI_Application_Initialize(0, PAL_T("My application ID"), NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK"));
 233                  NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL"));
 234                  MI_Application_Close(&application);
 235              }
 236              NitsEndTest
 237              
 238              /* Test invalid parameters for MI_Application_Initialize */
 239              NitsTest(MI_Application_Initialize_InvalidParameters)
 240              {
 241                  MI_Application application = MI_APPLICATION_NULL;
 242                  MI_Instance *extendedError = NULL;
 243              
 244              #if defined (_MSC_VER)
 245              #pragma prefast(push)
 246              #pragma prefast(disable: 6309)
 247              #endif
 248                  NitsCompare(MI_Application_Initialize(0, NULL, NULL, NULL), MI_RESULT_INVALID_PARAMETER, PAL_T("MI_Application_Initialize returns INVALID_PARAMETER"));
 249                  NitsCompare(MI_Application_Initialize(25, NULL, NULL, &application), MI_RESULT_INVALID_PARAMETER, PAL_T("MI_Application_Initialize returns INVALID_PARAMETER"));
 250                  MI_Application_Close(&application);
 251                  NitsCompare(MI_Application_InitializeV1(25, NULL, &extendedError, &application), MI_RESULT_INVALID_PARAMETER, PAL_T("MI_Application_Initialize returns INVALID_PARAMETER"));
 252              #if defined (_MSC_VER)
 253 krisbash 1.1 #pragma prefast(pop)
 254              #endif
 255                  if (extendedError)
 256                  {
 257                      MI_Instance_Delete(extendedError);
 258                  }
 259                  MI_Application_Close(&application);
 260              }
 261              NitsEndTest
 262              
 263              /* Test invalid parameters for MI_Application_Close */
 264              NitsTest(MI_Application_Close_InvalidParameters)
 265              {
 266                  MI_Application application = MI_APPLICATION_NULL;
 267                  NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK"));
 268                  NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL"));
 269              
 270                  if (application.ft == NULL)
 271                      NitsReturn;
 272              
 273                  const MI_ApplicationFT * const copyFT = application.ft;
 274 krisbash 1.1 
 275              #if defined (_MSC_VER)
 276              #pragma prefast(push)
 277              #pragma prefast(disable: 6309)
 278              #endif
 279                  MI_Application_Close(NULL);
 280                  application.ft->Close(NULL);
 281              #if defined (_MSC_VER)
 282              #pragma prefast(pop)
 283              #endif
 284              
 285                  MI_Application_Close(&application);
 286              
 287                  NitsAssert(application.ft == NULL, PAL_T("MI_Application function table should be NULL"));
 288              
 289              #if defined (_MSC_VER)
 290              #pragma prefast(push)
 291              #pragma prefast(disable: 6309)
 292              #endif
 293                  copyFT->Close(&application);
 294              #if defined (_MSC_VER)
 295 krisbash 1.1 #pragma prefast(pop)
 296              #endif
 297              }
 298              NitsEndTest
 299              
 300              /*==========================================================================================*/
 301              /*==========================================================================================*/
 302              /*==========================================================================================*/
 303              /*===================== MI_Application_NewHostedProvider tests =============================*/
 304              /*==========================================================================================*/
 305              /*==========================================================================================*/
 306              /*==========================================================================================*/
 307              
 308              /* Test success case for MI_Application_NewHostedProvider */
 309              NitsTest1(MI_Application_NewHostedProvider_Success, 
 310                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 311              {
 312                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 313                  MI_HostedProvider hostedProvider = MI_HOSTEDPROVIDER_NULL;
 314                  MI_Application parentApplication = MI_APPLICATION_NULL;
 315              
 316 krisbash 1.1     if (NitsCompare(MI_Application_NewHostedProvider(application, PAL_T("root\\cimv2"), PAL_T("MyProvider"), MyProvFunction, NULL, &hostedProvider), MI_RESULT_OK, PAL_T("MI_Application_NewHostedProvider returns OK")))
 317                  {
 318                      MI_HostedProvider_GetApplication(&hostedProvider, &parentApplication);
 319                      NitsAssert(application->ft == parentApplication.ft, PAL_T("function tables should be same"));
 320                      NitsAssert(application->reserved1 == parentApplication.reserved1, PAL_T("reserved1 should be same"));
 321                      NitsAssert(application->reserved2 == parentApplication.reserved2, PAL_T("reserved2 should be same"));
 322                      MI_HostedProvider_Close(&hostedProvider);
 323                  }
 324              }
 325              NitsEndTest
 326              
 327              /* Test invalid parameter cases for MI_Application_NewHostedProvider */
 328              NitsTest1(MI_Application_NewHostedProvider_InvalidParameters, 
 329                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 330              {
 331                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 332                  MI_HostedProvider hostedProvider = MI_HOSTEDPROVIDER_NULL;
 333                  MI_Application parentApplication = MI_APPLICATION_NULL;
 334              
 335                  NitsCompare(application->ft->NewHostedProvider(NULL, PAL_T("root\\cimv2"), PAL_T("MyProvider"), MyProvFunction, NULL, &hostedProvider), MI_RESULT_INVALID_PARAMETER, PAL_T("MI_Application_NewHostedProvider invalid parameter"));
 336                  NitsCompare(application->ft->NewHostedProvider(application, NULL, PAL_T("MyProvider"), MyProvFunction, NULL, &hostedProvider), MI_RESULT_INVALID_PARAMETER, PAL_T("MI_Application_NewHostedProvider invalid parameter"));
 337 krisbash 1.1     NitsCompare(application->ft->NewHostedProvider(application, PAL_T("root\\cimv2"), NULL, MyProvFunction, NULL, &hostedProvider), MI_RESULT_INVALID_PARAMETER, PAL_T("MI_Application_NewHostedProvider invalid parameter"));
 338                  NitsCompare(application->ft->NewHostedProvider(application, PAL_T("root\\cimv2"), PAL_T("MyProvider"), NULL, NULL, &hostedProvider), MI_RESULT_INVALID_PARAMETER, PAL_T("MI_Application_NewHostedProvider invalid parameter"));
 339                  NitsCompare(application->ft->NewHostedProvider(application, PAL_T("root\\cimv2"), PAL_T("MyProvider"), MyProvFunction, NULL, NULL), MI_RESULT_INVALID_PARAMETER, PAL_T("MI_Application_NewHostedProvider invalid parameter"));
 340                      
 341                      
 342                  if (NitsCompare(application->ft->NewHostedProvider(application, PAL_T("root\\cimv2"), PAL_T("MyProvider"), MyProvFunction, NULL, &hostedProvider), MI_RESULT_OK, PAL_T("MI_Application_NewHostedProvider Succeeds")) &&
 343                      NitsAssert(hostedProvider.ft != NULL, PAL_T("Failed to get function table")))
 344                  {
 345              #if defined (_MSC_VER)
 346              #pragma prefast(push)
 347              #pragma prefast(disable: 6011)
 348              #endif
 349                      hostedProvider.ft->GetApplication(NULL, &parentApplication);
 350                      hostedProvider.ft->GetApplication(&hostedProvider, NULL);
 351                      hostedProvider.ft->Close(&hostedProvider);
 352                      hostedProvider.ft->Close(NULL);
 353              #if defined (_MSC_VER)
 354              #pragma prefast(pop)
 355              #endif
 356                  }
 357              }
 358 krisbash 1.1 NitsEndTest
 359              
 360              /*==========================================================================================*/
 361              /*==========================================================================================*/
 362              /*==========================================================================================*/
 363              /*================================= MI_Session tests =======================================*/
 364              /*==========================================================================================*/
 365              /*==========================================================================================*/
 366              /*==========================================================================================*/
 367              
 368              /* Test creation of a session, then close it synchronously */
 369              NitsTest1(MI_Application_NewSession_Success_CloseSync, 
 370                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 371              {
 372                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 373                  MI_Session session = MI_SESSION_NULL;
 374              
 375                  NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK"));
 376                  NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL"));
 377              
 378                  MI_Session_Close(&session, NULL, NULL);
 379 krisbash 1.1 }
 380              NitsEndTest
 381              
 382              /* Test creation of session, then close asynchronously */
 383              extern "C" void MI_CALL Test_Sesson_CloseAync_Callback(void *context)
 384              {
 385                  ptrdiff_t *wait = (ptrdiff_t*) context;
 386                  *wait = 1;
 387                  CondLock_Broadcast((ptrdiff_t) &wait);
 388              }
 389              
 390              NitsTest1(MI_Application_NewSession_Success_CloseAsync, 
 391                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 392              {
 393                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 394                  MI_Session session = MI_SESSION_NULL;
 395                  volatile ptrdiff_t wait = 0;
 396              
 397                  NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK"));
 398                  NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL"));
 399              
 400 krisbash 1.1     MI_Session_Close(&session, (void*) &wait, Test_Sesson_CloseAync_Callback);
 401                  
 402                  ptrdiff_t currentWait = wait;
 403                  while (!currentWait)
 404                  {
 405                      CondLock_Wait((ptrdiff_t)&wait, &wait, currentWait, CONDLOCK_DEFAULT_SPINCOUNT);
 406                      currentWait = wait;
 407                  }
 408              }
 409              NitsEndTest
 410              
 411              /* Test creation of session with destination options */
 412              NitsTest1(MI_Application_NewSession_Success_Options, 
 413                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 414              {
 415                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 416                  MI_Session session = MI_SESSION_NULL;
 417                  MI_DestinationOptions options = MI_DESTINATIONOPTIONS_NULL;
 418              
 419                  if (NitsCompare(MI_Application_NewDestinationOptions(application, &options), MI_RESULT_OK, PAL_T("NewDestinationOptions should succeed")))
 420                  {
 421 krisbash 1.1         if (NitsAssert(options.ft != NULL, PAL_T("Should have options function table")))
 422                      {
 423                          MI_UserCredentials creds = { 0 };
 424                          creds.authenticationType = MI_AUTH_TYPE_BASIC;
 425                          creds.credentials.usernamePassword.username = PAL_T("username");
 426                          creds.credentials.usernamePassword.domain = PAL_T("domain");
 427                          creds.credentials.usernamePassword.password = PAL_T("password");
 428              
 429                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
 430                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
 431                          NitsCompare(options.ft->AddCredentials(&options, PAL_T("option3"), &creds, 0), MI_RESULT_OK, PAL_T("AddCredentials should work"));
 432              
 433                          NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), NULL, &options, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK"));
 434                          NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL"));
 435              
 436                          MI_Session_Close(&session, NULL, NULL);
 437                      }
 438                      MI_DestinationOptions_Delete(&options);
 439                  }
 440              }
 441              NitsEndTest
 442 krisbash 1.1 
 443              /* test session creation with a destination machine name */
 444              NitsTest1(MI_Application_NewSession_WithRemoteMachine, 
 445                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 446              {
 447                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 448                  MI_Session session = MI_SESSION_NULL;
 449              
 450                  NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), PAL_T("destination"), NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK"));
 451                  NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL"));
 452              
 453                  MI_Session_Close(&session, NULL, NULL);
 454              }
 455              NitsEndTest
 456              
 457              /* test session creation with invalid parameters */
 458              NitsTest1(MI_Application_NewSession_InvalidParameters, 
 459                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 460              {
 461                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 462                  MI_Session session = MI_SESSION_NULL;
 463 krisbash 1.1 
 464                  NitsCompare(application->ft->NewSession(NULL, NULL, NULL, NULL, NULL, NULL, &session), MI_RESULT_INVALID_PARAMETER, PAL_T("NewSession should fail due to null application"));
 465                  MI_Session_Close(&session, NULL, NULL);
 466              
 467                  NitsCompare(application->ft->NewSession(application, NULL, NULL, NULL, NULL, NULL, NULL), MI_RESULT_INVALID_PARAMETER, PAL_T("NewSession should fail due to null session"));
 468              }
 469              NitsEndTest
 470              
 471              extern "C" void MI_CALL Application_NewSession_PSSemantics_writeMessage(
 472                  _In_     MI_Application *application,
 473                  _In_opt_ void *callbackContext, 
 474                              MI_Uint32 channel,
 475                  _In_z_   const MI_Char *  message)
 476              {
 477                  NitsAssert(application != NULL, PAL_T("session_writeMessage: application null"));
 478                  NitsAssert(message != NULL, PAL_T("session_writeMessage: message null"));
 479              }
 480              
 481              extern "C" void MI_CALL Application_NewSession_PSSemantics_writeError(
 482                  _In_     MI_Application *application,
 483                  _In_opt_ void *callbackContext, 
 484 krisbash 1.1     _In_ MI_Instance *instance)
 485              {
 486                  NitsAssert(application != NULL, PAL_T("session_writeMessage: application null"));
 487              }
 488              
 489              NitsTest1(Application_NewSession_PSSemantics, 
 490                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 491              {
 492                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 493                  MI_Session session = MI_SESSION_NULL;
 494                  MI_SessionCallbacks callbacks = MI_SESSIONCALLBACKS_NULL;
 495                  callbacks.writeError = Application_NewSession_PSSemantics_writeError;
 496                  callbacks.writeMessage = Application_NewSession_PSSemantics_writeMessage;
 497              
 498              
 499                  if(NitsCompare(application->ft->NewSession(application, PAL_T("Test1"), NULL, NULL, &callbacks, NULL, &session), MI_RESULT_OK, PAL_T("NewSession should succeed")))
 500                  {
 501                      MI_Session_Close(&session, NULL, NULL);
 502                  }
 503              }
 504              NitsEndTest
 505 krisbash 1.1 
 506              NitsTest1(MI_Session_GetParent, 
 507                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 508              {
 509                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 510                  MI_Application testApplication = MI_APPLICATION_NULL;
 511                  MI_Session session = MI_SESSION_NULL;
 512              
 513                  if (NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")))
 514                  {
 515                      NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL"));
 516              
 517                      MI_Session_GetApplication(&session, &testApplication);
 518              
 519                      NitsAssert(memcmp(application, &testApplication, sizeof(MI_Application))==0, PAL_T("applications should be same"));
 520              
 521                      MI_Session_Close(&session, NULL, NULL);
 522                  }
 523              }
 524              NitsEndTest
 525              
 526 krisbash 1.1 /*==========================================================================================*/
 527              /*==========================================================================================*/
 528              /*==========================================================================================*/
 529              /*======================= MI_Application_NewInstance tests =================================*/
 530              /*==========================================================================================*/
 531              /*==========================================================================================*/
 532              /*==========================================================================================*/
 533              
 534              NitsTest1(MI_Application_NewInstance_Success, 
 535                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 536              {
 537                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 538                  MI_Instance *instance;
 539              
 540                  instance = TestCreateInstance(application, PAL_T("MyClass"));
 541                  if (NitsAssert(instance!=NULL, PAL_T("MI_Application_NewInstance should succeed")))
 542                  {
 543                      NitsAssert(instance->ft != NULL, PAL_T("MI_instance function table should not be NULL"));
 544              
 545                      MI_Instance_Delete(instance);
 546                  }
 547 krisbash 1.1 }
 548              NitsEndTest
 549              
 550              NitsTest1(MI_Application_NewInstance_WithRTTI_Success, 
 551                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 552              {
 553                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 554                  MI_Instance *instance = NULL;
 555              
 556                  if (NitsCompare(MI_Application_NewInstance(application, PAL_T("MyClass"), &MyClass_rtti, &instance), MI_RESULT_OK, PAL_T("MI_Application_NewInstance returns OK")))
 557                  {
 558                      NitsAssert(instance->ft != NULL, PAL_T("MI_instance function table should not be NULL"));
 559              
 560                      MI_Instance_Delete(instance);
 561                  }
 562              }
 563              NitsEndTest
 564              
 565              NitsTest1(MI_Application_NewInstance_InvalidParameters, 
 566                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 567              {
 568 krisbash 1.1     MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 569                  MI_Instance *instance;
 570              
 571                  NitsCompare(application->ft->NewInstance(NULL, PAL_T("MyClass"), NULL, &instance), MI_RESULT_INVALID_PARAMETER, PAL_T("NewInstance should fail due to null application"));
 572                  NitsCompare(application->ft->NewInstance(application, NULL, NULL, &instance), MI_RESULT_INVALID_PARAMETER, PAL_T("NewInstance should fail due to null class name"));
 573                  NitsCompare(application->ft->NewInstance(application, PAL_T("MyClass"), NULL, NULL), MI_RESULT_INVALID_PARAMETER, PAL_T("NewInstance should fail due to null instance"));
 574              }
 575              NitsEndTest
 576              
 577              
 578              /*==========================================================================================*/
 579              /*==========================================================================================*/
 580              /*==========================================================================================*/
 581              /*================== MI_Application_NewDestinationOptions tests ============================*/
 582              /*==========================================================================================*/
 583              /*==========================================================================================*/
 584              /*==========================================================================================*/
 585              
 586              NitsTest1(MI_Application_NewDestinationOptions_All, 
 587                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 588              {
 589 krisbash 1.1     MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 590                  MI_DestinationOptions options = MI_DESTINATIONOPTIONS_NULL;
 591                      
 592              #if defined (_MSC_VER)
 593              #pragma prefast(push)
 594              #pragma prefast(disable: 6309)
 595              #endif
 596                  NitsCompare(MI_Application_NewDestinationOptions(NULL, &options), MI_RESULT_INVALID_PARAMETER, PAL_T("NewDestinationOptions invalid parameter"));
 597                  NitsCompare(MI_Application_NewDestinationOptions(application, NULL), MI_RESULT_INVALID_PARAMETER, PAL_T("NewDestinationOptions invalid parameter"));
 598              #if defined (_MSC_VER)
 599              #pragma prefast(pop)
 600              #endif
 601              
 602                  if (NitsCompare(MI_Application_NewDestinationOptions(application, &options), MI_RESULT_OK, PAL_T("NewDestinationOptions should succeed")))
 603                  {
 604                      NitsAssert(options.ft != NULL, PAL_T("Should have options function table"));
 605                      if (options.ft != NULL)
 606                      {
 607                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
 608                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
 609                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
 610 krisbash 1.1             NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value22"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
 611                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 22), MI_RESULT_INVALID_PARAMETER, PAL_T("SetString invalid parameter"));
 612                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), NULL, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetString invalid parameter"));
 613                          NitsCompare(options.ft->SetString(&options, NULL, PAL_T("value1"), 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetString invalid parameter"));
 614                              
 615                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 33, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
 616                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
 617                          NitsCompare(options.ft->SetNumber(&options, NULL, 22, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetNumber invalid parameter"));
 618                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 22), MI_RESULT_INVALID_PARAMETER, PAL_T("SetNumber invalid parameter"));
 619                              
 620                          {
 621                              NitsCompare(options.ft->AddCredentials(&options, PAL_T("option3"), NULL, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("AddCredentials should fail"));
 622                          }
 623                          {
 624                              MI_UserCredentials creds = { MI_AUTH_TYPE_BASIC, {{ PAL_T("domain"), NULL, PAL_T("password") } }};
 625                              NitsCompare(options.ft->AddCredentials(&options, PAL_T("option3"), &creds, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("AddCredentials invalid parameter"));
 626                          }
 627                          {
 628                              MI_UserCredentials creds = { MI_AUTH_TYPE_BASIC, { { PAL_T("domain"), PAL_T("username"), PAL_T("password") } } };
 629                              NitsCompare(options.ft->AddCredentials(&options, PAL_T("option3"), &creds, 0), MI_RESULT_OK, PAL_T("AddCredentials should work"));
 630                          }
 631 krisbash 1.1             {
 632                              MI_UserCredentials creds = { MI_AUTH_TYPE_BASIC, {{ PAL_T("domain2"), PAL_T("username2"), PAL_T("password2") }} };
 633                              NitsCompare(options.ft->AddCredentials(&options, PAL_T("option3"), &creds, 0), MI_RESULT_FAILED, PAL_T("AddCredentials should fail because namne and type already exist"));
 634                          }
 635                          {
 636                              MI_UserCredentials creds = { MI_AUTH_TYPE_BASIC, {{ PAL_T("domain"), PAL_T("username"), PAL_T("password") }} };
 637                              NitsCompare(options.ft->AddCredentials(&options, NULL, &creds, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("AddCredentials invalid parameter"));
 638                          }
 639                          {
 640                              MI_UserCredentials creds = { NULL, {{ PAL_T("domain"), PAL_T("username"), PAL_T("password") } }};
 641                              NitsCompare(options.ft->AddCredentials(&options, PAL_T("option3"), &creds, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("AddCredentials invalid parameter"));
 642                          }
 643                          {
 644                              MI_UserCredentials creds = { MI_AUTH_TYPE_BASIC, {{ NULL, PAL_T("username"), PAL_T("password") }} };
 645                              NitsCompare(options.ft->AddCredentials(&options, PAL_T("option5"), &creds, 0), MI_RESULT_OK, PAL_T("AddCredentials should work"));
 646                          }
 647                          {
 648                              MI_UserCredentials creds = { MI_AUTH_TYPE_BASIC, {{ PAL_T("domain"), PAL_T("username"), NULL }} };
 649                              NitsCompare(options.ft->AddCredentials(&options, PAL_T("option4"), &creds, 0), MI_RESULT_OK, PAL_T("AddCredentials should work"));
 650                          }
 651                          {
 652 krisbash 1.1                 MI_UserCredentials creds = { MI_AUTH_TYPE_BASIC, {{ PAL_T("domain"), PAL_T("username"), PAL_T("password") } }};
 653                              NitsCompare(options.ft->AddCredentials(&options, PAL_T("option3"), &creds, 22), MI_RESULT_INVALID_PARAMETER, PAL_T("AddCredentials invalid parameter"));
 654                          }
 655                          options.ft->Delete(NULL);
 656              
 657                          MI_DestinationOptions_Delete(&options);
 658                      }
 659                  }
 660              }
 661              NitsEndTest
 662              
 663              /*==========================================================================================*/
 664              /*==========================================================================================*/
 665              /*==========================================================================================*/
 666              /*==================== MI_Application_NewOperationOptions tests ============================*/
 667              /*==========================================================================================*/
 668              /*==========================================================================================*/
 669              /*==========================================================================================*/
 670              
 671              NitsTest1(MI_Application_NewOperationOptions_All, 
 672                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
 673 krisbash 1.1 {
 674                  MI_Application *application = &NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData->application;
 675                  MI_OperationOptions options = MI_DESTINATIONOPTIONS_NULL;
 676                  MI_OperationOptions newOptions = MI_DESTINATIONOPTIONS_NULL;
 677              
 678              #if defined (_MSC_VER)
 679              #pragma prefast(push)
 680              #pragma prefast(disable: 6309)
 681              #endif
 682                  NitsCompare(MI_Application_NewOperationOptions(NULL, MI_FALSE, &options), MI_RESULT_INVALID_PARAMETER, PAL_T("NewOperationOptions invalid parameter"));
 683                  NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, NULL), MI_RESULT_INVALID_PARAMETER, PAL_T("NewOperationOptions invalid parameter"));
 684              #if defined (_MSC_VER)
 685              #pragma prefast(pop)
 686              #endif
 687              
 688                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
 689                  {
 690                      NitsAssert(options.ft != NULL, PAL_T("Should have options function table"));
 691                      if (options.ft != NULL)
 692                      {
 693                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
 694 krisbash 1.1             NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value2"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
 695                          NitsCompare(options.ft->SetString(&options, NULL, PAL_T("value1"), 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetString invalid parameter"));
 696                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), NULL, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetString invalid parameter"));
 697                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 22), MI_RESULT_INVALID_PARAMETER, PAL_T("SetString invalid parameter"));
 698              
 699                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
 700                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 33, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
 701                          NitsCompare(options.ft->SetNumber(&options, NULL, 22, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetNumber invalid parameter"));
 702                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 22), MI_RESULT_INVALID_PARAMETER, PAL_T("SetNumber invalid parameter"));
 703              
 704                          {
 705                              MI_Uint8 valueArray[2];
 706                              MI_Value value;
 707                              value.uint8 = 10;
 708                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint8"), MI_UINT8, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint8) should work"));
 709              
 710                              valueArray[0] = 10;
 711                              valueArray[1] = 20;
 712                              value.uint8a.data = valueArray;
 713                              value.uint8a.size = 2;
 714                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint8a"), MI_UINT8A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint8a) should work"));
 715 krisbash 1.1             }
 716                          {
 717                              MI_Sint8 valueArray[2];
 718                              MI_Value value;
 719                              value.sint8 = -10;
 720                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("sint8"), MI_SINT8, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(sint8) should work"));
 721              
 722                              valueArray[0] = -10;
 723                              valueArray[1] = -20;
 724                              value.sint8a.data = valueArray;
 725                              value.sint8a.size = 2;
 726                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("sint8a"), MI_SINT8A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(sint8a) should work"));
 727                          }
 728                          {
 729                              MI_Boolean valueArray[2];
 730                              MI_Value value;
 731                              value.boolean = MI_TRUE;
 732                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("boolean"), MI_BOOLEAN, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(boolean) should work"));
 733              
 734                              valueArray[0] = MI_TRUE;
 735                              valueArray[1] = MI_FALSE;
 736 krisbash 1.1                 value.booleana.data = valueArray;
 737                              value.booleana.size = 2;
 738                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("booleana"), MI_BOOLEANA, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(booleana) should work"));
 739                          }
 740                          {
 741                              MI_Uint16 valueArray[2];
 742                              MI_Value value;
 743                              value.uint16 = 20;
 744                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint16"), MI_UINT16, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint16) should work"));
 745              
 746                              valueArray[0] = 20;
 747                              valueArray[1] = 40;
 748                              value.uint16a.data = valueArray;
 749                              value.uint16a.size = 2;
 750                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint16a"), MI_UINT16A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint16a) should work"));
 751                          }
 752                          {
 753                              MI_Sint16 valueArray[2];
 754                              MI_Value value;
 755                              value.sint16 = -20;
 756                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("sint16"), MI_SINT16, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(sint16) should work"));
 757 krisbash 1.1 
 758                              valueArray[0] = -20;
 759                              valueArray[1] = -40;
 760                              value.sint16a.data = valueArray;
 761                              value.sint16a.size = 2;
 762                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("sint16a"), MI_SINT16A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(sint16a) should work"));
 763                          }
 764                          {
 765                              MI_Char16 valueArray[2];
 766                              MI_Value value;
 767                              value.char16 = L'a';
 768                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("char16"), MI_CHAR16, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(char16) should work"));
 769              
 770                              valueArray[0] = L'a';
 771                              valueArray[1] = L'b';
 772                              value.char16a.data = valueArray;
 773                              value.char16a.size = 2;
 774                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("char16a"), MI_CHAR16A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(char16a) should work"));
 775                          }
 776                          {
 777                              MI_Uint32 valueArray[2];
 778 krisbash 1.1                 MI_Value value;
 779                              value.uint32 = 32;
 780                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint32"), MI_UINT32, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint32) should work"));
 781              
 782                              valueArray[0] = 32;
 783                              valueArray[1] = 54;
 784                              value.uint32a.data = valueArray;
 785                              value.uint32a.size = 2;
 786                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint32a"), MI_UINT32A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint32a) should work"));
 787                          }
 788                          {
 789                              MI_Sint32 valueArray[2];
 790                              MI_Value value;
 791                              value.sint32 = -32;
 792                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("sint32"), MI_SINT32, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(sint32) should work"));
 793              
 794                              valueArray[0] = -32;
 795                              valueArray[1] = -54;
 796                              value.sint32a.data = valueArray;
 797                              value.sint32a.size = 2;
 798                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("sint32a"), MI_SINT32A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(sint32a) should work"));
 799 krisbash 1.1             }
 800                          {
 801                              MI_Real32 valueArray[2];
 802                              MI_Value value;
 803                              value.real32 = 32.32f;
 804                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("real32"), MI_REAL32, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(real32) should work"));
 805              
 806                              valueArray[0] = 32.32f;
 807                              valueArray[1] = -32.32f;
 808                              value.real32a.data = valueArray;
 809                              value.real32a.size = 2;
 810                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("real32a"), MI_REAL32A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(real32a) should work"));
 811                          }
 812                          {
 813                              MI_Real64 valueArray[2];
 814                              MI_Value value;
 815                              value.real64 = 64.64;
 816                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("real64"), MI_REAL64, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(real64) should work"));
 817              
 818                              valueArray[0] = 64.64;
 819                              valueArray[1] = -64.64;
 820 krisbash 1.1                 value.real64a.data = valueArray;
 821                              value.real64a.size = 2;
 822                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("real64a"), MI_REAL64A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(real64a) should work"));
 823                          }
 824                          {
 825                              MI_Uint64 valueArray[2];
 826                              MI_Value value;
 827                              value.uint64 = 64;
 828                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint64"), MI_UINT64, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint64) should work"));
 829              
 830                              valueArray[0] = 64;
 831                              valueArray[1] = 64;
 832                              value.uint64a.data = valueArray;
 833                              value.uint64a.size = 2;
 834                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint64a"), MI_UINT64A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint64a) should work"));
 835                          }
 836                          {
 837                              MI_Sint64 valueArray[2];
 838                              MI_Value value;
 839                              value.sint64 = -64;
 840                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("sint64"), MI_SINT64, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(sint64) should work"));
 841 krisbash 1.1 
 842                              valueArray[0] = 64;
 843                              valueArray[1] = -64;
 844                              value.sint64a.data = valueArray;
 845                              value.sint64a.size = 2;
 846                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("sint64a"), MI_SINT64A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(sint64a) should work"));
 847                          }
 848                          {
 849                              MI_Datetime valueArray[2];
 850                              MI_Value value;
 851                              value.datetime.isTimestamp = MI_TRUE;
 852                              value.datetime.u.timestamp.day = 11;
 853                              value.datetime.u.timestamp.hour = 13;
 854                              value.datetime.u.timestamp.microseconds = 323;
 855                              value.datetime.u.timestamp.minute = 55;
 856                              value.datetime.u.timestamp.month = 10;
 857                              value.datetime.u.timestamp.second = 43;
 858                              value.datetime.u.timestamp.utc = 8;
 859                              value.datetime.u.timestamp.year = 2010;
 860                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("datetime"), MI_DATETIME, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(datetime) should work"));
 861              
 862 krisbash 1.1                 valueArray[0].isTimestamp = MI_TRUE;
 863                              valueArray[0].u.timestamp.day = 11;
 864                              valueArray[0].u.timestamp.hour = 13;
 865                              valueArray[0].u.timestamp.microseconds = 323;
 866                              valueArray[0].u.timestamp.minute = 55;
 867                              valueArray[0].u.timestamp.month = 10;
 868                              valueArray[0].u.timestamp.second = 43;
 869                              valueArray[0].u.timestamp.utc = 8;
 870                              valueArray[0].u.timestamp.year = 2010;
 871                              valueArray[1].isTimestamp = MI_TRUE;
 872                              valueArray[1].u.timestamp.day = 11;
 873                              valueArray[1].u.timestamp.hour = 13;
 874                              valueArray[1].u.timestamp.microseconds = 323;
 875                              valueArray[1].u.timestamp.minute = 55;
 876                              valueArray[1].u.timestamp.month = 10;
 877                              valueArray[1].u.timestamp.second = 43;
 878                              valueArray[1].u.timestamp.utc = 8;
 879                              valueArray[1].u.timestamp.year = 2010;
 880                              value.datetimea.data = valueArray;
 881                              value.datetimea.size = 2;
 882                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("datetimea"), MI_DATETIMEA, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(datetimea) should work"));
 883 krisbash 1.1             }
 884                          {
 885                              const MI_Char *valueArray[3];
 886                              MI_Value value;
 887                              value.string = (MI_Char*) PAL_T("Hello world");
 888                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("string"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(string) should work"));
 889              
 890                              valueArray[0] = PAL_T("Hello world");
 891                              valueArray[1] = PAL_T("Goodbye");
 892                              valueArray[2] = PAL_T("Good night");
 893                              value.stringa.data = (MI_Char**)valueArray;
 894                              value.stringa.size = 3;
 895                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("stringa"), MI_STRINGA, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(stringa) should work"));
 896                          }
 897                              
 898                          /*============================================*/
 899                              
 900                          {
 901                              MI_Value value;
 902                              value.string = (MI_Char*)PAL_T("Hello world");
 903                              NitsCompare(options.ft->SetCustomOption(&options, NULL, MI_STRING, &value, MI_FALSE, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetCustomOption(string ) should fail due to invalid parameter"));
 904 krisbash 1.1             }
 905                          NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3_invalid1"), MI_STRING, NULL, MI_FALSE, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetCustomString invalid parameter"));
 906                          {
 907                              MI_Value value;
 908                              value.string = (MI_Char*)PAL_T("Hello world");
 909                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("string_invalid2 "), MI_STRING, &value, MI_FALSE, 22), MI_RESULT_INVALID_PARAMETER, PAL_T("SetCustomOption(string ) should fail due to invalid flags"));
 910                          }
 911                          {
 912                              MI_Value value;
 913                              value.string = (MI_Char*)PAL_T("Hello world");
 914                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint8"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("SetCustomOption(string ) should fail due to duplicate item existing with different type"));
 915                          }
 916                          {
 917                              MI_Value value;
 918                              value.uint8 = 10;
 919                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint8"), MI_UINT8, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint8) should succeed even when option already exists"));
 920                          }
 921              
 922                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option1"), 22, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("SetNumber should fail due to changing type of option"));
 923                          NitsCompare(options.ft->SetString(&options, PAL_T("option2"), PAL_T("value2"), 0), MI_RESULT_TYPE_MISMATCH, PAL_T("SetString should fail due to changing type of option"));
 924              
 925 krisbash 1.1             if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &newOptions), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
 926                          {
 927                              NitsCompare(OperationOptions_MigrateOptions(&options, &newOptions), MI_RESULT_OK, PAL_T("Migration should succeed"));
 928                              MI_OperationOptions_Delete(&newOptions);
 929                          }
 930                          options.ft->Delete(NULL);
 931              
 932                          MI_OperationOptions_Delete(&options);
 933                      }
 934                  }
 935              }
 936              NitsEndTest
 937              
 938              extern "C" void MI_CALL GetInstanceResult_Fail(
 939                  _In_     MI_Operation *operation,
 940                  _In_     void *callbackContext, 
 941                  _In_opt_ const MI_Instance *instance,
 942                           MI_Boolean moreResults,
 943                  _In_     MI_Result resultCode,
 944                  _In_opt_z_ const MI_Char * errorString,
 945                  _In_opt_ const MI_Instance *errorDetails,
 946 krisbash 1.1     _In_opt_ MI_Result (MI_CALL * resultAcknowledgement)(_In_ MI_Operation *operation))
 947              {
 948                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
 949                  NitsAssert(resultCode!= MI_RESULT_OK, PAL_T("should get error"));
 950                  NitsAssert(instance==NULL, PAL_T("Should not have result instance"));
 951                  if (resultAcknowledgement)
 952                  {
 953                      resultAcknowledgement(operation);
 954                  }
 955                  if (!moreResults)
 956                  {
 957                      MI_Operation_Close(operation);
 958              
 959                      runtimeData->finialResult = resultCode;
 960                      runtimeData->operationFinished = MI_TRUE;
 961              
 962                      CondLock_Broadcast((ptrdiff_t) callbackContext);
 963                  }
 964              }
 965              extern "C" void MI_CALL GetClassResult_Fail(
 966                  _In_     MI_Operation *operation,
 967 krisbash 1.1     _In_     void *callbackContext, 
 968                  _In_opt_ const MI_Class *className,
 969                           MI_Boolean moreResults,
 970                  _In_     MI_Result resultCode,
 971                  _In_opt_z_ const MI_Char * errorString,
 972                  _In_opt_ const MI_Instance *errorDetails,
 973                  _In_opt_ MI_Result (MI_CALL * resultAcknowledgement)(_In_ MI_Operation *operation))
 974              {
 975                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
 976                  NitsAssert(resultCode!= MI_RESULT_OK, PAL_T("should get error"));
 977                  NitsAssert(className==NULL, PAL_T("Should not have result instance"));
 978                  if (resultAcknowledgement)
 979                  {
 980                      resultAcknowledgement(operation);
 981                  }
 982                  if (!moreResults)
 983                  {
 984                      MI_Operation_Close(operation);
 985              
 986                      runtimeData->finialResult = resultCode;
 987                      runtimeData->operationFinished = MI_TRUE;
 988 krisbash 1.1 
 989                      CondLock_Broadcast((ptrdiff_t) callbackContext);
 990                  }
 991              }
 992              
 993              ptrdiff_t g_maximumInstanceCount = 1;
 994              
 995              extern "C" void MI_CALL GetInstanceResult(
 996                  _In_     MI_Operation *operation,
 997                  _In_     void *callbackContext, 
 998                  _In_opt_ const MI_Instance *instance,
 999                           MI_Boolean moreResults,
1000                  _In_     MI_Result resultCode,
1001                  _In_opt_z_ const MI_Char * errorString,
1002                  _In_opt_ const MI_Instance *errorDetails,
1003                  _In_opt_ MI_Result (MI_CALL * resultAcknowledgement)(_In_ MI_Operation *operation))
1004              {
1005                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1006                  MI_Session session = MI_SESSION_NULL;
1007                  NitsCompare(resultCode, MI_RESULT_OK, PAL_T("Error instance returned to client"));
1008              
1009 krisbash 1.1     if (instance)
1010                      Atomic_Inc(&runtimeData->instanceCount);
1011              
1012                  if (g_maximumInstanceCount)
1013                  {
1014                      NitsAssert(instance!=NULL, PAL_T("Should have result instance"));
1015                      if (!NitsAssert(runtimeData->instanceCount <=  g_maximumInstanceCount, PAL_T("too many results")))
1016                      {
1017                          /* try and kill the request early */
1018                          moreResults = FALSE;
1019                      }
1020                  }
1021              
1022                  if (resultAcknowledgement)
1023                  {
1024                      resultAcknowledgement(NULL);
1025                      resultAcknowledgement(operation);
1026                  }
1027              
1028                  if (!moreResults)
1029                  {
1030 krisbash 1.1         /* Get parent session */
1031                      MI_Operation_GetSession(operation, &session);
1032              
1033                      /* Some invalid parameter validation */
1034                      operation->ft->Cancel(NULL, MI_REASON_NONE);
1035                      operation->ft->Close(NULL);
1036              
1037                      MI_Operation_Close(operation);
1038              
1039                      /* Cancel after close */
1040                      MI_Operation_Cancel(operation, MI_REASON_NONE);
1041                 
1042                      /* Get results after closed */
1043                      MI_Operation_GetInstance(operation, &instance, &moreResults, &resultCode, &errorString, &errorDetails);
1044              
1045                      /* Get parent session after closed */
1046                      MI_Operation_GetSession(operation, &session);
1047              
1048                      runtimeData->finialResult = resultCode;
1049                      runtimeData->operationFinished = MI_TRUE;
1050              
1051 krisbash 1.1         CondLock_Broadcast((ptrdiff_t) callbackContext);
1052              
1053                  }
1054              }
1055              
1056              extern "C" void MI_CALL GetIndicationResult(
1057                  _In_     MI_Operation *operation,
1058                  _In_     void *callbackContext, 
1059                  _In_opt_ const MI_Instance *instance,
1060                  _In_opt_ const MI_Char *bookmark,
1061                  _In_opt_ const MI_Char *machineID,
1062                           MI_Boolean moreResults,
1063                  _In_     MI_Result resultCode,
1064                  _In_opt_z_ const MI_Char * errorString,
1065                  _In_opt_ const MI_Instance *errorDetails,
1066                  _In_opt_ MI_Result (MI_CALL * resultAcknowledgement)(_In_ MI_Operation *operation))
1067              {
1068                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1069                  MI_Session session = MI_SESSION_NULL;
1070                  NitsCompare(resultCode, MI_RESULT_OK, PAL_T("Error instance returned to client"));
1071                  NitsAssert(instance!=NULL, PAL_T("Should have result instance"));
1072 krisbash 1.1 
1073                  if (resultAcknowledgement)
1074                  {
1075                      resultAcknowledgement(NULL);
1076                      resultAcknowledgement(operation);
1077                  }
1078                  if (instance)
1079                      Atomic_Inc(&runtimeData->indicationCount);
1080              
1081                  if (!NitsAssert(runtimeData->indicationCount <=  g_maximumInstanceCount, PAL_T("too many results")))
1082                  {
1083                      /* try and kill the request early */
1084                      moreResults = FALSE;
1085                  }
1086              
1087                  if (!moreResults)
1088                  {
1089                      /* Get parent session */
1090                      MI_Operation_GetSession(operation, &session);
1091              
1092                      /* Some invalid parameter validation */
1093 krisbash 1.1         operation->ft->Cancel(NULL, MI_REASON_NONE);
1094                      operation->ft->Close(NULL);
1095              
1096                      MI_Operation_Close(operation);
1097              
1098                      /* Cancel after close */
1099                      MI_Operation_Cancel(operation, MI_REASON_NONE);
1100                 
1101                      /* Get results after closed */
1102                      MI_Operation_GetIndication(operation, &instance, &bookmark, &machineID, &moreResults, &resultCode, &errorString, &errorDetails);
1103              
1104                      /* Get parent session after closed */
1105                      MI_Operation_GetSession(operation, &session);
1106              
1107                      runtimeData->finialResult = resultCode;
1108                      runtimeData->operationFinished = MI_TRUE;
1109              
1110                      CondLock_Broadcast((ptrdiff_t) callbackContext);
1111                  }
1112              }
1113              extern "C" void MI_CALL GetClassResult(
1114 krisbash 1.1     _In_     MI_Operation *operation,
1115                  _In_     void *callbackContext, 
1116                  _In_opt_ const MI_Class *classResult,
1117                           MI_Boolean moreResults,
1118                  _In_     MI_Result resultCode,
1119                  _In_opt_z_ const MI_Char * errorString,
1120                  _In_opt_ const MI_Instance *errorDetails,
1121                  _In_opt_ MI_Result (MI_CALL * resultAcknowledgement)(_In_ MI_Operation *operation))
1122              {
1123                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1124                  MI_Session session = MI_SESSION_NULL;
1125                  NitsCompare(resultCode, MI_RESULT_OK, PAL_T("Error instance returned to client"));
1126                  NitsAssert(classResult!=NULL, PAL_T("Should have result class"));
1127              
1128                  if (resultAcknowledgement)
1129                  {
1130                      resultAcknowledgement(NULL);
1131                      resultAcknowledgement(operation);
1132                  }
1133                  if (classResult)
1134                      Atomic_Inc(&runtimeData->classCount);
1135 krisbash 1.1 
1136                  if (!NitsAssert(runtimeData->classCount <=  g_maximumInstanceCount, PAL_T("too many results")))
1137                  {
1138                      /* try and kill the request early */
1139                      moreResults = FALSE;
1140                  }
1141              
1142                  if (!moreResults)
1143                  {
1144                      /* Get parent session */
1145                      MI_Operation_GetSession(operation, &session);
1146              
1147                      /* Some invalid parameter validation */
1148                      operation->ft->Cancel(NULL, MI_REASON_NONE);
1149                      operation->ft->Close(NULL);
1150              
1151                      MI_Operation_Close(operation);
1152              
1153                      /* Cancel after close */
1154                      MI_Operation_Cancel(operation, MI_REASON_NONE);
1155                 
1156 krisbash 1.1         /* Get results after closed */
1157                      MI_Operation_GetClass(operation, &classResult, &moreResults, &resultCode, &errorString, &errorDetails);
1158              
1159                      /* Get parent session after closed */
1160                      MI_Operation_GetSession(operation, &session);
1161              
1162                      runtimeData->finialResult = resultCode;
1163                      runtimeData->operationFinished = MI_TRUE;
1164              
1165                      CondLock_Broadcast((ptrdiff_t) callbackContext);
1166                  }
1167              }
1168              
1169              extern "C" void MI_CALL InvokeResult(
1170                  _In_     MI_Operation *operation,
1171                  _In_     void *callbackContext, 
1172                  _In_opt_ const MI_Instance *instance,
1173                           MI_Boolean moreResults,
1174                  _In_     MI_Result resultCode,
1175                  _In_opt_z_ const MI_Char * errorString,
1176                  _In_opt_ const MI_Instance *errorDetails,
1177 krisbash 1.1     _In_opt_ MI_Result (MI_CALL * resultAcknowledgement)(_In_ MI_Operation *operation))
1178              {
1179                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1180                  MI_Session session = MI_SESSION_NULL;
1181                  NitsCompare(resultCode, MI_RESULT_OK, PAL_T("Error instance returned to client"));
1182                  if (resultAcknowledgement)
1183                  {
1184                      resultAcknowledgement(NULL);
1185                      resultAcknowledgement(operation);
1186                  }
1187              
1188                  if (instance)
1189                      Atomic_Inc(&runtimeData->methodCount);
1190              
1191                  if (!moreResults)
1192                  {
1193                      /* Get parent session */
1194                      MI_Operation_GetSession(operation, &session);
1195              
1196                      /* Some invalid parameter validation */
1197                      operation->ft->Cancel(NULL, MI_REASON_NONE);
1198 krisbash 1.1         operation->ft->Close(NULL);
1199              
1200                      MI_Operation_Close(operation);
1201              
1202                      /* Cancel after close */
1203                      MI_Operation_Cancel(operation, MI_REASON_NONE);
1204                 
1205                      /* Get results after closed */
1206                      MI_Operation_GetInstance(operation, &instance, &moreResults, &resultCode, &errorString, &errorDetails);
1207              
1208                      /* Get parent session after closed */
1209                      MI_Operation_GetSession(operation, &session);
1210              
1211                      runtimeData->finialResult = resultCode;
1212                      runtimeData->operationFinished = MI_TRUE;
1213              
1214                      CondLock_Broadcast((ptrdiff_t) callbackContext);
1215                  }
1216              }
1217              
1218              void WaitForOperationToComplete(RuntimeTestData *testData)
1219 krisbash 1.1 {
1220                  ptrdiff_t operationFinished = testData->operationFinished;
1221                  while (!operationFinished)
1222                  {
1223                      CondLock_Wait((ptrdiff_t)testData, &testData->operationFinished, operationFinished, CONDLOCK_DEFAULT_SPINCOUNT);
1224                      operationFinished = testData->operationFinished;
1225                  }
1226              }
1227              
1228              NitsTest3(MI_Session_GetInstance_Async_AutoAck, 
1229                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1230                        SetupDefaultSession, SetupDefaultSessionDefaults,
1231                        SetupTestInstance, g_SetupTestInstance_test)
1232              {    
1233                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1234                  ResetRuntimeTestData(testData);
1235                  MI_Session *session = &testData->session;
1236                  MI_Instance *testInstance = testData->testInstance;
1237                  MI_Operation operation = MI_OPERATION_NULL;
1238                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1239                  
1240 krisbash 1.1     g_maximumInstanceCount = 1;
1241                  callbacks.callbackContext = testData;
1242                  callbacks.instanceResult = GetInstanceResult;
1243              
1244                  MI_Session_GetInstance(session, 0, NULL, NULL, testInstance, &callbacks, &operation);
1245                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1246              
1247                  WaitForOperationToComplete(testData);
1248              
1249                  NitsAssert(testData->instanceCount == g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
1250              }
1251              NitsEndTest
1252              
1253              NitsTest3(MI_Session_GetInstance_Async_ManualAck, 
1254                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1255                        SetupDefaultSession, SetupDefaultSessionDefaults,
1256                        SetupTestInstance, g_SetupTestInstance_test)
1257              {
1258                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1259                  ResetRuntimeTestData(testData);
1260                  MI_Session *session = &testData->session;
1261 krisbash 1.1     MI_Instance *testInstance = testData->testInstance;
1262                  MI_Operation operation = MI_OPERATION_NULL;
1263                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1264                  
1265                  g_maximumInstanceCount = 1;
1266                  callbacks.callbackContext = testData;
1267                  callbacks.instanceResult = GetInstanceResult;
1268              
1269                  MI_Session_GetInstance(session, MI_OPERATIONFLAGS_MANUAL_ACK_RESULTS, NULL, NULL, testInstance, &callbacks, &operation);
1270                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1271              
1272                  WaitForOperationToComplete(testData);
1273              
1274                  NitsAssert(testData->instanceCount == g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
1275              }
1276              NitsEndTest
1277              
1278              NitsTest3(MI_Session_GetInstance_Sync, 
1279                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1280                        SetupDefaultSession, SetupDefaultSessionDefaults,
1281                        SetupTestInstance, g_SetupTestInstance_test)
1282 krisbash 1.1 {
1283                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1284                  ResetRuntimeTestData(testData);
1285                  MI_Session *session = &testData->session;
1286                  MI_Instance *testInstance = testData->testInstance;
1287                  MI_Operation operation = MI_OPERATION_NULL;
1288                  const MI_Instance *resultInstance;
1289                  MI_Boolean moreResults;
1290                  MI_Result result;
1291                  const MI_Char *errorMessage;
1292                  const MI_Instance *completionDetails;
1293              
1294                  MI_Session_GetInstance(session, 0, NULL, NULL, testInstance, NULL, &operation);
1295                  NitsAssert(operation.ft != NULL, PAL_T("operation testInstance table null"));
1296              
1297                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
1298                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
1299                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
1300              
1301                  MI_Operation_Close(&operation);
1302              }
1303 krisbash 1.1 NitsEndTest
1304              
1305              NitsTest2(MI_Session_GetInstance_Sync_WithOptions, 
1306                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1307                        SetupTestInstance, g_SetupTestInstance_test)
1308              {
1309                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1310                  ResetRuntimeTestData(testData);
1311                  MI_Application *application = &testData->application;
1312                  MI_Instance *testInstance = testData->testInstance;
1313                  MI_Session session = MI_SESSION_NULL;
1314                  MI_Operation operation = MI_OPERATION_NULL;
1315              
1316                  MI_DestinationOptions destOptions = MI_DESTINATIONOPTIONS_NULL;
1317                  if (NitsCompare(MI_Application_NewDestinationOptions(application, &destOptions), MI_RESULT_OK, PAL_T("create destoptions failed")))
1318                  {
1319                      MI_UserCredentials creds = { MI_AUTH_TYPE_BASIC, {{PAL_T("domain"), PAL_T("username"), PAL_T("password") }}};
1320              
1321                      NitsCompare(destOptions.ft->SetString(&destOptions, PAL_T("option111"), PAL_T("value111"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
1322                      NitsCompare(destOptions.ft->SetNumber(&destOptions, PAL_T("option222"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
1323                      NitsCompare(destOptions.ft->AddCredentials(&destOptions, PAL_T("option333"), &creds, 0), MI_RESULT_OK, PAL_T("AddCredentials should work"));
1324 krisbash 1.1 
1325                      MI_OperationOptions options = MI_DESTINATIONOPTIONS_NULL;
1326                      if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
1327                      {
1328                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
1329                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
1330                          {
1331                              MI_Value value;
1332                              value.string = (MI_Char*) PAL_T("hello world");
1333                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
1334                          }
1335              
1336                          if (NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), NULL, &destOptions, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
1337                              NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
1338                          {
1339                              const MI_Instance *resultInstance;
1340                              MI_Boolean moreResults;
1341                              MI_Result result;
1342                              const MI_Char *errorMessage;
1343                              const MI_Instance *completionDetails;
1344              
1345 krisbash 1.1                 MI_Session_GetInstance(&session, 0, &options, NULL, testInstance, NULL, &operation);
1346                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1347              
1348                              MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
1349                              NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
1350                              NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
1351              
1352                              MI_Operation_Close(&operation);
1353              
1354                              MI_Session_Close(&session, NULL, NULL);
1355                          }
1356                          MI_OperationOptions_Delete(&options);
1357                      }
1358                      MI_DestinationOptions_Delete(&destOptions);
1359                  }
1360              }
1361              NitsEndTest
1362              
1363              NitsTest3(MI_Session_GetInstance_Sync_ResultDeliverDifferentThread, 
1364                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1365                        SetupDefaultSession, SetupDefaultSessionDefaults,
1366 krisbash 1.1           SetupTestInstance, g_SetupTestInstance_DeliverResultDifferentThread)
1367              {
1368                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1369                  ResetRuntimeTestData(testData);
1370                  MI_Session *session = &testData->session;
1371                  MI_Instance *testInstance = testData->testInstance;
1372                  MI_Operation operation = MI_OPERATION_NULL;
1373              
1374                  const MI_Instance *resultInstance;
1375                  MI_Boolean moreResults;
1376                  MI_Result result;
1377                  const MI_Char *errorMessage;
1378                  const MI_Instance *completionDetails;
1379              
1380                  MI_Session_GetInstance(session, 0, NULL, NULL, testInstance, NULL, &operation);
1381                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1382              
1383                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
1384                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
1385                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
1386              
1387 krisbash 1.1     MI_Operation_Close(&operation);
1388              }
1389              NitsEndTest
1390              
1391              extern "C" void MI_CALL MI_Session_GetInstance_Async_PS_Semantics_PromptUser(
1392                  _In_     MI_Operation *operation,
1393                  _In_opt_ void *callbackContext, 
1394                  _In_z_   const MI_Char *message,
1395                  MI_PromptType promptType,
1396                  _In_     MI_Result (MI_CALL * promptUserResult)(_In_ MI_Operation *operation, 
1397                                                                    MI_OperationCallback_ResponseType response))
1398              
1399              {
1400                  /* Do an invalid handle version */
1401                  MI_Operation tmpOp = *operation;
1402                  tmpOp.reserved1=0;
1403                  if( promptUserResult)
1404                  {
1405                      promptUserResult(&tmpOp, MI_OperationCallback_ResponseType_Yes);
1406                      promptUserResult(NULL, MI_OperationCallback_ResponseType_Yes);
1407              
1408 krisbash 1.1         /* do valid handle */
1409                      promptUserResult(operation, g_PromptUserResponseType);
1410                  }
1411              
1412                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1413                  Atomic_Inc(&runtimeData->promptUserCount);
1414              }
1415              
1416              extern "C" void MI_CALL MI_Session_GetInstance_Async_PS_Semantics_WriteError(
1417                  _In_     MI_Operation *operation,
1418                  _In_opt_ void *callbackContext, 
1419                  _In_ MI_Instance *instance,
1420                  _In_     MI_Result (MI_CALL * writeErrorResult)(_In_ MI_Operation *operation, MI_OperationCallback_ResponseType response))
1421              {
1422                  /* Do an invalid handle version */
1423                  MI_Operation tmpOp = *operation;
1424                  tmpOp.reserved1=0;
1425                  if(writeErrorResult)
1426                  {
1427                      writeErrorResult(&tmpOp, MI_OperationCallback_ResponseType_Yes);
1428                      writeErrorResult(NULL, MI_OperationCallback_ResponseType_Yes);
1429 krisbash 1.1 
1430                      /* do valid handle */
1431                      writeErrorResult(operation, g_WriteErrorResponseType);
1432                  }
1433              
1434                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1435                  Atomic_Inc(&runtimeData->writeErrorCount);
1436              }
1437              
1438              extern "C" void MI_CALL MI_Session_GetInstance_Async_PS_Semantics_WriteMessage(
1439                  _In_     MI_Operation *operation,
1440                  _In_opt_ void *callbackContext, 
1441                           MI_Uint32 channel,
1442                  _In_z_   const MI_Char *message)
1443              {
1444                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1445                  Atomic_Inc(&runtimeData->writeMessageCount);
1446              }
1447              
1448              extern "C" void MI_CALL MI_Session_GetInstance_Async_PS_Semantics_WriteProgress(
1449                  _In_     MI_Operation *operation,
1450 krisbash 1.1     _In_opt_ void *callbackContext, 
1451                  _In_z_   const MI_Char *activity,
1452                  _In_z_   const MI_Char *currentOperation,
1453                  _In_z_   const MI_Char *statusDescription,
1454                           MI_Uint32 percentageComplete,
1455                           MI_Uint32 secondsRemaining)
1456              {
1457                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1458                  Atomic_Inc(&runtimeData->writeProgressCount);
1459              }
1460              
1461              extern "C" void MI_CALL MI_Session_GetInstance_Async_PS_Semantics_Sesson_WriteMessage(
1462                  _In_     MI_Application *application,
1463                  _In_opt_ void *callbackContext, 
1464                              MI_Uint32 channel,
1465                  _In_z_   const MI_Char *  message)
1466              {
1467                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1468                  Atomic_Inc(&runtimeData->session_writeMessageCount);
1469              }
1470              
1471 krisbash 1.1 extern "C" void MI_CALL MI_Session_GetInstance_Async_PS_Semantics_Sesson_WriteError(
1472                  _In_     MI_Application *application,
1473                  _In_opt_ void *callbackContext, 
1474                  _In_ MI_Instance *instance)
1475              {
1476                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1477                  Atomic_Inc(&runtimeData->session_writeErrorCount);
1478              }
1479              
1480              extern "C" void MI_CALL _MI_OperationCallback_StreamedParameter(
1481                  _In_ MI_Operation *operation,
1482                  _In_ void *callbackContext,
1483                  _In_z_ const MI_Char * parameterName,
1484                  _In_ MI_Type resultType,
1485                  _In_ const MI_Value *result,
1486                  _In_ MI_Result (MI_CALL * resultAcknowledgement)(_In_ MI_Operation *operation))
1487              {
1488                  if (resultAcknowledgement)
1489                  {
1490                      resultAcknowledgement(NULL);
1491                      resultAcknowledgement(operation);
1492 krisbash 1.1     }
1493              
1494                  RuntimeTestData *runtimeData = (RuntimeTestData *)callbackContext;
1495                  Atomic_Inc(&runtimeData->streamedParameterCount);
1496              }
1497              
1498              NitsTest3(MI_Session_GetInstance_Async_PS_Semantics, 
1499                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1500                        SetupDefaultSession, SetupDefaultSessionDefaults,
1501                        SetupTestInstance, g_SetupTestInstance_test)
1502              {
1503                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1504                  ResetRuntimeTestData(testData);
1505                  MI_Instance *testInstance = testData->testInstance;
1506                  MI_Session *session = &testData->session;
1507                  MI_Operation operation = MI_OPERATION_NULL;
1508                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1509                  
1510                  g_maximumInstanceCount = 1;
1511                  callbacks.callbackContext = testData;
1512                  callbacks.instanceResult = GetInstanceResult;
1513 krisbash 1.1     callbacks.promptUser = MI_Session_GetInstance_Async_PS_Semantics_PromptUser;
1514                  callbacks.writeError = MI_Session_GetInstance_Async_PS_Semantics_WriteError;
1515                  callbacks.writeMessage = MI_Session_GetInstance_Async_PS_Semantics_WriteMessage;
1516                  callbacks.writeProgress = MI_Session_GetInstance_Async_PS_Semantics_WriteProgress;
1517              
1518                  MI_Session_GetInstance(session, MI_OPERATIONFLAGS_MANUAL_ACK_RESULTS, NULL, NULL, testInstance, &callbacks, &operation);
1519                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1520              
1521                  NitsAssert(testData->instanceCount == g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
1522              }
1523              NitsEndTest
1524              
1525              NitsTest2(MI_Session_GetInstance_Sync_InvalidParameters, 
1526                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1527                        SetupTestInstance, g_SetupTestInstance_test)
1528              {
1529                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1530                  ResetRuntimeTestData(testData);
1531                  MI_Application *application = &testData->application;
1532                  MI_Session session = MI_SESSION_NULL;
1533                  MI_Instance *testInstance = testData->testInstance;
1534 krisbash 1.1     MI_Operation operation = MI_OPERATION_NULL;
1535                  const MI_Instance *result;
1536                  const MI_Instance *extendedInfo;
1537                  MI_Boolean moreResults;
1538                  MI_Result resultCode;
1539                  MI_Result returnValue;
1540                  const MI_Char *errorMessage;
1541                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1542                  callbacks.callbackContext = testData;
1543                  callbacks.instanceResult = GetInstanceResult_Fail;
1544              
1545                  {
1546                      if (NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
1547                          NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
1548                      {
1549                          if (session.ft == NULL)
1550                              NitsReturn;
1551              
1552                          {
1553                              session.ft->GetInstance(&session, 0, NULL, NULL, testInstance, NULL, &operation);
1554                              MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1555 krisbash 1.1                 NitsCompare(resultCode, MI_RESULT_OK, PAL_T("GetInstance should succeed"));
1556              
1557                              returnValue = operation.ft->GetInstance(NULL, &result, NULL, &resultCode, NULL, NULL);
1558                              NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetInstance should fail due to NULL operation"));
1559              
1560                              returnValue = operation.ft->GetInstance(&operation, NULL, NULL, &resultCode, NULL, NULL);
1561                              NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetInstance should fail due to NULL instance"));
1562              
1563                              returnValue = operation.ft->GetInstance(&operation, NULL, NULL, NULL, NULL, NULL);
1564                              NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetInstance should fail due to NULL instance"));
1565              
1566                              MI_Operation_Close(&operation);
1567              
1568                              session.ft->GetInstance(NULL, 0, NULL, NULL, testInstance, NULL, &operation);
1569                              MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1570                              NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should faul due to NULL session"));
1571                              MI_Operation_Close(&operation);
1572              
1573                              session.ft->GetInstance(&session, 0, NULL, NULL, NULL, NULL, &operation);
1574                              MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1575                              NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail due to NULL instance key"));
1576 krisbash 1.1                 MI_Operation_Close(&operation);
1577              
1578                              session.ft->GetInstance(&session, 0, NULL, NULL, testInstance, &callbacks, NULL);
1579                              MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1580                              NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail due to null operation, has callbacks"));
1581                              MI_Operation_Close(&operation);
1582              
1583                              session.ft->GetInstance(&session, 0, NULL, NULL, testInstance, NULL, NULL);
1584                              /* Validate it doesn't crash only as nowhere for failure to go */
1585                          }
1586                          MI_Session_Close(&session, NULL, NULL);
1587              
1588                          session.ft->GetInstance(&session, 0, NULL, NULL, testInstance, NULL, &operation);
1589                          MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1590                          NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail because session is already closed"));
1591                          MI_Operation_Close(&operation);
1592              
1593                      }
1594                  }
1595              }
1596              NitsEndTest
1597 krisbash 1.1 
1598              NitsTest3(MI_Session_GetInstance_TransportNotSupported, 
1599                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
1600                        SetupDefaultSession, SetupDefaultSessionDefaults,
1601                        SetupTestInstance, g_SetupTestInstance_test)
1602              {
1603                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1604                  ResetRuntimeTestData(testData);
1605                  MI_Session *session = &testData->session;
1606                  MI_Instance *testInstance = testData->testInstance;
1607                  MI_Operation operation = MI_OPERATION_NULL;
1608                  const MI_Instance *resultInstance;
1609                  MI_Boolean moreResults;
1610                  MI_Result result;
1611                  const MI_Char *errorMessage;
1612                  const MI_Instance *completionDetails;
1613              
1614                  MI_Session_GetInstance(session, 0, NULL, NULL, testInstance, NULL, &operation);
1615              
1616                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
1617                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should succeed"));
1618 krisbash 1.1     NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
1619              
1620                  MI_Operation_Close(&operation);
1621              }
1622              NitsEndTest
1623              
1624              NitsTest3(MI_Session_Invoke_Async_NonStatic, 
1625                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1626                        SetupDefaultSession, SetupDefaultSessionDefaults,
1627                        SetupTestInstance, g_SetupTestInstance_test)
1628              {
1629                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1630                  ResetRuntimeTestData(testData);
1631                  MI_Session *session = &testData->session;
1632                  MI_Instance *testInstance = testData->testInstance;
1633                  MI_Operation operation = MI_OPERATION_NULL;
1634                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1635                  
1636                  g_maximumInstanceCount = 1;
1637                  callbacks.callbackContext = testData;
1638                  callbacks.instanceResult = InvokeResult;
1639 krisbash 1.1 
1640                  MI_Session_Invoke(session, 0, NULL, NULL, PAL_T("testClass"), PAL_T("TestMethod"), testInstance, NULL, &callbacks, &operation);
1641                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1642              
1643                  WaitForOperationToComplete(testData);
1644              
1645                  NitsCompare((MI_Uint32)testData->methodCount,  (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
1646              }
1647              NitsEndTest
1648              
1649              NitsTest2(MI_Session_Invoke_Async_Static, 
1650                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1651                        SetupDefaultSession, SetupDefaultSessionDefaults)
1652              {
1653                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1654                  ResetRuntimeTestData(testData);
1655                  MI_Session *session = &testData->session;
1656                  MI_Operation operation = MI_OPERATION_NULL;
1657                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1658                  
1659                  g_maximumInstanceCount = 1;
1660 krisbash 1.1     callbacks.callbackContext = testData;
1661                  callbacks.instanceResult = InvokeResult;
1662              
1663                  MI_Session_Invoke(session, 0, NULL, NULL, PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, &callbacks, &operation);
1664                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1665              
1666                  WaitForOperationToComplete(testData);
1667              
1668                  NitsCompare((MI_Uint32)testData->methodCount,  (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
1669              }
1670              NitsEndTest
1671              
1672              NitsTest2(MI_Session_Invoke_Async_Static_PsSemantics, 
1673                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1674                        SetupDefaultSession, SetupDefaultSessionDefaults)
1675              {
1676                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1677                  ResetRuntimeTestData(testData);
1678                  MI_Session *session = &testData->session;
1679                  MI_Operation operation = MI_OPERATION_NULL;
1680                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1681 krisbash 1.1     
1682                  g_maximumInstanceCount = 1;
1683                  callbacks.callbackContext = testData;
1684                  callbacks.instanceResult = InvokeResult;
1685                  callbacks.promptUser = MI_Session_GetInstance_Async_PS_Semantics_PromptUser;
1686                  callbacks.writeError = MI_Session_GetInstance_Async_PS_Semantics_WriteError;
1687                  callbacks.writeMessage = MI_Session_GetInstance_Async_PS_Semantics_WriteMessage;
1688                  callbacks.writeProgress = MI_Session_GetInstance_Async_PS_Semantics_WriteProgress;
1689              
1690                  MI_Session_Invoke(session, 0, NULL, NULL, PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, &callbacks, &operation);
1691                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1692              
1693                  WaitForOperationToComplete(testData);
1694              
1695                  NitsCompare((MI_Uint32)testData->methodCount, (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
1696                  NitsCompare((MI_Uint32)testData->writeErrorCount, 2, PAL_T("Correct PS semantic count"));
1697                  NitsCompare((MI_Uint32)testData->writeMessageCount, 1, PAL_T("Correct PS semantic count"));
1698                  NitsCompare((MI_Uint32)testData->writeProgressCount, 1, PAL_T("Correct PS semantic count"));
1699                  NitsCompare((MI_Uint32)testData->promptUserCount, 2, PAL_T("Correct PS semantic count"));
1700              }
1701              NitsEndTest
1702 krisbash 1.1 
1703              NitsTest2(MI_Session_Invoke_Async_Static_StreamedParameter, 
1704                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1705                        SetupDefaultSession, SetupDefaultSessionDefaults)
1706              {
1707                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1708                  ResetRuntimeTestData(testData);
1709                  MI_Session *session = &testData->session;
1710                  MI_Operation operation = MI_OPERATION_NULL;
1711                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1712                  
1713                  g_maximumInstanceCount = 1;
1714                  callbacks.callbackContext = testData;
1715                  callbacks.instanceResult = InvokeResult;
1716                  callbacks.promptUser = MI_Session_GetInstance_Async_PS_Semantics_PromptUser;
1717                  callbacks.writeError = MI_Session_GetInstance_Async_PS_Semantics_WriteError;
1718                  callbacks.writeMessage = MI_Session_GetInstance_Async_PS_Semantics_WriteMessage;
1719                  callbacks.writeProgress = MI_Session_GetInstance_Async_PS_Semantics_WriteProgress;
1720                  callbacks.streamedParameterResult = _MI_OperationCallback_StreamedParameter;
1721              
1722                  MI_Session_Invoke(session, 0, NULL, NULL, PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, &callbacks, &operation);
1723 krisbash 1.1     NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1724              
1725                  WaitForOperationToComplete(testData);
1726              
1727                  NitsCompare((MI_Uint32)testData->methodCount, 0, PAL_T("Number of results callbacks received"));
1728                  NitsCompare((MI_Uint32)testData->writeErrorCount, 2, PAL_T("Correct PS semantic count"));
1729                  NitsCompare((MI_Uint32)testData->writeMessageCount, 1, PAL_T("Correct PS semantic count"));
1730                  NitsCompare((MI_Uint32)testData->writeProgressCount, 1, PAL_T("Correct PS semantic count"));
1731                  NitsCompare((MI_Uint32)testData->promptUserCount, 2, PAL_T("Correct PS semantic count"));
1732                  NitsCompare((MI_Uint32)testData->streamedParameterCount, 5, PAL_T("Correct PS semantic count"));
1733              }
1734              NitsEndTest
1735              
1736              NitsTest2(MI_Session_Invoke_Async_Static_StreamedParameter_ManualAck, 
1737                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1738                        SetupDefaultSession, SetupDefaultSessionDefaults)
1739              {
1740                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1741                  ResetRuntimeTestData(testData);
1742                  MI_Session *session = &testData->session;
1743                  MI_Operation operation = MI_OPERATION_NULL;
1744 krisbash 1.1     MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1745                  
1746                  g_maximumInstanceCount = 1;
1747                  callbacks.callbackContext = testData;
1748                  callbacks.instanceResult = InvokeResult;
1749                  callbacks.promptUser = MI_Session_GetInstance_Async_PS_Semantics_PromptUser;
1750                  callbacks.writeError = MI_Session_GetInstance_Async_PS_Semantics_WriteError;
1751                  callbacks.writeMessage = MI_Session_GetInstance_Async_PS_Semantics_WriteMessage;
1752                  callbacks.writeProgress = MI_Session_GetInstance_Async_PS_Semantics_WriteProgress;
1753                  callbacks.streamedParameterResult = _MI_OperationCallback_StreamedParameter;
1754              
1755                  MI_Session_Invoke(session, MI_OPERATIONFLAGS_MANUAL_ACK_RESULTS, NULL, NULL, PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, &callbacks, &operation);
1756                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1757              
1758                  WaitForOperationToComplete(testData);
1759              
1760                  NitsCompare((MI_Uint32)testData->methodCount, 0, PAL_T("Number of results callbacks received"));
1761                  NitsCompare((MI_Uint32)testData->writeErrorCount, 2, PAL_T("Correct PS semantic count"));
1762                  NitsCompare((MI_Uint32)testData->writeMessageCount, 1, PAL_T("Correct PS semantic count"));
1763                  NitsCompare((MI_Uint32)testData->writeProgressCount, 1, PAL_T("Correct PS semantic count"));
1764                  NitsCompare((MI_Uint32)testData->promptUserCount, 2, PAL_T("Correct PS semantic count"));
1765 krisbash 1.1     NitsCompare((MI_Uint32)testData->streamedParameterCount, 5, PAL_T("Correct PS semantic count"));
1766              }
1767              NitsEndTest
1768              
1769              NitsTest3(MI_Session_Invoke_Sync_Success, 
1770                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1771                        SetupDefaultSession, SetupDefaultSessionDefaults,
1772                        SetupTestInstance, g_SetupTestInstance_test)
1773              {
1774                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1775                  ResetRuntimeTestData(testData);
1776                  MI_Session *session = &testData->session;
1777                  MI_Operation operation = MI_OPERATION_NULL;
1778                  const MI_Instance *result;
1779                  const MI_Instance *extendedInfo;
1780                  MI_Boolean moreResults;
1781                  MI_Result resultCode;
1782                  const MI_Char *errorMessage;
1783              
1784                  session->ft->Invoke(session, 0, NULL, NULL,  PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, NULL, &operation);
1785                  MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1786 krisbash 1.1     NitsCompare(resultCode, MI_RESULT_OK, PAL_T("Invoke should succeed"));
1787                  MI_Operation_Close(&operation);
1788              }
1789              NitsEndTest
1790              
1791              NitsTest3(MI_Session_Invoke_Sync_WithOptions, 
1792                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1793                        SetupDefaultSession, SetupDefaultSessionDefaults,
1794                        SetupTestInstance, g_SetupTestInstance_test)
1795              {
1796                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1797                  ResetRuntimeTestData(testData);
1798                  MI_Application *application = &testData->application;
1799                  MI_Session *session = &testData->session;
1800                  MI_Operation operation = MI_OPERATION_NULL;
1801                  const MI_Instance *result;
1802                  const MI_Instance *extendedInfo;
1803                  MI_Boolean moreResults;
1804                  MI_Result resultCode;
1805                  const MI_Char *errorMessage;
1806                  MI_OperationOptions options = MI_DESTINATIONOPTIONS_NULL;
1807 krisbash 1.1 
1808                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
1809                  {
1810                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
1811                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
1812                      {
1813                          MI_Value value;
1814                          value.string = (MI_Char*) PAL_T("hello world");
1815                          NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
1816                      }
1817              
1818                      session->ft->Invoke(session, 0, &options, NULL,  PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, NULL, &operation);
1819                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1820                      NitsCompare(resultCode, MI_RESULT_OK, PAL_T("Invoke should succeed"));
1821                      MI_Operation_Close(&operation);
1822              
1823                      MI_OperationOptions_Delete(&options);
1824                  }
1825              }
1826              NitsEndTest
1827              
1828 krisbash 1.1 
1829              NitsTest2(MI_Session_Invoke_Sync_InvalidParameters, 
1830                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1831                        SetupTestInstance, g_SetupTestInstance_test)
1832              {
1833                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1834                  ResetRuntimeTestData(testData);
1835                  MI_Application *application = &testData->application;
1836                  MI_Session session = MI_SESSION_NULL;
1837                  MI_Operation operation = MI_OPERATION_NULL;
1838                  const MI_Instance *result;
1839                  const MI_Instance *extendedInfo;
1840                  MI_Boolean moreResults;
1841                  MI_Result resultCode;
1842                  const MI_Char *errorMessage;
1843                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1844              
1845                  callbacks.callbackContext = testData;
1846                  callbacks.instanceResult = GetInstanceResult_Fail;
1847              
1848                  if (NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
1849 krisbash 1.1         NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
1850                  {
1851                      if (session.ft == NULL)
1852                          NitsReturn;
1853              
1854                      session.ft->Invoke(&session, 0, NULL, NULL,  PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, NULL, &operation);
1855                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1856                      NitsCompare(resultCode, MI_RESULT_OK, PAL_T("Invoke should succeed"));
1857                      MI_Operation_Close(&operation);
1858              
1859                      session.ft->Invoke(&session, 11, NULL, NULL,  PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, NULL, &operation);
1860                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1861                      NitsCompare(resultCode, MI_RESULT_OK, PAL_T("Invoke should fail due to invalid flag"));
1862                      MI_Operation_Close(&operation);
1863              
1864                      session.ft->Invoke(NULL, 0, NULL, NULL, PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, NULL, &operation);
1865                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1866                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("Invoke should fail due to invalid session"));
1867                      MI_Operation_Close(&operation);
1868              
1869                      session.ft->Invoke(&session, 0, NULL, NULL,  PAL_T("testClass"), NULL, NULL, NULL, NULL, &operation);
1870 krisbash 1.1         MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1871                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("Invoke should fail due to invalid method name"));
1872              
1873                      operation.ft->GetInstance(NULL, &result, NULL, &resultCode, NULL, NULL);
1874                      operation.ft->GetInstance(&operation, NULL, NULL, &resultCode, NULL, NULL);
1875              
1876                      operation.ft->Close(NULL);
1877                      MI_Operation_Close(&operation);
1878              
1879                      session.ft->Invoke(&session, 0, NULL, NULL, PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, &callbacks, NULL);
1880                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1881                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("Invoke should fail due to null operation, has callbacks"));
1882                      MI_Operation_Close(&operation);
1883              
1884                      session.ft->Invoke(&session, 0, NULL, NULL,  PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, NULL, NULL);
1885                      /* Nothing to validate, just make sure it doesn't crash! */
1886              
1887                      MI_Session_Close(&session, NULL, NULL);
1888              
1889                      session.ft->Invoke(&session, 0, NULL, NULL,  PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, NULL, &operation);
1890                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1891 krisbash 1.1         NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("Invoke should fail because session is already closed"));
1892                      MI_Operation_Close(&operation);
1893                  }
1894              
1895              }
1896              NitsEndTest
1897              
1898              NitsTest3(MI_Session_Invoke_Sync_TransportNotSupported, 
1899                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
1900                        SetupDefaultSession, SetupDefaultSessionDefaults,
1901                        SetupTestInstance, g_SetupTestInstance_test)
1902              {
1903                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1904                  ResetRuntimeTestData(testData);
1905                  MI_Session *session = &testData->session;
1906                  MI_Operation operation = MI_OPERATION_NULL;
1907                  const MI_Instance *result;
1908                  const MI_Instance *extendedInfo;
1909                  MI_Boolean moreResults;
1910                  MI_Result resultCode;
1911                  const MI_Char *errorMessage;
1912 krisbash 1.1 
1913                  session->ft->Invoke(session, 0, NULL, NULL,  PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, NULL, &operation);
1914                  MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
1915                  NitsCompare(resultCode, MI_RESULT_NOT_SUPPORTED, PAL_T("Invoke should fail"));
1916                  MI_Operation_Close(&operation);
1917              }
1918              NitsEndTest
1919              
1920              NitsTest3(MI_Session_ModifyInstance_Async_AutoAck, 
1921                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1922                        SetupDefaultSession, SetupDefaultSessionDefaults,
1923                        SetupTestInstance, g_SetupTestInstance_test)
1924              {
1925                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1926                  ResetRuntimeTestData(testData);
1927                  MI_Session *session = &testData->session;
1928                  MI_Instance *testInstance = testData->testInstance;
1929                  MI_Operation operation = MI_OPERATION_NULL;
1930                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1931                  
1932                  g_maximumInstanceCount = 1;
1933 krisbash 1.1     callbacks.callbackContext = testData;
1934                  callbacks.instanceResult = GetInstanceResult;
1935              
1936                  MI_Session_ModifyInstance(session, 0, NULL, NULL, testInstance, &callbacks, &operation);
1937                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1938              
1939                  WaitForOperationToComplete(testData);
1940              
1941                  NitsCompare((MI_Uint32)testData->instanceCount,  (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
1942              }
1943              NitsEndTest
1944              
1945              NitsTest3(MI_Session_ModifyInstance_Async_ManualAck, 
1946                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1947                        SetupDefaultSession, SetupDefaultSessionDefaults,
1948                        SetupTestInstance, g_SetupTestInstance_test)
1949              {
1950                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1951                  ResetRuntimeTestData(testData);
1952                  MI_Session *session = &testData->session;
1953                  MI_Instance *testInstance = testData->testInstance;
1954 krisbash 1.1     MI_Operation operation = MI_OPERATION_NULL;
1955                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
1956                  
1957                  g_maximumInstanceCount = 1;
1958                  callbacks.callbackContext = testData;
1959                  callbacks.instanceResult = GetInstanceResult;
1960              
1961                  MI_Session_ModifyInstance(session, MI_OPERATIONFLAGS_MANUAL_ACK_RESULTS, NULL, NULL, testInstance, &callbacks, &operation);
1962                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1963              
1964                  WaitForOperationToComplete(testData);
1965              
1966                  NitsCompare((MI_Uint32)testData->instanceCount,  (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
1967              }
1968              NitsEndTest
1969              
1970              NitsTest3(MI_Session_ModifyInstance_Sync, 
1971                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
1972                        SetupDefaultSession, SetupDefaultSessionDefaults,
1973                        SetupTestInstance, g_SetupTestInstance_test)
1974              {
1975 krisbash 1.1     RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
1976                  ResetRuntimeTestData(testData);
1977                  MI_Session *session = &testData->session;
1978                  MI_Instance *testInstance = testData->testInstance;
1979                  MI_Operation operation = MI_OPERATION_NULL;
1980              
1981                  const MI_Instance *resultInstance;
1982                  MI_Boolean moreResults;
1983                  MI_Result result;
1984                  const MI_Char *errorMessage;
1985                  const MI_Instance *completionDetails;
1986              
1987                  MI_Session_ModifyInstance(session, 0, NULL, NULL, testInstance, NULL, &operation);
1988                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
1989              
1990                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
1991                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
1992                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
1993              
1994                  MI_Operation_Close(&operation);
1995              }
1996 krisbash 1.1 NitsEndTest
1997              
1998              NitsTest3(MI_Session_ModifyInstance_Sync_WithOptions, 
1999                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2000                        SetupDefaultSession, SetupDefaultSessionDefaults,
2001                        SetupTestInstance, g_SetupTestInstance_test)
2002              {
2003                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2004                  ResetRuntimeTestData(testData);
2005                  MI_Application *application = &testData->application;
2006                  MI_Session *session = &testData->session;
2007                  MI_Instance *testInstance = testData->testInstance;
2008                  MI_Operation operation = MI_OPERATION_NULL;
2009              
2010                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
2011                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
2012                  {
2013                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
2014                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
2015                      {
2016                          MI_Value value;
2017 krisbash 1.1             value.string = (MI_Char *)PAL_T("hello world");
2018                          NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
2019                      }
2020              
2021                      {
2022                          const MI_Instance *resultInstance;
2023                          MI_Boolean moreResults;
2024                          MI_Result result;
2025                          const MI_Char *errorMessage;
2026                          const MI_Instance *completionDetails;
2027              
2028                          MI_Session_ModifyInstance(session, 0, &options, NULL, testInstance, NULL, &operation);
2029                          NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2030              
2031                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2032                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
2033                          NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
2034              
2035                          MI_Operation_Close(&operation);
2036              
2037                      }
2038 krisbash 1.1         MI_OperationOptions_Delete(&options);
2039                  }
2040              }
2041              NitsEndTest
2042              
2043              NitsTest2(MI_Session_ModifyInstance_Sync_InvalidParameters, 
2044                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2045                        SetupTestInstance, g_SetupTestInstance_test)
2046              {
2047                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2048                  ResetRuntimeTestData(testData);
2049                  MI_Application *application = &testData->application;
2050                  MI_Session session = MI_SESSION_NULL;
2051                  MI_Instance *testInstance = testData->testInstance;
2052                  MI_Operation operation = MI_OPERATION_NULL;
2053                  const MI_Instance *result;
2054                  const MI_Instance *extendedInfo;
2055                  MI_Boolean moreResults;
2056                  MI_Result resultCode;
2057                  const MI_Char *errorMessage;
2058                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2059 krisbash 1.1     MI_Result returnValue;
2060                  
2061                  callbacks.callbackContext = testData;
2062                  callbacks.instanceResult = GetInstanceResult_Fail;
2063              
2064                  if (NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
2065                      NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
2066                  {
2067                      if (session.ft == NULL)
2068                          NitsReturn;
2069              
2070                      session.ft->ModifyInstance(&session, 0, NULL, NULL, testInstance, NULL, &operation);
2071                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2072                      NitsCompare(resultCode, MI_RESULT_OK, PAL_T("GetInstance should succeed"));
2073              
2074                      returnValue = operation.ft->GetInstance(NULL, &result, NULL, &resultCode, NULL, NULL);
2075                      NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetInstance should fail due to NULL operation"));
2076              
2077                      returnValue = operation.ft->GetInstance(&operation, NULL, NULL, &resultCode, NULL, NULL);
2078                      NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetInstance should fail due to NULL instance"));
2079              
2080 krisbash 1.1         operation.ft->GetInstance(&operation, NULL, NULL, NULL, NULL, NULL);
2081                      /* no where for result to go but may add code coverage for scenario */
2082              
2083                      MI_Operation_Close(&operation);
2084              
2085                      session.ft->ModifyInstance(NULL, 0, NULL, NULL, testInstance, NULL, &operation);
2086                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2087                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should faul due to NULL session"));
2088                      MI_Operation_Close(&operation);
2089              
2090                      session.ft->ModifyInstance(&session, 0, NULL, NULL, NULL, NULL, &operation);
2091                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2092                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail due to NULL instance key"));
2093                      MI_Operation_Close(&operation);
2094              
2095                      session.ft->ModifyInstance(&session, 0, NULL, NULL, testInstance, NULL, NULL);
2096                      /* Validate it doesn't crash only as nowhere for failure to go */
2097              
2098                      session.ft->ModifyInstance(&session, 0, NULL, NULL, testInstance, &callbacks, NULL);
2099                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2100                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail due to null operation, has callbacks"));
2101 krisbash 1.1         MI_Operation_Close(&operation);
2102              
2103                      MI_Session_Close(&session, NULL, NULL);
2104              
2105                      session.ft->ModifyInstance(&session, 0, NULL, NULL, testInstance, NULL, &operation);
2106                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2107                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail because session is already closed"));
2108                      MI_Operation_Close(&operation);
2109                  }
2110              }
2111              NitsEndTest
2112              
2113              NitsTest3(MI_Session_ModifyInstance_TransportNotSupported, 
2114                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
2115                        SetupDefaultSession, SetupDefaultSessionDefaults,
2116                        SetupTestInstance, g_SetupTestInstance_test)
2117              {
2118                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2119                  ResetRuntimeTestData(testData);
2120                  MI_Session *session = &testData->session;
2121                  MI_Instance *testInstance = testData->testInstance;
2122 krisbash 1.1     MI_Operation operation = MI_OPERATION_NULL;
2123                  
2124                  const MI_Instance *resultInstance;
2125                  MI_Boolean moreResults;
2126                  MI_Result result;
2127                  const MI_Char *errorMessage;
2128                  const MI_Instance *completionDetails;
2129              
2130                  MI_Session_ModifyInstance(session, 0, NULL, NULL, testInstance, NULL, &operation);
2131              
2132                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2133                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should succeed"));
2134                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
2135              
2136                  MI_Operation_Close(&operation);
2137              }
2138              NitsEndTest
2139              
2140              NitsTest3(MI_Session_CreateInstance_Async_AutoAck, 
2141                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2142                        SetupDefaultSession, SetupDefaultSessionDefaults,
2143 krisbash 1.1           SetupTestInstance, g_SetupTestInstance_test)
2144              {
2145                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2146                  ResetRuntimeTestData(testData);
2147                  MI_Session *session = &testData->session;
2148                  MI_Instance *testInstance = testData->testInstance;
2149                  MI_Operation operation = MI_OPERATION_NULL;
2150                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2151                  
2152                  g_maximumInstanceCount = 1;
2153                  callbacks.callbackContext = testData;
2154                  callbacks.instanceResult = GetInstanceResult;
2155              
2156                  MI_Session_CreateInstance(session, 0, NULL, NULL, testInstance, &callbacks, &operation);
2157                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2158              
2159                  WaitForOperationToComplete(testData);
2160              
2161                  NitsCompare((MI_Uint32)testData->instanceCount,  (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
2162              }
2163              NitsEndTest
2164 krisbash 1.1 
2165              NitsTest3(MI_Session_CreateInstance_Async_ManualAck, 
2166                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2167                        SetupDefaultSession, SetupDefaultSessionDefaults,
2168                        SetupTestInstance, g_SetupTestInstance_test)
2169              {
2170                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2171                  ResetRuntimeTestData(testData);
2172                  MI_Session *session = &testData->session;
2173                  MI_Instance *testInstance = testData->testInstance;
2174                  MI_Operation operation = MI_OPERATION_NULL;
2175                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2176                  
2177                  g_maximumInstanceCount = 1;
2178                  callbacks.callbackContext = testData;
2179                  callbacks.instanceResult = GetInstanceResult;
2180              
2181                  MI_Session_CreateInstance(session, MI_OPERATIONFLAGS_MANUAL_ACK_RESULTS, NULL, NULL, testInstance, &callbacks, &operation);
2182                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2183              
2184                  WaitForOperationToComplete(testData);
2185 krisbash 1.1 
2186                  NitsCompare((MI_Uint32)testData->instanceCount,  (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
2187              }
2188              NitsEndTest
2189              
2190              NitsTest3(MI_Session_CreateInstance_Sync, 
2191                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2192                        SetupDefaultSession, SetupDefaultSessionDefaults,
2193                        SetupTestInstance, g_SetupTestInstance_test)
2194              {
2195                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2196                  ResetRuntimeTestData(testData);
2197                  MI_Session *session = &testData->session;
2198                  MI_Instance *testInstance = testData->testInstance;
2199                  MI_Operation operation = MI_OPERATION_NULL;
2200              
2201                  const MI_Instance *resultInstance;
2202                  MI_Boolean moreResults;
2203                  MI_Result result;
2204                  const MI_Char *errorMessage;
2205                  const MI_Instance *completionDetails;
2206 krisbash 1.1 
2207                  MI_Session_CreateInstance(session, 0, NULL, NULL, testInstance, NULL, &operation);
2208                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2209              
2210                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2211                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
2212                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
2213              
2214                  MI_Operation_Close(&operation);
2215              }
2216              NitsEndTest
2217              
2218              NitsTest3(MI_Session_CreateInstance_Sync_WithOptions, 
2219                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2220                        SetupDefaultSession, SetupDefaultSessionDefaults,
2221                        SetupTestInstance, g_SetupTestInstance_test)
2222              {
2223                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2224                  ResetRuntimeTestData(testData);
2225                  MI_Application *application = &testData->application;
2226                  MI_Session *session = &testData->session;
2227 krisbash 1.1     MI_Instance *testInstance = testData->testInstance;
2228                  MI_Operation operation = MI_OPERATION_NULL;
2229              
2230                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
2231                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
2232                  {
2233                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
2234                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
2235                      {
2236                          MI_Value value;
2237                          value.string = (MI_Char*) PAL_T("hello world");
2238                          NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
2239                      }
2240              
2241                      const MI_Instance *resultInstance;
2242                      MI_Boolean moreResults;
2243                      MI_Result result;
2244                      const MI_Char *errorMessage;
2245                      const MI_Instance *completionDetails;
2246              
2247                      MI_Session_CreateInstance(session, 0, &options, NULL, testInstance, NULL, &operation);
2248 krisbash 1.1         NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2249              
2250                      MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2251                      NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
2252                      NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
2253              
2254                      MI_Operation_Close(&operation);
2255              
2256                      MI_OperationOptions_Delete(&options);
2257                  }
2258              }
2259              NitsEndTest
2260              
2261              NitsTest2(MI_Session_CreateInstance_Sync_InvalidParameters, 
2262                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2263                        SetupTestInstance, g_SetupTestInstance_test)
2264              {
2265                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2266                  ResetRuntimeTestData(testData);
2267                  MI_Application *application = &testData->application;
2268                  MI_Session session = MI_SESSION_NULL;
2269 krisbash 1.1     MI_Instance *testInstance = testData->testInstance;
2270                  MI_Operation operation = MI_OPERATION_NULL;
2271                  const MI_Instance *result;
2272                  const MI_Instance *extendedInfo;
2273                  MI_Boolean moreResults;
2274                  MI_Result resultCode;
2275                  MI_Result returnValue;
2276                  const MI_Char *errorMessage;
2277                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2278                  
2279                  callbacks.callbackContext = testData;
2280                  callbacks.instanceResult = GetInstanceResult_Fail;
2281              
2282                  if (NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
2283                      NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
2284                  {
2285                      if (session.ft == NULL)
2286                          NitsReturn;
2287              
2288                      session.ft->CreateInstance(&session, 0, NULL, NULL, testInstance, NULL, &operation);
2289                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2290 krisbash 1.1         NitsCompare(resultCode, MI_RESULT_OK, PAL_T("GetInstance should succeed"));
2291              
2292                      returnValue = operation.ft->GetInstance(NULL, &result, NULL, &resultCode, NULL, NULL);
2293                      NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetInstance should fail due to NULL operation"));
2294              
2295                      returnValue = operation.ft->GetInstance(&operation, NULL, NULL, &resultCode, NULL, NULL);
2296                      NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetInstance should fail due to NULL instance"));
2297              
2298                      operation.ft->GetInstance(&operation, NULL, NULL, NULL, NULL, NULL);
2299                      /* no where for result to go but may add code coverage for scenario */
2300              
2301                      MI_Operation_Close(&operation);
2302              
2303                      session.ft->CreateInstance(NULL, 0, NULL, NULL, testInstance, NULL, &operation);
2304                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2305                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should faul due to NULL session"));
2306                      MI_Operation_Close(&operation);
2307              
2308                      session.ft->CreateInstance(&session, 0, NULL, NULL, NULL, NULL, &operation);
2309                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2310                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail due to NULL instance key"));
2311 krisbash 1.1         MI_Operation_Close(&operation);
2312              
2313                      session.ft->CreateInstance(&session, 0, NULL, NULL, testInstance, NULL, NULL);
2314                      /* Validate it doesn't crash only as nowhere for failure to go */
2315              
2316                      session.ft->CreateInstance(&session, 0, NULL, NULL, testInstance, &callbacks, NULL);
2317                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2318                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail due to null operation, has callbacks"));
2319                      MI_Operation_Close(&operation);
2320              
2321                      MI_Session_Close(&session, NULL, NULL);
2322              
2323                      session.ft->CreateInstance(&session, 0, NULL, NULL, testInstance, NULL, &operation);
2324                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2325                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail because session is already closed"));
2326                      MI_Operation_Close(&operation);
2327              
2328                  }
2329              }
2330              NitsEndTest
2331              
2332 krisbash 1.1 NitsTest3(MI_Session_CreateInstance_TransportNotSupported, 
2333                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
2334                        SetupDefaultSession, SetupDefaultSessionDefaults,
2335                        SetupTestInstance, g_SetupTestInstance_test)
2336              {
2337                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2338                  ResetRuntimeTestData(testData);
2339                  MI_Session *session = &testData->session;
2340                  MI_Instance *testInstance = testData->testInstance;
2341                  MI_Operation operation = MI_OPERATION_NULL;
2342              
2343                  const MI_Instance *resultInstance;
2344                  MI_Boolean moreResults;
2345                  MI_Result result;
2346                  const MI_Char *errorMessage;
2347                  const MI_Instance *completionDetails;
2348              
2349                  MI_Session_CreateInstance(session, 0, NULL, NULL, testInstance, NULL, &operation);
2350              
2351                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2352                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should succeed"));
2353 krisbash 1.1     NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
2354              
2355                  MI_Operation_Close(&operation);
2356              
2357              }
2358              NitsEndTest
2359              
2360              NitsTest3(MI_Session_DeleteInstance_Async_AutoAck, 
2361                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2362                        SetupDefaultSession, SetupDefaultSessionDefaults,
2363                        SetupTestInstance, g_SetupTestInstance_test)
2364              {
2365                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2366                  ResetRuntimeTestData(testData);
2367                  MI_Session *session = &testData->session;
2368                  MI_Instance *testInstance = testData->testInstance;
2369                  MI_Operation operation = MI_OPERATION_NULL;
2370                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2371                  
2372                  g_maximumInstanceCount = 1;
2373                  callbacks.callbackContext = testData;
2374 krisbash 1.1     callbacks.instanceResult = GetInstanceResult;
2375              
2376                  MI_Session_DeleteInstance(session, 0, NULL, NULL, testInstance, &callbacks, &operation);
2377                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2378              
2379                  WaitForOperationToComplete(testData);
2380              
2381                  NitsCompare((MI_Uint32)testData->instanceCount,  (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
2382              }
2383              NitsEndTest
2384              
2385              NitsTest3(MI_Session_DeleteInstance_Async_ManualAck, 
2386                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2387                        SetupDefaultSession, SetupDefaultSessionDefaults,
2388                        SetupTestInstance, g_SetupTestInstance_test)
2389              {
2390                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2391                  ResetRuntimeTestData(testData);
2392                  MI_Session *session = &testData->session;
2393                  MI_Instance *testInstance = testData->testInstance;
2394                  MI_Operation operation = MI_OPERATION_NULL;
2395 krisbash 1.1     MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2396                  
2397                  g_maximumInstanceCount = 1;
2398                  callbacks.callbackContext = testData;
2399                  callbacks.instanceResult = GetInstanceResult;
2400              
2401                  MI_Session_DeleteInstance(session, MI_OPERATIONFLAGS_MANUAL_ACK_RESULTS, NULL, NULL, testInstance, &callbacks, &operation);
2402                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2403              
2404                  WaitForOperationToComplete(testData);
2405              
2406                  NitsCompare((MI_Uint32)testData->instanceCount,  (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
2407              }
2408              NitsEndTest
2409              
2410              NitsTest3(MI_Session_DeleteInstance_Sync, 
2411                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2412                        SetupDefaultSession, SetupDefaultSessionDefaults,
2413                        SetupTestInstance, g_SetupTestInstance_test)
2414              {
2415                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2416 krisbash 1.1     ResetRuntimeTestData(testData);
2417                  MI_Session *session = &testData->session;
2418                  MI_Instance *testInstance = testData->testInstance;
2419                  MI_Operation operation = MI_OPERATION_NULL;
2420              
2421                  const MI_Instance *resultInstance;
2422                  MI_Boolean moreResults;
2423                  MI_Result result;
2424                  const MI_Char *errorMessage;
2425                  const MI_Instance *completionDetails;
2426              
2427                  MI_Session_DeleteInstance(session, 0, NULL, NULL, testInstance, NULL, &operation);
2428                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2429              
2430                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2431                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
2432                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
2433              
2434                  MI_Operation_Close(&operation);
2435              }
2436              NitsEndTest
2437 krisbash 1.1 
2438              NitsTest3(MI_Session_DeleteInstance_Sync_WithOptions, 
2439                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2440                        SetupDefaultSession, SetupDefaultSessionDefaults,
2441                        SetupTestInstance, g_SetupTestInstance_test)
2442              {
2443                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2444                  ResetRuntimeTestData(testData);
2445                  MI_Application *application = &testData->application;
2446                  MI_Session *session = &testData->session;
2447                  MI_Instance *testInstance = testData->testInstance;
2448                  MI_Operation operation = MI_OPERATION_NULL;
2449                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
2450              
2451                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
2452                  {
2453                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
2454                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
2455                      {
2456                          MI_Value value;
2457                          value.string = (MI_Char*) PAL_T("hello world");
2458 krisbash 1.1             NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
2459                      }
2460              
2461                      const MI_Instance *resultInstance;
2462                      MI_Boolean moreResults;
2463                      MI_Result result;
2464                      const MI_Char *errorMessage;
2465                      const MI_Instance *completionDetails;
2466              
2467                      MI_Session_DeleteInstance(session, 0, &options, NULL, testInstance, NULL, &operation);
2468                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2469              
2470                      MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2471                      NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
2472                      NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
2473              
2474                      MI_Operation_Close(&operation);
2475                      MI_OperationOptions_Delete(&options);
2476                  }
2477              }
2478              NitsEndTest
2479 krisbash 1.1 
2480              NitsTest3(MI_Session_DeleteInstance_Sync_InvalidParameters, 
2481                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2482                        SetupDefaultSession, SetupDefaultSessionDefaults,
2483                        SetupTestInstance, g_SetupTestInstance_test)
2484              {
2485                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2486                  ResetRuntimeTestData(testData);
2487                  MI_Application *application = &testData->application;
2488                  MI_Instance *testInstance = testData->testInstance;
2489                  MI_Session session = MI_SESSION_NULL;
2490                  MI_Operation operation = MI_OPERATION_NULL;
2491                  const MI_Instance *result;
2492                  const MI_Instance *extendedInfo;
2493                  MI_Boolean moreResults;
2494                  MI_Result resultCode;
2495                  MI_Result returnValue;
2496                  const MI_Char *errorMessage;
2497                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2498                  
2499                  callbacks.callbackContext = testData;
2500 krisbash 1.1     callbacks.instanceResult = GetInstanceResult_Fail;
2501              
2502                  if (NitsCompare(MI_Application_NewSession(application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
2503                      NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
2504                  {
2505                      if (session.ft == NULL)
2506                          NitsReturn;
2507              
2508                      session.ft->DeleteInstance(&session, 0, NULL, NULL, testInstance, NULL, &operation);
2509                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2510                      NitsCompare(resultCode, MI_RESULT_OK, PAL_T("GetInstance should succeed"));
2511              
2512                      returnValue = operation.ft->GetInstance(NULL, &result, NULL, &resultCode, NULL, NULL);
2513                      NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetInstance should fail due to NULL operation"));
2514              
2515                      returnValue = operation.ft->GetInstance(&operation, NULL, NULL, &resultCode, NULL, NULL);
2516                      NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetInstance should fail due to NULL instance"));
2517              
2518                      operation.ft->GetInstance(&operation, NULL, NULL, NULL, NULL, NULL);
2519                      /* no where for result to go but may add code coverage for scenario */
2520              
2521 krisbash 1.1         MI_Operation_Close(&operation);
2522              
2523                      session.ft->DeleteInstance(NULL, 0, NULL, NULL, testInstance, NULL, &operation);
2524                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2525                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should faul due to NULL session"));
2526                      MI_Operation_Close(&operation);
2527              
2528                      session.ft->DeleteInstance(&session, 0, NULL, NULL, NULL, NULL, &operation);
2529                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2530                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail due to NULL instance key"));
2531                      MI_Operation_Close(&operation);
2532              
2533                      session.ft->DeleteInstance(&session, 0, NULL, NULL, testInstance, NULL, NULL);
2534                      /* Validate it doesn't crash only as nowhere for failure to go */
2535                          
2536                      session.ft->DeleteInstance(&session, 0, NULL, NULL, testInstance, &callbacks, NULL);
2537                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2538                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail due to null operation, has callbacks"));
2539                      MI_Operation_Close(&operation);
2540              
2541                      MI_Session_Close(&session, NULL, NULL);
2542 krisbash 1.1 
2543                      session.ft->DeleteInstance(&session, 0, NULL, NULL, testInstance, NULL, &operation);
2544                      MI_Operation_GetInstance(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
2545                      NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail because session is already closed"));
2546                      MI_Operation_Close(&operation);
2547              
2548                  }
2549              }
2550              NitsEndTest
2551              
2552              NitsTest3(MI_Session_DeleteInstance_TransportNotSupported, 
2553                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
2554                        SetupDefaultSession, SetupDefaultSessionDefaults,
2555                        SetupTestInstance, g_SetupTestInstance_test)
2556              {
2557                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2558                  ResetRuntimeTestData(testData);
2559                  MI_Session *session = &testData->session;
2560                  MI_Instance *testInstance = testData->testInstance;
2561                  MI_Operation operation = MI_OPERATION_NULL;
2562              
2563 krisbash 1.1     const MI_Instance *resultInstance;
2564                  MI_Boolean moreResults;
2565                  MI_Result result;
2566                  const MI_Char *errorMessage;
2567                  const MI_Instance *completionDetails;
2568              
2569                  MI_Session_DeleteInstance(session, 0, NULL, NULL, testInstance, NULL, &operation);
2570              
2571                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2572                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should succeed"));
2573                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
2574              
2575                  MI_Operation_Close(&operation);
2576              }
2577              NitsEndTest
2578              
2579              #if 0
2580              extern "C" void MI_CALL MI_Session_GetInstance_Async_CancelBeforeClose_Result(
2581                  _In_     MI_Operation *operation,
2582                  _In_     void *callbackContext, 
2583                  _In_opt_ const MI_Instance *instance,
2584 krisbash 1.1              MI_Boolean moreResults,
2585                  _In_     MI_Result resultCode,
2586                  _In_opt_z_ const MI_Char * errorString,
2587                  _In_opt_ const MI_Instance *errorDetails,
2588                  _In_opt_ MI_Result (MI_CALL * resultAcknowledgement)(_In_ MI_Operation *operation))
2589              {
2590                  NitsCompare(resultCode, MI_RESULT_OK, PAL_T("Operation should have succeeded"));
2591              
2592                  MI_Operation_Cancel(operation, MI_REASON_NONE);
2593              
2594                  if (resultAcknowledgement)
2595                  {
2596                      resultAcknowledgement(operation);
2597                  }
2598              
2599                  if (!moreResults)
2600                  {
2601                      MI_Operation_Close(operation);
2602                      CondLock_Broadcast((ptrdiff_t) callbackContext);
2603                  }
2604              }
2605 krisbash 1.1 
2606              
2607              NitsTest3(MI_Session_GetInstance_Async_CancelBeforeClose, 
2608                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2609                        SetupDefaultSession, SetupDefaultSessionDefaults,
2610                        SetupTestInstance, g_SetupTestInstance_test)
2611              {
2612                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2613                  ResetRuntimeTestData(testData);
2614                  MI_Session *session = &testData->session;
2615                  MI_Instance *testInstance = testData->testInstance;
2616                  MI_Operation operation = MI_OPERATION_NULL;
2617                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2618                  
2619                  callbacks.callbackContext = testData;
2620                  callbacks.instanceResult = MI_Session_GetInstance_Async_CancelBeforeClose_Result;
2621              
2622                  MI_Session_GetInstance(session, 0, NULL, NULL, testInstance, &callbacks, &operation);
2623                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2624                  
2625                  WaitForOperationToComplete(testData);
2626 krisbash 1.1 
2627              }
2628              NitsEndTest
2629              
2630              extern "C" void MI_CALL MI_Session_GetInstance_Async_CancelBeforeResult_Result(
2631                  _In_     MI_Operation *operation,
2632                  _In_     void *callbackContext, 
2633                  _In_opt_ const MI_Instance *instance,
2634                           MI_Boolean moreResults,
2635                  _In_     MI_Result resultCode,
2636                  _In_opt_z_ const MI_Char * errorString,
2637                  _In_opt_ const MI_Instance *errorDetails,
2638                  _In_opt_ MI_Result (MI_CALL * resultAcknowledgement)(_In_ MI_Operation *operation))
2639              {
2640                  NitsCompare(resultCode, MI_RESULT_FAILED, PAL_T("Operation should have failed"));
2641              
2642                  if (!moreResults)
2643                  {
2644                      MI_Operation_Close(operation);
2645                  }
2646                  if (resultAcknowledgement)
2647 krisbash 1.1     {
2648                      resultAcknowledgement(operation);
2649                  }
2650                  if (!moreResults)
2651                  {
2652                      CondLock_Broadcast((ptrdiff_t) callbackContext);
2653                  }
2654              }
2655              
2656              NitsTest3(MI_Session_GetInstance_Async_CancelBeforeResult, 
2657                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2658                        SetupDefaultSession, SetupDefaultSessionDefaults,
2659                        SetupTestInstance, g_SetupTestInstance_NoResult)
2660              {
2661                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2662                  ResetRuntimeTestData(testData);
2663                  MI_Session *session = &testData->session;
2664                  MI_Instance *testInstance = testData->testInstance;
2665                  MI_Operation operation = MI_OPERATION_NULL;
2666                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2667                  
2668 krisbash 1.1     callbacks.callbackContext = testData;
2669                  callbacks.instanceResult = MI_Session_GetInstance_Async_CancelBeforeResult_Result;
2670              
2671                  MI_Session_GetInstance(session, 0, NULL, NULL, testInstance, &callbacks, &operation);
2672                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2673              
2674                  MI_Operation_Cancel(&operation, MI_REASON_NONE);
2675              
2676                  WaitForOperationToComplete(testData);
2677              }
2678              NitsEndTest
2679              
2680              NitsTest(MI_Session_GetInstance_Async_CloseSessionBeforeResult)
2681              {
2682                  MI_Application application = MI_APPLICATION_NULL;
2683                  MI_Session session = MI_SESSION_NULL;
2684                  MI_Operation operation = MI_OPERATION_NULL;
2685                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2686                  
2687                  callbacks.instanceResult = MI_Session_GetInstance_Async_CancelBeforeResult_Result;
2688              
2689 krisbash 1.1     if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
2690                      NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
2691                  {
2692                      MI_Instance *instance = TestCreateInstance(&application, PAL_T("NoResult"));
2693                      if (NitsAssert(instance != NULL, PAL_T("failed to create instance")))
2694                      {
2695                          if (NitsCompare(MI_Application_NewSession(&application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
2696                              NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
2697                          {
2698                              MI_Session_GetInstance(&session, 0, NULL, NULL, instance, &callbacks, &operation);
2699                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2700              
2701                              MI_Session_Close(&session, NULL, NULL);
2702                          }
2703                          MI_Instance_Delete(instance);
2704                      }
2705              
2706                      MI_Application_Close(&application);
2707                  }
2708              }
2709              NitsEndTest
2710 krisbash 1.1 
2711              NitsTest(MI_Session_GetInstance_Async_CloseSessionBeforeResult_ResultOnDifferentThread)
2712              {
2713                  MI_Application application = MI_APPLICATION_NULL;
2714                  MI_Session session = MI_SESSION_NULL;
2715                  MI_Operation operation = MI_OPERATION_NULL;
2716                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2717                  
2718                  callbacks.instanceResult = MI_Session_GetInstance_Async_CancelBeforeResult_Result;
2719              
2720                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
2721                      NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
2722                  {
2723                      MI_Instance *instance = TestCreateInstance(&application, PAL_T("NoResultDifferentThread"));
2724                      if (NitsAssert(instance != NULL, PAL_T("failed to create instance")))
2725                      {
2726                          if (NitsCompare(MI_Application_NewSession(&application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
2727                              NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
2728                          {
2729                              MI_Session_GetInstance(&session, 0, NULL, NULL, instance, &callbacks, &operation);
2730                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2731 krisbash 1.1 
2732                              MI_Session_Close(&session, NULL, NULL);
2733                          }
2734                          MI_Instance_Delete(instance);
2735                      }
2736              
2737                      MI_Application_Close(&application);
2738                  }
2739              }
2740              NitsEndTest
2741              
2742              extern "C" void MI_CALL MI_Session_GetInstance_Async_CloseApplicationBeforeResult_ResultOnDifferentThread_Result_SessionClosed(_In_opt_ void *completionContext)
2743              {
2744              }
2745              extern "C" void MI_CALL MI_Session_GetInstance_Async_CloseApplicationBeforeResult_ResultOnDifferentThread_Result(
2746                  _In_     MI_Operation *operation,
2747                  _In_     void *callbackContext, 
2748                  _In_opt_ const MI_Instance *instance,
2749                           MI_Boolean moreResults,
2750                  _In_     MI_Result resultCode,
2751                  _In_opt_z_ const MI_Char * errorString,
2752 krisbash 1.1     _In_opt_ const MI_Instance *errorDetails,
2753                  _In_opt_ MI_Result (MI_CALL * resultAcknowledgement)(_In_ MI_Operation *operation))
2754              {
2755                  MI_Session session = MI_SESSION_NULL;
2756                  NitsCompare(resultCode, MI_RESULT_FAILED, PAL_T("Operation should have failed"));
2757                  MI_Operation_GetSession(operation, &session);
2758              
2759                  if (resultAcknowledgement)
2760                  {
2761                      resultAcknowledgement(operation);
2762                  }
2763              
2764                  if (!moreResults)
2765                  {
2766                      MI_Operation_Close(operation);
2767                      MI_Session_Close(&session, NULL, MI_Session_GetInstance_Async_CloseApplicationBeforeResult_ResultOnDifferentThread_Result_SessionClosed);
2768                  }
2769              
2770              }
2771              
2772              
2773 krisbash 1.1 NitsTest(MI_Session_GetInstance_Async_CloseApplicationBeforeResult_ResultOnDifferentThread)
2774              {
2775                  MI_Application application = MI_APPLICATION_NULL;
2776                  MI_Session session = MI_SESSION_NULL;
2777                  MI_Operation operation = MI_OPERATION_NULL;
2778                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2779                  
2780                  callbacks.instanceResult = MI_Session_GetInstance_Async_CloseApplicationBeforeResult_ResultOnDifferentThread_Result;
2781              
2782                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
2783                      NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
2784                  {
2785                      MI_Instance *instance = TestCreateInstance(&application, PAL_T("NoResultDifferentThread"));
2786                      if (NitsAssert(instance != NULL, PAL_T("failed to create instance")))
2787                      {
2788                          if (NitsCompare(MI_Application_NewSession(&application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
2789                              NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
2790                          {
2791                              MI_Session_GetInstance(&session, 0, NULL, NULL, instance, &callbacks, &operation);
2792                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2793                              /* session cleaned up in callback */
2794 krisbash 1.1             }
2795                          MI_Instance_Delete(instance);
2796                      }
2797              
2798                      MI_Application_Close(&application);
2799                  }
2800              }
2801              NitsEndTest
2802              
2803              #endif
2804              /*==========================================================================================*/
2805              /*=================================== Enumerate Instances ==================================*/
2806              /*==========================================================================================*/
2807              
2808              NitsTest2(MI_Session_EnumerateInstances_Sync, 
2809                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2810                        SetupDefaultSession, SetupDefaultSessionDefaults)
2811              {
2812                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2813                  ResetRuntimeTestData(testData);
2814                  MI_Session *session = &testData->session;
2815 krisbash 1.1     MI_Operation operation = MI_OPERATION_NULL;
2816                  
2817                  const MI_Instance *resultInstance;
2818                  MI_Boolean moreResults = MI_TRUE;
2819                  MI_Result result;
2820                  const MI_Char *errorMessage;
2821                  const MI_Instance *completionDetails;
2822                  unsigned int resultCount = 0;
2823              
2824                  MI_Session_EnumerateInstances(session, 0, NULL, NULL, PAL_T("testClass"), MI_FALSE, NULL, &operation);
2825                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2826              
2827                  while (moreResults && (++resultCount <= 10))
2828                  {
2829                      MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2830                      NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
2831                  }
2832                  NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
2833                  MI_Operation_Close(&operation);
2834              }
2835              NitsEndTest
2836 krisbash 1.1 
2837              NitsTest2(MI_Session_EnumerateInstances_Sync_WithOptions, 
2838                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2839                        SetupDefaultSession, SetupDefaultSessionDefaults)
2840              {
2841                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2842                  ResetRuntimeTestData(testData);
2843                  MI_Application *application = &testData->application;
2844                  MI_Session *session = &testData->session;
2845                  MI_Operation operation = MI_OPERATION_NULL;
2846                  MI_OperationOptions options = MI_DESTINATIONOPTIONS_NULL;
2847              
2848                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
2849                  {
2850                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
2851                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
2852                      {
2853                          MI_Value value;
2854                          value.string = (MI_Char*) PAL_T("hello world");
2855                          NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
2856                      }
2857 krisbash 1.1 
2858                      const MI_Instance *resultInstance;
2859                      MI_Boolean moreResults = MI_TRUE;
2860                      MI_Result result;
2861                      const MI_Char *errorMessage;
2862                      const MI_Instance *completionDetails;
2863                      unsigned int resultCount = 0;
2864              
2865                      MI_Session_EnumerateInstances(session, 0, &options, NULL, PAL_T("testClass"), MI_FALSE, NULL, &operation);
2866                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2867              
2868                      while (moreResults && (++resultCount <= 10))
2869                      {
2870                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2871                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
2872                      }
2873                      NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
2874                      MI_Operation_Close(&operation);
2875              
2876                      MI_OperationOptions_Delete(&options);
2877                  }
2878 krisbash 1.1 }
2879              NitsEndTest
2880              
2881              NitsTest2(MI_Session_EnumerateInstances_Sync_InvalidParameters, 
2882                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2883                        SetupDefaultSession, SetupDefaultSessionDefaults)
2884              {
2885                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2886                  ResetRuntimeTestData(testData);
2887                  MI_Session *session = &testData->session;
2888                  MI_Operation operation = MI_OPERATION_NULL;
2889                  
2890                  const MI_Instance *resultInstance;
2891                  MI_Boolean moreResults = MI_TRUE;
2892                  MI_Result result;
2893                  const MI_Char *errorMessage;
2894                  const MI_Instance *completionDetails;
2895                  unsigned int resultCount = 0;
2896              
2897                  {/* success */
2898                      MI_Session_EnumerateInstances(session, 0, NULL, NULL, PAL_T("testClass"), MI_FALSE, NULL, &operation);
2899 krisbash 1.1         NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2900              
2901                      while (moreResults && (++resultCount <= 10))
2902                      {
2903                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2904                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
2905                      }
2906                      NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
2907                      MI_Operation_Close(&operation);
2908                  }
2909                  {/* no opertion */
2910              #if defined (_MSC_VER)
2911              #pragma prefast(push)
2912              #pragma prefast(disable: 6309)
2913              #endif
2914                      MI_Session_EnumerateInstances(session, 0, NULL, NULL, PAL_T("testClass"), MI_FALSE, NULL, NULL);
2915              #if defined (_MSC_VER)
2916              #pragma prefast(pop)
2917              #endif
2918                      /* nothing more we can do as no where for result to go */
2919                  }
2920 krisbash 1.1 }
2921              NitsEndTest
2922              
2923              NitsTest2(MI_Session_EnumerateInstances_Sync_TransportNotSupported, 
2924                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
2925                        SetupDefaultSession, SetupDefaultSessionDefaults)
2926              {
2927                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2928                  ResetRuntimeTestData(testData);
2929                  MI_Session *session = &testData->session;
2930                  MI_Operation operation = MI_OPERATION_NULL;
2931                  
2932                  const MI_Instance *resultInstance;
2933                  MI_Boolean moreResults = MI_TRUE;
2934                  MI_Result result;
2935                  const MI_Char *errorMessage;
2936                  const MI_Instance *completionDetails;
2937              
2938                  MI_Session_EnumerateInstances(session, 0, NULL, NULL, PAL_T("testClass"), MI_FALSE, NULL, &operation);
2939                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2940              
2941 krisbash 1.1     MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2942                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should fail with not supported"));
2943                  MI_Operation_Close(&operation);
2944              }
2945              NitsEndTest
2946              
2947              NitsTest2(MI_Session_EnumerateInstances_Async_AutoAck, 
2948                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2949                        SetupDefaultSession, SetupDefaultSessionDefaults)
2950              {
2951                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2952                  ResetRuntimeTestData(testData);
2953                  MI_Session *session = &testData->session;
2954                  MI_Operation operation = MI_OPERATION_NULL;
2955                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
2956                  
2957                  g_maximumInstanceCount = 10;
2958                  callbacks.callbackContext = testData;
2959                  callbacks.instanceResult = GetInstanceResult;
2960              
2961                  MI_Session_EnumerateInstances(session, 0, NULL, NULL, PAL_T("testClass"), MI_FALSE, &callbacks, &operation);
2962 krisbash 1.1     NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2963              
2964                  WaitForOperationToComplete(testData);
2965              
2966                  NitsCompare((MI_Uint32)testData->instanceCount,  (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
2967              }
2968              NitsEndTest
2969              
2970              /*==========================================================================================*/
2971              /*===================================== Query Instances ====================================*/
2972              /*==========================================================================================*/
2973              
2974              NitsTest2(MI_Session_QueryInstances_Sync, 
2975                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
2976                        SetupDefaultSession, SetupDefaultSessionDefaults)
2977              {
2978                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
2979                  ResetRuntimeTestData(testData);
2980                  MI_Session *session = &testData->session;
2981                  MI_Operation operation = MI_OPERATION_NULL;
2982                  
2983 krisbash 1.1     const MI_Instance *resultInstance;
2984                  MI_Boolean moreResults = MI_TRUE;
2985                  MI_Result result;
2986                  const MI_Char *errorMessage;
2987                  const MI_Instance *completionDetails;
2988                  unsigned int resultCount = 0;
2989              
2990                  MI_Session_QueryInstances(session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), NULL, &operation);
2991                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
2992              
2993                  while (moreResults && (++resultCount <= 10))
2994                  {
2995                      MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
2996                      NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
2997                  }
2998                  NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
2999                  MI_Operation_Close(&operation);
3000              }
3001              NitsEndTest
3002              
3003              NitsTest2(MI_Session_QueryInstances_Sync_WithOptions, 
3004 krisbash 1.1           SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3005                        SetupDefaultSession, SetupDefaultSessionDefaults)
3006              {
3007                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3008                  ResetRuntimeTestData(testData);
3009                  MI_Application *application = &testData->application;
3010                  MI_Session *session = &testData->session;
3011                  MI_Operation operation = MI_OPERATION_NULL;
3012                  
3013                  MI_OperationOptions options = MI_DESTINATIONOPTIONS_NULL;
3014                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
3015                  {
3016                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
3017                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
3018                      {
3019                          MI_Value value;
3020                          value.string = (MI_Char*) PAL_T("hello world");
3021                          NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
3022                      }
3023              
3024                      const MI_Instance *resultInstance;
3025 krisbash 1.1         MI_Boolean moreResults = MI_TRUE;
3026                      MI_Result result;
3027                      const MI_Char *errorMessage;
3028                      const MI_Instance *completionDetails;
3029                      unsigned int resultCount = 0;
3030              
3031                      MI_Session_QueryInstances(session, 0, &options, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), NULL, &operation);
3032                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3033              
3034                      while (moreResults && (++resultCount <= 10))
3035                      {
3036                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3037                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3038                      }
3039                      NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3040                      MI_Operation_Close(&operation);
3041              
3042                      MI_OperationOptions_Delete(&options);
3043                  }
3044              }
3045              NitsEndTest
3046 krisbash 1.1 
3047              NitsTest2(MI_Session_QueryInstances_Sync_InvalidParameters, 
3048                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3049                        SetupDefaultSession, SetupDefaultSessionDefaults)
3050              {
3051                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3052                  ResetRuntimeTestData(testData);
3053                  MI_Session *session = &testData->session;
3054                  MI_Operation operation = MI_OPERATION_NULL;
3055                  
3056                  const MI_Instance *resultInstance;
3057                  MI_Boolean moreResults = MI_TRUE;
3058                  MI_Result result = MI_RESULT_FAILED;
3059                  const MI_Char *errorMessage;
3060                  const MI_Instance *completionDetails;
3061                  unsigned int resultCount = 0;
3062              
3063                  {/* success */
3064                      MI_Session_QueryInstances(session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), NULL, &operation);
3065                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3066              
3067 krisbash 1.1         while (moreResults && (++resultCount <= 10))
3068                      {
3069                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3070                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3071                      }
3072                      NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3073                      MI_Operation_Close(&operation);
3074                  }
3075                  {/* no filter */
3076                      MI_Session_QueryInstances(session, 0, NULL, PAL_T("namespace"), NULL, NULL, NULL, &operation);
3077                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3078                      resultCount = 0;
3079                      moreResults = MI_TRUE;
3080                      while (moreResults && (++resultCount <= 10))
3081                      {
3082                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3083                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3084                      }
3085                      NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3086                      MI_Operation_Close(&operation);
3087                  }
3088 krisbash 1.1     {/* no opertion */
3089              #if defined (_MSC_VER)
3090              #pragma prefast(push)
3091              #pragma prefast(disable: 6309)
3092              #endif
3093                      MI_Session_QueryInstances(session, 0, NULL, NULL, PAL_T("dialect"), PAL_T("filter"), NULL, NULL);
3094              #if defined (_MSC_VER)
3095              #pragma prefast(pop)
3096              #endif
3097                      /* nothing more we can do as no where for result to go */
3098                  }
3099              
3100              }
3101              NitsEndTest
3102              
3103              NitsTest2(MI_Session_QueryInstances_Sync_TransportNotSupported, 
3104                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
3105                        SetupDefaultSession, SetupDefaultSessionDefaults)
3106              {
3107                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3108                  ResetRuntimeTestData(testData);
3109 krisbash 1.1     MI_Session *session = &testData->session;
3110                  MI_Operation operation = MI_OPERATION_NULL;
3111                  
3112                  const MI_Instance *resultInstance;
3113                  MI_Boolean moreResults = MI_TRUE;
3114                  MI_Result result;
3115                  const MI_Char *errorMessage;
3116                  const MI_Instance *completionDetails;
3117              
3118                  MI_Session_QueryInstances(session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), NULL, &operation);
3119                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3120              
3121                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3122                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should fail with not supported"));
3123                  MI_Operation_Close(&operation);
3124              }
3125              NitsEndTest
3126              
3127              NitsTest2(MI_Session_QueryInstances_Async_AutoAck, 
3128                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3129                        SetupDefaultSession, SetupDefaultSessionDefaults)
3130 krisbash 1.1 {
3131                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3132                  ResetRuntimeTestData(testData);
3133                  MI_Session *session = &testData->session;
3134                  MI_Operation operation = MI_OPERATION_NULL;
3135                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
3136                  
3137                  g_maximumInstanceCount = 10;
3138                  callbacks.callbackContext = testData;
3139                  callbacks.instanceResult = GetInstanceResult;
3140              
3141                  MI_Session_QueryInstances(session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), &callbacks, &operation);
3142                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3143              
3144                  WaitForOperationToComplete(testData);
3145              
3146                  NitsCompare((MI_Uint32)testData->instanceCount,  (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
3147              }
3148              NitsEndTest
3149              
3150              /*==========================================================================================*/
3151 krisbash 1.1 /*=================================== ASSOCIATOR INSTANCE ==================================*/
3152              /*==========================================================================================*/
3153              
3154              NitsTest3(MI_Session_AssociatorInstances_Sync, 
3155                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3156                        SetupDefaultSession, SetupDefaultSessionDefaults,
3157                        SetupTestInstance, g_SetupTestInstance_test)
3158              {
3159                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3160                  ResetRuntimeTestData(testData);
3161                  MI_Session *session = &testData->session;
3162                  MI_Instance *testInstance = testData->testInstance;
3163                  MI_Operation operation = MI_OPERATION_NULL;
3164                  
3165                  const MI_Instance *resultInstance;
3166                  MI_Boolean moreResults = MI_TRUE;
3167                  MI_Result result;
3168                  const MI_Char *errorMessage;
3169                  const MI_Instance *completionDetails;
3170                  unsigned int resultCount = 0;
3171              
3172 krisbash 1.1     MI_Session_AssociatorInstances(session, 0, NULL, NULL, testInstance, NULL, PAL_T("test"), NULL, NULL, MI_FALSE, NULL, &operation);
3173                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3174              
3175                  while (moreResults && (++resultCount <= 10))
3176                  {
3177                      MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3178                      NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3179                  }
3180                  NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3181                  MI_Operation_Close(&operation);
3182              }
3183              NitsEndTest
3184              
3185              NitsTest3(MI_Session_AssociatorInstances_Sync_WithOptions, 
3186                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3187                        SetupDefaultSession, SetupDefaultSessionDefaults,
3188                        SetupTestInstance, g_SetupTestInstance_test)
3189              {
3190                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3191                  ResetRuntimeTestData(testData);
3192                  MI_Application *application = &testData->application;
3193 krisbash 1.1     MI_Session *session = &testData->session;
3194                  MI_Instance *testInstance = testData->testInstance;
3195                  MI_Operation operation = MI_OPERATION_NULL;
3196                  
3197                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
3198                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
3199                  {
3200                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
3201                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
3202                      {
3203                          MI_Value value;
3204                          value.string = (MI_Char*)PAL_T("hello world");
3205                          NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
3206                      }
3207              
3208                      const MI_Instance *resultInstance;
3209                      MI_Boolean moreResults = MI_TRUE;
3210                      MI_Result result;
3211                      const MI_Char *errorMessage;
3212                      const MI_Instance *completionDetails;
3213                      unsigned int resultCount = 0;
3214 krisbash 1.1 
3215                      MI_Session_AssociatorInstances(session, 0, &options, NULL, testInstance, NULL, PAL_T("test"), NULL, NULL, MI_FALSE, NULL, &operation);
3216                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3217              
3218                      while (moreResults && (++resultCount <= 10))
3219                      {
3220                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3221                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3222                      }
3223                      NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3224                      MI_Operation_Close(&operation);
3225              
3226                      MI_OperationOptions_Delete(&options);
3227                  }
3228              }
3229              NitsEndTest
3230              
3231              
3232              NitsTest3(MI_Session_AssociatorInstances_Sync_InvalidParameters, 
3233                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3234                        SetupDefaultSession, SetupDefaultSessionDefaults,
3235 krisbash 1.1           SetupTestInstance, g_SetupTestInstance_test)
3236              {
3237                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3238                  ResetRuntimeTestData(testData);
3239                  MI_Session *session = &testData->session;
3240                  MI_Instance *testInstance = testData->testInstance;
3241                  MI_Operation operation = MI_OPERATION_NULL;
3242                  
3243                  const MI_Instance *resultInstance;
3244                  MI_Boolean moreResults = MI_TRUE;
3245                  MI_Result result;
3246                  const MI_Char *errorMessage;
3247                  const MI_Instance *completionDetails;
3248                  unsigned int resultCount = 0;
3249              
3250                  {/* success */
3251                      MI_Session_AssociatorInstances(session, 0, NULL, NULL, testInstance, NULL, PAL_T("test"), NULL, NULL, MI_FALSE, NULL, &operation);
3252                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3253              
3254                      while (moreResults && (++resultCount <= 10))
3255                      {
3256 krisbash 1.1             MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3257                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3258                      }
3259                      NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3260                      MI_Operation_Close(&operation);
3261                  }
3262                  {/* no class */
3263              #if defined (_MSC_VER)
3264              #pragma prefast(push)
3265              #pragma prefast(disable: 6309)
3266              #endif
3267                      MI_Session_AssociatorInstances(session, 0, NULL, NULL, NULL, NULL, PAL_T("test"), NULL, NULL, MI_FALSE, NULL, &operation);
3268              #if defined (_MSC_VER)
3269              #pragma prefast(pop)
3270              #endif
3271                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3272              
3273                      MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3274                      NitsCompare(result, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation should succeed"));
3275                      MI_Operation_Close(&operation);
3276                  }
3277 krisbash 1.1     {/* no opertion */
3278              #if defined (_MSC_VER)
3279              #pragma prefast(push)
3280              #pragma prefast(disable: 6309)
3281              #endif
3282                      MI_Session_AssociatorInstances(session, 0, NULL, NULL, testInstance, NULL, PAL_T("test"), NULL, NULL, MI_FALSE, NULL, NULL);
3283              #if defined (_MSC_VER)
3284              #pragma prefast(pop)
3285              #endif
3286                      /* nothing more we can do as no where for result to go */
3287                  }
3288              }
3289              NitsEndTest
3290              
3291              NitsTest3(MI_Session_AssociatorInstances_Sync_TransportNotSupported, 
3292                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
3293                        SetupDefaultSession, SetupDefaultSessionDefaults,
3294                        SetupTestInstance, g_SetupTestInstance_test)
3295              {
3296                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3297                  ResetRuntimeTestData(testData);
3298 krisbash 1.1     MI_Session *session = &testData->session;
3299                  MI_Instance *testInstance = testData->testInstance;
3300                  MI_Operation operation = MI_OPERATION_NULL;
3301                  
3302                  const MI_Instance *resultInstance;
3303                  MI_Boolean moreResults = MI_TRUE;
3304                  MI_Result result;
3305                  const MI_Char *errorMessage;
3306                  const MI_Instance *completionDetails;
3307              
3308                  MI_Session_AssociatorInstances(session, 0, NULL, NULL, testInstance, NULL, PAL_T("test"), NULL, NULL, MI_FALSE, NULL, &operation);
3309                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3310              
3311                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3312                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should fail with not supported"));
3313                  MI_Operation_Close(&operation);
3314              }
3315              NitsEndTest
3316              
3317              NitsTest3(MI_Session_AssociatorInstances_Async_AutoAck, 
3318                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3319 krisbash 1.1           SetupDefaultSession, SetupDefaultSessionDefaults,
3320                        SetupTestInstance, g_SetupTestInstance_test)
3321              {
3322                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3323                  ResetRuntimeTestData(testData);
3324                  MI_Session *session = &testData->session;
3325                  MI_Instance *testInstance = testData->testInstance;
3326                  MI_Operation operation = MI_OPERATION_NULL;
3327                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
3328                  
3329                  g_maximumInstanceCount = 10;
3330                  callbacks.callbackContext = testData;
3331                  callbacks.instanceResult = GetInstanceResult;
3332              
3333                  MI_Session_AssociatorInstances(session, 0, NULL, NULL, testInstance, NULL, PAL_T("test"), NULL, NULL, MI_FALSE, &callbacks, &operation);
3334                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3335              
3336                  WaitForOperationToComplete(testData);
3337              
3338                  NitsAssert(testData->instanceCount == g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
3339              }
3340 krisbash 1.1 NitsEndTest
3341              
3342              /*==========================================================================================*/
3343              /*=================================== REFERENCE INSTANCE ===================================*/
3344              /*==========================================================================================*/
3345              
3346              NitsTest3(MI_Session_ReferenceInstances_Sync, 
3347                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3348                        SetupDefaultSession, SetupDefaultSessionDefaults,
3349                        SetupTestInstance, g_SetupTestInstance_test)
3350              {
3351                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3352                  ResetRuntimeTestData(testData);
3353                  MI_Session *session = &testData->session;
3354                  MI_Instance *testInstance = testData->testInstance;
3355                  MI_Operation operation = MI_OPERATION_NULL;
3356                  
3357                  const MI_Instance *resultInstance;
3358                  MI_Boolean moreResults = MI_TRUE;
3359                  MI_Result result;
3360                  const MI_Char *errorMessage;
3361 krisbash 1.1     const MI_Instance *completionDetails;
3362                  unsigned int resultCount = 0;
3363              
3364                  MI_Session_ReferenceInstances(session, 0, NULL, NULL, testInstance, PAL_T("test"), NULL, MI_FALSE, NULL, &operation);
3365                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3366              
3367                  while (moreResults && (++resultCount <= 10))
3368                  {
3369                      MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3370                      NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3371                  }
3372                  NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3373                  MI_Operation_Close(&operation);
3374              }
3375              NitsEndTest
3376              
3377              NitsTest3(MI_Session_ReferenceInstances_Sync_WithOptions, 
3378                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3379                        SetupDefaultSession, SetupDefaultSessionDefaults,
3380                        SetupTestInstance, g_SetupTestInstance_test)
3381              {
3382 krisbash 1.1     RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3383                  ResetRuntimeTestData(testData);
3384                  MI_Application *application = &testData->application;
3385                  MI_Session *session = &testData->session;
3386                  MI_Instance *testInstance = testData->testInstance;
3387                  MI_Operation operation = MI_OPERATION_NULL;
3388                  
3389                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
3390                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
3391                  {
3392                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
3393                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
3394                      {
3395                          MI_Value value;
3396                          value.string = (MI_Char *) PAL_T("hello world");
3397                          NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
3398                      }
3399              
3400                      const MI_Instance *resultInstance;
3401                      MI_Boolean moreResults = MI_TRUE;
3402                      MI_Result result;
3403 krisbash 1.1         const MI_Char *errorMessage;
3404                      const MI_Instance *completionDetails;
3405                      unsigned int resultCount = 0;
3406              
3407                      MI_Session_ReferenceInstances(session, 0, &options, NULL, testInstance, PAL_T("test"), NULL, MI_FALSE, NULL, &operation);
3408                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3409              
3410                      while (moreResults && (++resultCount <= 10))
3411                      {
3412                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3413                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3414                      }
3415                      NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3416                      MI_Operation_Close(&operation);
3417              
3418                      MI_OperationOptions_Delete(&options);
3419                  }
3420              }
3421              NitsEndTest
3422              
3423              NitsTest3(MI_Session_ReferenceInstances_Sync_InvalidParameters, 
3424 krisbash 1.1           SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3425                        SetupDefaultSession, SetupDefaultSessionDefaults,
3426                        SetupTestInstance, g_SetupTestInstance_test)
3427              {
3428                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3429                  ResetRuntimeTestData(testData);
3430                  MI_Session *session = &testData->session;
3431                  MI_Instance *testInstance = testData->testInstance;
3432                  MI_Operation operation = MI_OPERATION_NULL;
3433                  
3434                  const MI_Instance *resultInstance;
3435                  MI_Boolean moreResults = MI_TRUE;
3436                  MI_Result result;
3437                  const MI_Char *errorMessage;
3438                  const MI_Instance *completionDetails;
3439                  unsigned int resultCount = 0;
3440              
3441                  {/* success */
3442                      MI_Session_ReferenceInstances(session, 0, NULL, NULL, testInstance, PAL_T("test"), NULL, MI_FALSE, NULL, &operation);
3443                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3444              
3445 krisbash 1.1         while (moreResults && (++resultCount <= 10))
3446                      {
3447                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3448                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3449                      }
3450                      NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3451                      MI_Operation_Close(&operation);
3452                  }
3453                  {/* no class */
3454              #if defined (_MSC_VER)
3455              #pragma prefast(push)
3456              #pragma prefast(disable: 6309)
3457              #endif
3458                      MI_Session_ReferenceInstances(session, 0, NULL, NULL, NULL , PAL_T("test"), NULL, MI_FALSE, NULL, &operation);
3459              #if defined (_MSC_VER)
3460              #pragma prefast(pop)
3461              #endif
3462                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3463              
3464                      MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3465                      NitsCompare(result, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation should succeed"));
3466 krisbash 1.1         MI_Operation_Close(&operation);
3467                  }
3468                  {/* no opertion */
3469              #if defined (_MSC_VER)
3470              #pragma prefast(push)
3471              #pragma prefast(disable: 6309)
3472              #endif
3473                      MI_Session_ReferenceInstances(session, 0, NULL, NULL, testInstance, PAL_T("test"), NULL, MI_FALSE, NULL, NULL);
3474              #if defined (_MSC_VER)
3475              #pragma prefast(pop)
3476              #endif
3477                      /* nothing more we can do as no where for result to go */
3478                  }
3479              }
3480              NitsEndTest
3481              
3482              NitsTest3(MI_Session_ReferenceInstances_Sync_TransportNotSupported, 
3483                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
3484                        SetupDefaultSession, SetupDefaultSessionDefaults,
3485                        SetupTestInstance, g_SetupTestInstance_test)
3486              {
3487 krisbash 1.1     RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3488                  ResetRuntimeTestData(testData);
3489                  MI_Session *session = &testData->session;
3490                  MI_Instance *testInstance = testData->testInstance;
3491                  MI_Operation operation = MI_OPERATION_NULL;
3492                  
3493                  const MI_Instance *resultInstance;
3494                  MI_Boolean moreResults = MI_TRUE;
3495                  MI_Result result;
3496                  const MI_Char *errorMessage;
3497                  const MI_Instance *completionDetails;
3498              
3499                  MI_Session_ReferenceInstances(session, 0, NULL, NULL, testInstance, PAL_T("test"), NULL, MI_FALSE, NULL, &operation);
3500                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3501              
3502                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
3503                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should fail with not supported"));
3504                  MI_Operation_Close(&operation);
3505              }
3506              NitsEndTest
3507              
3508 krisbash 1.1 NitsTest3(MI_Session_ReferenceInstances_Async_AutoAck, 
3509                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3510                        SetupDefaultSession, SetupDefaultSessionDefaults,
3511                        SetupTestInstance, g_SetupTestInstance_test)
3512              {
3513                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3514                  ResetRuntimeTestData(testData);
3515                  MI_Session *session = &testData->session;
3516                  MI_Instance *testInstance = testData->testInstance;
3517                  MI_Operation operation = MI_OPERATION_NULL;
3518                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
3519                  
3520                  g_maximumInstanceCount = 10;
3521                  callbacks.callbackContext = testData;
3522                  callbacks.instanceResult = GetInstanceResult;
3523              
3524                  MI_Session_ReferenceInstances(session, 0, NULL, NULL, testInstance, PAL_T("test"), NULL, MI_FALSE, &callbacks, &operation);
3525                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3526              
3527                  WaitForOperationToComplete(testData);
3528              
3529 krisbash 1.1     NitsAssert(testData->instanceCount == g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
3530              }
3531              NitsEndTest
3532              
3533              /*==========================================================================================*/
3534              /*======================================== Get Class =======================================*/
3535              /*==========================================================================================*/
3536              
3537              NitsTest2(MI_Session_GetClass_Sync, 
3538                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3539                        SetupDefaultSession, SetupDefaultSessionDefaults)
3540              {
3541                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3542                  ResetRuntimeTestData(testData);
3543                  MI_Session *session = &testData->session;
3544                  MI_Operation operation = MI_OPERATION_NULL;
3545              
3546                  const MI_Class *resultClass;
3547                  MI_Boolean moreResults;
3548                  MI_Result result;
3549                  const MI_Char *errorMessage;
3550 krisbash 1.1     const MI_Instance *completionDetails;
3551              
3552                  MI_Session_GetClass(session, 0, NULL, PAL_T("namespace"), PAL_T("myClass"), NULL, &operation);
3553                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3554              
3555                  MI_Operation_GetClass(&operation, &resultClass, &moreResults, &result, &errorMessage, &completionDetails);
3556                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3557                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
3558              
3559                  MI_Operation_Close(&operation);
3560              }
3561              NitsEndTest
3562              
3563              
3564              NitsTest2(MI_Session_GetClass_Async_AutoAck, 
3565                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3566                        SetupDefaultSession, SetupDefaultSessionDefaults)
3567              {
3568                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3569                  ResetRuntimeTestData(testData);
3570                  MI_Session *session = &testData->session;
3571 krisbash 1.1     MI_Operation operation = MI_OPERATION_NULL;
3572                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
3573                  
3574                  g_maximumInstanceCount = 1;
3575                  callbacks.callbackContext = testData;
3576                  callbacks.classResult = GetClassResult;
3577              
3578                  MI_Session_GetClass(session, 0, NULL, PAL_T("Namespace"), PAL_T("MyClass"), &callbacks, &operation);
3579                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3580              
3581                  WaitForOperationToComplete(testData);
3582              
3583                  NitsCompare((MI_Uint32)testData->classCount, (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
3584              }
3585              NitsEndTest
3586              
3587              NitsTest2(MI_Session_GetClass_Async_ManualAck, 
3588                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3589                        SetupDefaultSession, SetupDefaultSessionDefaults)
3590              {
3591                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3592 krisbash 1.1     ResetRuntimeTestData(testData);
3593                  MI_Session *session = &testData->session;
3594                  MI_Operation operation = MI_OPERATION_NULL;
3595                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
3596                  
3597                  g_maximumInstanceCount = 1;
3598                  callbacks.callbackContext = testData;
3599                  callbacks.classResult = GetClassResult;
3600              
3601                  MI_Session_GetClass(session, MI_OPERATIONFLAGS_MANUAL_ACK_RESULTS, NULL, PAL_T("namespace"), PAL_T("myClass"), &callbacks, &operation);
3602                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3603              
3604                  WaitForOperationToComplete(testData);
3605              
3606                  NitsCompare((MI_Uint32)testData->classCount, (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
3607              }
3608              NitsEndTest
3609              
3610              NitsTest2(MI_Session_GetClass_Sync_WithOptions, 
3611                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3612                        SetupDefaultSession, SetupDefaultSessionDefaults)
3613 krisbash 1.1 {
3614                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3615                  ResetRuntimeTestData(testData);
3616                  MI_Application *application = &testData->application;
3617                  MI_Session *session = &testData->session;
3618                  MI_Operation operation = MI_OPERATION_NULL;
3619                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
3620              
3621                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
3622                  {
3623                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
3624                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
3625                      {
3626                          MI_Value value;
3627                          value.string = (MI_Char *)PAL_T("hello world");
3628                          NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
3629                      }
3630              
3631                      const MI_Class *resultClass;
3632                      MI_Boolean moreResults;
3633                      MI_Result result;
3634 krisbash 1.1         const MI_Char *errorMessage;
3635                      const MI_Instance *completionDetails;
3636              
3637                      MI_Session_GetClass(session, 0, &options, PAL_T("mynamespace"), PAL_T("myclass"), NULL, &operation);
3638                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3639              
3640                      MI_Operation_GetClass(&operation, &resultClass, &moreResults, &result, &errorMessage, &completionDetails);
3641                      NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3642                      NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
3643              
3644                      MI_Operation_Close(&operation);
3645              
3646                      MI_OperationOptions_Delete(&options);
3647                  }
3648              }
3649              NitsEndTest
3650              
3651              #if 0
3652              NitsTest(MI_Session_GetClass_Sync_InvalidParameters)
3653              {
3654                  MI_Application application = MI_APPLICATION_NULL;
3655 krisbash 1.1     MI_Session session = MI_SESSION_NULL;
3656                  MI_Operation operation = MI_OPERATION_NULL;
3657                  const MI_Class*result;
3658                  const MI_Instance *extendedInfo;
3659                  MI_Boolean moreResults;
3660                  MI_Result resultCode;
3661                  MI_Result returnValue;
3662                  const MI_Char *errorMessage;
3663                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
3664                  callbacks.classResult = GetClassResult_Fail;
3665              
3666                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
3667                      NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
3668                  {
3669                      if (NitsCompare(MI_Application_NewSession(&application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
3670                          NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
3671                      {
3672                          session.ft->GetClass(&session, 0, NULL, PAL_T("namespace"), PAL_T("myclass"), NULL, &operation);
3673                          MI_Operation_GetClass(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
3674                          NitsCompare(resultCode, MI_RESULT_OK, PAL_T("GetClass should succeed"));
3675              
3676 krisbash 1.1             returnValue = operation.ft->GetClass(NULL, &result, NULL, &resultCode, NULL, NULL);
3677                          NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetClass should fail due to NULL operation"));
3678              
3679                          returnValue = operation.ft->GetClass(&operation, NULL, NULL, &resultCode, NULL, NULL);
3680                          NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetClass should fail due to NULL instance"));
3681              
3682                          operation.ft->GetClass(&operation, NULL, NULL, NULL, NULL, NULL);
3683                          /* no where for result to go but may add code coverage for scenario */
3684              
3685                          MI_Operation_Close(&operation);
3686              
3687                          session.ft->GetClass(NULL, 0, NULL, PAL_T("namespace"), PAL_T("className"), NULL, &operation);
3688                          MI_Operation_GetClass(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
3689                          NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetClass should faul due to NULL session"));
3690                          MI_Operation_Close(&operation);
3691              
3692                          session.ft->GetClass(&session, 0, NULL, PAL_T("namespace"), PAL_T("className"), &callbacks, NULL);
3693                          MI_Operation_GetClass(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
3694                          NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetClass should fail due to null operation, has callbacks"));
3695                          MI_Operation_Close(&operation);
3696              
3697 krisbash 1.1             session.ft->GetClass(&session, 0, NULL, PAL_T("namespace"), PAL_T("myclass"), NULL, NULL);
3698                          /* Validate it doesn't crash only as nowhere for failure to go */
3699                          MI_Session_Close(&session, NULL, NULL);
3700              
3701                          session.ft->GetClass(&session, 0, NULL, PAL_T("mynamespace"), PAL_T("myclass"), NULL, &operation);
3702                          MI_Operation_GetClass(&operation, &result, &moreResults, &resultCode, &errorMessage, &extendedInfo);
3703                          NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetClass should fail because session is already closed"));
3704                          MI_Operation_Close(&operation);
3705              
3706                      }
3707                      MI_Application_Close(&application);
3708                  }
3709              }
3710              NitsEndTest
3711              #endif
3712              
3713              NitsTest2(MI_Session_GetClass_TransportNotSupported, 
3714                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
3715                        SetupDefaultSession, SetupDefaultSessionDefaults)
3716              {
3717                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3718 krisbash 1.1     ResetRuntimeTestData(testData);
3719                  MI_Session *session = &testData->session;
3720                  MI_Operation operation = MI_OPERATION_NULL;
3721              
3722                  const MI_Class *resultClass;
3723                  MI_Boolean moreResults;
3724                  MI_Result result;
3725                  const MI_Char *errorMessage;
3726                  const MI_Instance *completionDetails;
3727              
3728                  MI_Session_GetClass(session, 0, NULL, PAL_T("mynamespace"), PAL_T("myclass"), NULL, &operation);
3729              
3730                  MI_Operation_GetClass(&operation, &resultClass, &moreResults, &result, &errorMessage, &completionDetails);
3731                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should succeed"));
3732                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
3733              
3734                  MI_Operation_Close(&operation);
3735              }
3736              NitsEndTest
3737              
3738              /*==========================================================================================*/
3739 krisbash 1.1 /*==================================== Enumerate Classes ===================================*/
3740              /*==========================================================================================*/
3741              
3742              NitsTest2(MI_Session_EnumerateClasses_Sync, 
3743                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3744                        SetupDefaultSession, SetupDefaultSessionDefaults)
3745              {
3746                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3747                  ResetRuntimeTestData(testData);
3748                  MI_Session *session = &testData->session;
3749                  MI_Operation operation = MI_OPERATION_NULL;
3750                  
3751                  const MI_Class *resultClass;
3752                  MI_Boolean moreResults = MI_TRUE;
3753                  MI_Result result;
3754                  const MI_Char *errorMessage;
3755                  const MI_Instance *completionDetails;
3756                  unsigned int resultCount = 0;
3757              
3758                  MI_Session_EnumerateClasses(session, 0, NULL, PAL_T("namespace"), PAL_T("testClass"), MI_FALSE, NULL, &operation);
3759                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3760 krisbash 1.1 
3761                  while (moreResults && (++resultCount <= 10))
3762                  {
3763                      MI_Operation_GetClass(&operation, &resultClass, &moreResults, &result, &errorMessage, &completionDetails);
3764                      NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3765                  }
3766                  NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3767                  MI_Operation_Close(&operation);
3768              }
3769              NitsEndTest
3770              
3771              NitsTest2(MI_Session_EnumerateClasses_Sync_WithOptions, 
3772                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3773                        SetupDefaultSession, SetupDefaultSessionDefaults)
3774              {
3775                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3776                  ResetRuntimeTestData(testData);
3777                  MI_Application *application = &testData->application;
3778                  MI_Session *session = &testData->session;
3779                  MI_Operation operation = MI_OPERATION_NULL;
3780                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
3781 krisbash 1.1 
3782                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
3783                  {
3784                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
3785                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
3786                      {
3787                          MI_Value value;
3788                          value.string = (MI_Char*)PAL_T("hello world");
3789                          NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
3790                      }
3791              
3792                      const MI_Class *resultClass;
3793                      MI_Boolean moreResults = MI_TRUE;
3794                      MI_Result result;
3795                      const MI_Char *errorMessage;
3796                      const MI_Instance *completionDetails;
3797                      unsigned int resultCount = 0;
3798              
3799                      MI_Session_EnumerateClasses(session, 0, &options, PAL_T("namespace"), PAL_T("testClass"), MI_FALSE, NULL, &operation);
3800                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3801              
3802 krisbash 1.1         while (moreResults && (++resultCount <= 10))
3803                      {
3804                          MI_Operation_GetClass(&operation, &resultClass, &moreResults, &result, &errorMessage, &completionDetails);
3805                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3806                      }
3807                      NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3808                      MI_Operation_Close(&operation);
3809              
3810                      MI_OperationOptions_Delete(&options);
3811                  }
3812              }
3813              NitsEndTest
3814              
3815              #if 0
3816              NitsTest(MI_Session_EnumerateClasses_Sync_InvalidParameters)
3817              {
3818                  MI_Application application = MI_APPLICATION_NULL;
3819                  MI_Session session = MI_SESSION_NULL;
3820                  MI_Operation operation = MI_OPERATION_NULL;
3821                  
3822                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
3823 krisbash 1.1         NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
3824                  {
3825                      if (NitsCompare(MI_Application_NewSession(&application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
3826                          NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
3827                      {
3828                          const MI_Class *resultClass;
3829                          MI_Boolean moreResults = MI_TRUE;
3830                          MI_Result result = MI_RESULT_FAILED;
3831                          const MI_Char *errorMessage;
3832                          const MI_Instance *completionDetails;
3833                          unsigned int resultCount = 0;
3834              
3835                          {/* success */
3836                              MI_Session_EnumerateClasses(&session, 0, NULL, PAL_T("namespace"), PAL_T("testClass"), MI_FALSE, NULL, &operation);
3837                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3838              
3839                              while (moreResults && (++resultCount <= 10))
3840                              {
3841                                  MI_Operation_GetClass(&operation, &resultClass, &moreResults, &result, &errorMessage, &completionDetails);
3842                                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3843                              }
3844 krisbash 1.1                 NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3845                              MI_Operation_Close(&operation);
3846                          }
3847                          {/* no class */
3848                              MI_Session_EnumerateClasses(&session, 0, NULL, PAL_T("namespace"), NULL, MI_FALSE, NULL, &operation);
3849                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3850                              resultCount = 0;
3851                              moreResults = MI_TRUE;
3852                              while (moreResults && (++resultCount <= 10))
3853                              {
3854                                  MI_Operation_GetClass(&operation, &resultClass, &moreResults, &result, &errorMessage, &completionDetails);
3855                                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3856                              }
3857                              NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3858                              MI_Operation_Close(&operation);
3859                          }
3860                          {/* no opertion */
3861              #if defined (_MSC_VER)
3862              #pragma prefast(push)
3863              #pragma prefast(disable: 6309)
3864              #endif
3865 krisbash 1.1                 MI_Session_EnumerateClasses(&session, 0, NULL, PAL_T("namespace"), PAL_T("testClass"), MI_FALSE, NULL, NULL);
3866              #if defined (_MSC_VER)
3867              #pragma prefast(pop)
3868              #endif
3869                              /* nothing more we can do as no where for result to go */
3870                          }
3871              
3872                          MI_Session_Close(&session, NULL, NULL);
3873                      }
3874              
3875                      MI_Application_Close(&application);
3876                  }
3877              }
3878              NitsEndTest
3879              #endif
3880              
3881              NitsTest2(MI_Session_EnumerateClasses_Sync_TransportNotSupported, 
3882                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
3883                        SetupDefaultSession, SetupDefaultSessionDefaults)
3884              {
3885                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3886 krisbash 1.1     ResetRuntimeTestData(testData);
3887                  MI_Session *session = &testData->session;
3888                  MI_Operation operation = MI_OPERATION_NULL;
3889                  
3890                  const MI_Class *resultClass;
3891                  MI_Boolean moreResults = MI_TRUE;
3892                  MI_Result result;
3893                  const MI_Char *errorMessage;
3894                  const MI_Instance *completionDetails;
3895              
3896                  MI_Session_EnumerateClasses(session, 0, NULL, PAL_T("namespace"), PAL_T("testClass"), MI_FALSE, NULL, &operation);
3897                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3898              
3899                  MI_Operation_GetClass(&operation, &resultClass, &moreResults, &result, &errorMessage, &completionDetails);
3900                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should fail with not supported"));
3901                  MI_Operation_Close(&operation);
3902              
3903              }
3904              NitsEndTest
3905              
3906              NitsTest2(MI_Session_EnumerateClasses_Async_AutoAck, 
3907 krisbash 1.1           SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3908                        SetupDefaultSession, SetupDefaultSessionDefaults)
3909              {
3910                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3911                  ResetRuntimeTestData(testData);
3912                  MI_Session *session = &testData->session;
3913                  MI_Operation operation = MI_OPERATION_NULL;
3914                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
3915                  
3916                  g_maximumInstanceCount = 10;
3917                  callbacks.callbackContext = testData;
3918                  callbacks.classResult = GetClassResult;
3919              
3920                  MI_Session_EnumerateClasses(session, 0, NULL, PAL_T("namespace"), PAL_T("testClass"), MI_FALSE, &callbacks, &operation);
3921                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3922              
3923                  WaitForOperationToComplete(testData);
3924              
3925                  NitsCompare((MI_Uint32)testData->classCount, (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
3926              }
3927              NitsEndTest
3928 krisbash 1.1 
3929              /*==========================================================================================*/
3930              /*=================================== Subscribe Instances ==================================*/
3931              /*==========================================================================================*/
3932              
3933              NitsTest2(MI_Session_Subscribe_Sync, 
3934                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3935                        SetupDefaultSession, SetupDefaultSessionDefaults)
3936              {
3937                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3938                  ResetRuntimeTestData(testData);
3939                  MI_Session *session = &testData->session;
3940                  MI_Operation operation = MI_OPERATION_NULL;
3941                  
3942                  const MI_Instance *resultInstance;
3943                  const MI_Char *bookmark;
3944                  const MI_Char *machineID;
3945                  MI_Boolean moreResults = MI_TRUE;
3946                  MI_Result result;
3947                  const MI_Char *errorMessage;
3948                  const MI_Instance *completionDetails;
3949 krisbash 1.1     unsigned int resultCount = 0;
3950              
3951                  MI_Session_Subscribe(session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), NULL, NULL, &operation);
3952                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3953              
3954                  while (moreResults && (++resultCount <= 10))
3955                  {
3956                      MI_Operation_GetIndication(&operation, &resultInstance, &bookmark, &machineID, &moreResults, &result, &errorMessage, &completionDetails);
3957                      NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
3958                  }
3959                  NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
3960                  MI_Operation_Close(&operation);
3961              }
3962              NitsEndTest
3963              
3964              NitsTest2(MI_Session_Subscribe_Sync_WithOptions, 
3965                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
3966                        SetupDefaultSession, SetupDefaultSessionDefaults)
3967              {
3968                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
3969                  ResetRuntimeTestData(testData);
3970 krisbash 1.1     MI_Application *application = &testData->application;
3971                  MI_Session *session = &testData->session;
3972                  MI_Operation operation = MI_OPERATION_NULL;
3973                  
3974                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
3975                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
3976                  {
3977                      const MI_Instance *resultInstance;
3978                      const MI_Char *bookmark;
3979                      const MI_Char *machineID;
3980                      MI_Boolean moreResults = MI_TRUE;
3981                      MI_Result result;
3982                      const MI_Char *errorMessage;
3983                      const MI_Instance *completionDetails;
3984                      unsigned int resultCount = 0;
3985              
3986                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
3987                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
3988                      {
3989                          MI_Value value;
3990                          value.string = (MI_Char*) PAL_T("hello world");
3991 krisbash 1.1             NitsCompare(options.ft->SetCustomOption(&options, PAL_T("option3"), MI_STRING, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomString should work"));
3992                      }
3993              
3994                      MI_Session_Subscribe(session, 0, &options, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), NULL, NULL, &operation);
3995                      NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
3996              
3997                      while (moreResults && (++resultCount <= 10))
3998                      {
3999                          MI_Operation_GetIndication(&operation, &resultInstance, &bookmark, &machineID, &moreResults, &result, &errorMessage, &completionDetails);
4000                          NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
4001                      }
4002                      NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
4003                      MI_Operation_Close(&operation);
4004              
4005                      MI_OperationOptions_Delete(&options);
4006                  }
4007              }
4008              NitsEndTest
4009              
4010              #if 0
4011              NitsTest(MI_Session_Subscribe_Sync_WithDeliveryOptions)
4012 krisbash 1.1 {
4013                  MI_Application application = MI_APPLICATION_NULL;
4014                  MI_Session session = MI_SESSION_NULL;
4015                  MI_Operation operation = MI_OPERATION_NULL;
4016                  
4017                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
4018                      NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
4019                  {
4020                      MI_SubscriptionDeliveryOptions options = MI_SUBSCRIPTIONDELIVERYOPTIONS_NULL;
4021                      if (NitsCompare(MI_Application_NewSubscriptionDeliveryOptions(&application, MI_SubscriptionDeliveryType_Push, &options), MI_RESULT_OK, PAL_T("NewSubscribeDeliveryOptions should succeed")))
4022                      {
4023                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
4024                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 22, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
4025                          {
4026                              MI_Datetime datetime;
4027                              NitsCompare(options.ft->SetDateTime(&options, PAL_T("option3"), &datetime, 0), MI_RESULT_OK, PAL_T("SetDateTime should work"));
4028                          }
4029                          {
4030                              MI_Interval interval;
4031                              NitsCompare(options.ft->SetInterval(&options, PAL_T("option4"), &interval, 0), MI_RESULT_OK, PAL_T("SetInterval should work"));
4032                          }
4033 krisbash 1.1             {
4034                              MI_UserCredentials creds = { 0 };
4035                              creds.authenticationType = MI_AUTH_TYPE_BASIC;
4036                              creds.credentials.usernamePassword.username = PAL_T("username");
4037                              creds.credentials.usernamePassword.domain = PAL_T("domain");
4038                              creds.credentials.usernamePassword.password = PAL_T("password");
4039                              NitsCompare(options.ft->AddCredentials(&options, PAL_T("option5"), &creds, 0), MI_RESULT_OK, PAL_T("AddCredentials should work"));
4040                          }
4041              
4042                          if (NitsCompare(MI_Application_NewSession(&application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
4043                              NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
4044                          {
4045                              const MI_Instance *resultInstance;
4046                              const MI_Char *bookmark;
4047                              const MI_Char *machineID;
4048                              MI_Boolean moreResults = MI_TRUE;
4049                              MI_Result result;
4050                              const MI_Char *errorMessage;
4051                              const MI_Instance *completionDetails;
4052                              unsigned int resultCount = 0;
4053              
4054 krisbash 1.1                 MI_Session_Subscribe(&session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), &options, NULL, &operation);
4055                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
4056              
4057                              while (moreResults && (++resultCount <= 10))
4058                              {
4059                                  MI_Operation_GetIndication(&operation, &resultInstance, &bookmark, &machineID, &moreResults, &result, &errorMessage, &completionDetails);
4060                                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
4061                              }
4062                              NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
4063                              MI_Operation_Close(&operation);
4064              
4065                              MI_Session_Close(&session, NULL, NULL);
4066                          }
4067                          MI_SubscriptionDeliveryOptions_Delete(&options);
4068                      }
4069                      MI_Application_Close(&application);
4070                  }
4071              }
4072              NitsEndTest
4073              
4074              NitsTest(MI_Session_Subscribe_Sync_InvalidParameters)
4075 krisbash 1.1 {
4076                  MI_Application application = MI_APPLICATION_NULL;
4077                  MI_Session session = MI_SESSION_NULL;
4078                  MI_Operation operation = MI_OPERATION_NULL;
4079                  
4080                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
4081                      NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
4082                  {
4083                      if (NitsCompare(MI_Application_NewSession(&application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
4084                          NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
4085                      {
4086                          const MI_Instance *resultInstance;
4087                          const MI_Char *bookmark;
4088                          const MI_Char *machineID;
4089                          MI_Boolean moreResults = MI_TRUE;
4090                          MI_Result result;
4091                          MI_Result returnValue;
4092                          const MI_Char *errorMessage;
4093                          const MI_Instance *completionDetails;
4094                          unsigned int resultCount = 0;
4095              
4096 krisbash 1.1             {/* success */
4097                              MI_Session_Subscribe(&session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), NULL, NULL, &operation);
4098                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
4099              
4100                              while (moreResults && (++resultCount <= 10))
4101                              {
4102                                  MI_Operation_GetIndication(&operation, &resultInstance, &bookmark, &machineID, &moreResults, &result, &errorMessage, &completionDetails);
4103                                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
4104                              }
4105                              NitsCompare(resultCount, 10, PAL_T("Should have 10 results"));
4106                              NitsCompare(moreResults, MI_FALSE, PAL_T("Need no more results for operation close to work properly"));
4107              
4108              #if defined (_MSC_VER)
4109              #pragma prefast(push)
4110              #pragma prefast(disable: 6309)
4111              #endif
4112                              returnValue = MI_Operation_GetIndication(NULL, &resultInstance, &bookmark, &machineID, &moreResults, &result, &errorMessage, &completionDetails);
4113                              NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Should get invalid parameter"));
4114                              returnValue = MI_Operation_GetIndication(&operation, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
4115                              NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Should get invalid parameter"));
4116              #if defined (_MSC_VER)
4117 krisbash 1.1 #pragma prefast(pop)
4118              #endif
4119              
4120                              MI_Operation_Close(&operation);
4121                          }
4122                          {/* no filter */
4123                              MI_Session_Subscribe(&session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), NULL, NULL, NULL, &operation);
4124              
4125                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
4126              
4127                              MI_Operation_GetIndication(&operation, &resultInstance, &bookmark, &machineID, &moreResults, &result, &errorMessage, &completionDetails);
4128                              NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
4129                              if (moreResults)
4130                              {
4131                                  MI_Operation_Cancel(&operation, MI_REASON_NONE);
4132                                  while (moreResults)
4133                                  {
4134                                      MI_Operation_GetIndication(&operation, &resultInstance, &bookmark, &machineID, &moreResults, &result, &errorMessage, &completionDetails);
4135                                  }
4136                              }
4137                              MI_Operation_Close(&operation);
4138 krisbash 1.1             }
4139                          {/* no opertion */
4140              #if defined (_MSC_VER)
4141              #pragma prefast(push)
4142              #pragma prefast(disable: 6309)
4143              #endif
4144                              MI_Session_Subscribe(&session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), NULL, NULL, NULL);
4145              #if defined (_MSC_VER)
4146              #pragma prefast(pop)
4147              #endif
4148                              /* nothing more we can do as no where for result to go */
4149                          }
4150                          {
4151                              MI_SubscriptionDeliveryOptions options = MI_SUBSCRIPTIONDELIVERYOPTIONS_NULL;
4152                              if (NitsCompare(MI_Application_NewSubscriptionDeliveryOptions(&application, MI_SubscriptionDeliveryType_Push, &options), MI_RESULT_OK, PAL_T("NewSubscribeDeliveryOptions should succeed")))
4153                              {
4154                                  {
4155                                      MI_Datetime datetime;
4156                                      NitsCompare(options.ft->SetDateTime(NULL, PAL_T("option3"), &datetime, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetDateTime should fail"));
4157                                      NitsCompare(options.ft->SetDateTime(&options, NULL, &datetime, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetDateTime should fail"));
4158                                      NitsCompare(options.ft->SetDateTime(&options, PAL_T("option3"), NULL, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetDateTime should fail"));
4159 krisbash 1.1                         NitsCompare(options.ft->SetDateTime(&options, PAL_T("option3"), &datetime, 42), MI_RESULT_INVALID_PARAMETER, PAL_T("SetDateTime should fail"));
4160                                  }
4161                                  {
4162                                      MI_Interval interval;
4163                                      NitsCompare(options.ft->SetInterval(NULL, PAL_T("option4"), &interval, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetInterval should fail"));
4164                                      NitsCompare(options.ft->SetInterval(&options, NULL, &interval, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetInterval should fail"));
4165                                      NitsCompare(options.ft->SetInterval(&options, PAL_T("option4"), NULL, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("SetInterval should fail"));
4166                                      NitsCompare(options.ft->SetInterval(&options, PAL_T("option4"), &interval, 32), MI_RESULT_INVALID_PARAMETER, PAL_T("SetInterval should fail"));
4167                                  }
4168                                  MI_SubscriptionDeliveryOptions_Delete(&options);
4169                              }
4170                          }
4171                          MI_Session_Close(&session, NULL, NULL);
4172                      }
4173              
4174                      MI_Application_Close(&application);
4175                  }
4176              }
4177              NitsEndTest
4178              #endif
4179              
4180 krisbash 1.1 NitsTest2(MI_Session_Subscribe_Sync_TransportNotSupported, 
4181                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
4182                        SetupDefaultSession, SetupDefaultSessionDefaults)
4183              {
4184                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
4185                  ResetRuntimeTestData(testData);
4186                  MI_Session *session = &testData->session;
4187                  MI_Operation operation = MI_OPERATION_NULL;
4188                  
4189                  const MI_Instance *resultInstance;
4190                  const MI_Char *bookmark;
4191                  const MI_Char *machineID;
4192                  MI_Boolean moreResults = MI_TRUE;
4193                  MI_Result result;
4194                  const MI_Char *errorMessage;
4195                  const MI_Instance *completionDetails;
4196              
4197                  MI_Session_Subscribe(session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), NULL, NULL, &operation);
4198                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
4199              
4200                  MI_Operation_GetIndication(&operation, &resultInstance, &bookmark, &machineID, &moreResults, &result, &errorMessage, &completionDetails);
4201 krisbash 1.1     NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should fail with not supported"));
4202                  MI_Operation_Close(&operation);
4203              }
4204              NitsEndTest
4205              
4206              NitsTest2(MI_Session_Subscribe_Async_AutoAck, 
4207                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
4208                        SetupDefaultSession, SetupDefaultSessionDefaults)
4209              {
4210                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
4211                  ResetRuntimeTestData(testData);
4212                  MI_Session *session = &testData->session;
4213                  MI_Operation operation = MI_OPERATION_NULL;
4214                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
4215                  
4216                  g_maximumInstanceCount = 10;
4217                  callbacks.callbackContext = testData;
4218                  callbacks.indicationResult = GetIndicationResult;
4219              
4220                  MI_Session_Subscribe(session, 0, NULL, PAL_T("namespace"), PAL_T("dialect"), PAL_T("filter"), NULL, &callbacks, &operation);
4221                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
4222 krisbash 1.1 
4223                  WaitForOperationToComplete(testData);
4224              
4225                  NitsCompare((MI_Uint32)testData->indicationCount, (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
4226              }
4227              NitsEndTest
4228              
4229              #if 0
4230              extern "C" void ValidateCondition(MI_CallbackMode writeErrorMode, MI_CallbackMode promptUserMode,
4231                                        MI_OperationCallback_ResponseType writeErrorResponse, MI_OperationCallback_ResponseType promptUserResponse)
4232              {
4233                  NitsAssert(g_PSSemanticsProgressObject.WriteErrorCalled== 2, PAL_T(" WriteError not called"));    
4234                  if( writeErrorMode == MI_CALLBACKMODE_INQUIRE )
4235                  {
4236                      if(writeErrorResponse == MI_OperationCallback_ResponseType_YesToAll)
4237                      {
4238                          NitsCompare(g_PSSemanticsProgressObject.writeErrorCallback, 1, PAL_T(" writeErrorCallback is not 1"));   
4239                      }
4240                      else
4241                      {
4242                          NitsAssert(g_PSSemanticsProgressObject.writeErrorCallback == 2, PAL_T(" writeErrorCallback is not 2"));               
4243 krisbash 1.1         }
4244                  }
4245                  else
4246                  {
4247                      NitsAssert(g_PSSemanticsProgressObject.writeErrorCallback == 0, PAL_T(" writeErrorCallback is not 0"));
4248                  }
4249              
4250                  if( promptUserMode == MI_CALLBACKMODE_INQUIRE)
4251                  {
4252                      NitsAssert(g_PSSemanticsProgressObject.PromptUserCalled== 2, PAL_T(" PromptUser not called twice"));
4253                  }
4254                  else if( promptUserMode == MI_CALLBACKMODE_REPORT)
4255                  {
4256                      NitsAssert(g_PSSemanticsProgressObject.PromptUserCalled== 2, PAL_T(" PromptUser not called twice"));
4257                   
4258                  }
4259                  else
4260                  {
4261                      NitsAssert(g_PSSemanticsProgressObject.PromptUserCalled== 1, PAL_T(" PromptUser not called once"));
4262                  }
4263              }
4264 krisbash 1.1 extern "C" void Helper_MI_Session_Invoke_Async_PSSemantics_Part2(
4265                                                              MI_OperationCallback_ResponseType writeErrorResponse = MI_OperationCallback_ResponseType_Yes,
4266                                                              MI_OperationCallback_ResponseType promptUserResponse = MI_OperationCallback_ResponseType_Yes,
4267                                                              MI_CallbackMode writeErrorMode = MI_CALLBACKMODE_REPORT, 
4268                                                              MI_CallbackMode promptUserMode = MI_CALLBACKMODE_INQUIRE)
4269              {
4270                  MI_Application application = MI_APPLICATION_NULL;
4271                  MI_Session session = MI_SESSION_NULL;
4272                  MI_Operation operation = MI_OPERATION_NULL;
4273                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
4274                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
4275                  g_WriteErrorResponseType = writeErrorResponse;
4276                  g_PromptUserResponseType = promptUserResponse;
4277              
4278                  memset(&g_PSSemanticsProgressObject, 0 , sizeof(PSSemanticsProgressResult));    
4279                  
4280                  callbacks.instanceResult = GetInstanceResult;
4281                  callbacks.promptUser = MI_Session_GetInstance_Async_PS_Semantics_PromptUser;
4282                  callbacks.writeError = MI_Session_GetInstance_Async_PS_Semantics_WriteError;
4283                  callbacks.writeMessage = MI_Session_GetInstance_Async_PS_Semantics_WriteMessage;
4284                  callbacks.writeProgress = MI_Session_GetInstance_Async_PS_Semantics_WriteProgress;
4285 krisbash 1.1 
4286                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
4287                      NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
4288                  {
4289                      if (NitsCompare(MI_Application_NewOperationOptions(&application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
4290                      {
4291                          NitsAssert( MI_OperationOptions_SetWriteErrorMode(&options, writeErrorMode) == MI_RESULT_OK, PAL_T("Unable to ser Write Error mode"));
4292                          NitsAssert( MI_OperationOptions_SetPromptUserMode(&options, promptUserMode) == MI_RESULT_OK, PAL_T("Unable to ser Prompt User mode"));    
4293                          if (NitsCompare(MI_Application_NewSession(&application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
4294                              NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
4295                          {
4296                              MI_Session_Invoke(&session, 0, &options, NULL, PAL_T("testClass"), PAL_T("TestMethod"), NULL, NULL, &callbacks, &operation);
4297                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
4298              
4299                              MI_Session_Close(&session, NULL, NULL);
4300                              //Validate the condition
4301                              ValidateCondition(writeErrorMode, promptUserMode, writeErrorResponse, promptUserResponse);
4302                          }
4303                          MI_OperationOptions_Delete(&options);
4304                      }
4305              
4306 krisbash 1.1         MI_Application_Close(&application);
4307                  }
4308              }
4309              
4310              NitsTest(MI_Session_Invoke_Async_PSSemantics_Part2)
4311              {
4312                  NitsTrace(PAL_T("Executing operation 1"));
4313                  Helper_MI_Session_Invoke_Async_PSSemantics_Part2();
4314                  NitsTrace(PAL_T("Executing operation 2"));    
4315                  Helper_MI_Session_Invoke_Async_PSSemantics_Part2(MI_OperationCallback_ResponseType_YesToAll, MI_OperationCallback_ResponseType_YesToAll);
4316                  NitsTrace(PAL_T("Executing operation 3"));    
4317                  Helper_MI_Session_Invoke_Async_PSSemantics_Part2(MI_OperationCallback_ResponseType_YesToAll, MI_OperationCallback_ResponseType_YesToAll, MI_CALLBACKMODE_INQUIRE,
4318                              MI_CALLBACKMODE_REPORT);        
4319                  NitsTrace(PAL_T("Executing operation 4"));    
4320                  Helper_MI_Session_Invoke_Async_PSSemantics_Part2(MI_OperationCallback_ResponseType_YesToAll, MI_OperationCallback_ResponseType_YesToAll, MI_CALLBACKMODE_REPORT,
4321                              MI_CALLBACKMODE_REPORT);    
4322                  NitsTrace(PAL_T("Executing operation 5"));    
4323                  Helper_MI_Session_Invoke_Async_PSSemantics_Part2(MI_OperationCallback_ResponseType_YesToAll, MI_OperationCallback_ResponseType_YesToAll, MI_CALLBACKMODE_REPORT,
4324                              MI_CALLBACKMODE_IGNORE);     
4325              }
4326              NitsEndTest
4327 krisbash 1.1 #endif
4328              /*==========================================================================================*/
4329              /*===================================== TestConnection =====================================*/
4330              /*==========================================================================================*/
4331              
4332              NitsTest2(MI_Session_TestConnection_Sync, 
4333                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
4334                        SetupDefaultSession, SetupDefaultSessionDefaults)
4335              {
4336                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
4337                  ResetRuntimeTestData(testData);
4338                  MI_Session *session = &testData->session;
4339                  MI_Operation operation = MI_OPERATION_NULL;
4340              
4341                  MI_Boolean moreResults;
4342                  MI_Result result;
4343                  const MI_Char *errorMessage;
4344                  const MI_Instance *completionDetails;
4345                  const MI_Instance *resultInstance;
4346              
4347                  MI_Session_TestConnection(session, 0, NULL, &operation);
4348 krisbash 1.1     NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
4349              
4350                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
4351                  NitsCompare(result, MI_RESULT_OK, PAL_T("Operation should succeed"));
4352                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
4353              
4354                  MI_Operation_Close(&operation);
4355              }
4356              NitsEndTest
4357              
4358              NitsTest2(MI_Session_TestConnection_Async_AutoAck, 
4359                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
4360                        SetupDefaultSession, SetupDefaultSessionDefaults)
4361              {
4362                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
4363                  ResetRuntimeTestData(testData);
4364                  MI_Session *session = &testData->session;
4365                  MI_Operation operation = MI_OPERATION_NULL;
4366                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
4367                  
4368                  g_maximumInstanceCount = 0;
4369 krisbash 1.1     callbacks.callbackContext = testData;
4370                  callbacks.instanceResult = GetInstanceResult;
4371              
4372                  MI_Session_TestConnection(session, 0, &callbacks, &operation);
4373                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
4374              
4375                  WaitForOperationToComplete(testData);
4376              
4377                  NitsCompare((MI_Uint32)testData->instanceCount, (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
4378              }
4379              NitsEndTest
4380              
4381              NitsTest2(MI_Session_TestConnection_Async_ManualAck, 
4382                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1,
4383                        SetupDefaultSession, SetupDefaultSessionDefaults)
4384              {
4385                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
4386                  ResetRuntimeTestData(testData);
4387                  MI_Session *session = &testData->session;
4388                  MI_Operation operation = MI_OPERATION_NULL;
4389                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
4390 krisbash 1.1     
4391                  g_maximumInstanceCount = 0;
4392                  callbacks.callbackContext = testData;
4393                  callbacks.instanceResult = GetInstanceResult;
4394              
4395                  MI_Session_TestConnection(session, MI_OPERATIONFLAGS_MANUAL_ACK_RESULTS, &callbacks, &operation);
4396                  NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
4397              
4398                  WaitForOperationToComplete(testData);
4399              
4400                  NitsCompare((MI_Uint32)testData->instanceCount, (MI_Uint32)g_maximumInstanceCount, PAL_T("Number of results callbacks received"));
4401              }
4402              NitsEndTest
4403              
4404              #if 0
4405              
4406              NitsTest(MI_Session_TestConnection_Sync_InvalidParameters)
4407              {
4408                  MI_Application application = MI_APPLICATION_NULL;
4409                  MI_Session session = MI_SESSION_NULL;
4410                  MI_Operation operation = MI_OPERATION_NULL;
4411 krisbash 1.1     const MI_Instance *extendedInfo;
4412                  MI_Boolean moreResults;
4413                  MI_Result resultCode;
4414                  MI_Result returnValue;
4415                  const MI_Char *errorMessage;
4416                  MI_OperationCallbacks callbacks = MI_OPERATIONCALLBACKS_NULL;
4417                  callbacks.instanceResult = GetInstanceResult_Fail;
4418                  const MI_Instance *resultInstance = NULL;
4419              
4420                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
4421                      NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
4422                  {
4423                      if (NitsCompare(MI_Application_NewSession(&application, PAL_T("Test1"), NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
4424                          NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
4425                      {
4426                          session.ft->TestConnection(&session, 0, NULL, &operation);
4427                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &resultCode, &errorMessage, &extendedInfo);
4428                          NitsCompare(resultCode, MI_RESULT_OK, PAL_T("GetInstance should succeed"));
4429              
4430                          returnValue = operation.ft->GetInstance(NULL, &resultInstance, NULL, &resultCode, NULL, NULL);
4431                          NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetClass should fail due to NULL operation"));
4432 krisbash 1.1 
4433                          returnValue = operation.ft->GetInstance(&operation, NULL, NULL, &resultCode, NULL, NULL);
4434                          NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("Operation_GetClass should fail due to NULL instance"));
4435              
4436                          MI_Operation_Close(&operation);
4437              
4438                          session.ft->TestConnection(NULL, 0, NULL, &operation);
4439                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &resultCode, &errorMessage, &extendedInfo);
4440                          NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetClass should faul due to NULL session"));
4441                          MI_Operation_Close(&operation);
4442              
4443                          session.ft->TestConnection(&session, 0, NULL, &operation);
4444                          MI_Operation_GetInstance(&operation, NULL, &moreResults, &resultCode, &errorMessage, &extendedInfo);
4445                          NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetInstance should fail due to NULL instance key"));
4446                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &resultCode, &errorMessage, &extendedInfo);
4447                          NitsCompare(resultCode, MI_RESULT_OK, PAL_T("GetInstances hould succeed"));
4448                          MI_Operation_Close(&operation);
4449              
4450                          session.ft->TestConnection(&session, 0, &callbacks, NULL);
4451                          returnValue = MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &resultCode, &errorMessage, &extendedInfo);
4452                          NitsCompare(returnValue, MI_RESULT_INVALID_PARAMETER, PAL_T("GetClass should fail due to closed operation"));
4453 krisbash 1.1             MI_Operation_Close(&operation);
4454              
4455                          session.ft->TestConnection(&session, 0, NULL, NULL);
4456                          /* Validate it doesn't crash only as nowhere for failure to go */
4457                          MI_Session_Close(&session, NULL, NULL);
4458              
4459                          session.ft->TestConnection(&session, 0, NULL, &operation);
4460                          MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &resultCode, &errorMessage, &extendedInfo);
4461                          NitsCompare(resultCode, MI_RESULT_INVALID_PARAMETER, PAL_T("GetClass should fail because session is already closed"));
4462                          MI_Operation_Close(&operation);
4463              
4464                      }
4465                      MI_Application_Close(&application);
4466                  }
4467              }
4468              NitsEndTest
4469              #endif
4470              
4471              NitsTest2(MI_Session_TestConnection_TransportNotSupported, 
4472                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test2,
4473                        SetupDefaultSession, SetupDefaultSessionDefaults)
4474 krisbash 1.1 {
4475                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
4476                  ResetRuntimeTestData(testData);
4477                  MI_Session *session = &testData->session;
4478                  MI_Operation operation = MI_OPERATION_NULL;
4479              
4480                  const MI_Instance *resultInstance;
4481                  MI_Boolean moreResults;
4482                  MI_Result result;
4483                  const MI_Char *errorMessage;
4484                  const MI_Instance *completionDetails;
4485              
4486                  MI_Session_TestConnection(session, 0, NULL, &operation);
4487              
4488                  MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
4489                  NitsCompare(result, MI_RESULT_NOT_SUPPORTED, PAL_T("Operation should succeed"));
4490                  NitsAssert(moreResults==MI_FALSE, PAL_T("Should be no more results"));
4491              
4492                  MI_Operation_Close(&operation);
4493              }
4494              NitsEndTest
4495 krisbash 1.1 
4496              NitsTest(TestMapErrorToMiErrorCategory)
4497              {
4498                  MI_ErrorCategory errorCategory;
4499                  
4500              #if defined(_MSC_VER)
4501                  errorCategory = MI_Utilities_MapErrorToMiErrorCategory(MI_RESULT_TYPE_WIN32, ERROR_NOT_SUPPORTED);
4502                  NitsAssert(errorCategory==MI_ERRORCATEGORY_INVALID_OPERATION, PAL_T("ErrorCategory is not MI_ERRORCATEGORY_INVALID_OPERATION"));
4503              #endif
4504              
4505                  errorCategory = MI_Utilities_MapErrorToMiErrorCategory(MI_RESULT_TYPE_MI, MI_RESULT_ACCESS_DENIED);
4506                  NitsAssert(errorCategory==MI_ERRORCATEGORY_ACCESS_DENIED, PAL_T("ErrorCategory is not MI_ERRORCATEGORY_ACCESS_DENIED"));
4507              }
4508              NitsEndTest
4509              
4510              NitsTest(TestCimErrorFromErrorCode)
4511              {
4512                  MI_Value value;
4513              #if defined(_MSC_VER)
4514                  MI_Instance *pInst = NULL;
4515                  LANGID idLang = GetSystemDefaultLangID();
4516 krisbash 1.1 
4517                  if(NitsCompare(MI_Utilities_CimErrorFromErrorCode(ERROR_FILE_NOT_FOUND, MI_RESULT_TYPE_WIN32, NULL, &pInst), MI_RESULT_OK,PAL_T("Got an error")))
4518                  {
4519                      if(NitsCompare( MI_Instance_GetElement( pInst, PAL_T("MessageID"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("MessageID is not there")) )
4520                      {
4521                          NitsTrace((MI_String)value.string);
4522                          NitsCompareString((MI_String)value.string, PAL_T("Windows System Error 2"), PAL_T("MessageID != Windows System Error 2"));
4523                      }
4524                      if(NitsCompare( MI_Instance_GetElement( pInst, PAL_T("Message"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("Message is not there")) )
4525                      {
4526                          NitsTrace((MI_String)value.string);        
4527                          //Process only for en-us
4528                          if( idLang == 0x0409) 
4529                          {
4530                              NitsCompareString((MI_String)value.string, PAL_T("The system cannot find the file specified. "), PAL_T("Message != The system cannot find the file specified."));
4531                          }
4532                      }   
4533                      if(NitsCompare( MI_Instance_GetElement( pInst, PAL_T("OMI_ErrorMessage"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("OMI_ErrorMessage is not there")) )
4534                      {
4535                          NitsTrace((MI_String)value.string);        
4536                          //Process only for en-us
4537 krisbash 1.1             if( idLang == 0x0409) 
4538                          {
4539                              NitsCompareString((MI_String)value.string, PAL_T("The system cannot find the file specified. "), PAL_T("OMI_ErrorMessage != The system cannot find the file specified."));
4540                          }
4541                      }          
4542                      if(NitsCompare( MI_Instance_GetElement( pInst, PAL_T("OMI_Category"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("Error_Category is not there")) )
4543                      {
4544                          NitsCompare(value.uint16, MI_ERRORCATEGORY_OBJECT_NOT_FOUND,PAL_T("OMI_Category != MI_ERRORCATEGORY_OBJECT_NOT_FOUND"));
4545                      } 
4546                      if(NitsCompare( MI_Instance_GetElement( pInst, PAL_T("OMI_Type"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("OMI_Type is not there")) )
4547                      {
4548                          NitsTrace((MI_String)value.string);
4549                          NitsCompareString((MI_String)value.string, PAL_T("Win32"), PAL_T("error_Type != Win32"));
4550                      }        
4551                      if(NitsCompare( MI_Instance_GetElement( pInst, PAL_T("OMI_Code"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("OMI_Code is not there")) )
4552                      {
4553                          NitsCompare(value.uint32, ERROR_FILE_NOT_FOUND, PAL_T("OMI_Code != ERROR_FILE_NOT_FOUND"));
4554                      }    
4555                      if(NitsCompare( MI_Instance_GetElement( pInst, PAL_T("CIMStatusCode"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("ErrorType is not there")) )
4556                      {
4557                          NitsCompare(value.uint32, MI_RESULT_NOT_FOUND,PAL_T("CIMStatusCode != MI_RESULT_FAILED"));
4558 krisbash 1.1         }     
4559                  }
4560                  MI_Instance_Delete(pInst);
4561              #endif
4562              
4563                  MI_Instance* pInst3 = NULL;
4564                  if(NitsCompare(MI_Utilities_CimErrorFromErrorCode(MI_RESULT_INVALID_CLASS, MI_RESULT_TYPE_MI, PAL_T("Testing MI"), &pInst3), MI_RESULT_OK,PAL_T("Got an error")))
4565                  {
4566                      if(NitsCompare( MI_Instance_GetElement( pInst3, PAL_T("MessageID"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("MessageID is not there")) )
4567                      {
4568                          NitsTrace((MI_String)value.string);  
4569                          NitsCompareString((MI_String)value.string, PAL_T("OMI:MI_Result:5"), PAL_T("MessageID != MI RESULT 5"));
4570                      }
4571                      if(NitsCompare( MI_Instance_GetElement( pInst3, PAL_T("Message"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("Expect Message is there")) )
4572                      {
4573                          NitsTrace((MI_String)value.string);
4574                          NitsCompareString((MI_String)value.string, PAL_T("Testing MI"), PAL_T("Message != Testing MI"));
4575                      }
4576                      if(NitsAssert( MI_Instance_GetElement( pInst3, PAL_T("OMI_ErrorMessage"), &value, NULL, NULL, NULL) == MI_RESULT_OK, PAL_T("Expect Message is there")) )
4577                      {
4578                          NitsTrace((MI_String)value.string);        
4579 krisbash 1.1             //Process only for en-us
4580              #if defined(_MSC_VER)
4581                          if( idLang == 0x0409) 
4582              #endif
4583                          {
4584                              NitsCompareString((MI_String)value.string, PAL_T("The specified class does not exist."), PAL_T("OMI_ErrorMessage != The specified Class does not exist."));
4585                          }
4586              
4587                      }            
4588                      if(NitsCompare( MI_Instance_GetElement( pInst3, PAL_T("OMI_Category"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("OMI_Category is not there")) )
4589                      {
4590                          NitsCompare(value.uint16, MI_ERRORCATEGORY_METADATA_ERROR,PAL_T("OMI_Category != MI_ERRORCATEGORY_METADATA_ERROR"));
4591                      } 
4592                      if(NitsCompare( MI_Instance_GetElement( pInst3, PAL_T("OMI_Type"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("OMI_Type is not there")) )
4593                      {
4594                          NitsTrace((MI_String)value.string);
4595                          NitsCompareString((MI_String)value.string, PAL_T("MI"), PAL_T("OMI_Type != MI"));
4596                      }          
4597                      if(NitsCompare( MI_Instance_GetElement( pInst3, PAL_T("OMI_Code"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("OMI_Code is not there")) )
4598                      {
4599                          NitsCompare(value.uint32, MI_RESULT_INVALID_CLASS,PAL_T("OMI_Code != MI_RESULT_INVALID_CLASS"));
4600 krisbash 1.1         }    
4601                      if(NitsCompare( MI_Instance_GetElement( pInst3, PAL_T("CIMStatusCode"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("CIMStatusCode is not there")) )
4602                      {
4603                          NitsCompare(value.uint32, MI_RESULT_INVALID_CLASS,PAL_T("CIMStatusCode != MI_RESULT_INVALID_CLASS"));
4604                      }    
4605                  }
4606                  MI_Instance_Delete(pInst3);
4607              
4608                  MI_Instance* pInst4 = NULL;
4609                  if(NitsCompare(MI_Utilities_CimErrorFromErrorCode(E2BIG, MI_RESULT_TYPE_ERRNO, PAL_T("Testing MI"), &pInst4), MI_RESULT_OK,PAL_T("Got an error")))
4610                  {
4611                      if(NitsCompare( MI_Instance_GetElement( pInst4, PAL_T("MessageID"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("MessageID is not there")) )
4612                      {
4613                          NitsTrace((MI_String)value.string);  
4614                          NitsCompareString((MI_String)value.string, PAL_T("CRT errno 7"), PAL_T("MessageID != MI RESULT 7"));
4615                      }
4616                      if(NitsCompare( MI_Instance_GetElement( pInst4, PAL_T("Message"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("Expect Message is there")) )
4617                      {
4618                          NitsTrace((MI_String)value.string);
4619                          NitsCompareString((MI_String)value.string, PAL_T("Testing MI"), PAL_T("Message != Testing MI"));
4620                      }
4621 krisbash 1.1         if(NitsAssert( MI_Instance_GetElement( pInst4, PAL_T("OMI_ErrorMessage"), &value, NULL, NULL, NULL) == MI_RESULT_OK, PAL_T("Expect Message is there")) )
4622                      {
4623                          NitsTrace((MI_String)value.string);        
4624                          //Process only for en-us
4625              #if defined(_MSC_VER)
4626                          if( idLang == 0x0409) 
4627              #endif
4628                          {
4629              #if !defined(CONFIG_HAVE_STRERROR_R)
4630                              NitsCompareString((MI_String)value.string, PAL_T("Argument list too long"), PAL_T("OMI_ErrorMessage != Argument list too long."));
4631              #endif
4632                          }
4633              
4634                      }            
4635                      if(NitsCompare( MI_Instance_GetElement( pInst4, PAL_T("OMI_Category"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("OMI_Category is not there")) )
4636                      {
4637                          NitsCompare(value.uint16, MI_ERRORCATEGORY_NOT_SPECIFIED,PAL_T("OMI_Category != MI_ERRORCATEGORY_METADATA_ERROR"));
4638                      } 
4639                      if(NitsCompare( MI_Instance_GetElement( pInst4, PAL_T("OMI_Type"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("OMI_Type is not there")) )
4640                      {
4641                          NitsTrace((MI_String)value.string);
4642 krisbash 1.1             NitsCompareString((MI_String)value.string, PAL_T("ERRNO"), PAL_T("OMI_Type != ERRNO"));
4643                      }          
4644                      if(NitsCompare( MI_Instance_GetElement( pInst4, PAL_T("OMI_Code"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("OMI_Code is not there")) )
4645                      {
4646                          NitsCompare(value.uint32, E2BIG,PAL_T("OMI_Code != E2BIG"));
4647                      }    
4648                      if(NitsCompare( MI_Instance_GetElement( pInst4, PAL_T("CIMStatusCode"), &value, NULL, NULL, NULL) , MI_RESULT_OK, PAL_T("CIMStatusCode is not there")) )
4649                      {
4650                          NitsCompare(value.uint32, MI_RESULT_FAILED,PAL_T("CIMStatusCode != MI_RESULT_FAILED"));
4651                      }    
4652                      MI_Instance_Delete(pInst4);
4653                  }
4654              }
4655              NitsEndTest
4656              
4657              #if 0
4658              NitsTest(TestPassingParametersToMethodThatNeedsNoParameters)
4659              {
4660                  MI_Application application = MI_APPLICATION_NULL;
4661                  MI_Session session = MI_SESSION_NULL;
4662                  MI_Operation operation = MI_OPERATION_NULL;
4663 krisbash 1.1 
4664                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
4665                      NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
4666                  {
4667                      MI_Instance *instance = NULL;
4668                      MI_Instance *parameter = NULL;
4669                      MI_Value value;
4670                      value.string = PAL_T("0");
4671              
4672                      if (NitsCompare(MI_Application_NewInstance(&application, PAL_T("Win32_Process"), NULL, &instance), MI_RESULT_OK, PAL_T("instance")) &&
4673                          NitsAssert(instance != NULL, PAL_T("failed to create instance")) &&
4674                          NitsCompare(MI_Instance_AddElement(instance, PAL_T("Handle"), &value, MI_STRING, MI_FLAG_KEY), MI_RESULT_OK, PAL_T("Add instance handle key")) && 
4675                          NitsCompare(MI_Application_NewParameterSet(&application, NULL, &parameter), MI_RESULT_OK, PAL_T("parameter")) &&
4676                          NitsAssert(parameter != NULL, PAL_T("failed to create parameter")))
4677                      {
4678                          if (NitsCompare(MI_Application_NewSession(&application, NULL, NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
4679                              NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
4680                          {
4681                              MI_Session_Invoke(&session, 0, NULL, PAL_T("root\\cimv2"), PAL_T("Win32_Process"), PAL_T("GetOwner"), instance, parameter, NULL, &operation);
4682                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
4683              
4684 krisbash 1.1                 const MI_Instance *resultInstance;
4685                              MI_Boolean moreResults;
4686                              MI_Result result;
4687                              const MI_Char *errorMessage;
4688                              const MI_Instance *completionDetails;
4689              
4690                              MI_Operation_GetInstance(&operation, &resultInstance, &moreResults, &result, &errorMessage, &completionDetails);
4691                              NitsCompare(result, MI_RESULT_INVALID_PARAMETER, PAL_T("Should fail with invalid parameter"));
4692              
4693                              MI_Operation_Close(&operation);
4694              
4695                              MI_Session_Close(&session, NULL, NULL);
4696                          }
4697                          MI_Instance_Delete(instance);
4698                          MI_Instance_Delete(parameter);
4699                      }
4700              
4701                      MI_Application_Close(&application);
4702                  }
4703              }
4704              NitsEndTest
4705 krisbash 1.1 #endif
4706              
4707              void MI_OperationOptions_ReadOperations_Internal(
4708                  MI_OperationOptions& options,
4709                  bool cloned = false)
4710              {
4711                  MI_OperationOptions *nullOptions = NULL;
4712                  const MI_Char *nullString = NULL;
4713                  const MI_Char **nullStringPtr = NULL;
4714                  MI_Uint32 *nullNumberPtr = 0;
4715                  MI_Uint32 *nullIndex = 0;
4716                  MI_Uint32 index = 0;
4717                  MI_Value *nullMIValuePtr = NULL;
4718                  MI_Type *nullMITypePtr = 0;
4719                  MI_Uint32 flag;
4720              
4721                  // Read string
4722                  {
4723                      const MI_Char * stringValue = NULL;
4724                      const MI_Char * optionName = PAL_T("option1");
4725                      NitsCompare(options.ft->GetString(&options, optionName, &stringValue, nullIndex, &flag), MI_RESULT_OK, PAL_T("GetString should work"));
4726 krisbash 1.1         NitsCompare(options.ft->GetString(&options, optionName, &stringValue, &index, 0), MI_RESULT_OK, PAL_T("GetString should work"));
4727                      NitsCompareString(stringValue, PAL_T("value1"), PAL_T("GetString should work"));
4728                      if (!cloned) NitsCompare(index, 1, PAL_T("GetString should work"));
4729              
4730                      NitsCompare(options.ft->GetString(&options, PAL_T("option2"), &stringValue, nullIndex, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("GetString should return MI_RESULT_TYPE_MISMATCH"));
4731                      NitsCompare(options.ft->GetString(&options, PAL_T("optionbla"), &stringValue, nullIndex, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetString should return MI_RESULT_NO_SUCH_PROPERTY"));
4732                      NitsCompare(options.ft->GetString(nullOptions, optionName, &stringValue, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetString should fail"));
4733                      NitsCompare(options.ft->GetString(&options, nullString, &stringValue, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetString should fail"));
4734                      NitsCompare(options.ft->GetString(&options, optionName, nullStringPtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetString should fail"));
4735                  }
4736                  // Read number
4737                  {
4738                      MI_Uint32 int32Value = 0;
4739                      const MI_Char * optionName = PAL_T("option2");
4740                      NitsCompare(options.ft->GetNumber(&options, optionName, &int32Value, nullIndex, 0), MI_RESULT_OK, PAL_T("GetNumber should work"));
4741                      NitsCompare(options.ft->GetNumber(&options, optionName, &int32Value, &index, 0), MI_RESULT_OK, PAL_T("GetNumber should work"));
4742                      NitsCompare(int32Value, 33, PAL_T("GetNumber should work"));
4743                      if (!cloned) NitsCompare(index, 2, PAL_T("GetNumber should work"));
4744              
4745                      NitsCompare(options.ft->GetNumber(&options, PAL_T("option1"), &int32Value, nullIndex, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("GetNumber return MI_RESULT_TYPE_MISMATCH"));
4746                      NitsCompare(options.ft->GetNumber(&options, PAL_T("optionBla"), &int32Value, nullIndex, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetNumber return MI_RESULT_NOT_FOUND"));
4747 krisbash 1.1         NitsCompare(options.ft->GetNumber(nullOptions, optionName, &int32Value, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetNumber should fail"));
4748                      NitsCompare(options.ft->GetNumber(&options, nullString, &int32Value, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetNumber should fail"));
4749                      NitsCompare(options.ft->GetNumber(&options, optionName, nullNumberPtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetNumber should fail"));
4750                  }
4751              
4752                  // GetOptionCount
4753                  {
4754                      MI_Uint32 optionCount = 0;
4755                      NitsCompare(options.ft->GetOptionCount(nullOptions, &optionCount), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionCount should fail"));
4756                      NitsCompare(options.ft->GetOptionCount(&options, nullNumberPtr), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionCount should fail"));
4757              
4758                      NitsCompare(options.ft->GetOptionCount(&options, &optionCount), MI_RESULT_OK, PAL_T("GetOptionCount should success"));
4759                      MI_Uint32 expectedCount = 5;
4760                      NitsCompare(optionCount, expectedCount, PAL_T("GetOptionCount should success"));
4761                      if (optionCount == expectedCount)
4762                      {
4763                          for(MI_Uint32 i = 0; i < optionCount; i++)
4764                          {
4765                              MI_Value value = {0};
4766                              MI_Type type = MI_BOOLEAN;
4767                              const MI_Char * optionName = NULL;
4768 krisbash 1.1                 NitsCompare(options.ft->GetOptionAt(&options, i, &optionName, &value, &type, 0), MI_RESULT_OK, PAL_T("GetOptionAt should success"));
4769                          }
4770                      }
4771                  }
4772              
4773                  // GetOptionAt
4774                  if (!cloned)
4775                  {
4776                      MI_Value value = {0};
4777                      MI_Type type = MI_BOOLEAN;
4778                      const MI_Char * optionName = NULL;
4779                      NitsCompare(options.ft->GetOptionAt(nullOptions, 0, &optionName, &value, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
4780                      NitsCompare(options.ft->GetOptionAt(&options, 0, &optionName, &value, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
4781                      NitsCompare(options.ft->GetOptionAt(&options, 0, nullStringPtr, nullMIValuePtr, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
4782                      NitsCompare(options.ft->GetOptionAt(&options, 0, &optionName, &value, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
4783              
4784                      NitsCompare(options.ft->GetOptionAt(&options, 0x100, &optionName, &value, &type, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should return MI_RESULT_INVALID_PARAMETER"));
4785              
4786                      NitsCompare(options.ft->GetOptionAt(&options, 1, &optionName, &value, &type, 0), MI_RESULT_OK, PAL_T("GetOptionAt should success"));
4787                      if (NitsCompare(type, MI_STRING, PAL_T("GetOptionAt should success")))
4788                      {
4789 krisbash 1.1             NitsCompareString(value.string, PAL_T("value1"), PAL_T("GetOptionAt should success"));
4790                      }
4791                  }
4792              
4793                  // GetOption
4794                  {
4795                      MI_Value value = {0};
4796                      MI_Type type = MI_BOOLEAN;
4797                      const MI_Char * optionName = PAL_T("option1");
4798                      NitsCompare(options.ft->GetOption(nullOptions, optionName, &value, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
4799                      NitsCompare(options.ft->GetOption(&options, nullString, &value, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
4800                      NitsCompare(options.ft->GetOption(&options, optionName, nullMIValuePtr, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
4801                      NitsCompare(options.ft->GetOption(&options, optionName, &value, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
4802                      NitsCompare(options.ft->GetOption(&options, PAL_T("optionbla"), &value, &type, &index, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetOption should return MI_RESULT_NOT_FOUND"));
4803              
4804                      NitsCompare(options.ft->GetOption(&options, optionName, &value, &type, &index, 0), MI_RESULT_OK, PAL_T("GetOption should success"));
4805                      if (NitsCompare(type, MI_STRING, PAL_T("GetOption should success")))
4806                      {
4807                          NitsCompareString(value.string, PAL_T("value1"), PAL_T("GetOption should success"));
4808                      }
4809                      if (!cloned) NitsCompare(index, 1, PAL_T("GetOption should success"));
4810 krisbash 1.1     }
4811              
4812                  // GetEnabledChannels
4813                  {
4814                      const MI_Char * optionName = PAL_T("option1");
4815                      MI_Uint32 channels[3] = {0};
4816                      MI_Uint32 channelCount = 0;
4817                      NitsCompare(options.ft->GetEnabledChannels(nullOptions, optionName, channels, 1, nullNumberPtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetEnabledChannels should fail"));
4818                      NitsCompare(options.ft->GetEnabledChannels(&options, nullString, channels, 1, nullNumberPtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetEnabledChannels should fail"));
4819                      NitsCompare(options.ft->GetEnabledChannels(&options, optionName, channels, 1, nullNumberPtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetEnabledChannels should fail"));
4820              
4821                      NitsCompare(options.ft->GetEnabledChannels(&options, optionName, channels, 1, &channelCount, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("GetEnabledChannels should return MI_RESULT_NOT_FOUND"));
4822              
4823                      // too small buffer
4824                      NitsCompare(MI_OperationOptions_GetEnabledChannels(&options, channels, 1, &channelCount, 0), MI_RESULT_FAILED, PAL_T("GetEnabledChannels should return MI_RESULT_FAILED"));
4825              
4826                      MI_Uint32 expectedCount = 3;
4827                      NitsCompare(MI_OperationOptions_GetEnabledChannels(&options, channels, expectedCount, &channelCount, 0), MI_RESULT_OK, PAL_T("GetEnabledChannels should success"));
4828                      NitsCompare(MI_OperationOptions_GetEnabledChannels(&options, channels, expectedCount, &channelCount, &flag), MI_RESULT_OK, PAL_T("GetEnabledChannels should success"));
4829              
4830                      NitsCompare(channelCount, expectedCount, PAL_T("GetEnabledChannels should success"));
4831 krisbash 1.1 
4832                      NitsCompare(channels[0], 0, PAL_T("GetEnabledChannels should success"));
4833                      NitsCompare(channels[1], 2, PAL_T("GetEnabledChannels should success"));
4834                      NitsCompare(channels[2], 3, PAL_T("GetEnabledChannels should success"));
4835                  }
4836              }
4837              
4838              NitsTest1(MI_OperationOptions_ReadOperations, 
4839                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
4840              {
4841                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
4842                  ResetRuntimeTestData(testData);
4843                  MI_Application *application = &testData->application;
4844              
4845                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
4846              
4847              #if defined (_MSC_VER)
4848              #pragma prefast(push)
4849              #pragma prefast(disable: 6309)
4850              #endif
4851                  NitsCompare(MI_Application_NewOperationOptions(NULL, MI_FALSE, &options), MI_RESULT_INVALID_PARAMETER, PAL_T("NewOperationOptions invalid parameter"));
4852 krisbash 1.1     NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, NULL), MI_RESULT_INVALID_PARAMETER, PAL_T("NewOperationOptions invalid parameter"));
4853              #if defined (_MSC_VER)
4854              #pragma prefast(pop)
4855              #endif
4856              
4857                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
4858                  {
4859                      if (NitsAssert(options.ft != NULL, PAL_T("Should have options function table")))
4860                      {
4861                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
4862                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 33, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
4863                          {
4864                              MI_Uint8 valueArray[2];
4865                              MI_Value value;
4866                              value.uint8 = 10;
4867                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint8"), MI_UINT8, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint8) should work"));
4868              
4869                              valueArray[0] = 10;
4870                              valueArray[1] = 20;
4871                              value.uint8a.data = valueArray;
4872                              value.uint8a.size = 2;
4873 krisbash 1.1                 NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint8a"), MI_UINT8A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint8a) should work"));
4874                          }
4875                          {
4876                              NitsCompare(MI_OperationOptions_EnableChannel(&options, 1), MI_RESULT_OK, PAL_T("MI_OperationOptions_EnableChannel should work"));
4877                              NitsCompare(MI_OperationOptions_EnableChannel(&options, 2), MI_RESULT_OK, PAL_T("MI_OperationOptions_EnableChannel should work"));
4878                              NitsCompare(MI_OperationOptions_EnableChannel(&options, 3), MI_RESULT_OK, PAL_T("MI_OperationOptions_EnableChannel should work"));
4879                              NitsCompare(MI_OperationOptions_DisableChannel(&options, 1), MI_RESULT_OK, PAL_T("MI_OperationOptions_DisableChannel should work"));
4880                          }
4881              
4882                          MI_OperationOptions_ReadOperations_Internal(options);
4883                      }
4884              #if defined (_MSC_VER)
4885              #pragma prefast(push)
4886              #pragma prefast(disable: 6011)
4887              #endif
4888                      options.ft->Delete(NULL);
4889              #if defined (_MSC_VER)
4890              #pragma prefast(pop)
4891              #endif
4892                      MI_OperationOptions_Delete(&options);
4893                  }
4894 krisbash 1.1 }
4895              NitsEndTest
4896              
4897              NitsTest1(MI_OperationOptions_CloneTest, 
4898                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
4899              {
4900                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
4901                  ResetRuntimeTestData(testData);
4902                  MI_Application *application = &testData->application;
4903              
4904                  MI_OperationOptions options = MI_OPERATIONOPTIONS_NULL;
4905              
4906              #if defined (_MSC_VER)
4907              #pragma prefast(push)
4908              #pragma prefast(disable: 6309)
4909              #endif
4910                  NitsCompare(MI_Application_NewOperationOptions(NULL, MI_FALSE, &options), MI_RESULT_INVALID_PARAMETER, PAL_T("NewOperationOptions invalid parameter"));
4911                  NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, NULL), MI_RESULT_INVALID_PARAMETER, PAL_T("NewOperationOptions invalid parameter"));
4912              #if defined (_MSC_VER)
4913              #pragma prefast(pop)
4914              #endif
4915 krisbash 1.1 
4916                  if (NitsCompare(MI_Application_NewOperationOptions(application, MI_FALSE, &options), MI_RESULT_OK, PAL_T("NewOperationOptions should succeed")))
4917                  {
4918                      if (NitsAssert(options.ft != NULL, PAL_T("Should have options function table")))
4919                      {
4920                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
4921                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 33, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
4922                          {
4923                              MI_Uint8 valueArray[2];
4924                              MI_Value value;
4925                              value.uint8 = 10;
4926                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint8"), MI_UINT8, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint8) should work"));
4927              
4928                              valueArray[0] = 10;
4929                              valueArray[1] = 20;
4930                              value.uint8a.data = valueArray;
4931                              value.uint8a.size = 2;
4932                              NitsCompare(options.ft->SetCustomOption(&options, PAL_T("uint8a"), MI_UINT8A, &value, MI_FALSE, 0), MI_RESULT_OK, PAL_T("SetCustomOption(uint8a) should work"));
4933                          }
4934                          {
4935                              NitsCompare(MI_OperationOptions_EnableChannel(&options, 1), MI_RESULT_OK, PAL_T("MI_OperationOptions_EnableChannel should work"));
4936 krisbash 1.1                 NitsCompare(MI_OperationOptions_EnableChannel(&options, 2), MI_RESULT_OK, PAL_T("MI_OperationOptions_EnableChannel should work"));
4937                              NitsCompare(MI_OperationOptions_EnableChannel(&options, 3), MI_RESULT_OK, PAL_T("MI_OperationOptions_EnableChannel should work"));
4938                              NitsCompare(MI_OperationOptions_DisableChannel(&options, 1), MI_RESULT_OK, PAL_T("MI_OperationOptions_DisableChannel should work"));
4939                          }
4940                          MI_OperationOptions clonedOptions = MI_OPERATIONOPTIONS_NULL;
4941                          if (NitsCompare(MI_OperationOptions_Clone(&options, &clonedOptions), MI_RESULT_OK, PAL_T("MI_OperationOptions_Clone returns OK")) &&
4942                          NitsAssert(clonedOptions.ft != NULL, PAL_T("MI_OperationOptions function table should not be NULL")))
4943                          {
4944                              NitsCompare((MI_Uint32)options.reserved1, (MI_Uint32)clonedOptions.reserved1, PAL_T("Cloned options should has same mustUnderstand value"));
4945                              MI_OperationOptions_ReadOperations_Internal(clonedOptions, true);
4946                              MI_OperationOptions_Delete(&clonedOptions);
4947                          }
4948                      }
4949              #if defined (_MSC_VER)
4950              #pragma prefast(push)
4951              #pragma prefast(disable: 6011)
4952              #endif
4953                      options.ft->Delete(NULL);
4954              #if defined (_MSC_VER)
4955              #pragma prefast(pop)
4956              #endif
4957 krisbash 1.1         MI_OperationOptions_Delete(&options);
4958                  }
4959              }
4960              NitsEndTest
4961              
4962              void MI_DestinationOptions_ReadOperations_Internal(
4963                  MI_DestinationOptions& options,
4964                  MI_UserCredentials& creds,
4965                  bool cloned = false)
4966              {
4967                  MI_DestinationOptions *nullOptions = NULL;
4968                  const MI_Char *nullString = NULL;
4969                  const MI_Char **nullStringPtr = NULL;
4970                  MI_Uint32 *nullNumberPtr = 0;
4971                  MI_Uint32 *nullIndex = 0;
4972                  MI_Uint32 index = 0;
4973                  MI_Value *nullMIValuePtr = NULL;
4974                  MI_Type *nullMITypePtr = 0;
4975                  MI_Uint32 flag;
4976              
4977                  // Read string
4978 krisbash 1.1     {
4979                      const MI_Char * stringValue = NULL;
4980                      const MI_Char * optionName = PAL_T("option1");
4981                      NitsCompare(options.ft->GetString(&options, optionName, &stringValue, nullIndex, &flag), MI_RESULT_OK, PAL_T("GetString should work"));
4982                      NitsCompare(options.ft->GetString(&options, optionName, &stringValue, &index, 0), MI_RESULT_OK, PAL_T("GetString should work"));
4983                      NitsCompareString(stringValue, PAL_T("value1"), PAL_T("GetString should work"));
4984              
4985              #if defined (_MSC_VER)
4986                      if (!cloned) NitsCompare(index, 2, PAL_T("GetString should work"));
4987              #else
4988                      if (!cloned) NitsCompare(index, 0, PAL_T("GetString should work"));
4989              #endif
4990              
4991                      NitsCompare(options.ft->GetString(&options, PAL_T("option2"), &stringValue, nullIndex, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("GetString should return MI_RESULT_TYPE_MISMATCH"));
4992                      NitsCompare(options.ft->GetString(&options, PAL_T("optionbla"), &stringValue, nullIndex, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetString should return MI_RESULT_NOT_FOUND"));
4993                      NitsCompare(options.ft->GetString(nullOptions, optionName, &stringValue, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetString should fail"));
4994                      NitsCompare(options.ft->GetString(&options, nullString, &stringValue, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetString should fail"));
4995                      NitsCompare(options.ft->GetString(&options, optionName, nullStringPtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetString should fail"));
4996                  }
4997              
4998                  // Read default Locale
4999 krisbash 1.1 #if defined(_MSC_VER)
5000                  {
5001                      ULONG numLangs = 0;
5002                      ULONG lenBuffer = MI_MAX_LOCALE_SIZE;
5003                      WCHAR buffer[MI_MAX_LOCALE_SIZE];
5004                      if (GetThreadPreferredUILanguages(0, &numLangs, buffer, &lenBuffer))
5005                      {
5006                          const MI_Char * strLocale = NULL;
5007                          MI_Result r = MI_DestinationOptions_GetUILocale(&options, &strLocale);
5008                          NitsCompare(r, MI_RESULT_OK, PAL_T("MI_DestinationOptions_GetUILocale should success"));
5009                          if (r == MI_RESULT_OK)
5010                          {
5011                              NitsCompareString(strLocale, buffer, PAL_T("MI_DestinationOptions_GetUILocale should success"));
5012                          }
5013                          r = MI_DestinationOptions_GetDataLocale(&options, &strLocale);
5014                          NitsCompare(r, MI_RESULT_OK, PAL_T("MI_DestinationOptions_GetDataLocale should success"));
5015                          if (r == MI_RESULT_OK)
5016                          {
5017                              NitsCompareString(strLocale, buffer, PAL_T("MI_DestinationOptions_GetDataLocale should success"));
5018                          }
5019                      }
5020 krisbash 1.1         else
5021                      {
5022                          NitsCompare(1, 0, PAL_T("GetThreadPreferredUILanguages failed"));
5023                      }
5024                  }
5025              #endif
5026              
5027                  // Read number
5028                  {
5029                      MI_Uint32 int32Value = 0;
5030                      const MI_Char * optionName = PAL_T("option2");
5031                      NitsCompare(options.ft->GetNumber(&options, optionName, &int32Value, nullIndex, 0), MI_RESULT_OK, PAL_T("GetNumber should work"));
5032                      NitsCompare(options.ft->GetNumber(&options, optionName, &int32Value, &index, &flag), MI_RESULT_OK, PAL_T("GetNumber should work"));
5033                      NitsCompare(int32Value, 33, PAL_T("GetNumber should work"));
5034              #if defined (_MSC_VER)
5035                      if (!cloned) NitsCompare(index, 3, PAL_T("GetString should work"));
5036              #else
5037                      if (!cloned) NitsCompare(index, 1, PAL_T("GetString should work"));
5038              #endif
5039              
5040                      NitsCompare(options.ft->GetNumber(&options, PAL_T("option1"), &int32Value, nullIndex, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("GetNumber return MI_RESULT_TYPE_MISMATCH"));
5041 krisbash 1.1         NitsCompare(options.ft->GetNumber(&options, PAL_T("optionBla"), &int32Value, nullIndex, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetNumber return MI_RESULT_NOT_FOUND"));
5042                      NitsCompare(options.ft->GetNumber(nullOptions, optionName, &int32Value, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetNumber should fail"));
5043                      NitsCompare(options.ft->GetNumber(&options, nullString, &int32Value, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetNumber should fail"));
5044                      NitsCompare(options.ft->GetNumber(&options, optionName, nullNumberPtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetNumber should fail"));
5045                  }
5046              
5047                  // GetOptionCount
5048                  {
5049                      MI_Uint32 optionCount = 0;
5050                      NitsCompare(options.ft->GetOptionCount(nullOptions, &optionCount), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionCount should fail"));
5051                      NitsCompare(options.ft->GetOptionCount(&options, nullNumberPtr), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionCount should fail"));
5052              
5053                      NitsCompare(options.ft->GetOptionCount(&options, &optionCount), MI_RESULT_OK, PAL_T("GetOptionCount should success"));
5054              
5055              #if defined(_MSC_VER)
5056                      NitsCompare(optionCount, 4, PAL_T("GetOptionCount should success"));
5057              #else
5058                      /* No locale items yet */
5059                      NitsCompare(optionCount, 2, PAL_T("GetOptionCount should success"));
5060              #endif
5061                  }
5062 krisbash 1.1 
5063                  // GetOptionAt
5064                  if (!cloned)
5065                  {
5066                      MI_Value value = {0};
5067                      MI_Type type = MI_BOOLEAN;
5068                      const MI_Char * optionName = NULL;
5069                      NitsCompare(options.ft->GetOptionAt(nullOptions, 0, &optionName, &value, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
5070                      NitsCompare(options.ft->GetOptionAt(&options, 0, &optionName, &value, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
5071                      NitsCompare(options.ft->GetOptionAt(&options, 0, nullStringPtr, nullMIValuePtr, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
5072                      NitsCompare(options.ft->GetOptionAt(&options, 0, &optionName, &value, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
5073              
5074                      NitsCompare(options.ft->GetOptionAt(&options, 0x100, &optionName, &value, &type, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should return MI_RESULT_NOT_FOUND"));
5075              
5076              #if defined (_MSC_VER)
5077                      NitsCompare(options.ft->GetOptionAt(&options, 2, &optionName, &value, &type, &flag), MI_RESULT_OK, PAL_T("GetOptionAt should success"));
5078              #else
5079                      NitsCompare(options.ft->GetOptionAt(&options, 0, &optionName, &value, &type, &flag), MI_RESULT_OK, PAL_T("GetOptionAt should success"));
5080              #endif
5081                      if (NitsCompare(type, MI_STRING, PAL_T("GetOptionAt should success")))
5082                          NitsCompareString(value.string, PAL_T("value1"), PAL_T("GetOptionAt should success"));
5083 krisbash 1.1     }
5084              
5085                  // GetOption
5086                  {
5087                      MI_Value value = {0};
5088                      MI_Type type = MI_BOOLEAN;
5089                      const MI_Char * optionName = PAL_T("option1");
5090                      NitsCompare(options.ft->GetOption(nullOptions, optionName, &value, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
5091                      NitsCompare(options.ft->GetOption(&options, nullString, &value, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
5092                      NitsCompare(options.ft->GetOption(&options, optionName, nullMIValuePtr, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
5093                      NitsCompare(options.ft->GetOption(&options, optionName, &value, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
5094                      NitsCompare(options.ft->GetOption(&options, PAL_T("optionbla"), &value, &type, &index, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetOption should return MI_RESULT_NOT_FOUND"));
5095              
5096                      NitsCompare(options.ft->GetOption(&options, optionName, &value, &type, &index, 0), MI_RESULT_OK, PAL_T("GetOption should success"));
5097                      if (NitsCompare(type, MI_STRING, PAL_T("GetOption should success")))
5098                          NitsCompareString(value.string, PAL_T("value1"), PAL_T("GetOption should success"));
5099              #if defined(_MSC_VER)
5100                      if (!cloned) NitsCompare(index, 2, PAL_T("GetOption should success"));
5101              #else
5102                      if (!cloned) NitsCompare(index, 0, PAL_T("GetOption should success"));
5103              #endif
5104 krisbash 1.1     }
5105              
5106                  // GetCredentials
5107                  {
5108                      MI_Uint32 credentialCount = 0;
5109                      NitsCompare(options.ft->GetCredentialsCount(&options, &credentialCount), MI_RESULT_OK, PAL_T("GetCredentialsCount should work"));
5110                      NitsCompare(credentialCount, 1, PAL_T("GetCredentialsCount should work"));
5111              
5112                      MI_UserCredentials credential = {0};
5113                      const MI_Char *credentialOptionName = NULL;
5114                      NitsCompare(options.ft->GetCredentialsAt(&options, 0, &credentialOptionName, &credential, &flag), MI_RESULT_OK, PAL_T("GetCredentialsAt should work"));
5115                      NitsCompareString(credential.authenticationType, creds.authenticationType, PAL_T("GetCredentialsAt authenticationType should correct"));
5116                      NitsCompareString(credential.credentials.usernamePassword.domain, creds.credentials.usernamePassword.domain, PAL_T("GetCredentialsAt domain should correct"));
5117                      NitsCompareString(credential.credentials.usernamePassword.password, PAL_T("******"), PAL_T("GetCredentialsAt password should correct"));
5118                      NitsCompareString(credential.credentials.usernamePassword.username, creds.credentials.usernamePassword.username, PAL_T("GetCredentialsAt username should correct"));
5119                      NitsCompareString(credentialOptionName, PAL_T("option3"), PAL_T("GetCredentialsAt option name should correct"));
5120              
5121                      MI_Uint32 passwordLength = 0;
5122                      MI_Char password[9];
5123                      MI_Result r = options.ft->GetCredentialsPasswordAt(&options, 0, &credentialOptionName, password, 9, &passwordLength, &flag);
5124                      NitsCompare(r, MI_RESULT_OK, PAL_T("GetCredentialsPasswordAt should work"));
5125 krisbash 1.1         if (r == MI_RESULT_OK)
5126                      {
5127                          NitsCompareString(credentialOptionName, PAL_T("option3"), PAL_T("GetCredentialsPasswordAt option name should correct"));
5128              
5129              #ifdef _PREFAST_
5130                  #pragma prefast(push)
5131                  #pragma prefast(disable:26035) 
5132              #endif
5133                          NitsCompareString(password, creds.credentials.usernamePassword.password, PAL_T("GetCredentialsPasswordAt should work"));
5134              #ifdef _PREFAST_
5135                  #pragma prefast(pop)
5136              #endif
5137                          NitsCompare(passwordLength, 9, PAL_T("GetCredentialsPasswordAt should work"));
5138                      }
5139              
5140                      NitsCompare(options.ft->GetCredentialsPasswordAt(&options, 1, &credentialOptionName, password, 9, &passwordLength, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetCredentialsPasswordAt should return MI_RESULT_NOT_FOUND"));
5141                      NitsCompare(options.ft->GetCredentialsPasswordAt(nullOptions, 0, &credentialOptionName, password, 9, &passwordLength, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsPasswordAt should return MI_RESULT_INVALID_PARAMETER"));
5142                      NitsCompare(options.ft->GetCredentialsPasswordAt(&options, 0, nullStringPtr, password, 9, &passwordLength, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsPasswordAt should return MI_RESULT_INVALID_PARAMETER"));
5143                      NitsCompare(options.ft->GetCredentialsPasswordAt(&options, 0, &credentialOptionName, password, 9, nullNumberPtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsPasswordAt should return MI_RESULT_INVALID_PARAMETER"));
5144                      NitsCompare(options.ft->GetCredentialsPasswordAt(&options, 0, &credentialOptionName, password, 8, &passwordLength, 0), MI_RESULT_FAILED, PAL_T("GetCredentialsPasswordAt should return MI_RESULT_FAILED"));
5145              
5146 krisbash 1.1         MI_UserCredentials *nullCredentials = NULL;
5147                      NitsCompare(options.ft->GetCredentialsAt(&options, 1, &credentialOptionName, &credential, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetCredentialsAt should return MI_RESULT_NOT_FOUND"));
5148                      NitsCompare(options.ft->GetCredentialsAt(nullOptions, 0, &credentialOptionName, &credential, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsAt should return MI_RESULT_INVALID_PARAMETER"));
5149                      NitsCompare(options.ft->GetCredentialsAt(&options, 0, nullStringPtr, &credential, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsAt should return MI_RESULT_INVALID_PARAMETER"));
5150                      NitsCompare(options.ft->GetCredentialsAt(&options, 0, &credentialOptionName, nullCredentials, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsAt should return MI_RESULT_INVALID_PARAMETER"));
5151                  }
5152              }
5153              
5154              NitsTest1(MI_DestinationOptions_ReadOperations, 
5155                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
5156              {
5157                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
5158                  ResetRuntimeTestData(testData);
5159                  MI_Application *application = &testData->application;
5160              
5161                  MI_DestinationOptions options = MI_DESTINATIONOPTIONS_NULL;
5162                      
5163              #if defined (_MSC_VER)
5164              #pragma prefast(push)
5165              #pragma prefast(disable: 6309)
5166              #endif
5167 krisbash 1.1     NitsCompare(MI_Application_NewDestinationOptions(NULL, &options), MI_RESULT_INVALID_PARAMETER, PAL_T("NewDestinationOptions invalid parameter"));
5168                  NitsCompare(MI_Application_NewDestinationOptions(application, NULL), MI_RESULT_INVALID_PARAMETER, PAL_T("NewDestinationOptions invalid parameter"));
5169              #if defined (_MSC_VER)
5170              #pragma prefast(pop)
5171              #endif
5172              
5173                  if (NitsCompare(MI_Application_NewDestinationOptions(application, &options), MI_RESULT_OK, PAL_T("NewDestinationOptions should succeed")))
5174                  {
5175                      if (NitsAssert(options.ft != NULL, PAL_T("Should have options function table")))
5176                      {
5177                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
5178              
5179                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 33, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
5180              
5181                          MI_UserCredentials creds = { MI_AUTH_TYPE_BASIC, {{ PAL_T("domain"), PAL_T("username"), PAL_T("password") }}};
5182                          NitsCompare(options.ft->AddCredentials(&options, PAL_T("option3"), &creds, 0), MI_RESULT_OK, PAL_T("AddCredentials should work"));
5183              
5184                          MI_DestinationOptions_ReadOperations_Internal(options, creds);
5185                      }
5186              #if defined (_MSC_VER)
5187              #pragma prefast(push)
5188 krisbash 1.1 #pragma prefast(disable: 6011)
5189              #endif
5190                      options.ft->Delete(NULL);
5191              #if defined (_MSC_VER)
5192              #pragma prefast(pop)
5193              #endif
5194                      MI_DestinationOptions_Delete(&options);
5195                  }
5196              }
5197              NitsEndTest
5198              
5199              NitsTest1(MI_DestinationOptions_CloneTest, 
5200                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
5201              {
5202                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
5203                  ResetRuntimeTestData(testData);
5204                  MI_Application *application = &testData->application;
5205              
5206                  MI_DestinationOptions options = MI_DESTINATIONOPTIONS_NULL;
5207                      
5208              #if defined (_MSC_VER)
5209 krisbash 1.1 #pragma prefast(push)
5210              #pragma prefast(disable: 6309)
5211              #endif
5212                  NitsCompare(MI_Application_NewDestinationOptions(NULL, &options), MI_RESULT_INVALID_PARAMETER, PAL_T("NewDestinationOptions invalid parameter"));
5213                  NitsCompare(MI_Application_NewDestinationOptions(application, NULL), MI_RESULT_INVALID_PARAMETER, PAL_T("NewDestinationOptions invalid parameter"));
5214              #if defined (_MSC_VER)
5215              #pragma prefast(pop)
5216              #endif
5217              
5218                  if (NitsCompare(MI_Application_NewDestinationOptions(application, &options), MI_RESULT_OK, PAL_T("NewDestinationOptions should succeed")))
5219                  {
5220                      if (NitsAssert(options.ft != NULL, PAL_T("Should have options function table")))
5221                      {
5222                          NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
5223              
5224                          NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 33, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
5225              
5226                          MI_UserCredentials creds = { MI_AUTH_TYPE_BASIC, {{PAL_T("domain"), PAL_T("username"), PAL_T("password") }}};
5227                          NitsCompare(options.ft->AddCredentials(&options, PAL_T("option3"), &creds, 0), MI_RESULT_OK, PAL_T("AddCredentials should work"));
5228              
5229                          MI_DestinationOptions clonedOptions = MI_DESTINATIONOPTIONS_NULL;
5230 krisbash 1.1             if (NitsCompare(MI_DestinationOptions_Clone(&options, &clonedOptions), MI_RESULT_OK, PAL_T("MI_DestinationOptions_Clone returns OK")) &&
5231                          NitsAssert(clonedOptions.ft != NULL, PAL_T("MI_DestinationOptions function table should not be NULL")))
5232                          {
5233                              MI_DestinationOptions_ReadOperations_Internal(clonedOptions, creds, true);
5234                              MI_DestinationOptions_Delete(&clonedOptions);
5235                          }
5236                      }
5237              #if defined (_MSC_VER)
5238              #pragma prefast(push)
5239              #pragma prefast(disable: 6011)
5240              #endif
5241                      options.ft->Delete(NULL);
5242              #if defined (_MSC_VER)
5243              #pragma prefast(pop)
5244              #endif
5245                      MI_DestinationOptions_Delete(&options);
5246                  }
5247              }
5248              NitsEndTest
5249              
5250              void MI_SubscriptionDeliveryOptions_ReadOperations_Internal(
5251 krisbash 1.1     MI_SubscriptionDeliveryOptions& options,
5252                  MI_UserCredentials& creds,
5253                  bool cloned = false)
5254              {
5255                  MI_SubscriptionDeliveryOptions *nullOptions = NULL;
5256                  const MI_Char *nullString = NULL;
5257                  const MI_Char **nullStringPtr = NULL;
5258                  MI_Uint32 *nullNumberPtr = 0;
5259                  MI_Uint32 *nullIndex = 0;
5260                  MI_Uint32 index = 0;
5261                  MI_Value *nullMIValuePtr = NULL;
5262                  MI_Type *nullMITypePtr = 0;
5263                  MI_Uint32 flag = 0;
5264              
5265                  // Read string
5266                  {
5267                      const MI_Char * stringValue = NULL;
5268                      const MI_Char * optionName = PAL_T("option1");
5269                      NitsCompare(options.ft->GetString(&options, optionName, &stringValue, nullIndex, 0), MI_RESULT_OK, PAL_T("GetString should work"));
5270                      NitsCompare(options.ft->GetString(&options, optionName, &stringValue, &index, &flag), MI_RESULT_OK, PAL_T("GetString should work"));
5271                      NitsCompareString(stringValue, PAL_T("value1"), PAL_T("GetString should work"));
5272 krisbash 1.1         if (!cloned) NitsCompare(index, 0, PAL_T("GetString should work"));
5273              
5274                      NitsCompare(options.ft->GetString(&options, PAL_T("option2"), &stringValue, nullIndex, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("GetString should return MI_RESULT_TYPE_MISMATCH"));
5275                      NitsCompare(options.ft->GetString(&options, PAL_T("optionbla"), &stringValue, nullIndex, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetString should return MI_RESULT_NOT_FOUND"));
5276                      NitsCompare(options.ft->GetString(nullOptions, optionName, &stringValue, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetString should fail"));
5277                      NitsCompare(options.ft->GetString(&options, nullString, &stringValue, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetString should fail"));
5278                      NitsCompare(options.ft->GetString(&options, optionName, nullStringPtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetString should fail"));
5279                  }
5280                  // Read number
5281                  {
5282                      MI_Uint32 int32Value = 0;
5283                      const MI_Char * optionName = PAL_T("option2");
5284                      NitsCompare(options.ft->GetNumber(&options, optionName, &int32Value, nullIndex, 0), MI_RESULT_OK, PAL_T("GetNumber should work"));
5285                      NitsCompare(options.ft->GetNumber(&options, optionName, &int32Value, &index, &flag), MI_RESULT_OK, PAL_T("GetNumber should work"));
5286                      NitsCompare(int32Value, 33, PAL_T("GetNumber should work"));
5287                      if (!cloned) NitsCompare(index, 1, PAL_T("GetNumber should work"));
5288              
5289                      NitsCompare(options.ft->GetNumber(&options, PAL_T("option1"), &int32Value, nullIndex, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("GetNumber return MI_RESULT_TYPE_MISMATCH"));
5290                      NitsCompare(options.ft->GetNumber(&options, PAL_T("optionBla"), &int32Value, nullIndex, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetNumber return MI_RESULT_NOT_FOUND"));
5291                      NitsCompare(options.ft->GetNumber(nullOptions, optionName, &int32Value, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetNumber should fail"));
5292                      NitsCompare(options.ft->GetNumber(&options, nullString, &int32Value, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetNumber should fail"));
5293 krisbash 1.1         NitsCompare(options.ft->GetNumber(&options, optionName, nullNumberPtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetNumber should fail"));
5294                  }
5295                  // Read datetime
5296                  {
5297                      MI_Datetime datetimeRead = {0};
5298                      MI_Datetime * nullDatetimeRead = (MI_Datetime *)0;
5299                      const MI_Char * optionName = PAL_T("option3");
5300              
5301                      NitsCompare(options.ft->GetDateTime(&options, optionName, &datetimeRead, nullIndex, 0), MI_RESULT_OK, PAL_T("GetDateTime should work"));
5302                      NitsCompare(options.ft->GetDateTime(&options, optionName, &datetimeRead, &index, &flag), MI_RESULT_OK, PAL_T("GetDateTime should work"));
5303                      if (!cloned) NitsCompare(index, 2, PAL_T("GetDateTime should work"));
5304                      NitsCompare(datetimeRead.isTimestamp, MI_TRUE, PAL_T("GetDateTime should work"));
5305                      NitsCompare(datetimeRead.u.timestamp.day, 10, PAL_T("GetDateTime should work"));
5306                      NitsCompare(datetimeRead.u.timestamp.hour, 11, PAL_T("GetDateTime should work"));
5307                      NitsCompare(datetimeRead.u.timestamp.minute, 12, PAL_T("GetDateTime should work"));
5308                      NitsCompare(datetimeRead.u.timestamp.second, 13, PAL_T("GetDateTime should work"));
5309                      NitsCompare(datetimeRead.u.timestamp.microseconds, 14, PAL_T("GetDateTime should work"));
5310              
5311                      NitsCompare(options.ft->GetDateTime(&options, PAL_T("option1"), &datetimeRead, nullIndex, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("GetDateTime return MI_RESULT_TYPE_MISMATCH"));
5312                      NitsCompare(options.ft->GetDateTime(&options, PAL_T("optionBla"), &datetimeRead, nullIndex, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetDateTime return MI_RESULT_NOT_FOUND"));
5313              
5314 krisbash 1.1         NitsCompare(options.ft->GetDateTime(nullOptions, optionName, &datetimeRead, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetDateTime should fail"));
5315                      NitsCompare(options.ft->GetDateTime(&options, nullString, &datetimeRead, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetDateTime should fail"));
5316                      NitsCompare(options.ft->GetDateTime(&options, optionName, nullDatetimeRead, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetDateTime should fail"));
5317                  }
5318                  // Read interval
5319                  {
5320                      MI_Interval intervalRead = {0};
5321                      MI_Interval * nullIntervalRead = (MI_Interval *)0;
5322                      const MI_Char * optionName = PAL_T("option4");
5323                      NitsCompare(options.ft->GetInterval(&options, optionName, &intervalRead, nullIndex, 0), MI_RESULT_OK, PAL_T("GetInterval should work"));
5324                      NitsCompare(options.ft->GetInterval(&options, optionName, &intervalRead, &index, &flag), MI_RESULT_OK, PAL_T("GetInterval should work"));
5325                      if (!cloned) NitsCompare(index, 3, PAL_T("GetInterval should work"));
5326                      NitsCompare(intervalRead.days, 8, PAL_T("GetInterval should work"));
5327                      NitsCompare(intervalRead.hours, 9, PAL_T("GetInterval should work"));
5328                      NitsCompare(intervalRead.minutes, 10, PAL_T("GetInterval should work"));
5329                      NitsCompare(intervalRead.seconds, 11, PAL_T("GetInterval should work"));
5330                      NitsCompare(intervalRead.microseconds, 12, PAL_T("GetInterval should work"));
5331              
5332                      NitsCompare(options.ft->GetInterval(&options, PAL_T("option1"), &intervalRead, nullIndex, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("GetInterval return MI_RESULT_TYPE_MISMATCH"));
5333                      // Option3 is a datetime not interval
5334                      NitsCompare(options.ft->GetInterval(&options, PAL_T("option3"), &intervalRead, nullIndex, 0), MI_RESULT_TYPE_MISMATCH, PAL_T("GetInterval return MI_RESULT_TYPE_MISMATCH"));
5335 krisbash 1.1         NitsCompare(options.ft->GetInterval(&options, PAL_T("optionBla"), &intervalRead, nullIndex, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetInterval return MI_RESULT_NOT_FOUND"));
5336              
5337                      NitsCompare(options.ft->GetInterval(nullOptions, optionName, &intervalRead, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetInterval should fail"));
5338                      NitsCompare(options.ft->GetInterval(&options, nullString, &intervalRead, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetInterval should fail"));
5339                      NitsCompare(options.ft->GetInterval(&options, optionName, nullIntervalRead, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetInterval should fail"));
5340                  }
5341                  // GetOptionCount
5342                  {
5343                      MI_Uint32 optionCount = 0;
5344                      NitsCompare(options.ft->GetOptionCount(nullOptions, &optionCount), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionCount should fail"));
5345                      NitsCompare(options.ft->GetOptionCount(&options, nullNumberPtr), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionCount should fail"));
5346              
5347                      NitsCompare(options.ft->GetOptionCount(&options, &optionCount), MI_RESULT_OK, PAL_T("GetOptionCount should success"));
5348                      NitsCompare(optionCount, 4, PAL_T("GetOptionCount should success"));
5349                  }
5350                  // GetOptionAt
5351                  if (!cloned)
5352                  {
5353                      MI_Value value = {0};
5354                      MI_Type type = MI_BOOLEAN;
5355                      const MI_Char * optionName = NULL;
5356 krisbash 1.1         NitsCompare(options.ft->GetOptionAt(nullOptions, 0, &optionName, &value, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
5357                      NitsCompare(options.ft->GetOptionAt(&options, 0, &optionName, &value, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
5358                      NitsCompare(options.ft->GetOptionAt(&options, 0, nullStringPtr, nullMIValuePtr, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
5359                      NitsCompare(options.ft->GetOptionAt(&options, 0, &optionName, &value, nullMITypePtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should fail"));
5360              
5361                      NitsCompare(options.ft->GetOptionAt(&options, 0x100, &optionName, &value, &type, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOptionAt should return MI_RESULT_NOT_FOUND"));
5362              
5363                      NitsCompare(options.ft->GetOptionAt(&options, 0, &optionName, &value, &type, &flag), MI_RESULT_OK, PAL_T("GetOptionAt should success"));
5364                      if (NitsCompare(type, MI_STRING, PAL_T("GetOptionAt should success")))
5365                          NitsCompareString(value.string, PAL_T("value1"), PAL_T("GetOptionAt should success"));
5366                  }
5367                  // GetOption
5368                  {
5369                      MI_Value value = {0};
5370                      MI_Type type = MI_BOOLEAN;
5371                      const MI_Char * optionName = PAL_T("option1");
5372                      NitsCompare(options.ft->GetOption(nullOptions, optionName, &value, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
5373                      NitsCompare(options.ft->GetOption(&options, nullString, &value, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
5374                      NitsCompare(options.ft->GetOption(&options, optionName, nullMIValuePtr, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
5375                      NitsCompare(options.ft->GetOption(&options, optionName, &value, nullMITypePtr, 0, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetOption should fail"));
5376                      NitsCompare(options.ft->GetOption(&options, PAL_T("optionbla"), &value, &type, &index, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetOption should return MI_RESULT_NOT_FOUND"));
5377 krisbash 1.1 
5378                      NitsCompare(options.ft->GetOption(&options, optionName, &value, &type, &index, &flag), MI_RESULT_OK, PAL_T("GetOption should success"));
5379                      if (NitsCompare(type, MI_STRING, PAL_T("GetOption should success")))
5380                          NitsCompareString(value.string, PAL_T("value1"), PAL_T("GetOption should success"));
5381                      if (!cloned) NitsCompare(index, 0, PAL_T("GetOption should success"));
5382                  }
5383                  // GetCredentials
5384                  {
5385                      MI_Uint32 credentialCount = 0;
5386                      NitsCompare(options.ft->GetCredentialsCount(&options, &credentialCount), MI_RESULT_OK, PAL_T("GetCredentialsCount should work"));
5387                      NitsCompare(credentialCount, 1, PAL_T("GetCredentialsCount should work"));
5388              
5389                      MI_UserCredentials credential = {0};
5390                      const MI_Char *credentialOptionName = NULL;
5391                      NitsCompare(options.ft->GetCredentialsAt(&options, 0, &credentialOptionName, &credential, &flag), MI_RESULT_OK, PAL_T("GetCredentialsAt should work"));
5392                      NitsCompareString(credential.authenticationType, creds.authenticationType, PAL_T("GetCredentialsAt authenticationType should correct"));
5393                      NitsCompareString(credential.credentials.usernamePassword.domain, creds.credentials.usernamePassword.domain, PAL_T("GetCredentialsAt domain should correct"));
5394                      NitsCompareString(credential.credentials.usernamePassword.password, PAL_T("******"), PAL_T("GetCredentialsAt password should correct"));
5395                      NitsCompareString(credential.credentials.usernamePassword.username, creds.credentials.usernamePassword.username, PAL_T("GetCredentialsAt username should correct"));
5396                      NitsCompareString(credentialOptionName, PAL_T("option5"), PAL_T("GetCredentialsAt option name should correct"));
5397              
5398 krisbash 1.1         MI_Uint32 passwordLength = 0;
5399                      MI_Char password[9];
5400                      MI_Result r = options.ft->GetCredentialsPasswordAt(&options, 0, &credentialOptionName, password, 9, &passwordLength, &flag);
5401                      NitsCompare(r, MI_RESULT_OK, PAL_T("GetCredentialsPasswordAt should work"));
5402                      if (r == MI_RESULT_OK)
5403                      {
5404                          NitsCompareString(credentialOptionName, PAL_T("option5"), PAL_T("GetCredentialsPasswordAt option name should correct"));
5405              
5406              #ifdef _PREFAST_
5407                  #pragma prefast(push)
5408                  #pragma prefast(disable:26035) 
5409              #endif
5410                          NitsCompareString(password, creds.credentials.usernamePassword.password, PAL_T("GetCredentialsPasswordAt should work"));
5411              #ifdef _PREFAST_
5412                  #pragma prefast(pop)
5413              #endif
5414              
5415                          NitsCompare(passwordLength, 9, PAL_T("GetCredentialsPasswordAt should work"));
5416                      }
5417                      NitsCompare(options.ft->GetCredentialsPasswordAt(&options, 1, &credentialOptionName, password, 9, &passwordLength, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetCredentialsPasswordAt should return MI_RESULT_NOT_FOUND"));
5418                      NitsCompare(options.ft->GetCredentialsPasswordAt(nullOptions, 0, &credentialOptionName, password, 9, &passwordLength, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsPasswordAt should return MI_RESULT_INVALID_PARAMETER"));
5419 krisbash 1.1         NitsCompare(options.ft->GetCredentialsPasswordAt(&options, 0, nullStringPtr, password, 9, &passwordLength, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsPasswordAt should return MI_RESULT_INVALID_PARAMETER"));
5420                      NitsCompare(options.ft->GetCredentialsPasswordAt(&options, 0, &credentialOptionName, password, 9, nullNumberPtr, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsPasswordAt should return MI_RESULT_INVALID_PARAMETER"));
5421                      NitsCompare(options.ft->GetCredentialsPasswordAt(&options, 0, &credentialOptionName, password, 8, &passwordLength, 0), MI_RESULT_FAILED, PAL_T("GetCredentialsPasswordAt should return MI_RESULT_FAILED"));
5422              
5423                      MI_UserCredentials *nullCredentials = NULL;
5424                      NitsCompare(options.ft->GetCredentialsAt(&options, 1, &credentialOptionName, &credential, 0), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("GetCredentialsAt should return MI_RESULT_NOT_FOUND"));
5425                      NitsCompare(options.ft->GetCredentialsAt(nullOptions, 0, &credentialOptionName, &credential, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsAt should return MI_RESULT_INVALID_PARAMETER"));
5426                      NitsCompare(options.ft->GetCredentialsAt(&options, 0, nullStringPtr, &credential, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsAt should return MI_RESULT_INVALID_PARAMETER"));
5427                      NitsCompare(options.ft->GetCredentialsAt(&options, 0, &credentialOptionName, nullCredentials, 0), MI_RESULT_INVALID_PARAMETER, PAL_T("GetCredentialsAt should return MI_RESULT_INVALID_PARAMETER"));
5428                  }
5429              }
5430              
5431              NitsTest1(MI_SubscriptionDeliveryOptions_ReadOperations, 
5432                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
5433              {
5434                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
5435                  ResetRuntimeTestData(testData);
5436                  MI_Application *application= &testData->application;
5437                  
5438                  MI_SubscriptionDeliveryOptions options = MI_SUBSCRIPTIONDELIVERYOPTIONS_NULL;
5439                  if (NitsCompare(MI_Application_NewSubscriptionDeliveryOptions(application, MI_SubscriptionDeliveryType_Push, &options), MI_RESULT_OK, PAL_T("NewSubscribeDeliveryOptions should succeed")))
5440 krisbash 1.1     {
5441                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
5442                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 33, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
5443                      MI_Datetime datetime = {0};
5444                      {
5445                          datetime.isTimestamp = true;
5446                          datetime.u.timestamp.day = 10;
5447                          datetime.u.timestamp.hour = 11;
5448                          datetime.u.timestamp.minute = 12;
5449                          datetime.u.timestamp.second = 13;
5450                          datetime.u.timestamp.microseconds = 14;
5451                          NitsCompare(options.ft->SetDateTime(&options, PAL_T("option3"), &datetime, 0), MI_RESULT_OK, PAL_T("SetDateTime should work"));
5452                      }
5453                      MI_Interval interval = {0};
5454                      {
5455                          interval.days = 8;
5456                          interval.hours = 9;
5457                          interval.minutes = 10;
5458                          interval.seconds = 11;
5459                          interval.microseconds = 12;
5460                          NitsCompare(options.ft->SetInterval(&options, PAL_T("option4"), &interval, 0), MI_RESULT_OK, PAL_T("SetInterval should work"));
5461 krisbash 1.1         }
5462                      MI_UserCredentials creds = { 0 };
5463                      {
5464                          creds.authenticationType = MI_AUTH_TYPE_BASIC;
5465                          creds.credentials.usernamePassword.username = PAL_T("username");
5466                          creds.credentials.usernamePassword.domain = PAL_T("domain");
5467                          creds.credentials.usernamePassword.password = PAL_T("password");
5468                          NitsCompare(options.ft->AddCredentials(&options, PAL_T("option5"), &creds, 0), MI_RESULT_OK, PAL_T("AddCredentials should work"));
5469                      }
5470              
5471                      MI_SubscriptionDeliveryOptions_ReadOperations_Internal(options, creds);
5472                      MI_SubscriptionDeliveryOptions_Delete(&options);
5473                  }
5474              }
5475              NitsEndTest
5476              
5477              NitsTest1(MI_SubscriptionDeliveryOptions_CloneTest, 
5478                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
5479              {
5480                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
5481                  ResetRuntimeTestData(testData);
5482 krisbash 1.1     MI_Application *application = &testData->application;
5483                  
5484                  MI_SubscriptionDeliveryOptions options = MI_SUBSCRIPTIONDELIVERYOPTIONS_NULL;
5485                  if (NitsCompare(MI_Application_NewSubscriptionDeliveryOptions(application, MI_SubscriptionDeliveryType_Push, &options), MI_RESULT_OK, PAL_T("NewSubscribeDeliveryOptions should succeed")))
5486                  {
5487                      NitsCompare(options.ft->SetString(&options, PAL_T("option1"), PAL_T("value1"), 0), MI_RESULT_OK, PAL_T("SetString should work"));
5488                      NitsCompare(options.ft->SetNumber(&options, PAL_T("option2"), 33, 0), MI_RESULT_OK, PAL_T("SetNumber should work"));
5489                      MI_Datetime datetime = {0};
5490                      {
5491                          datetime.isTimestamp = true;
5492                          datetime.u.timestamp.day = 10;
5493                          datetime.u.timestamp.hour = 11;
5494                          datetime.u.timestamp.minute = 12;
5495                          datetime.u.timestamp.second = 13;
5496                          datetime.u.timestamp.microseconds = 14;
5497                          NitsCompare(options.ft->SetDateTime(&options, PAL_T("option3"), &datetime, 0), MI_RESULT_OK, PAL_T("SetDateTime should work"));
5498                      }
5499                      MI_Interval interval = {0};
5500                      {
5501                          interval.days = 8;
5502                          interval.hours = 9;
5503 krisbash 1.1             interval.minutes = 10;
5504                          interval.seconds = 11;
5505                          interval.microseconds = 12;
5506                          NitsCompare(options.ft->SetInterval(&options, PAL_T("option4"), &interval, 0), MI_RESULT_OK, PAL_T("SetInterval should work"));
5507                      }
5508                      MI_UserCredentials creds = { 0 };
5509                      {
5510                          creds.authenticationType = MI_AUTH_TYPE_BASIC;
5511                          creds.credentials.usernamePassword.username = PAL_T("username");
5512                          creds.credentials.usernamePassword.domain = PAL_T("domain");
5513                          creds.credentials.usernamePassword.password = PAL_T("password");
5514                          NitsCompare(options.ft->AddCredentials(&options, PAL_T("option5"), &creds, 0), MI_RESULT_OK, PAL_T("AddCredentials should work"));
5515                      }
5516                      MI_SubscriptionDeliveryOptions clonedOptions = MI_SUBSCRIPTIONDELIVERYOPTIONS_NULL;
5517                      if (NitsCompare(MI_SubscriptionDeliveryOptions_Clone(&options, &clonedOptions), MI_RESULT_OK, PAL_T("MI_SubscriptionDeliveryOptions_Clone returns OK")) &&
5518                          NitsAssert(clonedOptions.ft != NULL, PAL_T("MI_SubscriptionDeliveryOptions function table should not be NULL")))
5519                      {
5520                          NitsCompare((MI_Uint32)options.reserved1, (MI_Uint32)clonedOptions.reserved1, PAL_T("Cloned options should has same deliveryType"));
5521                          MI_SubscriptionDeliveryOptions_ReadOperations_Internal(clonedOptions, creds, true);
5522                          MI_SubscriptionDeliveryOptions_Delete(&clonedOptions);
5523                      }
5524 krisbash 1.1         MI_SubscriptionDeliveryOptions_Delete(&options);
5525                  }
5526              }
5527              NitsEndTest
5528              
5529              NitsTest1(MI_SubscriptionDeliveryOptions_StronglyTypedCheck, 
5530                        SetupDefaultApplication, g_RuntimeApplicationSetup_Test1)
5531              {
5532                  RuntimeTestData *testData = NitsContext()->_SetupDefaultApplication->_BaseSetup->_RuntimeTestData;
5533                  ResetRuntimeTestData(testData);
5534                  MI_Application *application = &testData->application;
5535              
5536                  MI_SubscriptionDeliveryOptions sdo = MI_SUBSCRIPTIONDELIVERYOPTIONS_NULL;
5537              
5538                  if (NitsCompare(MI_Application_NewSubscriptionDeliveryOptions(application, MI_SubscriptionDeliveryType_Pull, &sdo), MI_RESULT_OK, PAL_T("Subscribe delivery options created")))
5539                  {
5540                      MI_Interval value = {0};
5541                      value.days = 1;
5542                      NitsCompare(MI_SubscriptionDeliveryOptions_GetDeliveryRetryInterval(&sdo, &value), MI_RESULT_NO_SUCH_PROPERTY, PAL_T("Get delivery retry interval should be not found"));
5543                      NitsCompare(MI_SubscriptionDeliveryOptions_SetDeliveryRetryInterval(&sdo, &value), MI_RESULT_OK, PAL_T("Set delivery retry interval"));
5544                      NitsCompare(MI_SubscriptionDeliveryOptions_GetDeliveryRetryInterval(&sdo, &value), MI_RESULT_OK, PAL_T("Get delivery retry interval should work"));
5545 krisbash 1.1         NitsCompare(value.days, 1, PAL_T("validate get value same as set"));
5546              
5547                      NitsCompare(MI_SubscriptionDeliveryOptions_Delete(&sdo), MI_RESULT_OK, PAL_T("subscribe delivery options delete failed"));
5548                  }
5549              }
5550              NitsEndTest
5551              #if 0
5552              NitsTest(Session_GetInstance_Sync_OperationAck)
5553              {
5554                  MI_Application application = MI_APPLICATION_NULL;
5555                  MI_Session session = MI_SESSION_NULL;
5556                  MI_Operation operation = MI_OPERATION_NULL;
5557              
5558                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, &application), MI_RESULT_OK, PAL_T("MI_Application_Initialize returns OK")) &&
5559                      NitsAssert(application.ft != NULL, PAL_T("MI_Application function table should not be NULL")))
5560                  {
5561                      MI_Instance *instance = NULL;
5562                      if (NitsAssert(MI_Application_NewInstance(&application, PAL_T("Win32_OperatingSystem"), NULL, &instance) == MI_RESULT_OK, PAL_T("failed to create instance")))
5563                      {
5564                          if (NitsCompare(MI_Application_NewSession(&application, NULL, NULL, NULL, NULL, NULL, &session), MI_RESULT_OK, PAL_T("MI_Application_NewSession returns OK")) &&
5565                              NitsAssert(session.ft != NULL, PAL_T("MI_Session function table should not be NULL")))
5566 krisbash 1.1             {
5567                              MI_Session_GetInstance(&session, MI_OPERATIONFLAGS_REPORT_OPERATION_STARTED, NULL, PAL_T("root\\cimv2"), instance, NULL, &operation);
5568                              NitsAssert(operation.ft != NULL, PAL_T("operation function table null"));
5569              
5570                              const MI_Instance *newInst = NULL;
5571                              MI_Boolean moreResults = MI_TRUE;
5572                              MI_Result miResult;
5573                              MI_Operation_GetInstance(&operation, &newInst, &moreResults, &miResult, NULL, NULL);
5574                              if (NitsCompare(moreResults, MI_TRUE, PAL_T("result ACK should mean more results available")))
5575                              {
5576                                  MI_Uint32 count = 0;
5577                                  NitsAssert(newInst == NULL, PAL_T("First result should be NULL as it is an ACK"));
5578                                  NitsCompare(miResult, MI_RESULT_OK, PAL_T("Should get success for ACK"));
5579                                  while (moreResults)
5580                                  {
5581                                      MI_Operation_GetInstance(&operation, &newInst, &moreResults, &miResult, NULL, NULL);
5582                                      if (NitsCompare(miResult, MI_RESULT_OK, PAL_T("operation should succeed")))
5583                                          count++;
5584                                  }
5585                                  NitsCompare(count, 1, PAL_T("singleton so should be only 1 real response"));
5586                              }
5587 krisbash 1.1                 MI_Operation_Close(&operation);
5588              
5589                              MI_Session_Close(&session, NULL, NULL);
5590                          }
5591                          MI_Instance_Delete(instance);
5592                      }
5593              
5594                      MI_Application_Close(&application);
5595                  }
5596              
5597              }
5598              NitsEndTest
5599              #endif
5600              
5601              /*
5602              **==============================================================================
5603              **
5604              ** Test structure for MIAPI end to end test
5605              **
5606              **==============================================================================
5607              */
5608 krisbash 1.1 struct MIAPITestStruct
5609              {
5610                  /* Configurations */
5611                  const MI_Char* nameSpace; /* target namespace */
5612                  const MI_Char* className;
5613              
5614                  /* expected results */
5615                  MI_Uint32 expectedInstanceCount;
5616              
5617                  InstanceOperationStruct ios;
5618              };
5619              
5620              /*
5621              **==============================================================================
5622              **
5623              ** Setup function, it is called before running each test case
5624              ** NOTE: for "nits -fault" run, this function will be called once and only once
5625              ** for each test case.
5626              **
5627              **==============================================================================
5628              */
5629 krisbash 1.1 static void _setup(_In_ MIAPITestStruct* mts)
5630              {
5631                  MI_Application *application = &mts->ios.app;
5632                  mts->ios.app.ft = NULL;
5633                  if (NitsCompare(MI_Application_Initialize(0, NULL, NULL, application),
5634                      MI_RESULT_OK,
5635                      PAL_T("MI_Application_Initialize returns OK")))
5636                  {
5637                      NitsAssert(application->ft != NULL,
5638                          PAL_T("MI_Application_Initialize returns object with function table"));
5639                      if (application->ft == NULL)
5640                          return;
5641                  }
5642                  else
5643                      return;
5644              
5645                  mts->ios.session.ft = NULL;
5646                  if (NitsCompare(MI_Application_NewSession(&mts->ios.app, NULL, NULL, NULL, NULL, NULL, &mts->ios.session),
5647                      MI_RESULT_OK,
5648                      PAL_T("MI_Application_NewSession returns OK")))
5649                  {
5650 krisbash 1.1         NitsAssert(mts->ios.session.ft != NULL,
5651                          PAL_T("MI_Application_NewSession returns object with function table"));
5652                      if (mts->ios.session.ft == NULL)
5653                          return;
5654                  }
5655                  else
5656                      return;
5657              
5658                  mts->ios.finished = 0;
5659              }
5660              
5661              NitsSetup0(MIAPITest_Setup, MIAPITestStruct)
5662                  /*
5663                   * MI_Application_Intialize create global log file handler _os
5664                   * MI_Application_Close closes it,
5665                   * thus the test case needs to make sure not close _os while
5666                   * there are active MI_Application(s) objects
5667                   */
5668                  NitsAssert( StartServer_Assert() == MI_RESULT_OK, PAL_T(" Failed to start server "));
5669                  _setup(NitsContext()->_MIAPITestStruct);
5670              NitsEndSetup
5671 krisbash 1.1 
5672              /*
5673              **==============================================================================
5674              **
5675              ** Cleanup function, it is called after run each test case
5676              ** NOTE: for "nits -fault" run, this function will be called once and only once
5677              ** for each test case.
5678              **
5679              **==============================================================================
5680              */
5681              static void _cleanup(_In_ MIAPITestStruct* mts)
5682              {
5683                  MI_Application *application = &mts->ios.app;
5684                  MI_Session *session = &mts->ios.session;
5685              
5686                  if (NULL != session->ft)
5687                      NitsCompare(MI_Session_Close(session, NULL, NULL), MI_RESULT_OK, PAL_T("Failed to close MI_Session"));
5688                  if (NULL != application->ft)
5689                  NitsCompare(MI_Application_Close(application), MI_RESULT_OK, PAL_T("Failed to close MI_Application"));
5690              }
5691              
5692 krisbash 1.1 NitsCleanup(MIAPITest_Setup)
5693                  /*
5694                   * MI_Application_Intialize create global log file handler _os
5695                   * MI_Application_Close closes it,
5696                   * thus the test case needs to make sure not close _os while
5697                   * there are active MI_Application(s) objects
5698                   */
5699                  NitsAssert( StopServer_Assert() == MI_RESULT_OK, PAL_T("Failed to stop server"));
5700                  _cleanup (NitsContext()->_MIAPITestStruct);
5701              NitsEndCleanup
5702              
5703              /*
5704              **==============================================================================
5705              **
5706              ** Default test structure
5707              **
5708              **==============================================================================
5709              */
5710              static struct MIAPITestStruct MTS1 = {
5711                  MI_T("test/cpp"),
5712                  MI_T("X_SmallNumber"),
5713 krisbash 1.1     0,
5714                  {MI_FALSE, 0, 0}
5715              };
5716              
5717              
5718              /*
5719              **==============================================================================
5720              **
5721              ** Enumerate instance and validate results
5722              **
5723              **==============================================================================
5724              */
5725              static MI_Boolean _Enumerate_Validate(_In_ MIAPITestStruct* mts)
5726              {
5727                  MI_Result miResult;
5728              
5729                  /* Cleanup actual result */
5730                  mts->ios.count = 0;
5731              
5732                  miResult = EnumerateInstance(&mts->ios, mts->nameSpace, mts->className);
5733                  NitsCompare(miResult, MI_RESULT_OK, PAL_T("Unexpected enumerate result"));
5734 krisbash 1.1 
5735                  /* Validate subscribe result */
5736                  NitsCompare(mts->ios.count, mts->expectedInstanceCount, PAL_T("Unexpected instance count"));
5737              
5738                  if (mts->ios.count == mts->expectedInstanceCount)
5739                      return MI_TRUE;
5740                  return MI_FALSE;
5741              }
5742              
5743              
5744              /*
5745              **==============================================================================
5746              **
5747              ** For following tests, each test case needs to run twice w.r.t.
5748              ** sync and async consume result instances
5749              **
5750              ** To avoid the duplicate test code, following structure was introduced to
5751              ** indicate the way of deliver indication
5752              **
5753              **==============================================================================
5754              */
5755 krisbash 1.1 struct Sync_Struct
5756              {
5757                  MI_Boolean sync;
5758              };
5759              
5760              NitsSetup1(ConsumeInstance_Sync, Sync_Struct, MIAPITest_Setup, MTS1)
5761                  NitsContext()->_Sync_Struct->sync = MI_TRUE;
5762              NitsEndSetup
5763              
5764              NitsSetup1(ConsumeInstance_Async, Sync_Struct, MIAPITest_Setup, MTS1)
5765                  NitsContext()->_Sync_Struct->sync = MI_FALSE;
5766              NitsEndSetup
5767              
5768              NitsSplit2(ConsumeInstance_Approach, Sync_Struct, ConsumeInstance_Sync, ConsumeInstance_Async)
5769              NitsEndSplit
5770              
5771              typedef struct _ThreadStruct
5772              {
5773                  MIAPITestStruct mts;
5774                  Sem sem;
5775                  MI_Uint32* threadCount;
5776 krisbash 1.1     Thread threadHandle;
5777              }ThreadStruct;
5778              
5779              NITS_EXTERN_C PAL_Uint32 THREAD_API EnumerateInstanceProc(void* param)
5780              {
5781                  ThreadStruct* ts = (ThreadStruct*)param;
5782                  if ( MI_TRUE == _Enumerate_Validate(&ts->mts))
5783                  {
5784                      *ts->threadCount = (*ts->threadCount) + 1;
5785                  }
5786                  Sem_Post(&ts->sem, 1);
5787                  return 0;
5788              }
5789              
5790              #if !defined(_MSC_VER)
5791              
5792              NitsTest1(Test_SingleThread_Enumerate, ConsumeInstance_Approach, ConsumeInstance_ApproachDefaults)
5793              {
5794                  NitsDisableFaultSim;
5795                  MIAPITestStruct* mts = NitsContext()->_ConsumeInstance_Approach->_ConsumeInstance_Sync->_MIAPITest_Setup->_MIAPITestStruct;
5796                  MI_Boolean sync = NitsContext()->_ConsumeInstance_Approach->_Sync_Struct->sync;
5797 krisbash 1.1     mts->ios.sync = sync;
5798                  mts->ios.count = 0;
5799                  mts->expectedInstanceCount = 1000;
5800                  _Enumerate_Validate(mts);
5801              }
5802              NitsEndTest
5803              
5804              
5805              NitsTest1(Test_MultiThreads_Enumerate, ConsumeInstance_Approach, ConsumeInstance_ApproachDefaults)
5806              {
5807                  NitsDisableFaultSim;
5808                  MIAPITestStruct* mts = NitsContext()->_ConsumeInstance_Approach->_ConsumeInstance_Sync->_MIAPITest_Setup->_MIAPITestStruct;
5809                  MI_Boolean sync = NitsContext()->_ConsumeInstance_Approach->_Sync_Struct->sync;
5810                  mts->ios.sync = sync;
5811                  mts->ios.count = 0;
5812                  mts->expectedInstanceCount = 1000;
5813              
5814                  static const MI_Uint32 sthreadCount = 8;
5815                  ThreadStruct* tsarray[sthreadCount];
5816                  MI_Uint32 successThreadCount = 0;
5817                  for (MI_Uint32 i = 0; i < sthreadCount; i++)
5818 krisbash 1.1     {
5819                      ThreadStruct* ts = (ThreadStruct*)PAL_Malloc(sizeof(ThreadStruct));
5820                      tsarray[i] = NULL;
5821                      if (ts)
5822                      {
5823                          Sem_Init(&ts->sem, SEM_USER_ACCESS_ALLOW_ALL, 0);
5824                          ts->mts = *mts;
5825                          ts->threadCount = &successThreadCount;            
5826                          int code = Thread_CreateJoinable(&ts->threadHandle, 
5827                                                          EnumerateInstanceProc, 
5828                                                          NULL, (void*)ts);
5829                          NitsAssert( (code == 0), PAL_T("failed to create thread"));
5830                          if (code == 0)
5831                              tsarray[i] = ts;
5832                          else
5833                              PAL_Free(ts);
5834                      }
5835                      else
5836                          NitsAssert(0, PAL_T("failed to create ThreadStruct"));
5837                  }
5838                  for (MI_Uint32 i = 0; i < sthreadCount; i++)
5839 krisbash 1.1     {
5840                      if (tsarray[i])
5841                      {
5842                          PAL_Uint32 result = 0;
5843              
5844                          Sem_Wait(&tsarray[i]->sem);
5845                          Sem_Destroy(&tsarray[i]->sem);
5846              
5847                          Thread_Join(&tsarray[i]->threadHandle, &result);
5848                          Thread_Destroy(&tsarray[i]->threadHandle);
5849              
5850                          PAL_Free(tsarray[i]);
5851                          tsarray[i] = NULL;
5852                      }
5853                  }
5854                  NitsCompare(successThreadCount, sthreadCount, PAL_T("Some enumerate threads failed"));
5855              }
5856              NitsEndTest
5857              
5858              #endif
5859              

ViewCVS 0.9.2