| Index: ios/shared/chrome/browser/tabs/web_state_list_serialization_unittest.mm
|
| diff --git a/ios/shared/chrome/browser/tabs/web_state_list_serialization_unittest.mm b/ios/shared/chrome/browser/tabs/web_state_list_serialization_unittest.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1672b620962b2f99076b8a605be9af4690f86706
|
| --- /dev/null
|
| +++ b/ios/shared/chrome/browser/tabs/web_state_list_serialization_unittest.mm
|
| @@ -0,0 +1,134 @@
|
| +// Copyright 2017 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 "ios/shared/chrome/browser/tabs/web_state_list_serialization.h"
|
| +
|
| +#include <memory>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#import "ios/shared/chrome/browser/tabs/fake_web_state_list_delegate.h"
|
| +#import "ios/shared/chrome/browser/tabs/web_state_list.h"
|
| +#import "ios/shared/chrome/browser/tabs/web_state_opener.h"
|
| +#import "ios/web/public/crw_session_storage.h"
|
| +#import "ios/web/public/serializable_user_data_manager.h"
|
| +#import "ios/web/public/test/fakes/test_web_state.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "testing/platform_test.h"
|
| +
|
| +#if !defined(__has_feature) || !__has_feature(objc_arc)
|
| +#error "This file requires ARC support."
|
| +#endif
|
| +
|
| +namespace {
|
| +
|
| +// Serializable sub-class of TestWebState.
|
| +class SerializableTestWebState : public web::TestWebState {
|
| + public:
|
| + static std::unique_ptr<web::WebState> Create() {
|
| + return base::MakeUnique<SerializableTestWebState>();
|
| + }
|
| +
|
| + static std::unique_ptr<web::WebState> CreateWithSessionStorage(
|
| + CRWSessionStorage* session_storage) {
|
| + std::unique_ptr<web::WebState> web_state = Create();
|
| + web::SerializableUserDataManager::FromWebState(web_state.get())
|
| + ->AddSerializableUserData(session_storage.userData);
|
| + return web_state;
|
| + }
|
| +
|
| + private:
|
| + // web::TestWebState implementation.
|
| + CRWSessionStorage* BuildSessionStorage() override {
|
| + std::unique_ptr<web::SerializableUserData> serializable_user_data =
|
| + web::SerializableUserDataManager::FromWebState(this)
|
| + ->CreateSerializableUserData();
|
| +
|
| + CRWSessionStorage* session_storage = [[CRWSessionStorage alloc] init];
|
| + [session_storage setSerializableUserData:std::move(serializable_user_data)];
|
| + return session_storage;
|
| + }
|
| +};
|
| +
|
| +// Compares whether both WebStateList |original| and |restored| have the same
|
| +// opener-opened relationship. The |restored| WebStateList may have additional
|
| +// WebState, so only indices from |restored_index| to |count()| are compared.
|
| +void ExpectRelationshipIdenticalFrom(int restored_index,
|
| + WebStateList* original,
|
| + WebStateList* restored) {
|
| + ASSERT_GE(restored_index, 0);
|
| + EXPECT_EQ(original->count(), restored->count() - restored_index);
|
| +
|
| + for (int index = 0; index < original->count(); ++index) {
|
| + WebStateOpener original_opener = original->GetOpenerOfWebStateAt(index);
|
| + WebStateOpener restored_opener =
|
| + restored->GetOpenerOfWebStateAt(index + restored_index);
|
| +
|
| + int restored_opener_index =
|
| + restored_opener.opener
|
| + ? restored->GetIndexOfWebState(restored_opener.opener) -
|
| + restored_index
|
| + : WebStateList::kInvalidIndex;
|
| +
|
| + EXPECT_EQ(original->GetIndexOfWebState(original_opener.opener),
|
| + restored_opener_index);
|
| + EXPECT_EQ(original_opener.navigation_index,
|
| + restored_opener.navigation_index);
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +class WebStateListSerializationTest : public PlatformTest {
|
| + public:
|
| + WebStateListSerializationTest() = default;
|
| +
|
| + WebStateListDelegate* web_state_list_delegate() {
|
| + return &web_state_list_delegate_;
|
| + }
|
| +
|
| + private:
|
| + FakeWebStateListDelegate web_state_list_delegate_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(WebStateListSerializationTest);
|
| +};
|
| +
|
| +TEST_F(WebStateListSerializationTest, SerializationEmpty) {
|
| + WebStateList original_web_state_list(web_state_list_delegate());
|
| + NSArray<CRWSessionStorage*>* sessions =
|
| + SerializeWebStateList(&original_web_state_list);
|
| +
|
| + EXPECT_EQ(0u, [sessions count]);
|
| +}
|
| +
|
| +TEST_F(WebStateListSerializationTest, SerializationRoundTrip) {
|
| + WebStateList original_web_state_list(web_state_list_delegate());
|
| + original_web_state_list.InsertWebState(0, SerializableTestWebState::Create());
|
| + original_web_state_list.InsertWebState(1, SerializableTestWebState::Create());
|
| + original_web_state_list.InsertWebState(2, SerializableTestWebState::Create());
|
| + original_web_state_list.InsertWebState(3, SerializableTestWebState::Create());
|
| + original_web_state_list.SetOpenerOfWebStateAt(
|
| + 1, WebStateOpener(original_web_state_list.GetWebStateAt(0), 3));
|
| + original_web_state_list.SetOpenerOfWebStateAt(
|
| + 2, WebStateOpener(original_web_state_list.GetWebStateAt(0), 2));
|
| + original_web_state_list.SetOpenerOfWebStateAt(
|
| + 3, WebStateOpener(original_web_state_list.GetWebStateAt(1), 1));
|
| +
|
| + NSArray<CRWSessionStorage*>* sessions =
|
| + SerializeWebStateList(&original_web_state_list);
|
| +
|
| + EXPECT_EQ(4u, [sessions count]);
|
| +
|
| + WebStateList restored_web_state_list(web_state_list_delegate());
|
| + restored_web_state_list.InsertWebState(0, SerializableTestWebState::Create());
|
| + ASSERT_EQ(1, restored_web_state_list.count());
|
| +
|
| + DeserializeWebStateList(
|
| + &restored_web_state_list, sessions,
|
| + base::BindRepeating(&SerializableTestWebState::CreateWithSessionStorage));
|
| +
|
| + EXPECT_EQ(5, restored_web_state_list.count());
|
| + ExpectRelationshipIdenticalFrom(1, &original_web_state_list,
|
| + &restored_web_state_list);
|
| +}
|
|
|