Home | History | Annotate | Download | only in sessions
      1 // Copyright (c) 2012 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 #include <cstddef>
      6 #include <string>
      7 
      8 #include "base/basictypes.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/pickle.h"
     11 #include "base/strings/string16.h"
     12 #include "base/strings/string_number_conversions.h"
     13 #include "base/strings/utf_string_conversions.h"
     14 #include "base/time/time.h"
     15 #include "chrome/browser/search/search.h"
     16 #include "chrome/browser/sessions/session_types.h"
     17 #include "components/sessions/serialized_navigation_entry_test_helper.h"
     18 #include "content/public/browser/favicon_status.h"
     19 #include "content/public/browser/navigation_entry.h"
     20 #include "content/public/common/page_transition_types.h"
     21 #include "content/public/common/referrer.h"
     22 #include "sync/protocol/session_specifics.pb.h"
     23 #include "sync/util/time.h"
     24 #include "testing/gtest/include/gtest/gtest.h"
     25 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
     26 #include "url/gurl.h"
     27 
     28 namespace {
     29 
     30 const int kIndex = 3;
     31 const int kUniqueID = 50;
     32 const content::Referrer kReferrer =
     33     content::Referrer(GURL("http://www.referrer.com"),
     34                       WebKit::WebReferrerPolicyAlways);
     35 const GURL kVirtualURL("http://www.virtual-url.com");
     36 const string16 kTitle = ASCIIToUTF16("title");
     37 const content::PageState kPageState =
     38     content::PageState::CreateFromEncodedData("page state");
     39 const content::PageTransition kTransitionType =
     40     static_cast<content::PageTransition>(
     41         content::PAGE_TRANSITION_AUTO_SUBFRAME |
     42         content::PAGE_TRANSITION_HOME_PAGE |
     43         content::PAGE_TRANSITION_CLIENT_REDIRECT);
     44 const bool kHasPostData = true;
     45 const int64 kPostID = 100;
     46 const GURL kOriginalRequestURL("http://www.original-request.com");
     47 const bool kIsOverridingUserAgent = true;
     48 const base::Time kTimestamp = syncer::ProtoTimeToTime(100);
     49 const string16 kSearchTerms = ASCIIToUTF16("my search terms");
     50 const GURL kFaviconURL("http://virtual-url.com/favicon.ico");
     51 
     52 const int kPageID = 10;
     53 
     54 // Create a NavigationEntry from the constants above.
     55 scoped_ptr<content::NavigationEntry> MakeNavigationEntryForTest() {
     56   scoped_ptr<content::NavigationEntry> navigation_entry(
     57       content::NavigationEntry::Create());
     58   navigation_entry->SetReferrer(kReferrer);
     59   navigation_entry->SetVirtualURL(kVirtualURL);
     60   navigation_entry->SetTitle(kTitle);
     61   navigation_entry->SetPageState(kPageState);
     62   navigation_entry->SetTransitionType(kTransitionType);
     63   navigation_entry->SetHasPostData(kHasPostData);
     64   navigation_entry->SetPostID(kPostID);
     65   navigation_entry->SetOriginalRequestURL(kOriginalRequestURL);
     66   navigation_entry->SetIsOverridingUserAgent(kIsOverridingUserAgent);
     67   navigation_entry->SetTimestamp(kTimestamp);
     68   navigation_entry->SetExtraData(sessions::kSearchTermsKey, kSearchTerms);
     69   navigation_entry->GetFavicon().valid = true;
     70   navigation_entry->GetFavicon().url = kFaviconURL;
     71   return navigation_entry.Pass();
     72 }
     73 
     74 // Create a sync_pb::TabNavigation from the constants above.
     75 sync_pb::TabNavigation MakeSyncDataForTest() {
     76   sync_pb::TabNavigation sync_data;
     77   sync_data.set_virtual_url(kVirtualURL.spec());
     78   sync_data.set_referrer(kReferrer.url.spec());
     79   sync_data.set_title(UTF16ToUTF8(kTitle));
     80   sync_data.set_state(kPageState.ToEncodedData());
     81   sync_data.set_page_transition(
     82       sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME);
     83   sync_data.set_unique_id(kUniqueID);
     84   sync_data.set_timestamp_msec(syncer::TimeToProtoTime(kTimestamp));
     85   sync_data.set_redirect_type(sync_pb::SyncEnums::CLIENT_REDIRECT);
     86   sync_data.set_navigation_home_page(true);
     87   sync_data.set_search_terms(UTF16ToUTF8(kSearchTerms));
     88   sync_data.set_favicon_url(kFaviconURL.spec());
     89   return sync_data;
     90 }
     91 
     92 // Create a typical SessionTab protocol buffer and set an existing
     93 // SessionTab from it.  The data from the protocol buffer should
     94 // clobber the existing data.
     95 TEST(SessionTab, FromSyncData) {
     96   sync_pb::SessionTab sync_data;
     97   sync_data.set_tab_id(5);
     98   sync_data.set_window_id(10);
     99   sync_data.set_tab_visual_index(13);
    100   sync_data.set_current_navigation_index(3);
    101   sync_data.set_pinned(true);
    102   sync_data.set_extension_app_id("app_id");
    103   for (int i = 0; i < 5; ++i) {
    104     sync_pb::TabNavigation* navigation = sync_data.add_navigation();
    105     navigation->set_virtual_url("http://foo/" + base::IntToString(i));
    106     navigation->set_referrer("referrer");
    107     navigation->set_title("title");
    108     navigation->set_page_transition(sync_pb::SyncEnums_PageTransition_TYPED);
    109   }
    110 
    111   SessionTab tab;
    112   tab.window_id.set_id(100);
    113   tab.tab_id.set_id(100);
    114   tab.tab_visual_index = 100;
    115   tab.current_navigation_index = 1000;
    116   tab.pinned = false;
    117   tab.extension_app_id = "fake";
    118   tab.user_agent_override = "fake";
    119   tab.timestamp = base::Time::FromInternalValue(100);
    120   tab.navigations.resize(100);
    121   tab.session_storage_persistent_id = "fake";
    122 
    123   tab.SetFromSyncData(sync_data, base::Time::FromInternalValue(5u));
    124   EXPECT_EQ(10, tab.window_id.id());
    125   EXPECT_EQ(5, tab.tab_id.id());
    126   EXPECT_EQ(13, tab.tab_visual_index);
    127   EXPECT_EQ(3, tab.current_navigation_index);
    128   EXPECT_TRUE(tab.pinned);
    129   EXPECT_EQ("app_id", tab.extension_app_id);
    130   EXPECT_TRUE(tab.user_agent_override.empty());
    131   EXPECT_EQ(5u, tab.timestamp.ToInternalValue());
    132   ASSERT_EQ(5u, tab.navigations.size());
    133   for (int i = 0; i < 5; ++i) {
    134     EXPECT_EQ(i, tab.navigations[i].index());
    135     EXPECT_EQ(GURL("referrer"), tab.navigations[i].referrer().url);
    136     EXPECT_EQ(string16(ASCIIToUTF16("title")), tab.navigations[i].title());
    137     EXPECT_EQ(content::PAGE_TRANSITION_TYPED,
    138               tab.navigations[i].transition_type());
    139     EXPECT_EQ(GURL("http://foo/" + base::IntToString(i)),
    140               tab.navigations[i].virtual_url());
    141   }
    142   EXPECT_TRUE(tab.session_storage_persistent_id.empty());
    143 }
    144 
    145 TEST(SessionTab, ToSyncData) {
    146   SessionTab tab;
    147   tab.window_id.set_id(10);
    148   tab.tab_id.set_id(5);
    149   tab.tab_visual_index = 13;
    150   tab.current_navigation_index = 3;
    151   tab.pinned = true;
    152   tab.extension_app_id = "app_id";
    153   tab.user_agent_override = "fake";
    154   tab.timestamp = base::Time::FromInternalValue(100);
    155   for (int i = 0; i < 5; ++i) {
    156     tab.navigations.push_back(
    157         sessions::SerializedNavigationEntryTestHelper::CreateNavigation(
    158             "http://foo/" + base::IntToString(i), "title"));
    159   }
    160   tab.session_storage_persistent_id = "fake";
    161 
    162   const sync_pb::SessionTab& sync_data = tab.ToSyncData();
    163   EXPECT_EQ(5, sync_data.tab_id());
    164   EXPECT_EQ(10, sync_data.window_id());
    165   EXPECT_EQ(13, sync_data.tab_visual_index());
    166   EXPECT_EQ(3, sync_data.current_navigation_index());
    167   EXPECT_TRUE(sync_data.pinned());
    168   EXPECT_EQ("app_id", sync_data.extension_app_id());
    169   ASSERT_EQ(5, sync_data.navigation_size());
    170   for (int i = 0; i < 5; ++i) {
    171     EXPECT_EQ(tab.navigations[i].virtual_url().spec(),
    172               sync_data.navigation(i).virtual_url());
    173     EXPECT_EQ(UTF16ToUTF8(tab.navigations[i].title()),
    174               sync_data.navigation(i).title());
    175   }
    176   EXPECT_FALSE(sync_data.has_favicon());
    177   EXPECT_FALSE(sync_data.has_favicon_type());
    178   EXPECT_FALSE(sync_data.has_favicon_source());
    179 }
    180 
    181 }  // namespace
    182