OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2017 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 #import "ios/web/public/crw_navigation_item_storage.h" | |
6 | |
7 #import <Foundation/Foundation.h> | |
8 #include <stdint.h> | |
9 | |
10 #include <utility> | |
11 | |
12 #import "base/mac/scoped_nsobject.h" | |
13 #include "base/strings/sys_string_conversions.h" | |
14 #import "ios/testing/ocmock_complex_type_helper.h" | |
Eugene But (OOO till 7-30)
2017/01/31 22:12:26
This test tests interaction (that specific methods
kkhorimoto
2017/02/03 00:36:09
Done.
| |
15 #import "ios/web/navigation/navigation_item_impl.h" | |
16 #include "ios/web/public/referrer.h" | |
17 #import "net/base/mac/url_conversions.h" | |
18 #include "testing/gtest/include/gtest/gtest.h" | |
19 #import "testing/gtest_mac.h" | |
20 #include "testing/platform_test.h" | |
21 #import "third_party/ocmock/OCMock/OCMock.h" | |
22 #include "third_party/ocmock/gtest_support.h" | |
23 #include "ui/base/page_transition_types.h" | |
24 | |
25 class CRWNavigationItemStorageTest : public PlatformTest { | |
26 protected: | |
27 void SetUp() override { | |
28 // Set up |item_storage_|. | |
Eugene But (OOO till 7-30)
2017/01/31 22:12:26
Is it possible to move this code to constructor? I
kkhorimoto
2017/02/03 00:36:09
Done.
| |
29 item_storage_.reset([[CRWNavigationItemStorage alloc] init]); | |
30 [item_storage_ setVirtualURL:GURL("http://init.test")]; | |
31 [item_storage_ setReferrer:web::Referrer(GURL("http://referrer.url"), | |
32 web::ReferrerPolicyDefault)]; | |
33 [item_storage_ setTimestamp:base::Time::Now()]; | |
34 [item_storage_ setTitle:base::SysNSStringToUTF16(@"Title")]; | |
35 [item_storage_ | |
36 setDisplayState:web::PageDisplayState(0.0, 0.0, 0.0, 0.0, 0.0)]; | |
37 [item_storage_ | |
38 setPOSTData:[@"Test data" dataUsingEncoding:NSUTF8StringEncoding]]; | |
39 [item_storage_ setHTTPRequestHeaders:@{ @"HeaderKey" : @"HeaderValue" }]; | |
40 } | |
41 | |
42 // Convenience getter to facilitate dot notation in tests. | |
43 CRWNavigationItemStorage* item_storage() { return item_storage_; } | |
44 | |
45 protected: | |
46 base::scoped_nsobject<CRWNavigationItemStorage> item_storage_; | |
47 }; | |
48 | |
49 @implementation OCMockComplexTypeHelper (CRWNavigationItemStorageTest) | |
50 typedef void (^encodeBytes_length_forKey_block)(const uint8_t*, | |
51 NSUInteger, | |
52 NSString*); | |
53 - (void)encodeBytes:(const uint8_t*)bytes | |
54 length:(NSUInteger)length | |
55 forKey:(NSString*)key { | |
56 static_cast<encodeBytes_length_forKey_block>([self blockForSelector:_cmd])( | |
57 bytes, length, key); | |
58 } | |
59 | |
60 typedef const uint8_t* (^decodeBytesForKeyBlock)(NSString*, NSUInteger*); | |
61 - (const uint8_t*)decodeBytesForKey:(NSString*)key | |
62 returnedLength:(NSUInteger*)lengthp { | |
63 return static_cast<decodeBytesForKeyBlock>([self blockForSelector:_cmd])( | |
64 key, lengthp); | |
65 } | |
66 @end | |
67 | |
68 // Tests initializing with the legacy keys. | |
69 TEST_F(CRWNavigationItemStorageTest, InitWithCoderLegacy) { | |
70 NSURL* virtualUrl = net::NSURLWithGURL(item_storage().virtualURL); | |
71 NSURL* referrer = net::NSURLWithGURL(item_storage().referrer.url); | |
72 NSString* title = base::SysUTF16ToNSString(item_storage().title); | |
73 // Legacy NavigationItems don't persist timestamp. | |
74 item_storage().timestamp = base::Time::FromCFAbsoluteTime(0); | |
75 base::scoped_nsobject<id> decoder([[OCMockComplexTypeHelper alloc] | |
76 initWithRepresentedObject:[OCMockObject mockForClass:[NSCoder class]]]); | |
77 | |
78 decodeBytesForKeyBlock block = | |
79 ^const uint8_t*(NSString* key, NSUInteger* length) { | |
80 *length = 0; | |
81 return NULL; | |
82 }; | |
83 | |
84 [[[decoder stub] andReturnValue:[NSNumber numberWithBool:NO]] | |
85 containsValueForKey:[OCMArg any]]; | |
86 | |
87 [decoder onSelector:@selector(decodeBytesForKey:returnedLength:) | |
88 callBlockExpectation:block]; | |
89 [[[decoder expect] andReturn:virtualUrl] | |
90 decodeObjectForKey:web::kNavigationItemStorageURLDeperecatedKey]; | |
91 [[[decoder expect] andReturn:referrer] | |
92 decodeObjectForKey:web::kNavigationItemStorageReferrerURLDeprecatedKey]; | |
93 [[[decoder expect] andReturn:title] | |
94 decodeObjectForKey:web::kNavigationItemStorageTitleKey]; | |
95 NSDictionary* display_state_dict = [CRWNavigationItemStorage | |
96 dictionaryFromDisplayState:item_storage().displayState]; | |
97 [[[decoder expect] andReturn:display_state_dict] | |
98 decodeObjectForKey:web::kNavigationItemStoragePageDisplayStateKey]; | |
99 BOOL overriding_user_agent = item_storage().overridingUserAgent; | |
100 [[[decoder expect] andReturnValue:OCMOCK_VALUE(overriding_user_agent)] | |
101 decodeBoolForKey:web::kNavigationItemStorageUseDesktopUserAgentKey]; | |
102 NSDictionary* request_headers = item_storage().HTTPRequestHeaders; | |
103 [[[decoder expect] andReturn:request_headers] | |
104 decodeObjectForKey:web::kNavigationItemStorageHTTPRequestHeadersKey]; | |
105 [[[decoder expect] andReturn:item_storage().POSTData] | |
106 decodeObjectForKey:web::kNavigationItemStoragePOSTDataKey]; | |
107 BOOL skip_repost_form_confirmation = | |
108 item_storage().shouldSkipRepostFormConfirmation; | |
109 [[[decoder expect] andReturnValue:OCMOCK_VALUE(skip_repost_form_confirmation)] | |
110 decodeBoolForKey:web:: | |
111 kNavigationItemStorageSkipRepostFormConfirmationKey]; | |
112 | |
113 base::scoped_nsobject<CRWNavigationItemStorage> new_storage( | |
114 [[CRWNavigationItemStorage alloc] initWithCoder:decoder]); | |
115 | |
116 EXPECT_OCMOCK_VERIFY(decoder); | |
117 EXPECT_NSEQ(item_storage(), new_storage.get()); | |
118 } | |
119 | |
120 // Tests initializing with the new keys. | |
121 TEST_F(CRWNavigationItemStorageTest, InitWithCoder) { | |
122 std::string virtual_url = item_storage().virtualURL.spec(); | |
123 std::string referrer_url = item_storage().referrer.url.spec(); | |
124 NSString* title = base::SysUTF16ToNSString(item_storage().title); | |
125 int64_t timestamp = item_storage().timestamp.ToInternalValue(); | |
126 base::scoped_nsobject<id> decoder([[OCMockComplexTypeHelper alloc] | |
127 initWithRepresentedObject:[OCMockObject mockForClass:[NSCoder class]]]); | |
128 | |
129 const std::string empty_string; | |
130 decodeBytesForKeyBlock block = | |
131 ^const uint8_t*(NSString* key, NSUInteger* length) { | |
132 const std::string* value = &empty_string; | |
133 if ([key isEqualToString:web::kNavigationItemStorageURLKey]) | |
134 value = &virtual_url; | |
135 else if ([key isEqualToString:web::kNavigationItemStorageReferrerURLKey]) | |
136 value = &referrer_url; | |
137 else | |
138 EXPECT_TRUE(false); | |
139 | |
140 *length = value->size(); | |
141 return reinterpret_cast<const uint8_t*>(value->data()); | |
142 }; | |
143 | |
144 [decoder onSelector:@selector(decodeBytesForKey:returnedLength:) | |
145 callBlockExpectation:block]; | |
146 [[[decoder stub] andReturnValue:[NSNumber numberWithBool:YES]] | |
147 containsValueForKey:[OCMArg any]]; | |
148 web::ReferrerPolicy expected_policy = item_storage().referrer.policy; | |
149 [[[decoder expect] andReturnValue:OCMOCK_VALUE(expected_policy)] | |
150 decodeIntForKey:web::kNavigationItemStorageReferrerPolicyKey]; | |
151 [[[decoder expect] andReturnValue:OCMOCK_VALUE(timestamp)] | |
152 decodeInt64ForKey:web::kNavigationItemStorageTimestampKey]; | |
153 [[[decoder expect] andReturn:title] | |
154 decodeObjectForKey:web::kNavigationItemStorageTitleKey]; | |
155 const web::PageDisplayState& display_state = item_storage().displayState; | |
156 NSDictionary* display_state_dict = | |
157 [CRWNavigationItemStorage dictionaryFromDisplayState:display_state]; | |
158 [[[decoder expect] andReturn:display_state_dict] | |
159 decodeObjectForKey:web::kNavigationItemStoragePageDisplayStateKey]; | |
160 BOOL overriding_user_agent = item_storage().overridingUserAgent; | |
161 [[[decoder expect] andReturnValue:OCMOCK_VALUE(overriding_user_agent)] | |
162 decodeBoolForKey:web::kNavigationItemStorageUseDesktopUserAgentKey]; | |
163 NSDictionary* request_headers = item_storage().HTTPRequestHeaders; | |
164 [[[decoder expect] andReturn:request_headers] | |
165 decodeObjectForKey:web::kNavigationItemStorageHTTPRequestHeadersKey]; | |
166 NSData* post_data = item_storage().POSTData; | |
167 [[[decoder expect] andReturn:post_data] | |
168 decodeObjectForKey:web::kNavigationItemStoragePOSTDataKey]; | |
169 BOOL skip_repost_form_confirmation = | |
170 item_storage().shouldSkipRepostFormConfirmation; | |
171 [[[decoder expect] andReturnValue:OCMOCK_VALUE(skip_repost_form_confirmation)] | |
172 decodeBoolForKey:web:: | |
173 kNavigationItemStorageSkipRepostFormConfirmationKey]; | |
174 | |
175 base::scoped_nsobject<CRWNavigationItemStorage> new_storage( | |
176 [[CRWNavigationItemStorage alloc] initWithCoder:decoder]); | |
177 | |
178 EXPECT_OCMOCK_VERIFY(decoder); | |
179 EXPECT_NSEQ(item_storage(), new_storage.get()); | |
180 } | |
181 | |
182 // Tests that unarchiving CRWNavigationItemStorage data results in an equivalent | |
183 // storage. | |
184 TEST_F(CRWNavigationItemStorageTest, EncodeDecode) { | |
185 NSData* data = [NSKeyedArchiver archivedDataWithRootObject:item_storage()]; | |
186 id decoded = [NSKeyedUnarchiver unarchiveObjectWithData:data]; | |
187 EXPECT_NSEQ(item_storage(), decoded); | |
188 } | |
189 | |
190 // Tests that CRWNavigationItemStorage is encoded as expected. | |
191 TEST_F(CRWNavigationItemStorageTest, EncodeWithCoder) { | |
192 NSString* title = base::SysUTF16ToNSString(item_storage().title); | |
193 | |
194 base::scoped_nsobject<id> coder([[OCMockComplexTypeHelper alloc] | |
195 initWithRepresentedObject:[OCMockObject mockForClass:[NSCoder class]]]); | |
196 | |
197 encodeBytes_length_forKey_block block = ^(const uint8_t* bytes, | |
198 NSUInteger length, NSString* key) { | |
199 if ([key isEqualToString:web::kNavigationItemStorageURLKey]) { | |
200 ASSERT_EQ(item_storage().virtualURL.spec(), | |
201 std::string(reinterpret_cast<const char*>(bytes), length)); | |
202 return; | |
203 } else if ([key | |
204 isEqualToString:web::kNavigationItemStorageReferrerURLKey]) { | |
205 ASSERT_EQ(item_storage().referrer.url.spec(), | |
206 std::string(reinterpret_cast<const char*>(bytes), length)); | |
207 return; | |
208 } | |
209 FAIL(); | |
210 }; | |
211 [coder onSelector:@selector(encodeBytes:length:forKey:) | |
212 callBlockExpectation:block]; | |
213 [[coder expect] encodeInt:item_storage().referrer.policy | |
214 forKey:web::kNavigationItemStorageReferrerPolicyKey]; | |
215 [[coder expect] encodeInt64:item_storage().timestamp.ToInternalValue() | |
216 forKey:web::kNavigationItemStorageTimestampKey]; | |
217 [[coder expect] encodeObject:title | |
218 forKey:web::kNavigationItemStorageTitleKey]; | |
219 const web::PageDisplayState& display_state = item_storage().displayState; | |
220 NSDictionary* display_state_dict = | |
221 [CRWNavigationItemStorage dictionaryFromDisplayState:display_state]; | |
222 [[coder expect] encodeObject:display_state_dict | |
223 forKey:web::kNavigationItemStoragePageDisplayStateKey]; | |
224 BOOL useDesktopUserAgent = item_storage().overridingUserAgent; | |
225 [[coder expect] encodeBool:useDesktopUserAgent | |
226 forKey:web::kNavigationItemStorageUseDesktopUserAgentKey]; | |
227 NSDictionary* request_headers = item_storage().HTTPRequestHeaders; | |
228 [[coder expect] | |
229 encodeObject:request_headers | |
230 forKey:web::kNavigationItemStorageHTTPRequestHeadersKey]; | |
231 [[coder expect] encodeObject:item_storage().POSTData | |
232 forKey:web::kNavigationItemStoragePOSTDataKey]; | |
233 BOOL skip_repost_form_confirmation = | |
234 item_storage().shouldSkipRepostFormConfirmation; | |
235 [[coder expect] | |
236 encodeBool:skip_repost_form_confirmation | |
237 forKey:web::kNavigationItemStorageSkipRepostFormConfirmationKey]; | |
238 [item_storage() encodeWithCoder:coder]; | |
239 EXPECT_OCMOCK_VERIFY(coder); | |
240 } | |
OLD | NEW |