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

   1 krisbash 1.1 /*
   2              **==============================================================================
   3              **
   4              ** Open Management Infrastructure (OMI)
   5              **
   6              ** Copyright (c) Microsoft Corporation
   7              ** 
   8              ** Licensed under the Apache License, Version 2.0 (the "License"); you may not 
   9              ** use this file except in compliance with the License. You may obtain a copy 
  10              ** of the License at 
  11              **
  12              **     http://www.apache.org/licenses/LICENSE-2.0 
  13              **
  14              ** THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15              ** KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED 
  16              ** WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
  17              ** MERCHANTABLITY OR NON-INFRINGEMENT. 
  18              **
  19              ** See the Apache 2 License for the specific language governing permissions 
  20              ** and limitations under the License.
  21              **
  22 krisbash 1.1 **==============================================================================
  23              */
  24              
  25              /* Must be defined first (define MI_CHAR_TYPE) */
  26              #include <mof/mof.h>
  27              
  28              #include <string>
  29              #include <map>
  30              #include <iostream>
  31              
  32              #if defined(_MSC_VER)
  33              #include  <io.h>
  34              #define CONFIG_CIMSCHEMA "CIM-2.32.0"
  35              #endif
  36              
  37              #include <common.h>
  38              
  39              #include <ut/ut.h>
  40              
  41              #include <pal/format.h>
  42              #include <pal/file.h>
  43 krisbash 1.1 #include <base/paths.h>
  44              #include <pal/dir.h>
  45              #include <pal/strings.h>
  46              
  47              using namespace std;
  48              
  49              #if defined(_MSC_VER)
  50              #undef BEGIN_EXTERNC
  51              #undef END_EXTERNC
  52              #define BEGIN_EXTERNC
  53              #define END_EXTERNC
  54              #endif
  55              
  56              static char TEMP_FILE[PAL_MAX_PATH_SIZE];
  57              
  58              static struct MofTestResults {
  59                string m_error, m_warning;
  60              
  61                map<string,string> m_classes, m_qualifiers;
  62              
  63                void clear()
  64 krisbash 1.1   {
  65                  m_error.clear();
  66                  m_warning.clear();
  67                  m_classes.clear();
  68                  m_qualifiers.clear();
  69                }
  70              
  71              } s_results;
  72              
  73              extern "C" void ErrorCallback(const char* msg, const wchar_t* wmsg, void* )
  74              {
  75                  MI_UNUSED(wmsg);
  76                  s_results.m_error += msg;
  77                  s_results.m_error += "\n";
  78                  fprintf(stderr, "%s\n", msg);
  79              }
  80              
  81              extern "C" void ErrorCallback_Quiet(const char* msg, const wchar_t* wmsg, void*)
  82              {
  83                  MI_UNUSED(wmsg);
  84                  s_results.m_error += msg;
  85 krisbash 1.1     s_results.m_error += "\n";
  86              }
  87              
  88              extern "C" void WarningCallback(const char* msg, const wchar_t* wmsg, void*)
  89              {
  90                  MI_UNUSED(wmsg);
  91                  s_results.m_warning += msg;
  92                  s_results.m_warning += "\n";
  93                  //fprintf(stderr, "%s\n", msg);
  94              }
  95              
  96              extern "C" void PragmaCallback(const char* pragma, const char* value, void* )
  97              {
  98                  printf("pragma: %s=%s\n", pragma, value);
  99              }
 100              
 101              BEGIN_EXTERNC
 102              void ClassDeclCallback(const MI_ClassDecl* decl, void* )
 103              {
 104                  //printf("class: %s, parent: %s\n", decl->name, decl->superClass != 0 ? decl->superClass : "");
 105                  // verify class definition
 106 krisbash 1.1     if ( ut::String(MI_T("MyClass")) == decl->name )
 107                  {
 108                      UT_ASSERT( decl->superClass == 0 ||
 109                          ut::String() == decl->superClass);
 110                  }
 111                  else if ( ut::String(MI_T("MyAssoc")) == decl->name )
 112                  {
 113                      UT_ASSERT( decl->superClass == 0 ||
 114                          ut::String() == decl->superClass);
 115                  }
 116                  else if ( ut::String(MI_T("YourClass")) == decl->name )
 117                  {
 118                      UT_ASSERT( decl->superClass != 0 &&
 119                          ut::String(MI_T("MyClass")) == decl->superClass);
 120                  }
 121                  else if ( ut::String(MI_T("X")) == decl->name )
 122                  {
 123                      UT_ASSERT( decl->superClass == 0 ||
 124                          ut::String() == decl->superClass);
 125                  }
 126                  else if ( ut::String(MI_T("Y")) == decl->name )
 127 krisbash 1.1     {
 128                      UT_ASSERT( decl->superClass != 0 &&
 129                          ut::String(MI_T("X")) == decl->superClass);
 130                  }
 131                  else if ( ut::String(MI_T("Z")) == decl->name )
 132                  {
 133                      UT_ASSERT( decl->superClass != 0 &&
 134                          ut::String(MI_T("Y")) == decl->superClass);
 135                  }
 136                  else if ( ut::String(MI_T("Y2")) == decl->name )
 137                  {
 138                      UT_ASSERT( decl->superClass != 0 &&
 139                          ut::String(MI_T("X")) == decl->superClass);
 140                  }
 141                  else if ( ut::String(MI_T("Z2")) == decl->name )
 142                  {
 143                      UT_ASSERT( decl->superClass != 0 &&
 144                          ut::String(MI_T("Y2")) == decl->superClass);
 145                  }
 146                  else if ( ut::String(MI_T("Class")) == decl->name )
 147                  {
 148 krisbash 1.1         UT_ASSERT( decl->superClass == 0 ||
 149                          ut::String() == decl->superClass);
 150                  }
 151                  else if ( ut::String(MI_T("Tosubclass")) == decl->name )
 152                  {
 153                      UT_ASSERT( decl->superClass != 0 &&
 154                          ut::String("Class") == decl->superClass);
 155                  }
 156                  else if ( ut::String(MI_T("SMS_Class_Template")) == decl->name )
 157                  {
 158                      UT_ASSERT( decl->superClass == 0 ||
 159                          ut::String("") == decl->superClass);
 160                  }
 161                  else if ( ut::String(MI_T("Test_Misc")) == decl->name )
 162                  {
 163                      UT_ASSERT( decl->superClass != 0 &&
 164                          ut::String("SMS_Class_Template") == decl->superClass);
 165                  }
 166                  else
 167                  {
 168                      printf(MI_T("class: %s\n"), decl->name);
 169 krisbash 1.1         UT_ASSERT(ut::_StrToFalse("unexpected classname"));
 170                  }
 171              }
 172              
 173              void ClassDeclCallback_Q(const MI_ClassDecl* decl, void* )
 174              {
 175                  // verify class definition
 176                  if ( ut::String(MI_T("X")) == decl->name )
 177                  {
 178                      UT_ASSERT( decl->superClass == 0 ||
 179                          ut::String() == decl->superClass);
 180                  }
 181                  else if ( ut::String(MI_T("Y")) == decl->name )
 182                  {
 183                      UT_ASSERT( decl->superClass != 0 &&
 184                          ut::String(MI_T("X")) == decl->superClass);
 185                  }
 186                  else
 187                  {
 188                      printf(MI_T("class: %s\n"), decl->name);
 189                      UT_ASSERT(ut::_StrToFalse("unexpected classname"));
 190 krisbash 1.1     }
 191              }
 192              
 193              void QualifierDeclCallback(const MI_QualifierDecl* decl, void* )
 194              {
 195                  //printf("qualifier: %s\n", decl->name);
 196                  if ( ut::String(MI_T("Association")) == decl->name ||
 197                       ut::String(MI_T("Indication")) == decl->name ||
 198                       ut::String(MI_T("Abstract")) == decl->name ||
 199                       ut::String(MI_T("Aggregate")) == decl->name ||
 200                       ut::String(MI_T("Aggregation")) == decl->name ||
 201                       ut::String(MI_T("Composition")) == decl->name ||
 202                       ut::String(MI_T("Counter")) == decl->name ||
 203                       ut::String(MI_T("DN")) == decl->name ||
 204                       ut::String(MI_T("EmbeddedObject")) == decl->name ||
 205                       ut::String(MI_T("Exception")) == decl->name ||
 206                       ut::String(MI_T("Experimental")) == decl->name ||
 207                       ut::String(MI_T("Gauge")) == decl->name ||
 208                       ut::String(MI_T("In")) == decl->name ||
 209                       ut::String(MI_T("Key")) == decl->name ||
 210                       ut::String(MI_T("Octetstring")) == decl->name ||
 211 krisbash 1.1          ut::String(MI_T("Out")) == decl->name ||
 212                       ut::String(MI_T("Read")) == decl->name ||
 213                       ut::String(MI_T("Required")) == decl->name ||
 214                       ut::String(MI_T("Static")) == decl->name ||
 215                       ut::String(MI_T("Terminal")) == decl->name ||
 216                       ut::String(MI_T("Weak")) == decl->name ||
 217                       ut::String(MI_T("Write")) == decl->name ||
 218                       ut::String(MI_T("BooleanQ")) == decl->name ||
 219                       ut::String(MI_T("SMS_Report")) == decl->name )
 220                  {
 221                      UT_ASSERT( decl->type == MI_BOOLEAN );
 222                  }
 223                  else if ( ut::String(MI_T("ArrayType")) == decl->name ||
 224                       ut::String(MI_T("Description")) == decl->name ||
 225                       ut::String(MI_T("DisplayName")) == decl->name ||
 226                       ut::String(MI_T("EmbeddedInstance")) == decl->name ||
 227                       ut::String(MI_T("Nonlocal")) == decl->name ||
 228                       ut::String(MI_T("NonlocalType")) == decl->name ||
 229                       ut::String(MI_T("NullValue")) == decl->name ||
 230                       ut::String(MI_T("Override")) == decl->name ||
 231                       ut::String(MI_T("Propagated")) == decl->name ||
 232 krisbash 1.1          ut::String(MI_T("Revision")) == decl->name ||
 233                       ut::String(MI_T("Schema")) == decl->name ||
 234                       ut::String(MI_T("Source")) == decl->name ||
 235                       ut::String(MI_T("SourceType")) == decl->name ||
 236                       ut::String(MI_T("UMLPackagePath")) == decl->name ||
 237                       ut::String(MI_T("Units")) == decl->name ||
 238                       ut::String(MI_T("Version")) == decl->name ||
 239                       ut::String(MI_T("StringQ")) == decl->name ||
 240                       ut::String(MI_T("SMS_GroupName")) == decl->name ||
 241                       ut::String(MI_T("SMS_Class_ID")) == decl->name ||
 242                       ut::String(MI_T("SMS_Units")) == decl->name ||
 243                       ut::String(MI_T("SMS_Group_Name")) == decl->name )
 244                  {
 245                      UT_ASSERT( decl->type == MI_STRING );
 246                  }
 247                  else if ( ut::String(MI_T("BitMap")) == decl->name ||
 248                      ut::String(MI_T("BitValues")) == decl->name ||
 249                      ut::String(MI_T("ClassConstraint")) == decl->name ||
 250                      ut::String(MI_T("Deprecated")) == decl->name ||
 251                      ut::String(MI_T("MappingStrings")) == decl->name ||
 252                      ut::String(MI_T("MethodConstraint")) == decl->name ||
 253 krisbash 1.1         ut::String(MI_T("ModelCorrespondence")) == decl->name ||
 254                      ut::String(MI_T("PropertyConstraint")) == decl->name ||
 255                      ut::String(MI_T("ValueMap")) == decl->name ||
 256                      ut::String(MI_T("Values")) == decl->name ||
 257                      ut::String(MI_T("StringAQ")) == decl->name )
 258                  {
 259                      UT_ASSERT( decl->type == MI_STRINGA );
 260                  }
 261                  else if ( ut::String(MI_T("Max")) == decl->name ||
 262                      ut::String(MI_T("MaxLen")) == decl->name ||
 263                      ut::String(MI_T("Min")) == decl->name ||
 264                      ut::String(MI_T("MinLen")) == decl->name ||
 265                      ut::String(MI_T("Uint32Q")) == decl->name ||
 266                      ut::String(MI_T("X")) == decl->name ||
 267                      ut::String(MI_T("Y")) == decl->name ||
 268                      ut::String(MI_T("Z")) == decl->name  )
 269                  {
 270                      UT_ASSERT( decl->type == MI_UINT32 );
 271                  }
 272                  else if ( ut::String(MI_T("MaxValue")) == decl->name ||
 273                      ut::String(MI_T("MinValue")) == decl->name ||
 274 krisbash 1.1         ut::String(MI_T("Sint64Q")) == decl->name )
 275                  {
 276                      UT_ASSERT( decl->type == MI_SINT64 );
 277                  }
 278                  else if ( ut::String(MI_T("Sint8Q")) == decl->name )
 279                  {
 280                      UT_ASSERT( decl->type == MI_SINT8 );
 281                  }
 282                  else if ( ut::String(MI_T("Uint8Q")) == decl->name )
 283                  {
 284                      UT_ASSERT( decl->type == MI_UINT8 );
 285                  }
 286                  else if ( ut::String(MI_T("Sint16Q")) == decl->name )
 287                  {
 288                      UT_ASSERT( decl->type == MI_SINT16 );
 289                  }
 290                  else if ( ut::String(MI_T("Uint16Q")) == decl->name )
 291                  {
 292                      UT_ASSERT( decl->type == MI_UINT16 );
 293                  }
 294                  else if ( ut::String(MI_T("Sint32Q")) == decl->name )
 295 krisbash 1.1     {
 296                      UT_ASSERT( decl->type == MI_SINT32 );
 297                  }
 298                  else if ( ut::String(MI_T("Uint64Q")) == decl->name )
 299                  {
 300                      UT_ASSERT( decl->type == MI_UINT64 );
 301                  }
 302                  else if ( ut::String(MI_T("Real32Q")) == decl->name )
 303                  {
 304                      UT_ASSERT( decl->type == MI_REAL32 );
 305                  }
 306                  else if ( ut::String(MI_T("Real64Q")) == decl->name )
 307                  {
 308                      UT_ASSERT( decl->type == MI_REAL64 );
 309                  }
 310                  else if ( ut::String(MI_T("Char16Q")) == decl->name )
 311                  {
 312                      UT_ASSERT( decl->type == MI_CHAR16 );
 313                  }
 314                  else if ( ut::String(MI_T("DatetimeQ")) == decl->name ||
 315                      ut::String(MI_T("DatetimeQ2")) == decl->name )
 316 krisbash 1.1     {
 317                      UT_ASSERT( decl->type == MI_DATETIME );
 318                  }
 319                  else if ( ut::String(MI_T("BooleanAQ")) == decl->name )
 320                  {
 321                      UT_ASSERT( decl->type == MI_BOOLEANA );
 322                  }
 323                  else if ( ut::String(MI_T("Sint8AQ")) == decl->name )
 324                  {
 325                      UT_ASSERT( decl->type == MI_SINT8A );
 326                  }
 327                  else if ( ut::String(MI_T("Uint8AQ")) == decl->name )
 328                  {
 329                      UT_ASSERT( decl->type == MI_UINT8A );
 330                  }
 331                  else if ( ut::String(MI_T("Sint16AQ")) == decl->name )
 332                  {
 333                      UT_ASSERT( decl->type == MI_SINT16A );
 334                  }
 335                  else if ( ut::String(MI_T("Uint16AQ")) == decl->name )
 336                  {
 337 krisbash 1.1         UT_ASSERT( decl->type == MI_UINT16A );
 338                  }
 339                  else if ( ut::String(MI_T("Sint32AQ")) == decl->name )
 340                  {
 341                      UT_ASSERT( decl->type == MI_SINT32A );
 342                  }
 343                  else if ( ut::String(MI_T("Uint32AQ")) == decl->name )
 344                  {
 345                      UT_ASSERT( decl->type == MI_UINT32A );
 346                  }
 347                  else if ( ut::String(MI_T("Sint64AQ")) == decl->name )
 348                  {
 349                      UT_ASSERT( decl->type == MI_SINT64A );
 350                  }
 351                  else if ( ut::String(MI_T("Uint64AQ")) == decl->name )
 352                  {
 353                      UT_ASSERT( decl->type == MI_UINT64A );
 354                  }
 355                  else if ( ut::String(MI_T("Real32AQ")) == decl->name )
 356                  {
 357                      UT_ASSERT( decl->type == MI_REAL32A );
 358 krisbash 1.1     }
 359                  else if ( ut::String(MI_T("Real64AQ")) == decl->name )
 360                  {
 361                      UT_ASSERT( decl->type == MI_REAL64A );
 362                  }
 363                  else if ( ut::String(MI_T("Char16AQ")) == decl->name )
 364                  {
 365                      UT_ASSERT( decl->type == MI_CHAR16A );
 366                  }
 367                  else if ( ut::String(MI_T("DatetimeAQ")) == decl->name )
 368                  {
 369                      UT_ASSERT( decl->type == MI_DATETIMEA );
 370                  }
 371                  else
 372                  {
 373                      printf(MI_T("qualifier: %s\n"), decl->name);
 374                      UT_ASSERT(ut::_StrToFalse("unexpected qualifier"));
 375                  }
 376              }
 377              END_EXTERNC
 378              
 379 krisbash 1.1 static string findMofFile(const char* file)
 380              {
 381                  string root = OMI_GetPath(ID_PREFIX);
 382                  return ut::findSampleFile(root.c_str(), "tests/mof/", file);
 383              }
 384              
 385              static int ParseFile(const char* file, bool ignore_callbacks, bool use_quiet_callback)
 386              {
 387                  MOF_Parser* parser;
 388              
 389                  parser = MOF_Parser_New(0, 0);
 390              
 391                  MOF_Parser_SetErrorCallback(parser, use_quiet_callback ? ErrorCallback_Quiet : ErrorCallback, NULL);
 392                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
 393                  if ( !ignore_callbacks)
 394                  {
 395                      MOF_Parser_SetPragmaCallback(parser, PragmaCallback, NULL);
 396                      MOF_Parser_SetClassDeclCallback(parser, ClassDeclCallback_Q, NULL);
 397                      //MOF_Parser_SetQualifierDeclCallback(parser, QualifierDeclCallback, NULL);
 398                  }
 399              
 400 krisbash 1.1     /* clear results from previous run */
 401                  s_results.clear();
 402              
 403                  /* Parse the file */
 404                  int res = MOF_Parser_Parse(parser, file);
 405              
 406                  /* Delete the parser */
 407                  MOF_Parser_Delete(parser);
 408              
 409                  return res;
 410              }
 411              
 412              NitsSetup(TestMofSetup)
 413              {
 414                  NitsDisableFaultSim;
 415                  Strlcpy(TEMP_FILE, OMI_GetPath(ID_TMPDIR), sizeof(TEMP_FILE));
 416                  Strlcat(TEMP_FILE, "/test_temp.tmp", sizeof(TEMP_FILE));
 417              
 418              #if 0
 419                  string root = OMI_GetPath(ID_PREFIX);
 420                  root += "/unittest";
 421 krisbash 1.1     Chdir(root.c_str());
 422              #endif
 423                  s_results.clear();
 424              
 425              #ifndef _MSC_VER
 426                  Chdir(CONFIG_SRCDIR);
 427              #endif
 428              }
 429              NitsEndSetup
 430              
 431              NitsCleanup(TestMofSetup)
 432              {
 433                  ut::removeIfExist( TEMP_FILE );
 434              }
 435              NitsEndCleanup
 436              
 437              NitsTestWithSetup(TestFailedIfFileDoesNotExist, TestMofSetup)
 438              {    
 439                  MOF_Parser* parser;
 440              
 441                  /* Create the parser */
 442 krisbash 1.1     const char* paths [] = { "." };
 443              
 444                  parser = MOF_Parser_New(paths, sizeof(paths)/sizeof(paths[0]));
 445                  //MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
 446                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
 447                  MOF_Parser_SetPragmaCallback(parser, PragmaCallback, NULL);
 448                  MOF_Parser_SetClassDeclCallback(parser, ClassDeclCallback, NULL);
 449                  MOF_Parser_SetQualifierDeclCallback(parser, QualifierDeclCallback, NULL);
 450              
 451                  /* expecting error */
 452                  int r = MOF_Parser_Parse(parser, "fileThatDoesnotExist.mof");
 453              
 454                  MOF_Parser_Delete(parser);
 455              
 456                  UT_ASSERT (r != 0);
 457              }
 458              NitsEndTest
 459              
 460              NitsTestWithSetup(TestParseMofClasses, TestMofSetup)
 461              {
 462                  MOF_Parser* parser;
 463 krisbash 1.1 
 464                  /* Create the parser */
 465                  const char* paths [] = { "." };
 466              
 467                  /* Parse the file with extensions enabled */
 468              
 469                  parser = MOF_Parser_New(paths, sizeof(paths)/sizeof(paths[0]));
 470                  MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
 471                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
 472                  MOF_Parser_SetPragmaCallback(parser, PragmaCallback, NULL);
 473                  MOF_Parser_SetClassDeclCallback(parser, ClassDeclCallback, NULL);
 474                  MOF_Parser_SetQualifierDeclCallback(parser, QualifierDeclCallback, NULL);
 475                  MOF_Parser_EnableExtensions(parser, MI_TRUE);
 476              
 477                  UT_ASSERT (MOF_Parser_Parse(parser, findMofFile("classes.mof").c_str()) == 0);
 478              
 479                  UT_ASSERT( s_results.m_error.empty() );
 480              
 481                  /* Delete the parser */
 482                  MOF_Parser_Delete(parser);
 483              
 484 krisbash 1.1     /* Parse the file with extensions disabled */
 485              
 486                  parser = MOF_Parser_New(paths, sizeof(paths)/sizeof(paths[0]));
 487                  MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
 488                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
 489                  MOF_Parser_SetPragmaCallback(parser, PragmaCallback, NULL);
 490                  MOF_Parser_SetClassDeclCallback(parser, ClassDeclCallback, NULL);
 491                  MOF_Parser_SetQualifierDeclCallback(parser, QualifierDeclCallback, NULL);
 492                  MOF_Parser_EnableExtensions(parser, MI_FALSE);
 493              
 494                  UT_ASSERT (MOF_Parser_Parse(parser, findMofFile("classes.mof").c_str()) != 0);
 495              
 496                  UT_ASSERT( !s_results.m_error.empty() );
 497              
 498                  /* Delete the parser */
 499                  MOF_Parser_Delete(parser);
 500              }
 501              NitsEndTest
 502              
 503              static char s_MofString[] =
 504              {
 505 krisbash 1.1     "Qualifier In : boolean = true, Scope(parameter), Flavor(DisableOverride);\n"
 506                  "\n"
 507                  "Qualifier Out : boolean = true, Scope(parameter), Flavor(DisableOverride);\n"
 508                  "\n"
 509                  "Qualifier Key : boolean = true, Scope(property, reference), Flavor(DisableOverride);\n"
 510                  "\n"
 511                  "Qualifier Static : boolean = true, Scope(method, property), Flavor(DisableOverride);\n"
 512                  "\n"
 513                  "class MyClass\n"
 514                  "{\n"
 515                  "    [Key] MyClass REF Left;\n"
 516                  "    [Key] MyClass REF Right;\n"
 517                  "};\n"
 518                  "\n"
 519                  "class YourClass : MyClass\n"
 520                  "{\n"
 521                  "    [Key] String MyKey;\n"
 522                  "    String YourProperty;\n"
 523                  "    uint32 AnotherProperty;\n"
 524                  "\n"
 525                  "    [Static] Uint32 Foo(\n"
 526 krisbash 1.1     "        [In] String Arg1,\n"
 527                  "        [In, Out] String Arg2,\n"
 528                  "        [In(false), Out] String Arg3);\n"
 529                  "};\n"
 530                  "\n"
 531                  "instance of YourClass as $Y\n"
 532                  "{\n"
 533                  "    MyKey = \"My Key\";\n"
 534                  "    YourProperty = \"Your Property\";\n"
 535                  "    AnotherProperty = 3;\n"
 536                  "};\n"
 537              };
 538              
 539              NitsTestWithSetup(TestParseMofString, TestMofSetup)
 540              {
 541                  MOF_Parser* parser;
 542              
 543                  /* Create the parser */
 544                  const char* paths [] = { "." };
 545              
 546                  /* Parse the file with extensions disabled */
 547 krisbash 1.1 
 548                  parser = MOF_Parser_New(paths, sizeof(paths)/sizeof(paths[0]));
 549                  MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
 550                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
 551                  MOF_Parser_SetPragmaCallback(parser, PragmaCallback, NULL);
 552                  MOF_Parser_SetClassDeclCallback(parser, ClassDeclCallback, NULL);
 553                  MOF_Parser_SetQualifierDeclCallback(parser, QualifierDeclCallback, NULL);
 554                  MOF_Parser_EnableExtensions(parser, MI_FALSE);
 555              
 556                  UT_ASSERT (MOF_Parser_ParseString(parser, s_MofString) != 0);
 557              
 558                  UT_ASSERT( !s_results.m_error.empty() );
 559              
 560                  /* Delete the parser */
 561                  MOF_Parser_Delete(parser);
 562              }
 563              NitsEndTest
 564              
 565              NitsTestWithSetup(TestAllTypesOfQualifiers, TestMofSetup)
 566              {
 567                  MOF_Parser* parser;
 568 krisbash 1.1  
 569                  /* Create the parser */
 570                  const char* paths [] = {"."};
 571              
 572                  parser = MOF_Parser_New(paths, sizeof(paths)/sizeof(paths[0]));
 573                  MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
 574                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
 575                  MOF_Parser_SetPragmaCallback(parser, PragmaCallback, NULL);
 576                  MOF_Parser_SetClassDeclCallback(parser, ClassDeclCallback_Q, NULL);
 577                  MOF_Parser_SetQualifierDeclCallback(parser, QualifierDeclCallback, NULL);
 578              
 579                  /* Parse the file */
 580                  UT_ASSERT (MOF_Parser_Parse(parser, findMofFile("quals.mof").c_str()) == 0);
 581              
 582                  /* Delete the parser */
 583                  MOF_Parser_Delete(parser);
 584              
 585                  UT_ASSERT( s_results.m_error.empty() );
 586              }
 587              NitsEndTest
 588              
 589 krisbash 1.1 NitsTestWithSetup(TestDumpFunction, TestMofSetup)
 590              {
 591                  MOF_Parser* parser;
 592              
 593                  parser = MOF_Parser_New(0,0);
 594                  MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
 595                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
 596                  MOF_Parser_SetPragmaCallback(parser, PragmaCallback, NULL);
 597                  MOF_Parser_SetClassDeclCallback(parser, ClassDeclCallback, NULL);
 598                  MOF_Parser_SetQualifierDeclCallback(parser, QualifierDeclCallback, NULL);
 599                  MOF_Parser_EnableExtensions(parser, MI_TRUE);
 600              
 601                  /* Parse the file */
 602                  UT_ASSERT (MOF_Parser_Parse(parser, findMofFile("classes.mof").c_str()) == 0);
 603              
 604                  /* Dump */
 605                  FILE* f_null = File_Open(NULL_FILE,"a");
 606              
 607                  fprintf(f_null, "test out\n");
 608                  MOF_Parser_Dump(parser, f_null);
 609                  fclose(f_null);
 610 krisbash 1.1 
 611                  // if you want to see the output, un-comment next line
 612                  // MOF_Parser_Dump(parser, stdout);
 613              
 614                  /* Delete the parser */
 615                  MOF_Parser_Delete(parser);
 616              
 617                  UT_ASSERT( s_results.m_error.empty() );
 618              }
 619              NitsEndTest
 620              
 621              static void ParseContentExpectToFail( const char* content, bool ignore_callbacks = true, bool use_quiet_callback = true )
 622              {
 623                  ut::writeFileContent(TEMP_FILE, 
 624                      vector<unsigned char>( reinterpret_cast<const unsigned char*>(content), 
 625                      reinterpret_cast<const unsigned char*>(content)+strlen(content)));
 626              
 627                  UT_ASSERT( 0 != ParseFile(TEMP_FILE, ignore_callbacks, use_quiet_callback) );
 628              
 629                  // expect errors
 630                  UT_ASSERT( !s_results.m_error.empty() );
 631 krisbash 1.1 }
 632              
 633              static void ParseContentExpectToSucceed( const char* content, bool ignore_callbacks = false, bool use_quiet_callback = false )
 634              {
 635                  ut::writeFileContent( TEMP_FILE, vector<unsigned char>( reinterpret_cast<const unsigned char*>(content), 
 636                      reinterpret_cast<const unsigned char*>(content)+strlen(content)));
 637              
 638                  UT_ASSERT( 0 == ParseFile(TEMP_FILE, ignore_callbacks, use_quiet_callback) );
 639              
 640                  // expect no errors
 641                  UT_ASSERT( s_results.m_error.empty() );
 642              }
 643              
 644              static void AddQualifiersParseContentExpectToFail(const char* content, bool ignore_callbacks = true, bool use_quiet_callback = true )
 645              {
 646              #if defined(_MSC_VER)
 647                  string data = "\
 648              #pragma include (\"../../share/omischema/" CONFIG_CIMSCHEMA "/qualifiers.mof\")\n\
 649              #pragma include (\"../../share/omischema/" CONFIG_CIMSCHEMA "/qualifiers_optional.mof\")\n\
 650              ";
 651              #else
 652 krisbash 1.1     string data = "\
 653              #pragma include (\"./share/omischema/" CONFIG_CIMSCHEMA "/qualifiers.mof\")\n\
 654              #pragma include (\"./share/omischema/" CONFIG_CIMSCHEMA "/qualifiers_optional.mof\")\n\
 655              ";
 656              #endif
 657              
 658                  data += content;
 659              
 660                  ParseContentExpectToFail(data.c_str(), ignore_callbacks, use_quiet_callback);
 661              }
 662              
 663              static void AddQualifiersParseContentExpectToSucceed(const char* content, bool ignore_callbacks = false, bool use_quiet_callback = false)
 664              {
 665              #if defined(_MSC_VER)
 666                      string data = "\
 667              #pragma include (\"../../share/omischema/" CONFIG_CIMSCHEMA "/qualifiers.mof\")\n\
 668              #pragma include (\"../../share/omischema/" CONFIG_CIMSCHEMA "/qualifiers_optional.mof\")\n\
 669                  ";
 670              #else
 671                      string data = "\
 672              #pragma include (\"./share/omischema/" CONFIG_CIMSCHEMA "/qualifiers.mof\")\n\
 673 krisbash 1.1 #pragma include (\"./share/omischema/" CONFIG_CIMSCHEMA "/qualifiers_optional.mof\")\n\
 674                  ";
 675              #endif
 676              
 677                  data += content;
 678              
 679                  ParseContentExpectToSucceed(data.c_str(), ignore_callbacks, use_quiet_callback);
 680              }
 681              
 682              
 683              NitsTestWithSetup(TestValidDateString, TestMofSetup)
 684              {
 685                  // create a mof file with valid date-time quilifier
 686                  const char content [] = 
 687                      "Qualifier DatetimeQ : Datetime = \"20091225123000.123456-360\", Scope(any), Flavor(DisableOverride);\n\
 688                      [DatetimeQ(\"12345678121212.123456:000\")] \n\
 689                      class X \n\
 690                      {\n\
 691                      };\n";
 692              
 693              
 694 krisbash 1.1     ParseContentExpectToSucceed(content);
 695              }
 696              NitsEndTest
 697              
 698              
 699              NitsTestWithSetup(TestInvalidDateShortString, TestMofSetup)
 700              {
 701                  // create a mof file with invalid date-time quilifier
 702                  const char content [] = 
 703                      "Qualifier DatetimeQ : Datetime = \"20091225123000.123456-36\", Scope(any), Flavor(DisableOverride);";
 704              
 705                  ParseContentExpectToFail(content);
 706              }
 707              NitsEndTest
 708              
 709              
 710              NitsTestWithSetup(TestInvalidDateInvalidString, TestMofSetup)
 711              {
 712                  // create a mof file with invalid date-time quilifier
 713                  const char content [] = "Qualifier DatetimeQ : Datetime = \"xxx\", Scope(any), Flavor(DisableOverride);";
 714              
 715 krisbash 1.1     ParseContentExpectToFail(content);
 716              }
 717              NitsEndTest
 718              
 719              
 720              NitsTestWithSetup(TestInvalidYear, TestMofSetup)
 721              {
 722                  // create a mof file with invalid date-time quilifier                  
 723                  const char content [] = "Qualifier DatetimeQ : Datetime = \"y0091225123000.123456-360\", Scope(any), Flavor(DisableOverride);";
 724              
 725                  ParseContentExpectToFail(content);
 726              }
 727              NitsEndTest
 728              
 729              
 730              NitsTestWithSetup(TestInvalidMonth, TestMofSetup)
 731              {
 732                  // create a mof file with invalid date-time quilifier                  
 733                  const char content [] = "Qualifier DatetimeQ : Datetime = \"20091x25123000.123456-360\", Scope(any), Flavor(DisableOverride);";
 734              
 735                  ParseContentExpectToFail(content);
 736 krisbash 1.1 }
 737              NitsEndTest
 738              
 739              
 740              NitsTestWithSetup(TestInvalidDay, TestMofSetup)
 741              {
 742                  // create a mof file with invalid date-time quilifier                  
 743                  const char content [] = "Qualifier DatetimeQ : Datetime = \"2009112z123000.123456-360\", Scope(any), Flavor(DisableOverride);";
 744              
 745                  ParseContentExpectToFail(content);
 746              }
 747              NitsEndTest
 748              
 749              
 750              NitsTestWithSetup(TestInvalidHour, TestMofSetup)
 751              {
 752                  // create a mof file with invalid date-time quilifier                  
 753                  const char content [] = "Qualifier DatetimeQ : Datetime = \"20091121v23000.123456-360\", Scope(any), Flavor(DisableOverride);";
 754              
 755                  ParseContentExpectToFail(content);
 756              }
 757 krisbash 1.1 NitsEndTest
 758              
 759              
 760              NitsTestWithSetup(TestInvalidMin, TestMofSetup)
 761              {
 762                  // create a mof file with invalid date-time quilifier                  
 763                  const char content [] = "Qualifier DatetimeQ : Datetime = \"20091121v23000112hh56-360\", Scope(any), Flavor(DisableOverride);";
 764              
 765                  ParseContentExpectToFail(content);
 766              }
 767              NitsEndTest
 768              
 769              
 770              NitsTestWithSetup(TestInvalidSec, TestMofSetup)
 771              {
 772                  // create a mof file with invalid date-time quilifier                  
 773                  const char content [] = "Qualifier DatetimeQ : Datetime = \"20091121v2300011256ss-360\", Scope(any), Flavor(DisableOverride);";
 774              
 775                  ParseContentExpectToFail(content);
 776              }
 777              NitsEndTest
 778 krisbash 1.1 
 779              
 780              NitsTestWithSetup(TestInvalidDateFormat2, TestMofSetup)
 781              {
 782                  // create a mof file with invalid date-time quilifier                  
 783                  const char content [] = "Qualifier DatetimeQ : Datetime = \"12345?78121212.123456:000\", Scope(any), Flavor(DisableOverride);";
 784              
 785                  ParseContentExpectToFail(content);
 786              }
 787              NitsEndTest
 788              
 789              
 790              NitsTestWithSetup(TestInvalidTimeFormat2, TestMofSetup)
 791              {
 792                  //hh
 793                  ParseContentExpectToFail(
 794                      "Qualifier DatetimeQ : Datetime = \"123456781g1212.123456:000\", Scope(any), Flavor(DisableOverride);");
 795                  //mm
 796                  ParseContentExpectToFail(
 797                      "Qualifier DatetimeQ : Datetime = \"1234567812i212.123456:000\", Scope(any), Flavor(DisableOverride);");
 798                  //ss
 799 krisbash 1.1     ParseContentExpectToFail(
 800                      "Qualifier DatetimeQ : Datetime = \"123456781212--.123456:000\", Scope(any), Flavor(DisableOverride);");
 801              
 802                  //MMMMMM
 803                  ParseContentExpectToFail(
 804                      "Qualifier DatetimeQ : Datetime = \"12345678121212.1!3456:000\", Scope(any), Flavor(DisableOverride);");
 805                  ParseContentExpectToFail(
 806                      "Qualifier DatetimeQ : Datetime = \"12345678121212.12.456:000\", Scope(any), Flavor(DisableOverride);");
 807                  ParseContentExpectToFail(
 808                      "Qualifier DatetimeQ : Datetime = \"12345678121212.1234--:000\", Scope(any), Flavor(DisableOverride);");
 809              
 810                  // .MM
 811                  ParseContentExpectToFail(
 812                      "Qualifier DatetimeQ : Datetime = \"12345678121212!123456:000\", Scope(any), Flavor(DisableOverride);");
 813              
 814                  // :000
 815                  ParseContentExpectToFail(
 816                      "Qualifier DatetimeQ : Datetime = \"12345678121212.123456:x00\", Scope(any), Flavor(DisableOverride);");
 817                  ParseContentExpectToFail(
 818                      "Qualifier DatetimeQ : Datetime = \"12345678121212.123456:0x0\", Scope(any), Flavor(DisableOverride);");
 819                  ParseContentExpectToFail(
 820 krisbash 1.1         "Qualifier DatetimeQ : Datetime = \"12345678121212.123456:00x\", Scope(any), Flavor(DisableOverride);");
 821              
 822              }
 823              NitsEndTest
 824              
 825              
 826              
 827              NitsTestWithSetup(TestInvalidDateTimeArray, TestMofSetup)
 828              {
 829                  // create a mof file with invalid date-time quilifier
 830                  const char content [] = "Qualifier DatetimeQA : Datetime[] = { \"xxx1225123000.123456-360\" } , Scope(any), Flavor(DisableOverride);";
 831              
 832                  ParseContentExpectToFail(content);
 833              }
 834              NitsEndTest
 835              
 836              
 837              NitsTestWithSetup(TestInvalidDateTimeLongArray, TestMofSetup)
 838              {
 839                  // create a mof file with invalid date-time quilifier
 840                  const char content [] = "Qualifier DatetimeQA : Datetime[] = { \"20091225123000.123456-360\", \"20091225123000.123456-360\", \"20091225123000.123456-360\",\"xxx\" } , Scope(any), Flavor(DisableOverride);";
 841 krisbash 1.1 
 842                  ParseContentExpectToFail(content);
 843              }
 844              NitsEndTest
 845              
 846              
 847              NitsTestWithSetup(TestSyntaxErrorThatCausedHanging, TestMofSetup)
 848              {
 849                  // this specific file caused hanging initially and added for regression purposes
 850                  UT_ASSERT( 0 != ParseFile(findMofFile("syntaxerror.mof").c_str(), false, true) );
 851              
 852                  // expect errors
 853                  UT_ASSERT( !s_results.m_error.empty() );
 854              }
 855              NitsEndTest
 856              
 857              
 858              NitsTestWithSetup(TestParseMofWithInclude, TestMofSetup)
 859              {
 860                  // check 'pragma include' works
 861                  string content = "#pragma include(\"";
 862 krisbash 1.1 
 863                  content += findMofFile("quals.mof") + "\")";
 864              
 865                  ParseContentExpectToSucceed(content.c_str(), false);
 866              }
 867              NitsEndTest
 868              
 869              
 870              NitsTestWithSetup(TestMinValueIncompatibleType, TestMofSetup)
 871              {
 872                  AddQualifiersParseContentExpectToFail(
 873                      "class T { [MinValue(1234)]ut::String s = \"123\"; /* incompatible type */ };" );
 874              }
 875              NitsEndTest
 876              
 877              
 878              NitsTestWithSetup(TestMinValueU8, TestMofSetup)
 879              {
 880                  AddQualifiersParseContentExpectToSucceed(
 881                      "class T { [MinValue(14)]Uint8 x = 15; /* ok */};", true);
 882                  AddQualifiersParseContentExpectToSucceed(
 883 krisbash 1.1         "class T { [MinValue(255)]Uint8 x = 255; /* ok */};", true);
 884              }
 885              NitsEndTest
 886              
 887              
 888              NitsTestWithSetup(TestInvalidMinValueU8, TestMofSetup)
 889              {
 890                  AddQualifiersParseContentExpectToFail(
 891                      "class T { [MinValue(1234)]Uint8 x = 0; /* overflow */ };" );
 892                  AddQualifiersParseContentExpectToFail(
 893                      "class T { [MinValue(1234)]Uint8 x = 256; /* overflow */ };" );
 894                  AddQualifiersParseContentExpectToFail(
 895                      "class T { [MinValue(1)]Uint8 x = 0; /* value too small */ };" );
 896                  AddQualifiersParseContentExpectToFail(
 897                      "class T { [MinValue(1)]Uint8 x = -1; /* underflow */ };" );
 898              }
 899              NitsEndTest
 900              
 901              
 902              NitsTestWithSetup(TestMinValueU16, TestMofSetup)
 903              {
 904 krisbash 1.1     AddQualifiersParseContentExpectToSucceed(
 905                      "class T { [MinValue(1000)]Uint16 x = 1000; /* ok */};", true);
 906                  AddQualifiersParseContentExpectToSucceed(
 907                      "class T { [MinValue(65535)]Uint16 x = 65535; /* ok */};", true);
 908              }
 909              NitsEndTest
 910              
 911              
 912              NitsTestWithSetup(TestInvalidMinValueU16, TestMofSetup)
 913              {
 914                  // u16 range is 0-65535
 915                  AddQualifiersParseContentExpectToFail(
 916                      "class T { [MinValue(65536)]Uint16 x = 0; /* overflow */ };" );
 917                  AddQualifiersParseContentExpectToFail(
 918                      "class T { [MinValue(0)]Uint16 x = 65536; /* overflow */ };" );
 919                  AddQualifiersParseContentExpectToFail(
 920                      "class T { [MinValue(1)]Uint16 x = 0; /* value too small */ };" );
 921                  AddQualifiersParseContentExpectToFail(
 922                      "class T { [MinValue(1)]Uint16 x = -1; /* underflow */ };" );
 923              }
 924              NitsEndTest
 925 krisbash 1.1 
 926              
 927              NitsTestWithSetup(TestMinValueU32, TestMofSetup)
 928              {
 929                  AddQualifiersParseContentExpectToSucceed(
 930                      "class T { [MinValue(999)]Uint32 x = 1000; /* ok */};", true);
 931                  AddQualifiersParseContentExpectToSucceed(
 932                      "class T { [MinValue(4294967295)]Uint32 x = 4294967295; /* ok */};", true);
 933              }
 934              NitsEndTest
 935              
 936              
 937              NitsTestWithSetup(TestInvalidMinValueU32, TestMofSetup)
 938              {
 939                  // u32 range is 0-4294967295
 940                  AddQualifiersParseContentExpectToFail(
 941                      "class T { [MinValue(4294967296)]Uint32 x = 0; /* overflow */ };" );
 942                  AddQualifiersParseContentExpectToFail(
 943                      "class T { [MinValue(0)]Uint32 x = 4294967296; /* overflow */ };" );
 944                  AddQualifiersParseContentExpectToFail(
 945                      "class T { [MinValue(1)]Uint32 x = 0; /* value too small */ };" );
 946 krisbash 1.1     AddQualifiersParseContentExpectToFail(
 947                      "class T { [MinValue(1)]Uint32 x = -1; /* underflow */ };" );
 948              }
 949              NitsEndTest
 950              
 951              
 952              NitsTestWithSetup(TestMinValueU64, TestMofSetup)
 953              {
 954                  AddQualifiersParseContentExpectToSucceed(
 955                      "class T { [MinValue(999)]Uint64 x = 1000; /* ok */};", true);
 956                  AddQualifiersParseContentExpectToSucceed(
 957                      "class T { [MinValue(9223372036854775807)]Uint64 x = 9223372036854775807; /* ok */};", true);
 958              #if 0
 959                  //ATTN: values greater than sint64_max are not supported
 960                  AddQualifiersParseContentExpectToSucceed(
 961                      "class T { Uint64 x = 18446744073709551615; /* ok */};", true);
 962                  AddQualifiersParseContentExpectToSucceed(
 963                      "class T { [MinValue(NULL)]Uint64 x = 18446744073709551615; /* ok */};", true);
 964              #endif
 965              }
 966              NitsEndTest
 967 krisbash 1.1 
 968              
 969              NitsTestWithSetup(TestInvalidMinValueU64, TestMofSetup)
 970              {
 971                  // u64 range is 0-18446744073709551615
 972                  // practically, attributes are limitted by sint64:
 973                  // -9223372036854775807 - 1  - 9223372036854775807
 974                  // however, MinValue is Sint64, so real max for Min value is 9223372036854775807
 975              
 976                  //ATTN: values greater than sint64_max are not supported
 977                  //AddQualifiersParseContentExpectToFail(
 978                  //    "class T { [MinValue(18446744073709551616)]Uint64 x = 0; /* overflow */ };" );
 979                  //AddQualifiersParseContentExpectToFail(
 980                  //    "class T { [MinValue(0)]Uint64 x = 18446744073709551616; /* overflow */ };" );
 981              
 982                  AddQualifiersParseContentExpectToFail(
 983                      "class T { [MinValue(1)]Uint64 x = 0; /* value too small */ };" );
 984                  AddQualifiersParseContentExpectToFail(
 985                      "class T { [MinValue(1)]Uint64 x = -1; /* underflow */ };" );
 986              }
 987              NitsEndTest
 988 krisbash 1.1 
 989              
 990              NitsTestWithSetup(TestMinValueS8, TestMofSetup)
 991              {
 992                  AddQualifiersParseContentExpectToSucceed(
 993                      "class T { [MinValue(14)]Sint8 x = 15; /* ok */};", true);
 994                  AddQualifiersParseContentExpectToSucceed(
 995                      "class T { [MinValue(-128)]Sint8 x = -128; /* ok */};", true);
 996                  AddQualifiersParseContentExpectToSucceed(
 997                      "class T { [MinValue(127)]Sint8 x = 127; /* ok */};", true);
 998              }
 999              NitsEndTest
