// 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/web/public/crw_session_storage.h"

#include "base/strings/sys_string_conversions.h"
#import "ios/web/navigation/navigation_item_impl.h"
#import "ios/web/navigation/navigation_item_storage_test_util.h"
#import "ios/web/navigation/serializable_user_data_manager_impl.h"
#import "ios/web/public/crw_navigation_item_storage.h"
#include "ios/web/public/referrer.h"
#import "net/base/mac/url_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"
#include "testing/platform_test.h"
#include "third_party/ocmock/gtest_support.h"
#include "ui/base/page_transition_types.h"

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

namespace {
// Checks for equality between the item storages in |items1| and |items2|.
BOOL ItemStorageListsAreEqual(NSArray* items1, NSArray* items2) {
  __block BOOL items_are_equal = items1.count == items2.count;
  if (!items_are_equal)
    return NO;
  [items1 enumerateObjectsUsingBlock:^(CRWNavigationItemStorage* item,
                                       NSUInteger idx, BOOL* stop) {
    items_are_equal &= web::ItemStoragesAreEqual(item, items2[idx]);
    *stop = !items_are_equal;
  }];
  return items_are_equal;
}
// Checks for equality between |user_data1| and |user_data2|.
BOOL UserDataAreEqual(web::SerializableUserData* user_data1,
                      web::SerializableUserData* user_data2) {
  web::SerializableUserDataImpl* data1 =
      static_cast<web::SerializableUserDataImpl*>(user_data1);
  web::SerializableUserDataImpl* data2 =
      static_cast<web::SerializableUserDataImpl*>(user_data2);
  return (data1 == nullptr) == (data2 == nullptr) &&
         (!data1 || [data1->data() isEqualToDictionary:data2->data()]);
}
// Checks for equality between |session1| and |session2|.
BOOL SessionStoragesAreEqual(CRWSessionStorage* session1,
                             CRWSessionStorage* session2) {
  // Check the rest of the properties.
  NSArray* items1 = session1.itemStorages;
  NSArray* items2 = session2.itemStorages;
  return ItemStorageListsAreEqual(items1, items2) &&
         session1.hasOpener == session2.hasOpener &&
         session1.lastCommittedItemIndex == session2.lastCommittedItemIndex &&
         session1.previousItemIndex == session2.previousItemIndex &&
         UserDataAreEqual(session1.userData, session2.userData);
}
}  // namespace

class CRWNSessionStorageTest : public PlatformTest {
 protected:
  CRWNSessionStorageTest()
      : session_storage_([[CRWSessionStorage alloc] init]) {
    // Set up |session_storage_|.
    [session_storage_ setHasOpener:YES];
    [session_storage_ setLastCommittedItemIndex:4];
    [session_storage_ setPreviousItemIndex:3];
    // Create an item storage.
    CRWNavigationItemStorage* item_storage =
        [[CRWNavigationItemStorage alloc] init];
    [item_storage setVirtualURL:GURL("http://init.test")];
    [item_storage setReferrer:web::Referrer(GURL("http://referrer.url"),
                                            web::ReferrerPolicyDefault)];
    [item_storage setTimestamp:base::Time::Now()];
    [item_storage setTitle:base::SysNSStringToUTF16(@"Title")];
    [item_storage
        setDisplayState:web::PageDisplayState(0.0, 0.0, 0.0, 0.0, 0.0)];
    [item_storage
        setPOSTData:[@"Test data" dataUsingEncoding:NSUTF8StringEncoding]];
    [item_storage setHTTPRequestHeaders:@{ @"HeaderKey" : @"HeaderValue" }];
    [session_storage_ setItemStorages:@[ item_storage ]];
    // Create serializable user data.
    std::unique_ptr<web::SerializableUserDataImpl> user_data(
        new web::SerializableUserDataImpl(
            @{ @"key" : @"value" }));
    [session_storage_ setSerializableUserData:std::move(user_data)];
  }

 protected:
  CRWSessionStorage* session_storage_;
};

// Tests that unarchiving CRWSessionStorage data results in an equivalent
// storage.
TEST_F(CRWNSessionStorageTest, EncodeDecode) {
  NSData* data = [NSKeyedArchiver archivedDataWithRootObject:session_storage_];
  id decoded = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  EXPECT_TRUE(SessionStoragesAreEqual(session_storage_, decoded));
}
