1 /*
   2  * Copyright 2003-2004 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  20  * CA 95054 USA or visit www.sun.com if you need additional information or
  21  * have any questions.
  22  */
  23 
  24 /* @test
  25  * @bug 4173528 5068772
  26  * @summary Unit tests for java.util.UUID
  27  */
  28 
  29 import java.util.*;
  30 
  31 public class UUIDTest {
  32 
  33     static Random generator = new Random();
  34 
  35     public static void main(String[] args) throws Exception {
  36         containsTest();
  37         randomUUIDTest();
  38         nameUUIDFromBytesTest();
  39         stringTest();
  40         versionTest();
  41         variantTest();
  42         timestampTest();
  43         clockSequenceTest();
  44         nodeTest();
  45         hashCodeEqualsTest();
  46         compareTo();
  47     }
  48 
  49     // Verify that list.contains detects UUID collisons
  50     private static void containsTest() throws Exception {
  51         List list = new LinkedList();
  52         list.add(new UUID(4,4));
  53         if (!list.contains(new UUID(4,4)))
  54             throw new Exception("contains test did not work as expected");
  55     }
  56 
  57     private static void randomUUIDTest() throws Exception {
  58         List list = new LinkedList();
  59         for (int i=0; i<100; i++) {
  60             UUID u1 = UUID.randomUUID();
  61             if (list.contains(u1))
  62                 throw new Exception("random UUID collision very unlikely");
  63             list.add(u1);
  64         }
  65     }
  66 
  67     private static void nameUUIDFromBytesTest() throws Exception {
  68         Random byteSource = new Random();
  69         byte[] someBytes = new byte[12];
  70         List list = new LinkedList();
  71         for (int i=0; i<100; i++) {
  72             byteSource.nextBytes(someBytes);
  73             UUID test = UUID.nameUUIDFromBytes(someBytes);
  74             if (list.contains(test))
  75                 throw new Exception("byte UUID collision very unlikely");
  76             list.add(test);
  77         }
  78     }
  79 
  80     private static void stringTest() throws Exception {
  81         for (int i=0; i<100; i++) {
  82             UUID u1 = UUID.randomUUID();
  83             UUID u2 = UUID.fromString(u1.toString());
  84             if (!u1.equals(u2))
  85                 throw new Exception("UUID -> string -> UUID failed");
  86         }
  87     }
  88 
  89     private static void versionTest() throws Exception {
  90         UUID test = UUID.randomUUID();
  91         if (test.version() != 4)
  92             throw new Exception("randomUUID not type 4");
  93         Random byteSource = new Random();
  94         byte[] someBytes = new byte[12];
  95         byteSource.nextBytes(someBytes);
  96         test = UUID.nameUUIDFromBytes(someBytes);
  97         if (test.version() != 3)
  98             throw new Exception("nameUUIDFromBytes not type 3");
  99         test = UUID.fromString("9835451d-e2e0-1e41-8a5a-be785f17dcda");
 100         if (test.version() != 1)
 101             throw new Exception("wrong version fromString 1");
 102         test = UUID.fromString("9835451d-e2e0-2e41-8a5a-be785f17dcda");
 103         if (test.version() != 2)
 104             throw new Exception("wrong version fromString 2");
 105         test = UUID.fromString("9835451d-e2e0-3e41-8a5a-be785f17dcda");
 106         if (test.version() != 3)
 107             throw new Exception("wrong version fromString 3");
 108         test = UUID.fromString("9835451d-e2e0-4e41-8a5a-be785f17dcda");
 109         if (test.version() != 4)
 110             throw new Exception("wrong version fromString 4");
 111         test = new UUID(0x0000000000001000L, 55L);
 112         if (test.version() != 1)
 113             throw new Exception("wrong version from bit set to 1");
 114         test = new UUID(0x0000000000002000L, 55L);
 115         if (test.version() != 2)
 116             throw new Exception("wrong version from bit set to 2");
 117         test = new UUID(0x0000000000003000L, 55L);
 118         if (test.version() != 3)
 119             throw new Exception("wrong version from bit set to 3");
 120         test = new UUID(0x0000000000004000L, 55L);
 121         if (test.version() != 4)
 122             throw new Exception("wrong version from bit set to 4");
 123     }
 124 
 125     private static void variantTest() throws Exception {
 126         UUID test = UUID.randomUUID();
 127         if (test.variant() != 2)
 128             throw new Exception("randomUUID not variant 2");
 129         Random byteSource = new Random();
 130         byte[] someBytes = new byte[12];
 131         byteSource.nextBytes(someBytes);
 132         test = UUID.nameUUIDFromBytes(someBytes);
 133         if (test.variant() != 2)
 134             throw new Exception("nameUUIDFromBytes not variant 2");
 135         test = new UUID(55L, 0x0000000000001000L);
 136         if (test.variant() != 0)
 137             throw new Exception("wrong variant from bit set to 0");
 138         test = new UUID(55L, 0x8000000000001000L);
 139         if (test.variant() != 2)
 140             throw new Exception("wrong variant from bit set to 2");
 141        test = new UUID(55L, 0xc000000000001000L);
 142         if (test.variant() != 6)
 143             throw new Exception("wrong variant from bit set to 6");
 144        test = new UUID(55L, 0xe000000000001000L);
 145         if (test.variant() != 7)
 146             throw new Exception("wrong variant from bit set to 7");
 147     }
 148 
 149     private static void timestampTest() throws Exception {
 150         UUID test = UUID.randomUUID();
 151         try {
 152             test.timestamp();
 153             throw new Exception("Expected exception not thrown");
 154         } catch (UnsupportedOperationException uoe) {
 155             // Correct result
 156         }
 157         test = UUID.fromString("00000001-0000-1000-8a5a-be785f17dcda");
 158         if (test.timestamp() != 1)
 159             throw new Exception("Incorrect timestamp");
 160         test = UUID.fromString("00000400-0000-1000-8a5a-be785f17dcda");
 161         if (test.timestamp() != 1024)
 162             throw new Exception("Incorrect timestamp");
 163         test = UUID.fromString("FFFFFFFF-FFFF-1FFF-8a5a-be785f17dcda");
 164         if (test.timestamp() != Long.MAX_VALUE>>3)
 165             throw new Exception("Incorrect timestamp");
 166     }
 167 
 168     private static void clockSequenceTest() throws Exception {
 169         UUID test = UUID.randomUUID();
 170         try {
 171             test.clockSequence();
 172             throw new Exception("Expected exception not thrown");
 173         } catch (UnsupportedOperationException uoe) {
 174             // Correct result
 175         }
 176         test = UUID.fromString("00000001-0000-1000-8001-be785f17dcda");
 177         if (test.clockSequence() != 1)
 178             throw new Exception("Incorrect sequence");
 179         test = UUID.fromString("00000001-0000-1000-8002-be785f17dcda");
 180         if (test.clockSequence() != 2)
 181             throw new Exception("Incorrect sequence");
 182         test = UUID.fromString("00000001-0000-1000-8010-be785f17dcda");
 183         if (test.clockSequence() != 16)
 184             throw new Exception("Incorrect sequence");
 185         test = UUID.fromString("00000001-0000-1000-bFFF-be785f17dcda");
 186         if (test.clockSequence() != ((2L<<13)-1)) // 2^14 - 1
 187             throw new Exception("Incorrect sequence");
 188     }
 189 
 190     private static void nodeTest() throws Exception {
 191         UUID test = UUID.randomUUID();
 192         try {
 193             test.node();
 194             throw new Exception("Expected exception not thrown");
 195         } catch (UnsupportedOperationException uoe) {
 196             // Correct result
 197         }
 198         test = UUID.fromString("00000001-0000-1000-8001-000000000001");
 199         if (test.node() != 1)
 200             throw new Exception("Incorrect node");
 201         test = UUID.fromString("00000001-0000-1000-8002-FFFFFFFFFFFF");
 202         if (test.node() != ((2L<<47)-1)) // 2^48 - 1
 203             throw new Exception("Incorrect node");
 204     }
 205 
 206     private static void hashCodeEqualsTest() throws Exception {
 207         // If two UUIDs are equal they must have the same hashCode
 208         for (int i=0; i<100; i++) {
 209             UUID u1 = UUID.randomUUID();
 210             UUID u2 = UUID.fromString(u1.toString());
 211             if (u1.hashCode() != u2.hashCode())
 212                 throw new Exception("Equal UUIDs with different hashcodes");
 213         }
 214         // Test equality of UUIDs with tampered bits
 215         for (int i=0; i<1000; i++) {
 216             long l = generator.nextLong();
 217             long l2 = generator.nextLong();
 218             int position = generator.nextInt(64);
 219             UUID u1 = new UUID(l, l2);
 220             l = l ^ (1L << position);
 221             UUID u2 = new UUID(l, l2);
 222             if (u1.equals(u2))
 223                 throw new Exception("UUIDs with different bits equal");
 224         }
 225     }
 226 
 227     private static void compareTo() throws Exception {
 228         UUID id = new UUID(33L, 63L);
 229         UUID id2 = new UUID(34L, 62L);
 230         UUID id3 = new UUID(34L, 63L);
 231         UUID id4 = new UUID(34L, 64L);
 232         UUID id5 = new UUID(35L, 63L);
 233 
 234         if ((id.compareTo(id2) >= 0) ||
 235             (id2.compareTo(id3) >= 0) ||
 236             (id3.compareTo(id4) >= 0) ||
 237             (id4.compareTo(id5) >= 0))
 238             throw new RuntimeException("compareTo failure");
 239 
 240         if ((id5.compareTo(id4) <= 0) ||
 241             (id4.compareTo(id3) <= 0) ||
 242             (id3.compareTo(id2) <= 0) ||
 243             (id2.compareTo(id) <= 0))
 244             throw new RuntimeException("compareTo failure");
 245 
 246         if (id.compareTo(id) != 0)
 247             throw new RuntimeException("compareTo failure");
 248 
 249     }
 250 
 251 }