| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #import <UIKit/UIKit.h> | 
 |  | 
 | #include "base/ios/device_util.h" | 
 | #include "base/strings/sys_string_conversions.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 | #include "testing/gtest_mac.h" | 
 | #include "testing/platform_test.h" | 
 |  | 
 | namespace { | 
 | // The behavior of most of these utility functions depends on what they are run | 
 | // on, so there is not much to unittest them. The APIs are run to make sure they | 
 | // don't choke. Additional checks are added for particular APIs when needed. | 
 |  | 
 | typedef PlatformTest DeviceUtilTest; | 
 |  | 
 | void CleanNSUserDefaultsForDeviceId() { | 
 |   NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 
 |   [defaults removeObjectForKey:@"ChromeClientID"]; | 
 |   [defaults removeObjectForKey:@"ChromiumClientID"]; | 
 |   [defaults removeObjectForKey:@"ClientIDGenerationHardwareType"]; | 
 |   [defaults synchronize]; | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, GetPlatform) { | 
 |   GTEST_ASSERT_GT(ios::device_util::GetPlatform().length(), 0U); | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, IsSingleCoreDevice) { | 
 |   ios::device_util::IsSingleCoreDevice(); | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, GetMacAddress) { | 
 |   GTEST_ASSERT_GT(ios::device_util::GetMacAddress("en0").length(), 0U); | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, GetRandomId) { | 
 |   GTEST_ASSERT_GT(ios::device_util::GetRandomId().length(), 0U); | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, GetDeviceIdentifier) { | 
 |   CleanNSUserDefaultsForDeviceId(); | 
 |  | 
 |   std::string default_id = ios::device_util::GetDeviceIdentifier(NULL); | 
 |   std::string other_id = ios::device_util::GetDeviceIdentifier("ForTest"); | 
 |   EXPECT_NE(default_id, other_id); | 
 |  | 
 |   CleanNSUserDefaultsForDeviceId(); | 
 |  | 
 |   std::string new_default_id = ios::device_util::GetDeviceIdentifier(NULL); | 
 |   if (![[[[UIDevice currentDevice] identifierForVendor] UUIDString] | 
 |           isEqualToString:@"00000000-0000-0000-0000-000000000000"]) { | 
 |     EXPECT_EQ(default_id, new_default_id); | 
 |   } else { | 
 |     EXPECT_NE(default_id, new_default_id); | 
 |   } | 
 |  | 
 |   CleanNSUserDefaultsForDeviceId(); | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, CheckMigration) { | 
 |   CleanNSUserDefaultsForDeviceId(); | 
 |  | 
 |   NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 
 |   [defaults setObject:@"10000000-0000-0000-0000-000000000000" | 
 |                forKey:@"ChromeClientID"]; | 
 |   [defaults synchronize]; | 
 |   std::string expected_id = ios::device_util::GetDeviceIdentifier(NULL); | 
 |   [defaults removeObjectForKey:@"ChromeClientID"]; | 
 |   [defaults setObject:@"10000000-0000-0000-0000-000000000000" | 
 |                forKey:@"ChromiumClientID"]; | 
 |   [defaults synchronize]; | 
 |   std::string new_id = ios::device_util::GetDeviceIdentifier(NULL); | 
 |   EXPECT_EQ(expected_id, new_id); | 
 |  | 
 |   CleanNSUserDefaultsForDeviceId(); | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, CheckMigrationFromZero) { | 
 |   CleanNSUserDefaultsForDeviceId(); | 
 |  | 
 |   NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 
 |   [defaults setObject:@"00000000-0000-0000-0000-000000000000" | 
 |                forKey:@"ChromeClientID"]; | 
 |   [defaults synchronize]; | 
 |   std::string zero_id = ios::device_util::GetDeviceIdentifier(NULL); | 
 |   [defaults removeObjectForKey:@"ChromeClientID"]; | 
 |   [defaults setObject:@"00000000-0000-0000-0000-000000000000" | 
 |                forKey:@"ChromiumClientID"]; | 
 |   [defaults synchronize]; | 
 |   std::string new_id = ios::device_util::GetDeviceIdentifier(NULL); | 
 |   EXPECT_NE(zero_id, new_id); | 
 |  | 
 |   CleanNSUserDefaultsForDeviceId(); | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, GetSaltedStringEquals) { | 
 |   std::string string1("The quick brown fox jumps over the lazy dog"); | 
 |   std::string string2("The quick brown fox jumps over the lazy dog"); | 
 |   std::string salt("salt"); | 
 |   // Same string and same salt should result in the same salted string. | 
 |   EXPECT_EQ(ios::device_util::GetSaltedString(string1, salt), | 
 |             ios::device_util::GetSaltedString(string2, salt)); | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, GetSaltedStringNotEquals) { | 
 |   std::string string1("The quick brown fox jumps over the lazy dog"); | 
 |   std::string string2("The lazy brown fox jumps over the quick dog"); | 
 |   std::string salt("salt"); | 
 |   // Different string and same salt should result in different salted strings. | 
 |   EXPECT_NE(ios::device_util::GetSaltedString(string1, salt), | 
 |             ios::device_util::GetSaltedString(string2, salt)); | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, GetSaltedStringDifferentSalt) { | 
 |   std::string string1("The quick brown fox jumps over the lazy dog"); | 
 |   std::string salt1("salt"); | 
 |   std::string salt2("pepper"); | 
 |   // Same string with different salt should result in different salted strings. | 
 |   EXPECT_NE(ios::device_util::GetSaltedString(string1, salt1), | 
 |             ios::device_util::GetSaltedString(string1, salt2)); | 
 | } | 
 |  | 
 | TEST_F(DeviceUtilTest, CheckDeviceMigration) { | 
 |   CleanNSUserDefaultsForDeviceId(); | 
 |  | 
 |   NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 
 |   [defaults setObject:@"10000000-0000-0000-0000-000000000000" | 
 |                forKey:@"ChromeClientID"]; | 
 |   [defaults synchronize]; | 
 |   std::string base_id = ios::device_util::GetDeviceIdentifier(NULL); | 
 |   [defaults setObject:@"Foo" forKey:@"ClientIDGenerationHardwareType"]; | 
 |   [defaults synchronize]; | 
 |   std::string new_id = ios::device_util::GetDeviceIdentifier(NULL); | 
 |   EXPECT_NE(new_id, base_id); | 
 |  | 
 |   CleanNSUserDefaultsForDeviceId(); | 
 | } | 
 |  | 
 | }  // namespace |