1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/guid.h"
6
7#include <limits>
8
9#include "base/strings/string_util.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12#if defined(OS_POSIX)
13
14namespace {
15
16bool IsGUIDv4(const std::string& guid) {
17  // The format of GUID version 4 must be xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,
18  // where y is one of [8, 9, A, B].
19  return base::IsValidGUID(guid) && guid[14] == '4' &&
20         (guid[19] == '8' || guid[19] == '9' || guid[19] == 'A' ||
21          guid[19] == 'a' || guid[19] == 'B' || guid[19] == 'b');
22}
23
24}  // namespace
25
26
27TEST(GUIDTest, GUIDGeneratesAllZeroes) {
28  uint64 bytes[] = { 0, 0 };
29  std::string clientid = base::RandomDataToGUIDString(bytes);
30  EXPECT_EQ("00000000-0000-0000-0000-000000000000", clientid);
31}
32
33TEST(GUIDTest, GUIDGeneratesCorrectly) {
34  uint64 bytes[] = { 0x0123456789ABCDEFULL, 0xFEDCBA9876543210ULL };
35  std::string clientid = base::RandomDataToGUIDString(bytes);
36  EXPECT_EQ("01234567-89AB-CDEF-FEDC-BA9876543210", clientid);
37}
38#endif
39
40TEST(GUIDTest, GUIDCorrectlyFormatted) {
41  const int kIterations = 10;
42  for (int it = 0; it < kIterations; ++it) {
43    std::string guid = base::GenerateGUID();
44    EXPECT_TRUE(base::IsValidGUID(guid));
45    EXPECT_TRUE(base::IsValidGUID(base::StringToLowerASCII(guid)));
46    EXPECT_TRUE(base::IsValidGUID(StringToUpperASCII(guid)));
47  }
48}
49
50TEST(GUIDTest, GUIDBasicUniqueness) {
51  const int kIterations = 10;
52  for (int it = 0; it < kIterations; ++it) {
53    std::string guid1 = base::GenerateGUID();
54    std::string guid2 = base::GenerateGUID();
55    EXPECT_EQ(36U, guid1.length());
56    EXPECT_EQ(36U, guid2.length());
57    EXPECT_NE(guid1, guid2);
58#if defined(OS_POSIX)
59    EXPECT_TRUE(IsGUIDv4(guid1));
60    EXPECT_TRUE(IsGUIDv4(guid2));
61#endif
62  }
63}
64