/*
 * Copyright 2003-2004 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

/* @test
 * @bug 4173528 5068772
 * @compile -source 1.4 -target 1.4 UUIDTest.java
 * @run main UUIDTest
 * @summary Unit tests for java.util.UUID
 */

import java.util.*;

public class UUIDTest {

    static Random generator = new Random();

    public static void main(String[] args) throws Exception {
        containsTest();
        randomUUIDTest();
        nameUUIDFromBytesTest();
        stringTest();
        versionTest();
        variantTest();
        timestampTest();
        clockSequenceTest();
        nodeTest();
        hashCodeEqualsTest();
        compareTo();
    }

    // Verify that list.contains detects UUID collisons
    private static void containsTest() throws Exception {
        List list = new LinkedList();
        list.add(new UUID(4,4));
        if (!list.contains(new UUID(4,4)))
            throw new Exception("contains test did not work as expected");
    }

    private static void randomUUIDTest() throws Exception {
        List list = new LinkedList();
        for (int i=0; i<100; i++) {
            UUID u1 = UUID.randomUUID();
            if (list.contains(u1))
                throw new Exception("random UUID collision very unlikely");
            list.add(u1);
        }
    }

    private static void nameUUIDFromBytesTest() throws Exception {
        Random byteSource = new Random();
        byte[] someBytes = new byte[12];
        List list = new LinkedList();
        for (int i=0; i<100; i++) {
            byteSource.nextBytes(someBytes);
            UUID test = UUID.nameUUIDFromBytes(someBytes);
            if (list.contains(test))
                throw new Exception("byte UUID collision very unlikely");
            list.add(test);
        }
    }

    private static void stringTest() throws Exception {
        for (int i=0; i<100; i++) {
            UUID u1 = UUID.randomUUID();
            UUID u2 = UUID.fromString(u1.toString());
            if (!u1.equals(u2))
                throw new Exception("UUID -> string -> UUID failed");
        }
    }

    private static void versionTest() throws Exception {
        UUID test = UUID.randomUUID();
        if (test.version() != 4)
            throw new Exception("randomUUID not type 4");
        Random byteSource = new Random();
        byte[] someBytes = new byte[12];
        byteSource.nextBytes(someBytes);
        test = UUID.nameUUIDFromBytes(someBytes);
        if (test.version() != 3)
            throw new Exception("nameUUIDFromBytes not type 3");
        test = UUID.fromString("9835451d-e2e0-1e41-8a5a-be785f17dcda");
        if (test.version() != 1)
            throw new Exception("wrong version fromString 1");
        test = UUID.fromString("9835451d-e2e0-2e41-8a5a-be785f17dcda");
        if (test.version() != 2)
            throw new Exception("wrong version fromString 2");
        test = UUID.fromString("9835451d-e2e0-3e41-8a5a-be785f17dcda");
        if (test.version() != 3)
            throw new Exception("wrong version fromString 3");
        test = UUID.fromString("9835451d-e2e0-4e41-8a5a-be785f17dcda");
        if (test.version() != 4)
            throw new Exception("wrong version fromString 4");
        test = new UUID(0x0000000000001000L, 55L);
        if (test.version() != 1)
            throw new Exception("wrong version from bit set to 1");
        test = new UUID(0x0000000000002000L, 55L);
        if (test.version() != 2)
            throw new Exception("wrong version from bit set to 2");
        test = new UUID(0x0000000000003000L, 55L);
        if (test.version() != 3)
            throw new Exception("wrong version from bit set to 3");
        test = new UUID(0x0000000000004000L, 55L);
        if (test.version() != 4)
            throw new Exception("wrong version from bit set to 4");
    }

    private static void variantTest() throws Exception {
        UUID test = UUID.randomUUID();
        if (test.variant() != 2)
            throw new Exception("randomUUID not variant 2");
        Random byteSource = new Random();
        byte[] someBytes = new byte[12];
        byteSource.nextBytes(someBytes);
        test = UUID.nameUUIDFromBytes(someBytes);
        if (test.variant() != 2)
            throw new Exception("nameUUIDFromBytes not variant 2");
        test = new UUID(55L, 0x0000000000001000L);
        if (test.variant() != 0)
            throw new Exception("wrong variant from bit set to 0");
        test = new UUID(55L, 0x8000000000001000L);
        if (test.variant() != 2)
            throw new Exception("wrong variant from bit set to 2");
       test = new UUID(55L, 0xc000000000001000L);
        if (test.variant() != 6)
            throw new Exception("wrong variant from bit set to 6");
       test = new UUID(55L, 0xe000000000001000L);
        if (test.variant() != 7)
            throw new Exception("wrong variant from bit set to 7");
    }

