// 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"

#import "base/mac/scoped_nsobject.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"

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.openedByDOM == session2.openedByDOM &&
         session1.currentNavigationIndex == session2.currentNavigationIndex &&
         session1.previousNavigationIndex == session2.previousNavigationIndex &&
         UserDataAreEqual(session1.userData, session2.userData);
}
}  // namespace

class CRWNSessionStorageTest : public PlatformTest {
 protected:
  CRWNSessionStorageTest()
      : session_storage_([[CRWSessionStorage alloc] init]) {
    // Set up |session_storage_|.
    [session_storage_ setOpenedByDOM:YES];
    [session_storage_ setCurrentNavigationIndex:4];
    [session_storage_ setPreviousNavigationIndex:3];
    // Create an item storage.
    base::scoped_nsobject<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:
  base::scoped_nsobject<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));
}
