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