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/session/serializable_user_data_manager.h"
6
7#import "ios/web/public/test/fakes/test_web_state.h"
8#import "testing/gtest_mac.h"
9#include "testing/platform_test.h"
10
11#if !defined(__has_feature) || !__has_feature(objc_arc)
12#error "This file requires ARC support."
13#endif
14
15namespace {
16// User Data and Key to use for tests.
17NSString* const kTestUserData = @"TestUserData";
18NSString* const kTestUserDataKey = @"TestUserDataKey";
19}  // namespace
20
21class SerializableUserDataManagerTest : public PlatformTest {
22 protected:
23  // Convenience getter for the user data manager.
24  web::SerializableUserDataManager* manager() {
25    return web::SerializableUserDataManager::FromWebState(&web_state_);
26  }
27
28  web::TestWebState web_state_;
29};
30
31// Tests that serializable data can be successfully added and read.
32TEST_F(SerializableUserDataManagerTest, SetAndReadData) {
33  manager()->AddSerializableData(kTestUserData, kTestUserDataKey);
34  id value = manager()->GetValueForSerializationKey(kTestUserDataKey);
35  EXPECT_NSEQ(value, kTestUserData);
36}
37
38// Tests that SerializableUserData can successfully encode and decode.
39TEST_F(SerializableUserDataManagerTest, EncodeDecode) {
40  // Create a SerializableUserData instance for the test data.
41  manager()->AddSerializableData(kTestUserData, kTestUserDataKey);
42  std::unique_ptr<web::SerializableUserData> user_data =
43      manager()->CreateSerializableUserData();
44
45  // Archive the serializable user data.
46  NSKeyedArchiver* archiver =
47      [[NSKeyedArchiver alloc] initRequiringSecureCoding:NO];
48  user_data->Encode(archiver);
49  [archiver finishEncoding];
50  NSData* data = [archiver encodedData];
51
52  // Create a new SerializableUserData by unarchiving.
53  NSKeyedUnarchiver* unarchiver =
54      [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:nil];
55  unarchiver.requiresSecureCoding = NO;
56  std::unique_ptr<web::SerializableUserData> decoded_data =
57      web::SerializableUserData::Create();
58  decoded_data->Decode(unarchiver);
59
60  // Add the decoded user data to a new WebState and verify its contents.
61  web::TestWebState decoded_web_state;
62  web::SerializableUserDataManager* decoded_manager =
63      web::SerializableUserDataManager::FromWebState(&decoded_web_state);
64  decoded_manager->AddSerializableUserData(decoded_data.get());
65  id decoded_value =
66      decoded_manager->GetValueForSerializationKey(kTestUserDataKey);
67  EXPECT_NSEQ(decoded_value, kTestUserData);
68}
69
70// Check that if serialized data does not include user data, then restored
71// SerializableUserDataManager still allow reading and writing user data
72// (see http://crbug.com/699249 for details).
73TEST_F(SerializableUserDataManagerTest, DecodeNoData) {
74  NSKeyedArchiver* archiver =
75      [[NSKeyedArchiver alloc] initRequiringSecureCoding:NO];
76  [archiver finishEncoding];
77  NSData* data = [archiver encodedData];
78
79  std::unique_ptr<web::SerializableUserData> user_data =
80      web::SerializableUserData::Create();
81
82  NSKeyedUnarchiver* unarchiver =
83      [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:nil];
84  unarchiver.requiresSecureCoding = NO;
85  user_data->Decode(unarchiver);
86
87  web::TestWebState web_state;
88  web::SerializableUserDataManager* user_data_manager =
89      web::SerializableUserDataManager::FromWebState(&web_state);
90  user_data_manager->AddSerializableUserData(user_data.get());
91
92  id value = user_data_manager->GetValueForSerializationKey(kTestUserDataKey);
93  EXPECT_NSEQ(nil, value);
94
95  user_data_manager->AddSerializableData(kTestUserData, kTestUserDataKey);
96  value = user_data_manager->GetValueForSerializationKey(kTestUserDataKey);
97  EXPECT_NSEQ(kTestUserData, value);
98}
99