Index: ios/net/cookies/cookie_creation_time_manager_unittest.mm |
diff --git a/ios/net/cookies/cookie_creation_time_manager_unittest.mm b/ios/net/cookies/cookie_creation_time_manager_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ac73d383816cdb40be3ca7847c6b6161755f76a1 |
--- /dev/null |
+++ b/ios/net/cookies/cookie_creation_time_manager_unittest.mm |
@@ -0,0 +1,126 @@ |
+// Copyright 2014 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. |
+ |
+#include "ios/net/cookies/cookie_creation_time_manager.h" |
+ |
+#import <Foundation/Foundation.h> |
+ |
+#include "base/ios/ios_util.h" |
+#include "base/time/time.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace net { |
+ |
+class CookieCreationTimeManagerTest : public testing::Test { |
+ public: |
+ NSHTTPCookie* GetCookie(NSString* cookie_line) { |
+ NSArray* cookies = [NSHTTPCookie |
+ cookiesWithResponseHeaderFields:@{ @"Set-Cookie" : cookie_line } |
+ forURL:[NSURL URLWithString:@"http://foo"]]; |
+ if ([cookies count] != 1) |
+ return nil; |
+ |
+ return [cookies objectAtIndex:0]; |
+ } |
+ |
+ protected: |
+ CookieCreationTimeManager creation_time_manager_; |
+}; |
+ |
+TEST_F(CookieCreationTimeManagerTest, SetAndGet) { |
+ NSHTTPCookie* cookie = GetCookie(@"A=B"); |
+ ASSERT_TRUE(cookie); |
+ base::Time creation_time = base::Time::Now(); |
+ creation_time_manager_.SetCreationTime(cookie, creation_time); |
+ EXPECT_EQ(creation_time, creation_time_manager_.GetCreationTime(cookie)); |
+} |
+ |
+TEST_F(CookieCreationTimeManagerTest, GetFromSystemCookie) { |
+ NSHTTPCookie* cookie = GetCookie(@"A=B"); |
+ |
+ // The creation time of a cookie that was never set through the |
+ // CookieCreationTimeManager should be retrieved from the system with 1 |
+ // second precision. |
+ base::Time time = creation_time_manager_.GetCreationTime(cookie); |
+ base::Time now = base::Time::Now(); |
+ ASSERT_FALSE(time.is_null()); |
+ int64 delta = (now - time).InMilliseconds(); |
+ // On iOS 8, the range is (0, 1000) ms, but on earlier iOS versions the range |
+ // is (-500, 500) ms. The intervals tested are actually 1200 ms to allow some |
+ // imprecision. |
+ if (base::ios::IsRunningOnIOS8OrLater()) { |
+ EXPECT_GT(delta, -100); |
+ EXPECT_LT(delta, 1100); |
+ } else { |
+ EXPECT_GT(delta, -600); |
+ EXPECT_LT(delta, 600); |
+ } |
+} |
+ |
+TEST_F(CookieCreationTimeManagerTest, MakeUniqueCreationTime) { |
+ base::Time now = base::Time::Now(); |
+ |
+ // |now| is not used yet, so MakeUniqueCreationTime() should return that. |
+ base::Time creation_time = creation_time_manager_.MakeUniqueCreationTime(now); |
+ EXPECT_EQ(now, creation_time); |
+ |
+ NSHTTPCookie* cookie1 = GetCookie(@"A=B"); |
+ ASSERT_TRUE(cookie1); |
+ creation_time_manager_.SetCreationTime(cookie1, creation_time); |
+ // |now| is used by cookie1, MakeUniqueCreationTime() should return the |
+ // incremented value. |
+ creation_time = creation_time_manager_.MakeUniqueCreationTime(now); |
+ EXPECT_EQ(base::Time::FromInternalValue(now.ToInternalValue() + 1), |
+ creation_time); |
+ |
+ // Delete |cookie1|. |
+ creation_time_manager_.DeleteCreationTime(cookie1); |
+ // |now| is available again because |cookie1| was deleted. |
+ creation_time = creation_time_manager_.MakeUniqueCreationTime(now); |
+ EXPECT_EQ(now, creation_time); |
+ |
+ creation_time_manager_.SetCreationTime(GetCookie(@"C=D"), creation_time); |
+ // Override |C| with a cookie that has a different time, to make |now| |
+ // available again. |
+ creation_time_manager_.SetCreationTime( |
+ GetCookie(@"C=E"), now - base::TimeDelta::FromMilliseconds(1)); |
+ // |now| is available again because |C| was overriden. |
+ creation_time = creation_time_manager_.MakeUniqueCreationTime(now); |
+ EXPECT_EQ(now, creation_time); |
+ |
+ creation_time_manager_.SetCreationTime(GetCookie(@"F=G"), creation_time); |
+ // Delete all creation times. |
+ creation_time_manager_.Clear(); |
+ // |now| is available again because all creation times were cleared. |
+ creation_time = creation_time_manager_.MakeUniqueCreationTime(now); |
+ EXPECT_EQ(now, creation_time); |
+} |
+ |
+TEST_F(CookieCreationTimeManagerTest, MakeUniqueCreationTimeConflicts) { |
+ base::Time creation_time = base::Time::Now(); |
+ int64 time_internal_value = creation_time.ToInternalValue(); |
+ // Insert two cookies with consecutive times. |
+ creation_time_manager_.SetCreationTime(GetCookie(@"A=B"), creation_time); |
+ creation_time_manager_.SetCreationTime( |
+ GetCookie(@"C=D"), |
+ base::Time::FromInternalValue(time_internal_value + 1)); |
+ |
+ // MakeUniqueCreationTime() should insert at |time_internal_value + 2|. |
+ base::Time time = |
+ creation_time_manager_.MakeUniqueCreationTime(creation_time); |
+ EXPECT_EQ(time_internal_value + 2, time.ToInternalValue()); |
+ creation_time_manager_.SetCreationTime(GetCookie(@"E=F"), time); |
+ |
+ // Leave an available slot at |time_internal_value + 3| and insert another |
+ // cookie at |time_internal_value + 4|. |
+ creation_time_manager_.SetCreationTime( |
+ GetCookie(@"G=H"), |
+ base::Time::FromInternalValue(time_internal_value + 4)); |
+ |
+ // MakeUniqueCreationTime() should use the available slot. |
+ time = creation_time_manager_.MakeUniqueCreationTime(creation_time); |
+ EXPECT_EQ(time_internal_value + 3, time.ToInternalValue()); |
+} |
+ |
+} // namespace net |