1 /* 2 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* @test 25 * @bug 4173528 5068772 8148936 26 * @summary Unit tests for java.util.UUID 27 * @key randomness 28 * @run main/othervm -XX:+CompactStrings UUIDTest 29 * @run main/othervm -XX:-CompactStrings UUIDTest 30 */ 31 32 package test.java.util.UUID; 33 34 import java.util.*; 35 36 public class UUIDTest { 37 38 static Random generator = new Random(); 39 main(String[] args)40 public static void main(String[] args) throws Exception { 41 containsTest(); 42 randomUUIDTest(); 43 nameUUIDFromBytesTest(); 44 stringTest(); 45 versionTest(); 46 variantTest(); 47 timestampTest(); 48 clockSequenceTest(); 49 nodeTest(); 50 hashCodeEqualsTest(); 51 compareTo(); 52 } 53 54 // Verify that list.contains detects UUID collisons containsTest()55 private static void containsTest() throws Exception { 56 List list = new LinkedList(); 57 list.add(new UUID(4,4)); 58 if (!list.contains(new UUID(4,4))) 59 throw new Exception("contains test did not work as expected"); 60 } 61 randomUUIDTest()62 private static void randomUUIDTest() throws Exception { 63 List list = new LinkedList(); 64 for (int i=0; i<100; i++) { 65 UUID u1 = UUID.randomUUID(); 66 if (4 != u1.version()) { 67 throw new Exception("bad version"); 68 } 69 if (2 != u1.variant()) { 70 throw new Exception("bad variant"); 71 } 72 if (list.contains(u1)) 73 throw new Exception("random UUID collision very unlikely"); 74 list.add(u1); 75 } 76 } 77 nameUUIDFromBytesTest()78 private static void nameUUIDFromBytesTest() throws Exception { 79 Random byteSource = new Random(); 80 byte[] someBytes = new byte[12]; 81 List list = new LinkedList(); 82 for (int i=0; i<100; i++) { 83 byteSource.nextBytes(someBytes); 84 UUID u1 = UUID.nameUUIDFromBytes(someBytes); 85 if (3 != u1.version()) { 86 throw new Exception("bad version"); 87 } 88 if (2 != u1.variant()) { 89 throw new Exception("bad variant"); 90 } 91 if (list.contains(u1)) 92 throw new Exception("byte UUID collision very unlikely"); 93 list.add(u1); 94 } 95 } 96 stringTest()97 private static void stringTest() throws Exception { 98 for (int i=0; i<100; i++) { 99 UUID u1 = UUID.randomUUID(); 100 UUID u2 = UUID.fromString(u1.toString()); 101 if (!u1.equals(u2)) 102 throw new Exception("UUID -> string -> UUID failed"); 103 } 104 105 testFromStringError("-0"); 106 testFromStringError("x"); 107 testFromStringError("----"); 108 testFromStringError("-0-0-0-0"); 109 testFromStringError("0-0-0-0-"); 110 // Android-changed: due to targetSdkVersion this test checks old 111 // implementation, which is not that strict. 112 // testFromStringError("0-0-0-0-0-"); 113 testFromStringError("0-0-0-0-x"); 114 } 115 testFromStringError(String str)116 private static void testFromStringError(String str) { 117 try { 118 UUID test = UUID.fromString(str); 119 throw new RuntimeException("Should have thrown IAE"); 120 } catch (IllegalArgumentException iae) { 121 // pass 122 } 123 } 124 versionTest()125 private static void versionTest() throws Exception { 126 UUID test = UUID.randomUUID(); 127 if (test.version() != 4) 128 throw new Exception("randomUUID not type 4"); 129 Random byteSource = new Random(); 130 byte[] someBytes = new byte[12]; 131 byteSource.nextBytes(someBytes); 132 test = UUID.nameUUIDFromBytes(someBytes); 133 if (test.version() != 3) 134 throw new Exception("nameUUIDFromBytes not type 3"); 135 test = UUID.fromString("9835451d-e2e0-1e41-8a5a-be785f17dcda"); 136 if (test.version() != 1) 137 throw new Exception("wrong version fromString 1"); 138 test = UUID.fromString("9835451d-e2e0-2e41-8a5a-be785f17dcda"); 139 if (test.version() != 2) 140 throw new Exception("wrong version fromString 2"); 141 test = UUID.fromString("9835451d-e2e0-3e41-8a5a-be785f17dcda"); 142 if (test.version() != 3) 143 throw new Exception("wrong version fromString 3"); 144 test = UUID.fromString("9835451d-e2e0-4e41-8a5a-be785f17dcda"); 145 if (test.version() != 4) 146 throw new Exception("wrong version fromString 4"); 147 test = new UUID(0x0000000000001000L, 55L); 148 if (test.version() != 1) 149 throw new Exception("wrong version from bit set to 1"); 150 test = new UUID(0x0000000000002000L, 55L); 151 if (test.version() != 2) 152 throw new Exception("wrong version from bit set to 2"); 153 test = new UUID(0x0000000000003000L, 55L); 154 if (test.version() != 3) 155 throw new Exception("wrong version from bit set to 3"); 156 test = new UUID(0x0000000000004000L, 55L); 157 if (test.version() != 4) 158 throw new Exception("wrong version from bit set to 4"); 159 } 160 variantTest()161 private static void variantTest() throws Exception { 162 UUID test = UUID.randomUUID(); 163 if (test.variant() != 2) 164 throw new Exception("randomUUID not variant 2"); 165 Random byteSource = new Random(); 166 byte[] someBytes = new byte[12]; 167 byteSource.nextBytes(someBytes); 168 test = UUID.nameUUIDFromBytes(someBytes); 169 if (test.variant() != 2) 170 throw new Exception("nameUUIDFromBytes not variant 2"); 171 test = new UUID(55L, 0x0000000000001000L); 172 if (test.variant() != 0) 173 throw new Exception("wrong variant from bit set to 0"); 174 test = new UUID(55L, 0x8000000000001000L); 175 if (test.variant() != 2) 176 throw new Exception("wrong variant from bit set to 2"); 177 test = new UUID(55L, 0xc000000000001000L); 178 if (test.variant() != 6) 179 throw new Exception("wrong variant from bit set to 6"); 180 test = new UUID(55L, 0xe000000000001000L); 181 if (test.variant() != 7) 182 throw new Exception("wrong variant from bit set to 7"); 183 } 184 timestampTest()185 private static void timestampTest() throws Exception { 186 UUID test = UUID.randomUUID(); 187 try { 188 test.timestamp(); 189 throw new Exception("Expected exception not thrown"); 190 } catch (UnsupportedOperationException uoe) { 191 // Correct result 192 } 193 test = UUID.fromString("00000001-0000-1000-8a5a-be785f17dcda"); 194 if (test.timestamp() != 1) 195 throw new Exception("Incorrect timestamp"); 196 test = UUID.fromString("00000400-0000-1000-8a5a-be785f17dcda"); 197 if (test.timestamp() != 1024) 198 throw new Exception("Incorrect timestamp"); 199 test = UUID.fromString("FFFFFFFF-FFFF-1FFF-8a5a-be785f17dcda"); 200 if (test.timestamp() != Long.MAX_VALUE>>3) 201 throw new Exception("Incorrect timestamp"); 202 } 203 clockSequenceTest()204 private static void clockSequenceTest() throws Exception { 205 UUID test = UUID.randomUUID(); 206 try { 207 test.clockSequence(); 208 throw new Exception("Expected exception not thrown"); 209 } catch (UnsupportedOperationException uoe) { 210 // Correct result 211 } 212 test = UUID.fromString("00000001-0000-1000-8001-be785f17dcda"); 213 if (test.clockSequence() != 1) 214 throw new Exception("Incorrect sequence"); 215 test = UUID.fromString("00000001-0000-1000-8002-be785f17dcda"); 216 if (test.clockSequence() != 2) 217 throw new Exception("Incorrect sequence"); 218 test = UUID.fromString("00000001-0000-1000-8010-be785f17dcda"); 219 if (test.clockSequence() != 16) 220 throw new Exception("Incorrect sequence"); 221 test = UUID.fromString("00000001-0000-1000-bFFF-be785f17dcda"); 222 if (test.clockSequence() != ((2L<<13)-1)) // 2^14 - 1 223 throw new Exception("Incorrect sequence"); 224 } 225 nodeTest()226 private static void nodeTest() throws Exception { 227 UUID test = UUID.randomUUID(); 228 try { 229 test.node(); 230 throw new Exception("Expected exception not thrown"); 231 } catch (UnsupportedOperationException uoe) { 232 // Correct result 233 } 234 test = UUID.fromString("00000001-0000-1000-8001-000000000001"); 235 if (test.node() != 1) 236 throw new Exception("Incorrect node"); 237 test = UUID.fromString("00000001-0000-1000-8002-FFFFFFFFFFFF"); 238 if (test.node() != ((2L<<47)-1)) // 2^48 - 1 239 throw new Exception("Incorrect node"); 240 } 241 hashCodeEqualsTest()242 private static void hashCodeEqualsTest() throws Exception { 243 // If two UUIDs are equal they must have the same hashCode 244 for (int i=0; i<100; i++) { 245 UUID u1 = UUID.randomUUID(); 246 UUID u2 = UUID.fromString(u1.toString()); 247 if (u1.hashCode() != u2.hashCode()) 248 throw new Exception("Equal UUIDs with different hashcodes"); 249 } 250 // Test equality of UUIDs with tampered bits 251 for (int i=0; i<1000; i++) { 252 long l = generator.nextLong(); 253 long l2 = generator.nextLong(); 254 int position = generator.nextInt(64); 255 UUID u1 = new UUID(l, l2); 256 l = l ^ (1L << position); 257 UUID u2 = new UUID(l, l2); 258 if (u1.equals(u2)) 259 throw new Exception("UUIDs with different bits equal"); 260 } 261 } 262 compareTo()263 private static void compareTo() throws Exception { 264 UUID id = new UUID(33L, 63L); 265 UUID id2 = new UUID(34L, 62L); 266 UUID id3 = new UUID(34L, 63L); 267 UUID id4 = new UUID(34L, 64L); 268 UUID id5 = new UUID(35L, 63L); 269 270 if ((id.compareTo(id2) >= 0) || 271 (id2.compareTo(id3) >= 0) || 272 (id3.compareTo(id4) >= 0) || 273 (id4.compareTo(id5) >= 0)) 274 throw new RuntimeException("compareTo failure"); 275 276 if ((id5.compareTo(id4) <= 0) || 277 (id4.compareTo(id3) <= 0) || 278 (id3.compareTo(id2) <= 0) || 279 (id2.compareTo(id) <= 0)) 280 throw new RuntimeException("compareTo failure"); 281 282 if (id.compareTo(id) != 0) 283 throw new RuntimeException("compareTo failure"); 284 285 } 286 287 } 288