// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/web/navigation/synthesized_session_restore.h"

#import "base/ios/ios_util.h"
#import "base/strings/stringprintf.h"
#import "base/strings/utf_string_conversions.h"
#import "ios/web/public/test/web_test.h"
#import "ios/web/web_state/web_state_impl.h"
#import "testing/gtest/include/gtest/gtest.h"

namespace web {

namespace {

// Creates a vector with given number of navigation items. All items will
// have distinct titles, URLs, and referrers
std::vector<std::unique_ptr<NavigationItemImpl>> CreateTestNavigationItems(
    size_t count) {
  std::vector<std::unique_ptr<NavigationItemImpl>> items;
  for (size_t i = 0; i < count; i++) {
    auto item = std::make_unique<NavigationItemImpl>();
    item->SetURL(GURL(base::StringPrintf("http://www.%zu.com", i)));
    item->SetTitle(base::ASCIIToUTF16(base::StringPrintf("Test%zu", i)));
    // Set every other referrer.
    if (i % 2) {
      item->SetReferrer(web::Referrer(
          GURL(base::StringPrintf("http://www.referrer%zu.com", i)),
          static_cast<web::ReferrerPolicy>(0)));
    }
    items.push_back(std::move(item));
  }
  return items;
}

}  // namespace

class SynthesizedSessionRestoreTest : public web::WebTest {
 protected:
  SynthesizedSessionRestoreTest() {}

  void SetUp() override {
    web::WebTest::SetUp();
    web::WebState::CreateParams params(GetBrowserState());
    web_state_ = std::make_unique<web::WebStateImpl>(params);
  }

  std::unique_ptr<WebStateImpl> web_state_;
};

// Test that the synthetic session data blob can be successfully loaded
// by WebStateImpl and correctly restores the session.
TEST_F(SynthesizedSessionRestoreTest, TestRestore) {
  std::vector<std::unique_ptr<NavigationItemImpl>> items =
      CreateTestNavigationItems(100);

  NSData* synthesized_data = SynthesizedSessionRestore(
      /*last_committed_item_index=*/0, items, /*off_the_record=*/false);
  EXPECT_GT(synthesized_data.length, 0u);

  EXPECT_TRUE(web_state_->SetSessionStateData(synthesized_data));
  EXPECT_EQ(web_state_->GetNavigationItemCount(), 100);
}

}  // namespace web
