test_uuid.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. // (C) Copyright Andy Tompkins 2007. Permission to copy, use, modify, sell and
  2. // distribute this software is granted provided this copyright notice appears
  3. // in all copies. This software is provided "as is" without express or implied
  4. // warranty, and with no claim as to its suitability for any purpose.
  5. // Distributed under the Boost Software License, Version 1.0. (See
  6. // accompanying file LICENSE_1_0.txt or copy at
  7. // https://www.boost.org/LICENSE_1_0.txt)
  8. // libs/uuid/test/test_uuid.cpp -------------------------------//
  9. #include <iostream>
  10. #include <boost/uuid/uuid.hpp>
  11. #include <boost/uuid/uuid_io.hpp>
  12. #include <boost/detail/lightweight_test.hpp>
  13. #include <boost/functional/hash.hpp>
  14. #include <boost/current_function.hpp>
  15. void test_uuid_equal_array(char const * file, int line, char const * function,
  16. boost::uuids::uuid const& lhs, const unsigned char (&rhs)[16])
  17. {
  18. for (size_t i=0; i<16; i++) {
  19. if ( *(lhs.begin()+i) != rhs[i]) {
  20. std::cerr << file << "(" << line << "): uuid " << lhs << " not equal " << "{";
  21. for (size_t j=0; j<16; j++) {
  22. if (j != 0) {
  23. std::cerr << " ";
  24. }
  25. std::cerr << std::hex << (int)rhs[j];
  26. }
  27. std::cerr << "} in function '" << function << "'" << std::endl;
  28. ++boost::detail::test_errors();
  29. return;
  30. }
  31. }
  32. }
  33. #define BOOST_TEST_UUID(lhs, rhs) ( test_uuid_equal_array(__FILE__, __LINE__, BOOST_CURRENT_FUNCTION, lhs, rhs) )
  34. int main(int, char*[])
  35. {
  36. using namespace boost::uuids;
  37. // uuid::static_size
  38. BOOST_TEST_EQ(uuid::static_size(), 16U);
  39. { // uuid::operator=()
  40. uuid u1 = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
  41. uuid u2 = u1;
  42. BOOST_TEST_EQ(u2, u1);
  43. }
  44. { // uuid::begin(), end()
  45. uuid u = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
  46. unsigned char values[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  47. BOOST_TEST_UUID(u, values);
  48. }
  49. { // uuid::begin() const, end() const
  50. const uuid u = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
  51. unsigned char values[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  52. BOOST_TEST_UUID(u, values);
  53. }
  54. { // uuid::size()
  55. uuid u; // uninitialized
  56. BOOST_TEST_EQ(u.size(), 16U);
  57. }
  58. { // uuid::is_nil()
  59. uuid u1 = {{0}};
  60. BOOST_TEST_EQ(u1.is_nil(), true);
  61. uuid u2 = {{1,0}};
  62. BOOST_TEST_EQ(u2.is_nil(), false);
  63. }
  64. { // uuid::variant()
  65. struct Test {
  66. unsigned char octet7;
  67. boost::uuids::uuid::variant_type variant;
  68. };
  69. const Test tests[] =
  70. { { 0x00, boost::uuids::uuid::variant_ncs }
  71. , { 0x10, boost::uuids::uuid::variant_ncs }
  72. , { 0x20, boost::uuids::uuid::variant_ncs }
  73. , { 0x30, boost::uuids::uuid::variant_ncs }
  74. , { 0x40, boost::uuids::uuid::variant_ncs }
  75. , { 0x50, boost::uuids::uuid::variant_ncs }
  76. , { 0x60, boost::uuids::uuid::variant_ncs }
  77. , { 0x70, boost::uuids::uuid::variant_ncs }
  78. , { 0x80, boost::uuids::uuid::variant_rfc_4122 }
  79. , { 0x90, boost::uuids::uuid::variant_rfc_4122 }
  80. , { 0xa0, boost::uuids::uuid::variant_rfc_4122 }
  81. , { 0xb0, boost::uuids::uuid::variant_rfc_4122 }
  82. , { 0xc0, boost::uuids::uuid::variant_microsoft }
  83. , { 0xd0, boost::uuids::uuid::variant_microsoft }
  84. , { 0xe0, boost::uuids::uuid::variant_future }
  85. , { 0xf0, boost::uuids::uuid::variant_future }
  86. };
  87. for (size_t i=0; i<sizeof(tests)/sizeof(Test); i++) {
  88. uuid u = { {} };
  89. u.data[8] = tests[i].octet7; // note that octet7 is array index 8
  90. BOOST_TEST_EQ(u.variant(), tests[i].variant);
  91. }
  92. }
  93. { // uuid::version()
  94. struct Test {
  95. unsigned char octet9;
  96. boost::uuids::uuid::version_type version;
  97. };
  98. const Test tests[] =
  99. { { 0x00, boost::uuids::uuid::version_unknown }
  100. , { 0x10, boost::uuids::uuid::version_time_based }
  101. , { 0x20, boost::uuids::uuid::version_dce_security }
  102. , { 0x30, boost::uuids::uuid::version_name_based_md5 }
  103. , { 0x40, boost::uuids::uuid::version_random_number_based }
  104. , { 0x50, boost::uuids::uuid::version_name_based_sha1 }
  105. , { 0x60, boost::uuids::uuid::version_unknown }
  106. , { 0x70, boost::uuids::uuid::version_unknown }
  107. , { 0x80, boost::uuids::uuid::version_unknown }
  108. , { 0x90, boost::uuids::uuid::version_unknown }
  109. , { 0xa0, boost::uuids::uuid::version_unknown }
  110. , { 0xb0, boost::uuids::uuid::version_unknown }
  111. , { 0xc0, boost::uuids::uuid::version_unknown }
  112. , { 0xd0, boost::uuids::uuid::version_unknown }
  113. , { 0xe0, boost::uuids::uuid::version_unknown }
  114. , { 0xf0, boost::uuids::uuid::version_unknown }
  115. };
  116. for (size_t i=0; i<sizeof(tests)/sizeof(Test); i++) {
  117. uuid u = {{0}};
  118. u.data[6] = tests[i].octet9; // note that octet9 is array index 8
  119. BOOST_TEST_EQ(u.version(), tests[i].version);
  120. }
  121. }
  122. { // uuid::swap(), swap()
  123. uuid u1 = {{0}};
  124. uuid u2 = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
  125. u1.swap(u2);
  126. unsigned char values1[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  127. unsigned char values2[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  128. BOOST_TEST_UUID(u1, values2);
  129. BOOST_TEST_UUID(u2, values1);
  130. swap(u1, u2);
  131. BOOST_TEST_UUID(u1, values1);
  132. BOOST_TEST_UUID(u2, values2);
  133. }
  134. { // test comparsion
  135. uuid u1 = {{0}};
  136. uuid u2 = {{1,0}};
  137. uuid u3 = {{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}};
  138. uuid u4 = {{0,1,0}};
  139. uuid u5 = {{0,255,0}};
  140. BOOST_TEST_EQ(u1, u1);
  141. BOOST_TEST_NE(u1, u2);
  142. BOOST_TEST(u1 < u2);
  143. BOOST_TEST(u2 < u3);
  144. BOOST_TEST(u1 < u4);
  145. BOOST_TEST(u1 < u5);
  146. BOOST_TEST(u4 < u5);
  147. BOOST_TEST(u4 < u2);
  148. BOOST_TEST(u5 < u2);
  149. BOOST_TEST(u1 <= u1);
  150. BOOST_TEST(u1 <= u2);
  151. BOOST_TEST(u2 <= u3);
  152. BOOST_TEST(u2 >= u1);
  153. BOOST_TEST(u3 >= u1);
  154. BOOST_TEST(u3 >= u3);
  155. BOOST_TEST(u2 >= u1);
  156. BOOST_TEST(u3 >= u1);
  157. }
  158. { // ticket 10510
  159. // the uuids in the report
  160. uuid u6 = {{0x14,0x5c,0xfc,0x95,0x80,0x50,0x45,0x5a,0x83,0x82,0x44,0xca,0x57,0xc1,0x48,0x3b}};
  161. uuid u7 = {{0x14,0x5c,0xfc,0x95,0x80,0x50,0x45,0x5a,0x83,0x82,0x44,0xca,0x57,0xc1,0x48,0x3c}};
  162. // simple uuids to reproduce problem
  163. uuid u8 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}};
  164. uuid u9 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2}};
  165. uuid u10 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254}};
  166. uuid u11 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255}};
  167. // some additional uuids for testing boundary cases
  168. uuid u12 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1}};
  169. uuid u13 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,2}};
  170. uuid u14 = {{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}};
  171. uuid u15 = {{255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255}};
  172. BOOST_TEST(u6 < u7);
  173. BOOST_TEST(!(u7 < u6));
  174. BOOST_TEST(u8 < u9);
  175. BOOST_TEST(!(u9 < u8));
  176. BOOST_TEST(u8 < u10);
  177. BOOST_TEST(!(u10 < u8));
  178. BOOST_TEST(u8 < u11);
  179. BOOST_TEST(!(u11 < u8));
  180. BOOST_TEST(u9 < u10);
  181. BOOST_TEST(!(u10 < u9));
  182. BOOST_TEST(u9 < u11);
  183. BOOST_TEST(!(u11 < u9));
  184. BOOST_TEST(u10 < u11);
  185. BOOST_TEST(!(u11 < u10));
  186. BOOST_TEST(u12 < u13);
  187. BOOST_TEST(!(u13 < u12));
  188. BOOST_TEST(u14 < u15);
  189. BOOST_TEST(!(u15 < u14));
  190. }
  191. { // test hash
  192. uuid u1 = {{0}};
  193. uuid u2 = {{1,0}};
  194. uuid u3 = {{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}};
  195. boost::hash<uuid> uuid_hasher;
  196. BOOST_TEST_NE(uuid_hasher(u1), uuid_hasher(u2));
  197. BOOST_TEST_NE(uuid_hasher(u1), uuid_hasher(u3));
  198. BOOST_TEST_NE(uuid_hasher(u2), uuid_hasher(u3));
  199. }
  200. { // test is_pod
  201. BOOST_TEST_EQ(boost::is_pod<uuid>::value, true);
  202. }
  203. return boost::report_errors();
  204. }