]>
git.saurik.com Git - apple/xnu.git/blob - iokit/Tests/TestContainers.cpp
   2  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  31 #include <libkern/c++/OSData.h> 
  32 #include <libkern/c++/OSString.h> 
  33 #include <libkern/c++/OSSymbol.h> 
  35 static const char testC00
[] = "The quick brown fox jumps over the lazy dog.  "; 
  36 static const char testC01
[] = "The quick brown fox "; 
  37 static const char testC02
[] = "jumps over the "; 
  38 static const char testC03
[] = "lazy dog.  \n"; 
  39 static const char testC04
[] = "The "; 
  40 static const char testC05
[] = "quick "; 
  41 static const char testC06
[] = "brown "; 
  42 static const char testC07
[] = "fox "; 
  43 static const char testC08
[] = "jumps "; 
  44 static const char testC09
[] = "over "; 
  45 static const char testC10
[] = "the "; 
  46 static const char testC11
[] = "lazy "; 
  47 static const char testC12
[] = "dog.  \n"; 
  48 static const char testC13
[] = "Now is the time for all good " 
  49                                "men to come to the aid of the party  \n"; 
  50 static const char testC14
[] = "Now is the time for "; 
  51 static const char testC15
[] = "all good men to come "; 
  52 static const char testC16
[] = "to the aid of the party  \n"; 
  53 static const char testC17
[] = "Now "; 
  54 static const char testC18
[] = "is "; 
  55 static const char testC19
[] = "the "; 
  56 static const char testC20
[] = "time "; 
  57 static const char testC21
[] = "for "; 
  58 static const char testC22
[] = "all "; 
  59 static const char testC23
[] = "good "; 
  60 static const char testC24
[] = "men "; 
  61 static const char testC25
[] = "to "; 
  62 static const char testC26
[] = "come "; 
  63 static const char testC27
[] = "to "; 
  64 static const char testC28
[] = "the "; 
  65 static const char testC29
[] = "aid "; 
  66 static const char testC30
[] = "of "; 
  67 static const char testC31
[] = "the "; 
  68 static const char testC32
[] = "party.  \n"; 
  69 static const char testC33
[] = "Frank Burns eats worms.  \n"; 
  70 static const char testC34
[] = "Frank Burns "; 
  71 static const char testC35
[] = "eats worms.  \n"; 
  72 static const char testC36
[] = "Frank "; 
  73 static const char testC37
[] = "Burns "; 
  74 static const char testC38
[] = "eats "; 
  75 static const char testC39
[] = "worms.  \n"; 
  76 static const char testC40
[] = "Tired eyes?  Stiff neck?  Tight shoulders?  " 
  77                               "Aching back?  The right moves can help " 
  78                               "prevent these kinds of problem.  "; 
  79 static const char testC41
[] = "Tired eyes?  Stiff neck?  "; 
  80 static const char testC42
[] = "Tight shoulders?  Aching back?  "; 
  81 static const char testC43
[] = "The right moves can help prevent "; 
  82 static const char testC44
[] = "these kinds of problem.  "; 
  83 static const char testC45
[] = "Tired "; 
  84 static const char testC46
[] = "eyes?  "; 
  85 static const char testC47
[] = "Stiff "; 
  86 static const char testC48
[] = "neck?  "; 
  87 static const char testC49
[] = "Tight "; 
  88 static const char testC50
[] = "shoulders?  "; 
  89 static const char testC51
[] = "Aching "; 
  90 static const char testC52
[] = "back?  "; 
  91 static const char testC53
[] = "The "; 
  92 static const char testC54
[] = "right "; 
  93 static const char testC55
[] = "moves "; 
  94 static const char testC56
[] = "can "; 
  95 static const char testC57
[] = "help "; 
  96 static const char testC58
[] = "prevent "; 
  97 static const char testC59
[] = "these "; 
  98 static const char testC60
[] = "kinds "; 
  99 static const char testC61
[] = "of "; 
 100 static const char testC62
[] = "problem.  "; 
 102 const char *strCache
