15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/guid.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool IsGUIDv4(const std::string& guid) { 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The format of GUID version 4 must be xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // where y is one of [8, 9, A, B]. 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return base::IsValidGUID(guid) && guid[14] == '4' && 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (guid[19] == '8' || guid[19] == '9' || guid[19] == 'A' || 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci guid[19] == 'a' || guid[19] == 'B' || guid[19] == 'b'); 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GUIDTest, GUIDGeneratesAllZeroes) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 bytes[] = { 0, 0 }; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string clientid = base::RandomDataToGUIDString(bytes); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("00000000-0000-0000-0000-000000000000", clientid); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GUIDTest, GUIDGeneratesCorrectly) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 bytes[] = { 0x0123456789ABCDEFULL, 0xFEDCBA9876543210ULL }; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string clientid = base::RandomDataToGUIDString(bytes); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("01234567-89AB-CDEF-FEDC-BA9876543210", clientid); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GUIDTest, GUIDCorrectlyFormatted) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kIterations = 10; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int it = 0; it < kIterations; ++it) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string guid = base::GenerateGUID(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(base::IsValidGUID(guid)); 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(base::IsValidGUID(base::StringToLowerASCII(guid))); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(base::IsValidGUID(StringToUpperASCII(guid))); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GUIDTest, GUIDBasicUniqueness) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kIterations = 10; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int it = 0; it < kIterations; ++it) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string guid1 = base::GenerateGUID(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string guid2 = base::GenerateGUID(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(36U, guid1.length()); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(36U, guid2.length()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(guid1, guid2); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_POSIX) 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(IsGUIDv4(guid1)); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(IsGUIDv4(guid2)); 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 64