blob: 196daab77ac2b48b850055c1c52a59d0351ce347 [file] [log] [blame]
// Copyright 2019 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.
#include "components/send_tab_to_self/send_tab_to_self_entry.h"
#include <memory>
#include "base/strings/utf_string_conversions.h"
#include "base/test/gtest_util.h"
#include "base/test/simple_test_tick_clock.h"
#include "components/send_tab_to_self/proto/send_tab_to_self.pb.h"
#include "components/sync/protocol/send_tab_to_self_specifics.pb.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace send_tab_to_self {
namespace {
bool IsEqualForTesting(const SendTabToSelfEntry& a,
const SendTabToSelfEntry& b) {
return a.GetGUID() == b.GetGUID() && a.GetURL() == b.GetURL() &&
a.GetTitle() == b.GetTitle() &&
a.GetDeviceName() == b.GetDeviceName() &&
a.GetTargetDeviceSyncCacheGuid() == b.GetTargetDeviceSyncCacheGuid() &&
a.GetSharedTime() == b.GetSharedTime() &&
a.GetOriginalNavigationTime() == b.GetOriginalNavigationTime();
}
bool IsEqualForTesting(const SendTabToSelfEntry& entry,
const sync_pb::SendTabToSelfSpecifics& specifics) {
return (
entry.GetGUID() == specifics.guid() &&
entry.GetURL() == specifics.url() &&
entry.GetTitle() == specifics.title() &&
entry.GetDeviceName() == specifics.device_name() &&
entry.GetTargetDeviceSyncCacheGuid() ==
specifics.target_device_sync_cache_guid() &&
specifics.shared_time_usec() ==
entry.GetSharedTime().ToDeltaSinceWindowsEpoch().InMicroseconds() &&
specifics.navigation_time_usec() == entry.GetOriginalNavigationTime()
.ToDeltaSinceWindowsEpoch()
.InMicroseconds());
}
TEST(SendTabToSelfEntry, CompareEntries) {
const SendTabToSelfEntry e1("1", GURL("http://example.com"), "bar",
base::Time::FromTimeT(10),
base::Time::FromTimeT(10), "device1", "device2");
const SendTabToSelfEntry e2("1", GURL("http://example.com"), "bar",
base::Time::FromTimeT(10),
base::Time::FromTimeT(10), "device1", "device2");
EXPECT_TRUE(IsEqualForTesting(e1, e2));
const SendTabToSelfEntry e3("2", GURL("http://example.org"), "bar",
base::Time::FromTimeT(10),
base::Time::FromTimeT(10), "device1", "device2");
EXPECT_FALSE(IsEqualForTesting(e1, e3));
}
TEST(SendTabToSelfEntry, SharedTime) {
SendTabToSelfEntry e("1", GURL("http://example.com"), "bar",
base::Time::FromTimeT(10), base::Time::FromTimeT(10),
"device", "device2");
EXPECT_EQ("bar", e.GetTitle());
// Getters return Base::Time values.
EXPECT_EQ(e.GetSharedTime(), base::Time::FromTimeT(10));
}
// Tests that the send tab to self entry is correctly encoded to
// sync_pb::SendTabToSelfSpecifics.
TEST(SendTabToSelfEntry, AsProto) {
SendTabToSelfEntry entry("1", GURL("http://example.com"), "bar",
base::Time::FromTimeT(10), base::Time::FromTimeT(10),
"device", "device2");
SendTabToSelfLocal pb_entry(entry.AsLocalProto());
EXPECT_TRUE(IsEqualForTesting(entry, pb_entry.specifics()));
}
// Tests that the send tab to self entry is correctly created from the required
// fields
TEST(SendTabToSelfEntry, FromRequiredFields) {
SendTabToSelfEntry expected("1", GURL("http://example.com"), "", base::Time(),
base::Time(), "", "target_device");
std::unique_ptr<SendTabToSelfEntry> actual =
SendTabToSelfEntry::FromRequiredFields("1", GURL("http://example.com"),
"target_device");
EXPECT_TRUE(IsEqualForTesting(expected, *actual));
}
// Tests that the send tab to self entry is correctly parsed from
// sync_pb::SendTabToSelfSpecifics.
TEST(SendTabToSelfEntry, FromProto) {
std::unique_ptr<sync_pb::SendTabToSelfSpecifics> pb_entry =
std::make_unique<sync_pb::SendTabToSelfSpecifics>();
pb_entry->set_guid("1");
pb_entry->set_url("http://example.com/");
pb_entry->set_title("title");
pb_entry->set_device_name("device");
pb_entry->set_target_device_sync_cache_guid("device");
pb_entry->set_shared_time_usec(1);
pb_entry->set_navigation_time_usec(1);
std::unique_ptr<SendTabToSelfEntry> entry(
SendTabToSelfEntry::FromProto(*pb_entry, base::Time::FromTimeT(10)));
EXPECT_TRUE(IsEqualForTesting(*entry, *pb_entry));
}
// Tests that the send tab to self entry expiry works as expected
TEST(SendTabToSelfEntry, IsExpired) {
SendTabToSelfEntry entry("1", GURL("http://example.com"), "bar",
base::Time::FromTimeT(10), base::Time::FromTimeT(10),
"device1", "device1");
EXPECT_TRUE(entry.IsExpired(base::Time::FromTimeT(11) +
base::TimeDelta::FromDays(10)));
EXPECT_FALSE(entry.IsExpired(base::Time::FromTimeT(11)));
}
// Tests that the send tab to self entry rejects strings that are not utf8.
TEST(SendTabToSelfEntry, InvalidStrings) {
const base::char16 term[1] = {0xFDD1u};
std::string invalid_utf8;
base::UTF16ToUTF8(&term[0], 1, &invalid_utf8);
EXPECT_DCHECK_DEATH(SendTabToSelfEntry(
"1", GURL("http://example.com"), invalid_utf8, base::Time::FromTimeT(10),
base::Time::FromTimeT(10), "device", "device"));
EXPECT_DCHECK_DEATH(
SendTabToSelfEntry(invalid_utf8, GURL("http://example.com"), "title",
base::Time::FromTimeT(10), base::Time::FromTimeT(10),
"device", "device"));
EXPECT_DCHECK_DEATH(SendTabToSelfEntry(
"1", GURL("http://example.com"), "title", base::Time::FromTimeT(10),
base::Time::FromTimeT(10), invalid_utf8, "device"));
EXPECT_DCHECK_DEATH(SendTabToSelfEntry(
"1", GURL("http://example.com"), "title", base::Time::FromTimeT(10),
base::Time::FromTimeT(10), "device", invalid_utf8));
std::unique_ptr<sync_pb::SendTabToSelfSpecifics> pb_entry =
std::make_unique<sync_pb::SendTabToSelfSpecifics>();
pb_entry->set_guid(invalid_utf8);
pb_entry->set_url("http://example.com/");
pb_entry->set_title(invalid_utf8);
pb_entry->set_device_name(invalid_utf8);
pb_entry->set_target_device_sync_cache_guid("device");
;
pb_entry->set_shared_time_usec(1);
pb_entry->set_navigation_time_usec(1);
EXPECT_DCHECK_DEATH(
SendTabToSelfEntry::FromProto(*pb_entry, base::Time::FromTimeT(10)));
}
// Tests that the send tab to self entry is correctly encoded to
// sync_pb::SendTabToSelfSpecifics.
TEST(SendTabToSelfEntry, MarkAsOpened) {
SendTabToSelfEntry entry("1", GURL("http://example.com"), "bar",
base::Time::FromTimeT(10), base::Time::FromTimeT(10),
"device", "device2");
EXPECT_FALSE(entry.IsOpened());
entry.MarkOpened();
EXPECT_TRUE(entry.IsOpened());
std::unique_ptr<sync_pb::SendTabToSelfSpecifics> pb_entry =
std::make_unique<sync_pb::SendTabToSelfSpecifics>();
pb_entry->set_guid("1");
pb_entry->set_url("http://example.com/");
pb_entry->set_title("title");
pb_entry->set_device_name("device");
pb_entry->set_target_device_sync_cache_guid("device");
pb_entry->set_shared_time_usec(1);
pb_entry->set_navigation_time_usec(1);
pb_entry->set_opened(true);
std::unique_ptr<SendTabToSelfEntry> entry2(
SendTabToSelfEntry::FromProto(*pb_entry, base::Time::FromTimeT(10)));
EXPECT_TRUE(entry2->IsOpened());
}
} // namespace
} // namespace send_tab_to_self