1000              
1001              
1002              NitsTestWithSetup(TestInvalidMinValueS8, TestMofSetup)
1003              {
1004                  AddQualifiersParseContentExpectToFail(
1005                      "class T { [MinValue(1234)]Sint8 x = 0; /* overflow */ };" );
1006                  AddQualifiersParseContentExpectToFail(
1007                      "class T { [MinValue(1234)]Sint8 x = 256; /* overflow */ };" );
1008                  AddQualifiersParseContentExpectToFail(
1009 krisbash 1.1         "class T { [MinValue(1)]Sint8 x = 0; /* value too small */ };" );
1010                  AddQualifiersParseContentExpectToFail(
1011                      "class T { [MinValue(-11)]Sint8 x = -12; /* value too small */ };" );
1012                  AddQualifiersParseContentExpectToFail(
1013                      "class T { [MinValue(1)]Sint8 x = -129; /* underflow */ };" );
1014              }
1015              NitsEndTest
1016              
1017              
1018              NitsTestWithSetup(TestMinValueS16, TestMofSetup)
1019              {
1020                  AddQualifiersParseContentExpectToSucceed(
1021                      "class T { [MinValue(1000)]Sint16 x = 1000; /* ok */};", true);
1022                  AddQualifiersParseContentExpectToSucceed(
1023                      "class T { [MinValue(32767)]Sint16 x = 32767; /* ok */};", true);
1024                  AddQualifiersParseContentExpectToSucceed(
1025                      "class T { [MinValue(-32768)]Sint16 x = -32768; /* ok */};", true);
1026                  AddQualifiersParseContentExpectToSucceed(
1027                      "class T { [MinValue(null)]Sint16 x = -32768; /* ok */};", true);
1028              }
1029              NitsEndTest
1030 krisbash 1.1 
1031              
1032              NitsTestWithSetup(TestInvalidMinValueS16, TestMofSetup)
1033              {
1034                  // s16 range is -32768 - 32767
1035                  AddQualifiersParseContentExpectToFail(
1036                      "class T { [MinValue(32768)]Sint16 x = 0; /* overflow */ };" );
1037                  AddQualifiersParseContentExpectToFail(
1038                      "class T { [MinValue(0)]Sint16 x = 32768; /* overflow */ };" );
1039                  AddQualifiersParseContentExpectToFail(
1040                      "class T { [MinValue(1)]Sint16 x = 0; /* value too small */ };" );
1041                  AddQualifiersParseContentExpectToFail(
1042                      "class T { [MinValue(1)]Sint16 x = -32769; /* underflow */ };" );
1043                  AddQualifiersParseContentExpectToFail(
1044                      "class T { Sint16 x = -32769; /* underflow */ };" );
1045              }
1046              NitsEndTest
1047              
1048              
1049              NitsTestWithSetup(TestMinValueS32, TestMofSetup)
1050              {
1051 krisbash 1.1     AddQualifiersParseContentExpectToSucceed(
1052                      "class T { [MinValue(999)]Sint32 x = 1000; /* ok */};", true);
1053                  AddQualifiersParseContentExpectToSucceed(
1054                      "class T { [MinValue(-2147483648)]Sint32 x = -2147483648; /* ok */};", true);
1055                  AddQualifiersParseContentExpectToSucceed(
1056                      "class T { [MinValue(-2147483648)]Sint32 x = -2147483647; /* ok */};", true);
1057                  AddQualifiersParseContentExpectToSucceed(
1058                      "class T { [MinValue(2147483647)]Sint32 x = 2147483647; /* ok */};", true);
1059              }
1060              NitsEndTest
1061              
1062              
1063              NitsTestWithSetup(TestInvalidMinValueS32, TestMofSetup)
1064              {
1065                  // s32 range is -2147483648  -   2147483647
1066                  AddQualifiersParseContentExpectToFail(
1067                      "class T { [MinValue(2147483648)]Sint32 x = 0; /* overflow */ };" );
1068                  AddQualifiersParseContentExpectToFail(
1069                      "class T { [MinValue(0)]Sint32 x = 2147483648; /* overflow */ };" );
1070                  AddQualifiersParseContentExpectToFail(
1071                      "class T { [MinValue(1)]Sint32 x = 0; /* value too small */ };" );
1072 krisbash 1.1     AddQualifiersParseContentExpectToFail(
1073                      "class T { Sint32 x = -2147483649; /* underflow */ };" );
1074              }
1075              NitsEndTest
1076              
1077              
1078              NitsTestWithSetup(TestMinValueS64, TestMofSetup)
1079              {
1080                  AddQualifiersParseContentExpectToSucceed(
1081                      "class T { [MinValue(999)]Sint64 x = 1000; /* ok */};", true);
1082                  AddQualifiersParseContentExpectToSucceed(
1083                      "class T { [MinValue(9223372036854775807)]Sint64 x = 9223372036854775807; /* ok */};", true);
1084                  AddQualifiersParseContentExpectToSucceed(
1085                      "class T { [MinValue(-9223372036854775808)]Sint64 x = -9223372036854775808; /* ok */};", true);
1086                  AddQualifiersParseContentExpectToSucceed(
1087                      "class T { [MinValue(-9223372036854775808)]Sint64 x = -9223372036854775807; /* ok */};", true);
1088              }
1089              NitsEndTest
1090              
1091              
1092              NitsTestWithSetup(TestInvalidMinValueS64, TestMofSetup)
1093 krisbash 1.1 {
1094                  // u64 range is 0-18446744073709551615
1095                  // practically, attributes are limitted by sint64:
1096                  // -9223372036854775807 - 1  - 9223372036854775807
1097                  //ATTN! int64 errors are not processed correctly yet
1098              #if 0
1099                  AddQualifiersParseContentExpectToFail(
1100                      "class T { [MinValue(9223372036854775808)]Sint64 x = 0; /* overflow */ };" );
1101                  AddQualifiersParseContentExpectToFail(
1102                      "class T { [MinValue(0)]Sint64 x = 9223372036854775808; /* overflow */ };" );
1103                  AddQualifiersParseContentExpectToFail(
1104                      "class T { Sint64 x = -9223372036854775809; /* underflow */ };" );
1105              #endif
1106                  AddQualifiersParseContentExpectToFail(
1107                      "class T { [MinValue(1)]Sint64 x = 0; /* value too small */ };" );
1108              }
1109              NitsEndTest
1110              
1111              
1112              NitsTestWithSetup(TestMinValueR32, TestMofSetup)
1113              {
1114 krisbash 1.1     AddQualifiersParseContentExpectToSucceed(
1115                      "class T { [MinValue(999)]Real32 x = 999.1; /* ok */};", true);
1116                  AddQualifiersParseContentExpectToSucceed(
1117                      "class T { [MinValue(0)]Real32 x = 0.1e+0; /* ok */};", true);
1118                  AddQualifiersParseContentExpectToSucceed(
1119                      "class T { [MinValue(9223372036854775807)]Real32 x = 9.3e+18; /* ok */};", true);
1120                  AddQualifiersParseContentExpectToSucceed(
1121                      "class T { [MinValue(-9223372036854775808)]Real32 x = -9.22e18; /* ok */};", true);
1122              }
1123              NitsEndTest
1124              
1125              
1126              NitsTestWithSetup(TestInvalidMinValueR32, TestMofSetup)
1127              {
1128                  AddQualifiersParseContentExpectToFail(
1129                      "class T { [MinValue(999)]Real32 x = 998.1; /* too small */};");
1130                  AddQualifiersParseContentExpectToFail(
1131                      "class T { [MinValue(0)]Real32 x = -0.1e+0; /* too small */};");
1132                  AddQualifiersParseContentExpectToFail(
1133                      "class T { [MinValue(9223372036854775807)]Real32 x = 9.2e18; /* too small */};");
1134                  AddQualifiersParseContentExpectToFail(
1135 krisbash 1.1         "class T { [MinValue(-9223372036854775808)]Real32 x = -9.23e18; /* too small */};");
1136              }
1137              NitsEndTest
1138              
1139              
1140              NitsTestWithSetup(TestMinValueR64, TestMofSetup)
1141              {
1142                  AddQualifiersParseContentExpectToSucceed(
1143                      "class T { [MinValue(999)]Real64 x = 999.1; /* ok */};", true);
1144                  AddQualifiersParseContentExpectToSucceed(
1145                      "class T { [MinValue(0)]Real64 x = 0.1e+0; /* ok */};", true);
1146                  AddQualifiersParseContentExpectToSucceed(
1147                      "class T { [MinValue(9223372036854775807)]Real64 x = 9.3e+18; /* ok */};", true);
1148                  AddQualifiersParseContentExpectToSucceed(
1149                      "class T { [MinValue(-9223372036854775808)]Real64 x = -9.22e18; /* ok */};", true);
1150              }
1151              NitsEndTest
1152              
1153              
1154              NitsTestWithSetup(TestInvalidMinValueR64, TestMofSetup)
1155              {
1156 krisbash 1.1     AddQualifiersParseContentExpectToFail(
1157                      "class T { [MinValue(999)]Real64 x = 998.1; /* too small */};");
1158                  AddQualifiersParseContentExpectToFail(
1159                      "class T { [MinValue(0)]Real64 x = -0.1e+0; /* too small */};");
1160                  AddQualifiersParseContentExpectToFail(
1161                      "class T { [MinValue(9223372036854775807)]Real64 x = 9.2e18; /* too small */};");
1162                  AddQualifiersParseContentExpectToFail(
1163                      "class T { [MinValue(-9223372036854775808)]Real64 x = -9.23e18; /* too small */};");
1164              }
1165              NitsEndTest
1166              
1167              
1168              NitsTestWithSetup(TestMaxValueIncompatibleType, TestMofSetup)
1169              {
1170                  AddQualifiersParseContentExpectToFail(
1171                      "class T { [MaxValue(1234)]ut::String s = \"123\"; /* incompatible type */ };" );
1172              }
1173              NitsEndTest
1174              
1175              
1176              
1177 krisbash 1.1 NitsTestWithSetup(TestMaxValueU8, TestMofSetup)
1178              {
1179                  AddQualifiersParseContentExpectToSucceed(
1180                      "class T { [MaxValue(14)]Uint8 x = 13; /* ok */};", true);
1181                  AddQualifiersParseContentExpectToSucceed(
1182                      "class T { [MaxValue(255)]Uint8 x = 255; /* ok */};", true);
1183              }
1184              NitsEndTest
1185              
1186              
1187              NitsTestWithSetup(TestInvalidMaxValueU8, TestMofSetup)
1188              {
1189                  AddQualifiersParseContentExpectToFail(
1190                      "class T { [MaxValue(-1)]Uint8 x = 0; /* overflow */ };" );
1191                  AddQualifiersParseContentExpectToFail(
1192                      "class T { [MaxValue(1234)]Uint8 x = 256; /* overflow */ };" );
1193                  AddQualifiersParseContentExpectToFail(
1194                      "class T { [MaxValue(1)]Uint8 x = 10; /* value too large */ };" );
1195                  AddQualifiersParseContentExpectToFail(
1196                      "class T { [MaxValue(1)]Uint8 x = -1; /* underflow */ };" );
1197              }
1198 krisbash 1.1 NitsEndTest
1199              
1200              
1201              NitsTestWithSetup(TestMaxValueU16, TestMofSetup)
1202              {
1203                  AddQualifiersParseContentExpectToSucceed(
1204                      "class T { [MaxValue(1000)]Uint16 x = 1000; /* ok */};", true);
1205                  AddQualifiersParseContentExpectToSucceed(
1206                      "class T { [MaxValue(65535)]Uint16 x = 65535; /* ok */};", true);
1207              }
1208              NitsEndTest
1209              
1210              
1211              NitsTestWithSetup(TestInvalidMaxValueU16, TestMofSetup)
1212              {
1213                  // u16 range is 0-65535
1214                  AddQualifiersParseContentExpectToFail(
1215                      "class T { [MaxValue(65536)]Uint16 x = 65536; /* overflow */ };" );
1216                  AddQualifiersParseContentExpectToFail(
1217                      "class T { [MaxValue(0)]Uint16 x = 65536; /* overflow */ };" );
1218                  AddQualifiersParseContentExpectToFail(
1219 krisbash 1.1         "class T { [MaxValue(1)]Uint16 x = 2; /* value too large */ };" );
1220                  AddQualifiersParseContentExpectToFail(
1221                      "class T { [MaxValue(1)]Uint16 x = -1; /* underflow */ };" );
1222              }
1223              NitsEndTest
1224              
1225              
1226              NitsTestWithSetup(TestMaxValueU32, TestMofSetup)
1227              {
1228                  AddQualifiersParseContentExpectToSucceed(
1229                      "class T { [MaxValue(999)]Uint32 x = 998; /* ok */};", true);
1230                  AddQualifiersParseContentExpectToSucceed(
1231                      "class T { [MaxValue(4294967295)]Uint32 x = 4294967295; /* ok */};", true);
1232              }
1233              NitsEndTest
1234              
1235              
1236              NitsTestWithSetup(TestInvalidMaxValueU32, TestMofSetup)
1237              {
1238                  // u32 range is 0-4294967295
1239                  AddQualifiersParseContentExpectToFail(
1240 krisbash 1.1         "class T { [MaxValue(4294967296)]Uint32 x = 4294967296; /* overflow */ };" );
1241                  AddQualifiersParseContentExpectToFail(
1242                      "class T { [MaxValue(0)]Uint32 x = 4294967296; /* overflow */ };" );
1243                  AddQualifiersParseContentExpectToFail(
1244                      "class T { [MaxValue(1)]Uint32 x = 100; /* value too large */ };" );
1245                  AddQualifiersParseContentExpectToFail(
1246                      "class T { [MaxValue(1)]Uint32 x = -1; /* underflow */ };" );
1247              }
1248              NitsEndTest
1249              
1250              
1251              NitsTestWithSetup(TestMaxValueU64, TestMofSetup)
1252              {
1253                  AddQualifiersParseContentExpectToSucceed(
1254                      "class T { [MaxValue(999)]Uint64 x = 997; /* ok */};", true);
1255                  AddQualifiersParseContentExpectToSucceed(
1256                      "class T { [MaxValue(9223372036854775807)]Uint64 x = 9223372036854775807; /* ok */};", true);
1257              #if 0
1258                  //ATTN: values greater than sint64_max are not supported
1259                  AddQualifiersParseContentExpectToSucceed(
1260                      "class T { Uint64 x = 18446744073709551615; /* ok */};", true);
1261 krisbash 1.1     AddQualifiersParseContentExpectToSucceed(
1262                      "class T { [MaxValue(NULL)]Uint64 x = 18446744073709551615; /* ok */};", true);
1263              #endif
1264              }
1265              NitsEndTest
1266              
1267              
1268              NitsTestWithSetup(TestInvalidMaxValueU64, TestMofSetup)
1269              {
1270                  // u64 range is 0-18446744073709551615
1271                  // practically, attributes are limitted by sint64:
1272                  // -9223372036854775807 - 1  - 9223372036854775807
1273                  // however, MaxValue is Sint64, so real max for Max value is 9223372036854775807
1274              
1275                  //ATTN: values greater than sint64_max are not supported
1276                  //AddQualifiersParseContentExpectToFail(
1277                  //    "class T { [MaxValue(18446744073709551616)]Uint64 x = 0; /* overflow */ };" );
1278                  AddQualifiersParseContentExpectToFail(
1279                      "class T { [MaxValue(0)]Uint64 x = 18446744073709551616; /* overflow */ };" );
1280              
1281                  AddQualifiersParseContentExpectToFail(
1282 krisbash 1.1         "class T { [MaxValue(1)]Uint64 x = 10; /* value too large */ };" );
1283                  // ATTN:
1284                  // next line is waiting for some bigger then 64-bit integer 
1285                  // internal representaitons of integers in the parser
1286                  AddQualifiersParseContentExpectToFail(
1287                      "class T { [MaxValue(1)]Uint64 x = -1; /* underflow */ };" );
1288              }
1289              NitsEndTest
1290              
1291              
1292              NitsTestWithSetup(TestMaxValueS8, TestMofSetup)
1293              {
1294                  AddQualifiersParseContentExpectToSucceed(
1295                      "class T { [MaxValue(14)]Sint8 x = 13; /* ok */};", true);
1296                  AddQualifiersParseContentExpectToSucceed(
1297                      "class T { [MaxValue(-128)]Sint8 x = -128; /* ok */};", true);
1298                  AddQualifiersParseContentExpectToSucceed(
1299                      "class T { [MaxValue(127)]Sint8 x = 127; /* ok */};", true);
1300              }
1301              NitsEndTest
1302              
1303 krisbash 1.1 
1304              NitsTestWithSetup(TestInvalidMaxValueS8, TestMofSetup)
1305              {
1306                  AddQualifiersParseContentExpectToFail(
1307                      "class T { [MaxValue(1234)]Sint8 x = 1234; /* overflow */ };" );
1308                  AddQualifiersParseContentExpectToFail(
1309                      "class T { [MaxValue(1234)]Sint8 x = 256; /* overflow */ };" );
1310                  AddQualifiersParseContentExpectToFail(
1311                      "class T { [MaxValue(1)]Sint8 x = 2; /* value too large */ };" );
1312                  AddQualifiersParseContentExpectToFail(
1313                      "class T { [MaxValue(-11)]Sint8 x = -10; /* value too large */ };" );
1314                  AddQualifiersParseContentExpectToFail(
1315                      "class T { [MaxValue(1)]Sint8 x = -129; /* underflow */ };" );
1316              }
1317              NitsEndTest
1318              
1319              
1320              NitsTestWithSetup(TestMaxValueS16, TestMofSetup)
1321              {
1322                  AddQualifiersParseContentExpectToSucceed(
1323                      "class T { [MaxValue(1000)]Sint16 x = 0; /* ok */};", true);
1324 krisbash 1.1     AddQualifiersParseContentExpectToSucceed(
1325                      "class T { [MaxValue(32767)]Sint16 x = 32767; /* ok */};", true);
1326                  AddQualifiersParseContentExpectToSucceed(
1327                      "class T { [MaxValue(-32768)]Sint16 x = -32768; /* ok */};", true);
1328                  AddQualifiersParseContentExpectToSucceed(
1329                      "class T { [MaxValue(null)]Sint16 x = -32768; /* ok */};", true);
1330              }
1331              NitsEndTest
1332              
1333              
1334              NitsTestWithSetup(TestInvalidMaxValueS16, TestMofSetup)
1335              {
1336                  // s16 range is -32768 - 32767
1337                  AddQualifiersParseContentExpectToFail(
1338                      "class T { [MaxValue(32768)]Sint16 x = 32768; /* overflow */ };" );
1339                  AddQualifiersParseContentExpectToFail(
1340                      "class T { [MaxValue(0)]Sint16 x = 32768; /* overflow */ };" );
1341                  AddQualifiersParseContentExpectToFail(
1342                      "class T { [MaxValue(1)]Sint16 x = 2; /* value too large */ };" );
1343                  AddQualifiersParseContentExpectToFail(
1344                      "class T { [MaxValue(1)]Sint16 x = -32769; /* underflow */ };" );
1345 krisbash 1.1     AddQualifiersParseContentExpectToFail(
1346                      "class T { Sint16 x = -32769; /* underflow */ };" );
1347              }
1348              NitsEndTest
1349              
1350              
1351              NitsTestWithSetup(TestMaxValueS32, TestMofSetup)
1352              
1353              {
1354                  AddQualifiersParseContentExpectToSucceed(
1355                      "class T { [MaxValue(1001)]Sint32 x = 1000; /* ok */};", true);
1356                  AddQualifiersParseContentExpectToSucceed(
1357                      "class T { [MaxValue(-2147483648)]Sint32 x = -2147483648; /* ok */};", true);
1358                  AddQualifiersParseContentExpectToSucceed(
1359                      "class T { [MaxValue(-2147483647)]Sint32 x = -2147483648; /* ok */};", true);
1360                  AddQualifiersParseContentExpectToSucceed(
1361                      "class T { [MaxValue(2147483647)]Sint32 x = 2147483647; /* ok */};", true);
1362              }
1363              NitsEndTest
1364              
1365              
1366 krisbash 1.1 NitsTestWithSetup(TestInvalidMaxValueS32, TestMofSetup)
1367              {
1368                  // s32 range is -2147483648  -   2147483647
1369                  AddQualifiersParseContentExpectToFail(
1370                      "class T { [MaxValue(2147483648)]Sint32 x = 2147483648; /* overflow */ };" );
1371                  AddQualifiersParseContentExpectToFail(
1372                      "class T { [MaxValue(0)]Sint32 x = 2147483648; /* overflow */ };" );
1373                  AddQualifiersParseContentExpectToFail(
1374                      "class T { [MaxValue(1)]Sint32 x = 10; /* value too large */ };" );
1375                  AddQualifiersParseContentExpectToFail(
1376                      "class T { Sint32 x = -2147483649; /* underflow */ };" );
1377              }
1378              NitsEndTest
1379              
1380              
1381              NitsTestWithSetup(TestMaxValueS64, TestMofSetup)
1382              {
1383                  AddQualifiersParseContentExpectToSucceed(
1384                      "class T { [MaxValue(1010)]Sint64 x = 1000; /* ok */};", true);
1385                  AddQualifiersParseContentExpectToSucceed(
1386                      "class T { [MaxValue(9223372036854775807)]Sint64 x = 9223372036854775807; /* ok */};", true);
1387 krisbash 1.1     AddQualifiersParseContentExpectToSucceed(
1388                      "class T { [MaxValue(-9223372036854775808)]Sint64 x = -9223372036854775808; /* ok */};", true);
1389                  AddQualifiersParseContentExpectToSucceed(
1390                      "class T { [MaxValue(-9223372036854775807)]Sint64 x = -9223372036854775808; /* ok */};", true);
1391              }
1392              NitsEndTest
1393              
1394              
1395              NitsTestWithSetup(TestInvalidMaxValueS64, TestMofSetup)
1396              {
1397                  // u64 range is 0-18446744073709551615
1398                  // practically, attributes are limitted by sint64:
1399                  // -9223372036854775807 - 1  - 9223372036854775807
1400                  //ATTN! int64 errors are not processed correctly yet
1401              #if 0
1402                  AddQualifiersParseContentExpectToFail(
1403                      "class T { [MaxValue(9223372036854775808)]Sint64 x = 0; /* overflow */ };" );
1404                  AddQualifiersParseContentExpectToFail(
1405                      "class T { [MaxValue(0)]Sint64 x = 9223372036854775808; /* overflow */ };" );
1406                  AddQualifiersParseContentExpectToFail(
1407                      "class T { Sint64 x = -9223372036854775809; /* underflow */ };" );
1408 krisbash 1.1 #endif
1409                  AddQualifiersParseContentExpectToFail(
1410                      "class T { [MaxValue(-9223372036854775808)]Sint64 x = -9223372036854775807; /* too large */};");
1411                  AddQualifiersParseContentExpectToFail(
1412                      "class T { [MaxValue(1)]Sint64 x = 10; /* value too large */ };" );
1413              }
1414              NitsEndTest
1415              
1416              
1417              NitsTestWithSetup(TestMaxValueR32, TestMofSetup)
1418              {
1419                  AddQualifiersParseContentExpectToSucceed(
1420                      "class T { [MaxValue(999)]Real32 x = 998.9; /* ok */};", true);
1421                  AddQualifiersParseContentExpectToSucceed(
1422                      "class T { [MaxValue(0)]Real32 x = -0.1e-99; /* ok */};", true);
1423                  AddQualifiersParseContentExpectToSucceed(
1424                      "class T { [MaxValue(9223372036854775807)]Real32 x = 9.222e+18; /* ok */};", true);
1425                  AddQualifiersParseContentExpectToSucceed(
1426                      "class T { [MaxValue(-9223372036854775808)]Real32 x = -9.224e18; /* ok */};", true);
1427              }
1428              NitsEndTest
1429 krisbash 1.1 
1430              
1431              NitsTestWithSetup(TestInvalidMaxValueR32, TestMofSetup)
1432              {
1433                  AddQualifiersParseContentExpectToFail(
1434                      "class T { [MaxValue(999)]Real32 x = 999.0001; /* too big */};");
1435                  AddQualifiersParseContentExpectToFail(
1436                      "class T { [MaxValue(0)]Real32 x = 0.1e+0; /* too big */};");
1437                  AddQualifiersParseContentExpectToFail(
1438                      "class T { [MaxValue(9223372036854775807)]Real32 x = 9.23e18; /* too big */};");
1439                  AddQualifiersParseContentExpectToFail(
1440                      "class T { [MaxValue(9223372036854775807)]Real32 x = 1.0e38; /* too big */};");
1441                  AddQualifiersParseContentExpectToFail(
1442                      "class T { [MaxValue(-9223372036854775808)]Real32 x = -9.21e18; /* too big */};");
1443              }
1444              NitsEndTest
1445              
1446              
1447              NitsTestWithSetup(TestMaxValueR64, TestMofSetup)
1448              {
1449                  AddQualifiersParseContentExpectToSucceed(
1450 krisbash 1.1         "class T { [MaxValue(999)]Real64 x = 998.9; /* ok */};", true);
1451                  AddQualifiersParseContentExpectToSucceed(
1452                      "class T { [MaxValue(0)]Real64 x = -0.1e-99; /* ok */};", true);
1453                  AddQualifiersParseContentExpectToSucceed(
1454                      "class T { [MaxValue(9223372036854775807)]Real64 x = 9.222e+18; /* ok */};", true);
1455                  AddQualifiersParseContentExpectToSucceed(
1456                      "class T { [MaxValue(-9223372036854775808)]Real64 x = -9.224e18; /* ok */};", true);
1457              }
1458              NitsEndTest
1459              
1460              
1461              NitsTestWithSetup(TestInvalidMaxValueR64, TestMofSetup)
1462              {
1463                  AddQualifiersParseContentExpectToFail(
1464                      "class T { [MaxValue(999)]Real64 x = 999.00001; /* too big */};");
1465                  AddQualifiersParseContentExpectToFail(
1466                      "class T { [MaxValue(0)]Real64 x = 0.1e+0; /* too big */};");
1467                  AddQualifiersParseContentExpectToFail(
1468                      "class T { [MaxValue(9223372036854775807)]Real64 x = 9.23e18; /* too big */};");
1469                  AddQualifiersParseContentExpectToFail(
1470                      "class T { [MaxValue(9223372036854775807)]Real64 x = 1.0e38; /* too big */};");
1471 krisbash 1.1     AddQualifiersParseContentExpectToFail(
1472                      "class T { [MaxValue(-9223372036854775808)]Real64 x = -9.21e18; /* too big */};");
1473              }
1474              NitsEndTest
1475              
1476              
1477              NitsTestWithSetup(TestUint64_Bug741436, TestMofSetup)
1478              {
1479                  AddQualifiersParseContentExpectToSucceed(
1480                      "class T { uint64 p_uint64 = 0xFFFFFFFFFFFFFFAA; /* ok */};", true);
1481              }
1482              NitsEndTest
1483              
1484              
1485              NitsTestWithSetup(TestMaxLenAttribute, TestMofSetup)
1486              {
1487                  AddQualifiersParseContentExpectToSucceed(
1488                      "class T { [MaxLen(3)] string s = \"123\"; /* ok */};", true);
1489                  AddQualifiersParseContentExpectToSucceed(
1490                      "class T { [MaxLen(3)] string s[] = {\"123\",\"ab\"}; /* ok */};", true);
1491              }
1492 krisbash 1.1 NitsEndTest
1493              
1494              
1495              NitsTestWithSetup(TestInvalidMaxLenAttribute, TestMofSetup)
1496              {
1497                  AddQualifiersParseContentExpectToFail(
1498                      "class T { [MaxLen(3)] string s = \"12345\"; /* string too long */};");
1499                  AddQualifiersParseContentExpectToFail(
1500                      "class T { [MaxLen(3)] string s[] = {\"ab\",\"12345\"}; /* string too long */};");
1501              }
1502              NitsEndTest
1503              
1504              
1505              NitsTestWithSetup(TestIncompatibleTypeMaxLenAttribute, TestMofSetup)
1506              {
1507                  AddQualifiersParseContentExpectToFail(
1508                      "class T { [MaxLen(3)] uint32 u = 12345; /* n/a for ints */};");
1509              }
1510              NitsEndTest
1511              
1512              
1513 krisbash 1.1 NitsTestWithSetup(TestMinLenAttribute, TestMofSetup)
1514              {
1515                  AddQualifiersParseContentExpectToSucceed(
1516                      "class T { [MinLen(3)] string s = \"123\"; /* ok */};", true);
1517                  AddQualifiersParseContentExpectToSucceed(
1518                      "class T { [MinLen(3)] string s[] = {\"123\",\"abcd\"}; /* ok */};", true);
1519              }
1520              NitsEndTest
1521              
1522              
1523              NitsTestWithSetup(TestInvalidMinLenAttribute, TestMofSetup)
1524              {
1525                  AddQualifiersParseContentExpectToFail(
1526                      "class T { [MinLen(3)] string s = \"12\"; /* string too short */};");
1527                  AddQualifiersParseContentExpectToFail(
1528                      "class T { [MinLen(3)] string s[] = {\"ab\",\"12345\"}; /* string too short */};");
1529              }
1530              NitsEndTest
1531              
1532              
1533              NitsTestWithSetup(TestIncompatibleTypeMinLenAttribute, TestMofSetup)
1534 krisbash 1.1 {
1535                  AddQualifiersParseContentExpectToFail(
1536                      "class T { [MinLen(3)] uint32 u = 12345; /* n/a for ints */};");
1537              }
1538              NitsEndTest
1539              
1540              
1541              NitsTestWithSetup(TestFindingIncludeFile, TestMofSetup)
1542              {
1543                  // test include pragma with relative path
1544                  string data = "\
1545              #pragma include (\"qualifiers.mof\")\n\
1546              #pragma include (\"qualifiers_optional.mof\")\n\
1547                                class T { [MinValue(0)] uint32 u = 12345; };\
1548              ";
1549              
1550                  const char* content = data.c_str();
1551                  ut::writeFileContent( TEMP_FILE, vector<unsigned char>( reinterpret_cast<const unsigned char*>(content), 
1552                      reinterpret_cast<const unsigned char*>(content)+strlen(content)));
1553              
1554                  const char* paths[] = {
1555 krisbash 1.1         "/some-invalid-path/",
1556              #if defined(_MSC_VER)
1557                      "../../share/omischema/" CONFIG_CIMSCHEMA "/"
1558              #else
1559                      "./share/omischema/" CONFIG_CIMSCHEMA "/"
1560              #endif
1561                  };
1562              
1563                  MOF_Parser* parser;
1564                  parser = MOF_Parser_New(paths,MI_COUNT(paths));
1565              
1566                  MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
1567                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
1568              
1569                  /* clear results from previous run */
1570                  s_results.clear();
1571              
1572                  /* Parse the file */
1573                  int res = MOF_Parser_Parse(parser, TEMP_FILE);
1574              
1575                  /* Delete the parser */
1576 krisbash 1.1     MOF_Parser_Delete(parser);
1577              
1578                  UT_ASSERT( 0 == res );
1579              
1580                  // expect no errors
1581                  UT_ASSERT( s_results.m_error.empty() );
1582              }
1583              NitsEndTest
1584              
1585              
1586              NitsTestWithSetup(TestDifferentKeyInDerivedClass, TestMofSetup)
1587              {
1588                  // test different key in derived class
1589                  // Note: this MOF is invalid and MOF parser should catch the error
1590                  string data = "\
1591              Class A { [key] uint32 kv1; };\n\
1592              Class B: A { [key] uint32 kv2; };\n\
1593              ";
1594              
1595                  AddQualifiersParseContentExpectToFail( data.c_str(), true, true );
1596              }
1597 krisbash 1.1 NitsEndTest
1598              
1599              
1600              NitsTestWithSetup(TestDifferentKeyInSkipLevelClass, TestMofSetup)
1601              {
1602                  // test different key in skip-level derived class
1603                  // Note: this MOF is invalid and MOF parser should catch the error
1604                  string data = "\
1605              Class A { [key] uint32 kv1; };\n\
1606              class b : A {};\n\
1607              Class C: B { [key] uint32 kv2; };\n\
1608              ";
1609              
1610                  AddQualifiersParseContentExpectToFail( data.c_str(), true, true );
1611              }
1612              NitsEndTest
1613              
1614              
1615              NitsTestWithSetup(TestDifferentKeyTypeInDerivedClass, TestMofSetup)
1616              {
1617                  // test different key type in derived class
1618 krisbash 1.1     // Note: this MOF is invalid and MOF parser should catch the error
1619                  string data = "\
1620              Class A { [key] uint32 kv1; };\n\
1621              class b : A {};\n\
1622              Class C: B { [key] uint16 kv1; };\n\
1623              ";
1624              
1625                  AddQualifiersParseContentExpectToFail( data.c_str(), true, true );
1626              }
1627              NitsEndTest
1628              
1629              
1630              NitsTestWithSetup(TestEmbeddedInstanceUndefinedClass, TestMofSetup)
1631              {
1632                  // test undefined class referred from embedded instance
1633                  // Note: this MOF is invalid and MOF parser should catch the error
1634                  string data = "\
1635              Class A { [embeddedInstance(\"DoesNotExists\")] string s; };\n\
1636              ";
1637              
1638                  AddQualifiersParseContentExpectToFail( data.c_str(), true, true );
1639 krisbash 1.1 }
1640              NitsEndTest
1641              
1642              
1643              NitsTestWithSetup(TestEmbeddedInstanceDifferentCase, TestMofSetup)
1644              {
1645                  // test undefined class referred from embedded instance
1646                  // Note: this MOF is invalid and MOF parser should catch the error
1647                  string data = "\
1648              class emb { string s;};\n\
1649              Class A { [embeddedInstance(\"eMB\")] string s; };\n\
1650              ";
1651              
1652                  AddQualifiersParseContentExpectToSucceed( data.c_str(), true, false );
1653              }
1654              NitsEndTest
1655              
1656              
1657              NitsTestWithSetup(TestIntConstantOverflow, TestMofSetup)
1658              {
1659                  // test different key type in derived class
1660 krisbash 1.1     // Note: this MOF is invalid and MOF parser should catch the error
1661                  string data = "\
1662              Class TestSP_Value\n\
1663              {\n\
1664              uint64 p_uint64 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\n\
1665              };\n\
1666              ";
1667              
1668                  //AddQualifiersParseContentExpectToFail( data.c_str(), true, false );
1669                  ParseContentExpectToFail(data.c_str(), true, true);
1670              }
1671              NitsEndTest
1672              
1673              
1674              BEGIN_EXTERNC
1675              void _Uint64ValueVerificationCallback(const MI_ClassDecl* decl,void*)
1676              {
1677                  UT_ASSERT( ut::String(MI_T("T")) == decl->name );
1678                  UT_ASSERT( decl->numProperties == 1 );
1679                  UT_ASSERT( ut::String(MI_T("p_uint64")) == decl->properties[0]->name );
1680                  UT_ASSERT( MI_UINT64 == decl->properties[0]->type );
1681 krisbash 1.1     UT_ASSERT( MI_LL(0xFFFFFFFFFFFFFFAA) == *(MI_Uint64*)decl->properties[0]->value );
1682              }
1683              END_EXTERNC
1684              
1685              NitsTestWithSetup(TestUint64ConstantValue, TestMofSetup)
1686              {
1687                  // verify that parser correctly interprets vlaue greater than LLONG_MAX
1688                  const unsigned char content [] =
1689                      "class T { uint64 p_uint64 = 0xFFFFFFFFFFFFFFAA; /* ok */};";
1690                  ut::writeFileContent( TEMP_FILE, vector<unsigned char>( content, (content)+ sizeof(content) ));
1691              
1692                  MOF_Parser* parser;
1693              
1694                  parser = MOF_Parser_New(0,0);
1695              
1696                  MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
1697                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
1698                  MOF_Parser_SetClassDeclCallback(parser, _Uint64ValueVerificationCallback, NULL);
1699              
1700                  /* clear results from previous run */
1701                  s_results.clear();
1702 krisbash 1.1 
1703                  /* Parse the file */
1704                  int res = MOF_Parser_Parse(parser, TEMP_FILE);
1705              
1706                  /* Delete the parser */
1707                  MOF_Parser_Delete(parser);
1708              
1709                  UT_ASSERT( 0 == res );
1710              
1711                  // expect no errors
1712                  UT_ASSERT( s_results.m_error.empty() );
1713              }
1714              NitsEndTest
1715              
1716              
1717              BEGIN_EXTERNC
1718              void _Int64ValueVerificationCallback(
1719                  const MI_ClassDecl* decl, void*)
1720              {
1721                  UT_ASSERT( ut::String(MI_T("T")) == decl->name );
1722                  UT_ASSERT( decl->numProperties == 1 );
1723 krisbash 1.1     UT_ASSERT( ut::String(MI_T("p_int64")) == decl->properties[0]->name );
1724                  UT_ASSERT( MI_SINT64 == decl->properties[0]->type );
1725                  UT_ASSERT( (-MI_LL(9223372036854775807)-0) == *(MI_Sint64*)decl->properties[0]->value );
1726              }
1727              END_EXTERNC
1728              
1729              NitsTestWithSetup(TestInt64ConstantValue, TestMofSetup)
1730              {
1731                  // verify that parser correctly interprets vlaue greater than LLONG_MAX
1732                  const unsigned char content [] =
1733                      "class T { sint64 p_int64 = -9223372036854775807; /* ok */};";
1734                  ut::writeFileContent( TEMP_FILE, vector<unsigned char>( content, (content)+ sizeof(content) ));
1735              
1736                  MOF_Parser* parser;
1737              
1738                  parser = MOF_Parser_New(0,0);
1739              
1740                  MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
1741                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
1742                  MOF_Parser_SetClassDeclCallback(parser, _Int64ValueVerificationCallback, NULL);
1743              
1744 krisbash 1.1     /* clear results from previous run */
1745                  s_results.clear();
1746              
1747                  /* Parse the file */
1748                  int res = MOF_Parser_Parse(parser, TEMP_FILE);
1749              
1750                  /* Delete the parser */
1751                  MOF_Parser_Delete(parser);
1752              
1753                  UT_ASSERT( 0 == res );
1754              
1755                  // expect no errors
1756                  UT_ASSERT( s_results.m_error.empty() );
1757              }
1758              NitsEndTest
1759              
1760              
1761              BEGIN_EXTERNC
1762              void _HexInt64ValueVerificationCallback(
1763                  const MI_ClassDecl* decl, void*)
1764              {
1765 krisbash 1.1     UT_ASSERT( ut::String(MI_T("T")) == decl->name );
1766                  UT_ASSERT( decl->numProperties == 1 );
1767                  UT_ASSERT( ut::String(MI_T("p_int64")) == decl->properties[0]->name );
1768                  UT_ASSERT( MI_SINT64 == decl->properties[0]->type );
1769                  UT_ASSERT( -MI_LL(0x7FFFFFFFFFFFFFAA) == *(MI_Sint64*)decl->properties[0]->value );
1770              }
1771              END_EXTERNC
1772              
1773              NitsTestWithSetup(TestHexInt64ConstantValue, TestMofSetup)
1774              {
1775                  // verify that parser correctly interprets vlaue greater than LLONG_MAX
1776                  const unsigned char content [] =
1777                      "class T { sint64 p_int64 = -0x7FFFFFFFFFFFFFAA; /* ok */};";
1778                  ut::writeFileContent( TEMP_FILE, vector<unsigned char>( content, (content)+ sizeof(content) ));
1779              
1780                  MOF_Parser* parser;
1781              
1782                  parser = MOF_Parser_New(0,0);
1783              
1784                  MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
1785                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
1786 krisbash 1.1     MOF_Parser_SetClassDeclCallback(parser, _HexInt64ValueVerificationCallback, NULL);
1787              
1788                  /* clear results from previous run */
1789                  s_results.clear();
1790              
1791                  /* Parse the file */
1792                  int res = MOF_Parser_Parse(parser, TEMP_FILE);
1793              
1794                  /* Delete the parser */
1795                  MOF_Parser_Delete(parser);
1796              
1797                  UT_ASSERT( 0 == res );
1798              
1799                  // expect no errors
1800                  UT_ASSERT( s_results.m_error.empty() );
1801              }
1802              NitsEndTest
1803              
1804              
1805              BEGIN_EXTERNC
1806              void _BinInt64ValueVerificationCallback(
1807 krisbash 1.1     const MI_ClassDecl* decl, void*)
1808              {
1809                  UT_ASSERT( ut::String(MI_T("T")) == decl->name );
1810                  UT_ASSERT( decl->numProperties == 1 );
1811                  UT_ASSERT( ut::String(MI_T("p_int64")) == decl->properties[0]->name );
1812                  UT_ASSERT( MI_SINT64 == decl->properties[0]->type );
1813                  UT_ASSERT( -MI_LL(0x7FFFFFFFFFFFFFFD) == *(MI_Sint64*)decl->properties[0]->value );
1814              }
1815              END_EXTERNC
1816              
1817              NitsTestWithSetup(TestBinInt64ConstantValue, TestMofSetup)
1818              {
1819                  // verify that parser correctly interprets vlaue greater than LLONG_MAX
1820                  const unsigned char content [] =
1821                      "class T { sint64 p_int64 = -111111111111111111111111111111111111111111111111111111111111101b; /* ok  dec*/};";
1822                  ut::writeFileContent( TEMP_FILE, vector<unsigned char>( content, (content)+ sizeof(content) ));
1823              
1824                  MOF_Parser* parser;
1825              
1826                  parser = MOF_Parser_New(0,0);
1827              
1828 krisbash 1.1     MOF_Parser_SetErrorCallback(parser, ErrorCallback, NULL);
1829                  MOF_Parser_SetWarningCallback(parser, WarningCallback, NULL);
1830                  MOF_Parser_SetClassDeclCallback(parser, _BinInt64ValueVerificationCallback, NULL);
1831              
1832                  /* clear results from previous run */
1833                  s_results.clear();
1834              
1835                  /* Parse the file */
1836                  int res = MOF_Parser_Parse(parser, TEMP_FILE);
1837              
1838                  /* Delete the parser */
1839                  MOF_Parser_Delete(parser);
1840              
1841                  UT_ASSERT( 0 == res );
1842              
1843                  // expect no errors
1844                  UT_ASSERT( s_results.m_error.empty() );
1845              }
1846              NitsEndTest
1847              
1848              

ViewCVS 0.9.2