[] = { 
 103     testC00
, testC01
, testC02
, testC03
, testC04
, testC05
, testC06
, testC07
, 
 104     testC08
, testC09
, testC10
, testC11
, testC12
, testC13
, testC14
, testC15
, 
 105     testC16
, testC17
, testC18
, testC19
, testC20
, testC21
, testC22
, testC23
, 
 106     testC24
, testC25
, testC26
, testC27
, testC28
, testC29
, testC30
, testC31
, 
 107     testC32
, testC33
, testC34
, testC35
, testC36
, testC37
, testC38
, testC39
,  
 108     testC40
, testC41
, testC42
, testC43
, testC44
, testC45
, testC46
, testC47
,  
 109     testC48
, testC49
, testC50
, testC51
, testC52
, testC53
, testC54
, testC55
,  
 110     testC56
, testC57
, testC58
, testC59
, testC60
, testC61
, testC62
,  
 112 const int numStrCache 
= ((int) (sizeof(strCache
)/sizeof(strCache
[0]))); 
 116 #define DATA_SIZE_1      256 
 117 #define DATA_SIZE_2      512 
 118 #define DATA_SIZE_3     1024 
 119 #define DATA_SIZE_4     8192 
 121     OSData 
*test1
, *test2
, *test3
; 
 126     unsigned short testData
[DATA_SIZE_4
/sizeof(short)], *cp
; 
 128     // very first test initialises the OSMetaClass cache. 
 129     test1 
= OSData::withCapacity(DATA_SIZE_1
); 
 130     TEST_ASSERT('d', "0a", test1
); 
 134     for (i 
= 0; i 
< sizeof(testData
)/sizeof(short); i
++) 
 135         testData
[i
] = (unsigned short) i
; 
 137     // Check empty data allocation 
 138     spaceCheck 
= checkPointSpace(); 
 139     test1 
= OSData::withCapacity(DATA_SIZE_1
); 
 140     TEST_ASSERT('d', "1a", test1
); 
 142         TEST_ASSERT('d', "1b", !test1
->getLength()); 
 143         TEST_ASSERT('d', "1c", test1
->getCapacity() == DATA_SIZE_1
); 
 144         TEST_ASSERT('d', "1d", !test1
->getBytesNoCopy()); 
 145         TEST_ASSERT('d', "1e", !test1
->getBytesNoCopy(10, DATA_SIZE_1 
- 10)); 
 146         TEST_ASSERT('d', "1f", test1
->appendBytes(spaceCheck
, 0)); 
 147         TEST_ASSERT('d', "1g", !test1
->getLength()); 
 148         TEST_ASSERT('d', "1h", test1
->getCapacity() == DATA_SIZE_1
); 
 149         TEST_ASSERT('d', "1i", !test1
->getBytesNoCopy()); 
 152     res 
= res 
&& checkSpace("(d)1", spaceCheck
, 0); 
 154     // Check appending to empty data allocation  
 155     spaceCheck 
= checkPointSpace(); 
 156     test1 
= OSData::withCapacity(DATA_SIZE_1
); 
 157     TEST_ASSERT('d', "2a", test1
); 
 159         TEST_ASSERT('d', "2b", !test1
->getLength()); 
 160         TEST_ASSERT('d', "2c", !test1
->getBytesNoCopy()); 
 161         TEST_ASSERT('d', "2d", test1
->appendBytes(testData
, DATA_SIZE_1
)); 
 162         TEST_ASSERT('d', "2e", test1
->getLength() == DATA_SIZE_1
); 
 163         TEST_ASSERT('d', "2f", test1
->getBytesNoCopy()); 
 164         cp 
= (unsigned short *) test1
->getBytesNoCopy(); 
 165         for (i 
= 0; cp 
&& i 
< (DATA_SIZE_1
/sizeof(short)); i
++) { 
 166             TEST_ASSERT('d', "2g", *cp
++ == testData
[i
]); 
 167             if (*cp 
!= testData
[i
]) 
 170         TEST_ASSERT('d', "2h", test1
->getBytesNoCopy(10, DATA_SIZE_1
-10)); 
 171         cp 
= (unsigned short *) test1
->getBytesNoCopy(10, DATA_SIZE_1 
- 10); 
 172         for (i 
= 5; cp 
&& i 
< (DATA_SIZE_1
/sizeof(short)) - 5; i
++) { 
 173             TEST_ASSERT('d', "2i", *cp
++ == testData
[i
]); 
 174             if (*cp 
!= testData
[i
]) 
 177         TEST_ASSERT('d', "2j", test1
->isEqualTo(testData
, DATA_SIZE_1
)); 
 180     res 
= res 
&& checkSpace("(d)2", spaceCheck
, 0); 
 182     // Check data allocation from some constant data 
 183     spaceCheck 
= checkPointSpace(); 
 184     test1 
= OSData::withBytes(testData
, sizeof(testData
)); 
 185     TEST_ASSERT('d', "3a", test1
); 
 187         TEST_ASSERT('d', "3b", test1
->getLength() == sizeof(testData
)); 
 188         TEST_ASSERT('d', "3c", test1
->getCapacity() == sizeof(testData
)); 
 189         TEST_ASSERT('d', "3d", test1
->getBytesNoCopy()); 
 190         TEST_ASSERT('d', "3e", test1
->getBytesNoCopy(10, sizeof(testData
)-10)); 
 191         TEST_ASSERT('d', "3f", test1
->appendBytes(spaceCheck
, 0)); 
 192         TEST_ASSERT('d', "3g", test1
->getLength() == sizeof(testData
)); 
 193         TEST_ASSERT('d', "3h", test1
->getCapacity() == sizeof(testData
)); 
 194         TEST_ASSERT('d', "3i", test1
->getBytesNoCopy()); 
 195         TEST_ASSERT('d', "3j", test1
->getBytesNoCopy(10, sizeof(testData
)-10)); 
 196         TEST_ASSERT('d', "3k", !test1
->appendBytes(testData
, 10)); 
 199     res 
= res 
&& checkSpace("(d)3", spaceCheck
, 0); 
 201     // Check and continious addition of more data 
 202     spaceCheck 
= checkPointSpace(); 
 203     test1 
= OSData::withCapacity(DATA_SIZE_4
); 
 204     test2 
= OSData::withBytesNoCopy(testData
, DATA_SIZE_3
); 
 206     TEST_ASSERT('d', "4a", (test1 
&& test2
)); 
 207     if (test1 
&& test2
) { 
 208         TEST_ASSERT('d', "4b", !test1
->getLength()); 
 209         for (i 
= 0; i 
< DATA_SIZE_4
; i 
+= DATA_SIZE_3
) 
 210             TEST_ASSERT('d', "4c", test1
->appendBytes(test2
)); 
 211         TEST_ASSERT('d', "4d", !test1
->appendBytes(test2
)); 
 212         for (i 
= 0; i 
< DATA_SIZE_4
; i 
+= DATA_SIZE_3
) { 
 214             TEST_ASSERT('d', "4e", test2
->isEqualTo( 
 215                                         test1
->getBytesNoCopy(i
, DATA_SIZE_3
), 
 218             test3 
= OSData::withData(test1
, i
, DATA_SIZE_3
); 
 219             TEST_ASSERT('d', "4f", test3
); 
 221                 TEST_ASSERT('d', "4g", test2
->isEqualTo(test3
)); 
 225             test3 
= OSData::withData(test1
, i
, len
); 
 226             TEST_ASSERT('d', "4i", test3
); 
 228                 TEST_ASSERT('d', "4j", test2
->isEqualTo(test3
)); 
 235     res 
= res 
&& checkSpace("(d)3", spaceCheck
, 0); 
 238         verPrintf(("testData: All OSData Tests passed\n")); 
 240         logPrintf(("testData: Some OSData Tests failed\n")); 
 249     OSString 
*test1
, *test2
; 
 255     // very first test initialises the OSMetaClass cache. 
 256     test1 
= OSString::withCStringNoCopy(testC00
); 
 257     TEST_ASSERT('s', "0a", test1
); 
 261     // Check c string allocation 
 262     spaceCheck 
= checkPointSpace(); 
 263     test1 
= OSString::withCString(testC00
); 
 264     TEST_ASSERT('s', "1a", test1
); 
 265     TEST_ASSERT('s', "1b", testC00 
!= test1
->getCStringNoCopy()); 
 266     TEST_ASSERT('s', "1c", strcmp(testC00
, test1
->getCStringNoCopy()) == 0); 
 267     TEST_ASSERT('s', "1d", strlen(testC00
) == test1
->getLength()); 
 268     TEST_ASSERT('s', "1e", test1
->isEqualTo(testC00
)); 
 269     TEST_ASSERT('s', "1f", !test1
->isEqualTo(testC01
)); 
 270     if (test1
) test1
->release(); 
 271     res 
= res 
&& checkSpace("(s)1", spaceCheck
, 0); 
 273     // Check c string no allocation 
 274     spaceCheck 
= checkPointSpace(); 
 275     test1 
= OSString::withCStringNoCopy(testC00
); 
 276     TEST_ASSERT('s', "2a", test1
); 
 277     TEST_ASSERT('s', "2b", testC00 
== test1
->getCStringNoCopy()); 
 278     if (test1
) test1
->release(); 
 279     res 
= res 
&& checkSpace("(s)2", spaceCheck
, 0); 
 281     // Check string from other string generation 
 282     spaceCheck 
= checkPointSpace(); 
 283     test1 
= OSString::withCStringNoCopy(testC00
); 
 284     TEST_ASSERT('s', "3a", test1
); 
 285     test2 
= OSString::withString(test1
); 
 286     TEST_ASSERT('s', "3b", test2
); 
 287     TEST_ASSERT('s', "3c", test1 
!= test2
); 
 288     TEST_ASSERT('s', "3d", test1
->isEqualTo(test2
)); 
 289     if (test1
) test1
->release(); 
 290     if (test2
) test2
->release(); 
 291     res 
= res 
&& checkSpace("(s)3", spaceCheck
, 0); 
 293     // Check string comparison functionality no copy 
 294     spaceCheck 
= checkPointSpace(); 
 295     test1 
= OSString::withCStringNoCopy(testC00
); 
 296     test2 
= OSString::withCStringNoCopy(testC01
); 
 297     TEST_ASSERT('s', "4a", test1 
&& test2
); 
 298     TEST_ASSERT('s', "4b", !test1
->isEqualTo(test2
)); 
 299     TEST_ASSERT('s', "4c", !test1
->isEqualTo(testC01
)); 
 300     TEST_ASSERT('s', "4d", test1
->isEqualTo(testC00
)); 
 301     if (test1
) test1
->release(); 
 302     if (test2
) test2
->release(); 
 303     res 
= res 
&& checkSpace("(s)4", spaceCheck
, 0); 
 305     // Check string comparison functionality with copy 
 306     spaceCheck 
= checkPointSpace(); 
 307     test1 
= OSString::withCString(testC00
); 
 308     test2 
= OSString::withCString(testC01
); 
 309     TEST_ASSERT('s', "5a", test1 
&& test2
); 
 310     TEST_ASSERT('s', "5b", !test1
->isEqualTo(test2
)); 
 311     TEST_ASSERT('s', "5c", !test1
->isEqualTo(testC01
)); 
 312     TEST_ASSERT('s', "5d", test1
->isEqualTo(testC00
)); 
 313     if (test1
) test1
->release(); 
 314     if (test2
) test2
->release(); 
 315     res 
= res 
&& checkSpace("(s)5", spaceCheck
, 0); 
 317     // Check string inplace modifications 
 318     spaceCheck 
= checkPointSpace(); 
 319     test1 
= OSString::withCString(testC00
); 
 320     TEST_ASSERT('s', "6a", test1
); 
 321     for (i 
= 0; (c 
= test1
->getChar(i
)); i
++) 
 322         if (c 
!= testC00
[i
]) { 
 323             verPrintf(("testString(s) test 6b failed\n")); res 
= false; 
 326     TEST_ASSERT('s', "6c", !c
); 
 327     TEST_ASSERT('s', "6d", test1
->setChar(' ', 0)); 
 328     TEST_ASSERT('s', "6e", !test1
->isEqualTo(testC00
)); 
 329     TEST_ASSERT('s', "6f", test1
->setChar('T', 0)); 
 330     TEST_ASSERT('s', "6g", !test1
->setChar(' ', sizeof(testC00
))); 
 331     TEST_ASSERT('s', "6h", test1
->isEqualTo(testC00
)); 
 332     if (test1
) test1
->release(); 
 333     res 
= res 
&& checkSpace("(s)6", spaceCheck
, 0); 
 335     // Check const string fail inplace modifications 
 336     spaceCheck 
= checkPointSpace(); 
 337     test1 
= OSString::withCStringNoCopy(testC00
); 
 338     TEST_ASSERT('s', "7a", test1
); 
 339     for (i 
= 0; (c 
= test1
->getChar(i
)); i
++) 
 340         if (c 
!= testC00
[i
]) { 
 341             verPrintf(("testString(s) test 7b failed\n")); res 
= false; 
 344     TEST_ASSERT('s', "7c", !c
); 
 345     TEST_ASSERT('s', "7d", !test1
->setChar(' ', 0)); 
 346     TEST_ASSERT('s', "7e", test1
->isEqualTo(testC00
)); 
 347     TEST_ASSERT('s', "7f", !test1
->setChar(' ', sizeof(testC00
))); 
 348     TEST_ASSERT('s', "7g", test1
->isEqualTo(testC00
)); 
 349     if (test1
) test1
->release(); 
 350     res 
= res 
&& checkSpace("(s)7", spaceCheck
, 0); 
 353         verPrintf(("testString: All OSString Tests passed\n")); 
 355         logPrintf(("testString: Some OSString Tests failed\n")); 
 363     const OSSymbol 
*cache
[numStrCache
]; 
 366     // very first test initialises the OSMetaClass cache. 
 367     cache
[0] = IOSymbol::withCStringNoCopy(testC00
); 
 368     TEST_ASSERT('u', "0a", cache
[0]); 
 372     spaceCheck 
= checkPointSpace(); 
 374     // Setup the symbol cache, make sure it grows the symbol unique'ing 
 375     // hash table.  Also determine that the symbol is created ok and that 
 376     // it is indeed equal to the creating cString by strcmp. 
 377     for (i 
= 0; i 
< numStrCache
; i
++) { 
 378         cache
[i
] = OSSymbol::withCStringNoCopy(strCache
[i
]); 
 380             verPrintf(("testSymbol(u) test 1a%d failed\n", i
)); res 
= false; 
 382         else if (!cache
[i
]->isEqualTo(strCache
[i
])) { 
 383             verPrintf(("testSymbol(u) test 1b%d failed\n", i
)); res 
= false; 
 387     // The strCache does have some duplicates in it, mostly 'the'.  Make 
 388     // sure that we wind them and that different cache entries really are 
 389     // different by strcmp.  Fundamental to OSSymbol semantics. 
 391     for (i 
= 0; i 
< numStrCache
; i
++) 
 392         for (j 
= i
+1; j 
< numStrCache
; j
++) { 
 393             if (cache
[i
] != cache
[j
] && cache
[i
]->isEqualTo(cache
[j
])) { 
 394                 verPrintf(("testSymbol(u) test 2a%d,%d failed\n", i
, j
)); 
 397             else if (cache
[i
] == cache
[j
]) { 
 398                 if (cache
[i
]->getRetainCount() == 1) { 
 399                     verPrintf(("testSymbol(u) test 2b%d,%d failed\n", i
, j
)); 
 405     TEST_ASSERT('u', "2c", countDups
); 
 407     // Clear out the cache and check that the unique'ing hashtable has grown 
 408     for (i 
= 0; i 
< numStrCache
; i
++) { 
 414     // As of 1998-11-17 the hash growth is 364. 
 415     res 
= res 
&& checkSpace("(u)3", spaceCheck
, 972); 
 418     // Check for leaks by repeating the cacheing and freeing 
 419     spaceCheck 
= checkPointSpace(); 
 420     for (i 
= 0; i 
< numStrCache
; i
++) 
 421         cache
[i
] = OSSymbol::withCString(strCache
[i
]); 
 422     for (i 
= 0; i 
< numStrCache
; i
++) { 
 428     res 
= res 
&& checkSpace("(u)4", spaceCheck
, 0); 
 430     // Check that the OSString based symbol constructors work 
 431     // and that they don't leak, and finally double check that while 
 432     // the cache is active the symbol semantics still work. 
 433     spaceCheck 
= checkPointSpace(); 
 434     for (i 
= 0; i 
< numStrCache
; i
++) { 
 438                ? OSString::withCString(strCache
[i
]) 
 439                : OSString::withCStringNoCopy(strCache
[i
]); 
 441             cache
[i
] = OSSymbol::withString(tmpStr
); 
 443                 verPrintf(("testSymbol(u) test 5a%d failed\n", i
)); 
 450     for (i 
= 0; i 
< numStrCache
; i
++) { 
 452             const OSSymbol 
*tmpSymb
; 
 454             tmpSymb 
= OSSymbol::withCStringNoCopy(strCache
[i
]); 
 455             if (cache
[i
] != tmpSymb
) { 
 456                 verPrintf(("testSymbol(u) test 5b%d failed\n", i
)); 
 464             verPrintf(("testSymbol(u) test 5c%d failed\n", i
)); 
 468     res 
= res 
&& checkSpace("(u)5", spaceCheck
, 0); 
 471         verPrintf(("testSymbol: All OSSymbol Tests passed\n")); 
 473         logPrintf(("testSymbol: Some OSSymbol Tests failed\n"));