    private static void timestampTest() throws Exception {
        UUID test = UUID.randomUUID();
        try {
            test.timestamp();
            throw new Exception("Expected exception not thrown");
        } catch (UnsupportedOperationException uoe) {
            // Correct result
        }
        test = UUID.fromString("00000001-0000-1000-8a5a-be785f17dcda");
        if (test.timestamp() != 1)
            throw new Exception("Incorrect timestamp");
        test = UUID.fromString("00000400-0000-1000-8a5a-be785f17dcda");
        if (test.timestamp() != 1024)
            throw new Exception("Incorrect timestamp");
        test = UUID.fromString("FFFFFFFF-FFFF-1FFF-8a5a-be785f17dcda");
        if (test.timestamp() != Long.MAX_VALUE>>3)
            throw new Exception("Incorrect timestamp");
    }

    private static void clockSequenceTest() throws Exception {
        UUID test = UUID.randomUUID();
        try {
            test.clockSequence();
            throw new Exception("Expected exception not thrown");
        } catch (UnsupportedOperationException uoe) {
            // Correct result
        }
        test = UUID.fromString("00000001-0000-1000-8001-be785f17dcda");
        if (test.clockSequence() != 1)
            throw new Exception("Incorrect sequence");
        test = UUID.fromString("00000001-0000-1000-8002-be785f17dcda");
        if (test.clockSequence() != 2)
            throw new Exception("Incorrect sequence");
        test = UUID.fromString("00000001-0000-1000-8010-be785f17dcda");
        if (test.clockSequence() != 16)
            throw new Exception("Incorrect sequence");
        test = UUID.fromString("00000001-0000-1000-bFFF-be785f17dcda");
        if (test.clockSequence() != ((2L<<13)-1)) // 2^14 - 1
            throw new Exception("Incorrect sequence");
    }

    private static void nodeTest() throws Exception {
        UUID test = UUID.randomUUID();
        try {
            test.node();
            throw new Exception("Expected exception not thrown");
        } catch (UnsupportedOperationException uoe) {
            // Correct result
        }
        test = UUID.fromString("00000001-0000-1000-8001-000000000001");
        if (test.node() != 1)
            throw new Exception("Incorrect node");
        test = UUID.fromString("00000001-0000-1000-8002-FFFFFFFFFFFF");
        if (test.node() != ((2L<<47)-1)) // 2^48 - 1
            throw new Exception("Incorrect node");
    }

    private static void hashCodeEqualsTest() throws Exception {
        // If two UUIDs are equal they must have the same hashCode
        for (int i=0; i<100; i++) {
            UUID u1 = UUID.randomUUID();
            UUID u2 = UUID.fromString(u1.toString());
            if (u1.hashCode() != u2.hashCode())
                throw new Exception("Equal UUIDs with different hashcodes");
        }
        // Test equality of UUIDs with tampered bits
        for (int i=0; i<1000; i++) {
            long l = generator.nextLong();
            long l2 = generator.nextLong();
            int position = generator.nextInt(64);
            UUID u1 = new UUID(l, l2);
            l = l ^ (1L << position);
            UUID u2 = new UUID(l, l2);
            if (u1.equals(u2))
                throw new Exception("UUIDs with different bits equal");
        }
    }

    private static void compareTo() throws Exception {
        UUID id = new UUID(33L, 63L);
        UUID id2 = new UUID(34L, 62L);
        UUID id3 = new UUID(34L, 63L);
        UUID id4 = new UUID(34L, 64L);
        UUID id5 = new UUID(35L, 63L);

        if ((id.compareTo(id2) >= 0) ||
            (id2.compareTo(id3) >= 0) ||
            (id3.compareTo(id4) >= 0) ||
            (id4.compareTo(id5) >= 0))
            throw new RuntimeException("compareTo failure");

        if ((id5.compareTo(id4) <= 0) ||
            (id4.compareTo(id3) <= 0) ||
            (id3.compareTo(id2) <= 0) ||
            (id2.compareTo(id) <= 0))
            throw new RuntimeException("compareTo failure");

        if (id.compareTo(id) != 0)
            throw new RuntimeException("compareTo failure");

    }

}
