1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_piece.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_types.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/glue/typed_url_model_associator.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/typed_url_specifics.pb.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing browser_sync::TypedUrlModelAssociator;
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TypedUrlModelAssociatorTest : public testing::Test {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static history::URLRow MakeTypedUrlRow(const char* url,
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         const char* title,
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         int typed_count,
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         int64 last_visit,
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         bool hidden,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         history::VisitVector* visits) {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL gurl(url);
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    history::URLRow history_url(gurl);
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    history_url.set_title(UTF8ToUTF16(title));
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    history_url.set_typed_count(typed_count);
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    history_url.set_last_visit(
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        base::Time::FromInternalValue(last_visit));
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    history_url.set_hidden(hidden);
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    visits->push_back(history::VisitRow(
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        history_url.id(), history_url.last_visit(), 0, 0, 0));
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    history_url.set_visit_count(visits->size());
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return history_url;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static sync_pb::TypedUrlSpecifics MakeTypedUrlSpecifics(const char* url,
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          const char* title,
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          int typed_count,
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          int64 last_visit,
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          bool hidden) {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    sync_pb::TypedUrlSpecifics typed_url;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typed_url.set_url(url);
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typed_url.set_title(title);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typed_url.set_typed_count(typed_count);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typed_url.set_hidden(hidden);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typed_url.add_visit(last_visit);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return typed_url;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool URLsEqual(history::URLRow& lhs, history::URLRow& rhs) {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (lhs.url().spec().compare(rhs.url().spec()) == 0) &&
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           (lhs.title().compare(rhs.title()) == 0) &&
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           (lhs.visit_count() == rhs.visit_count()) &&
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           (lhs.typed_count() == rhs.typed_count()) &&
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           (lhs.hidden() == rhs.hidden());
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TypedUrlModelAssociatorTest, MergeUrls) {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector visits1;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow row1(MakeTypedUrlRow("http://pie.com/", "pie",
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       2, 3, false, &visits1));
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sync_pb::TypedUrlSpecifics specs1(MakeTypedUrlSpecifics("http://pie.com/",
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          "pie",
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          2, 3, false));
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow new_row1(GURL("http://pie.com/"));
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<base::Time> new_visits1;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(TypedUrlModelAssociator::DIFF_NONE,
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            TypedUrlModelAssociator::MergeUrls(specs1, row1, &visits1,
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                               &new_row1, &new_visits1));
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector visits2;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow row2(MakeTypedUrlRow("http://pie.com/", "pie",
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       2, 3, false, &visits2));
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sync_pb::TypedUrlSpecifics specs2(MakeTypedUrlSpecifics("http://pie.com/",
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          "pie",
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          2, 3, true));
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector expected_visits2;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow expected2(MakeTypedUrlRow("http://pie.com/", "pie",
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            2, 3, true, &expected_visits2));
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow new_row2(GURL("http://pie.com/"));
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<base::Time> new_visits2;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(TypedUrlModelAssociator::DIFF_ROW_CHANGED,
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            TypedUrlModelAssociator::MergeUrls(specs2, row2, &visits2,
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                               &new_row2, &new_visits2));
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(URLsEqual(new_row2, expected2));
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector visits3;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow row3(MakeTypedUrlRow("http://pie.com/", "pie",
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       2, 3, false, &visits3));
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sync_pb::TypedUrlSpecifics specs3(MakeTypedUrlSpecifics("http://pie.com/",
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          "pie2",
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          2, 3, true));
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector expected_visits3;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow expected3(MakeTypedUrlRow("http://pie.com/", "pie2",
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            2, 3, true, &expected_visits3));
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow new_row3(GURL("http://pie.com/"));
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<base::Time> new_visits3;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(TypedUrlModelAssociator::DIFF_ROW_CHANGED |
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            TypedUrlModelAssociator::DIFF_TITLE_CHANGED,
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            TypedUrlModelAssociator::MergeUrls(specs3, row3, &visits3,
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                               &new_row3, &new_visits3));
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(URLsEqual(new_row3, expected3));
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector visits4;
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow row4(MakeTypedUrlRow("http://pie.com/", "pie",
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       2, 4, false, &visits4));
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sync_pb::TypedUrlSpecifics specs4(MakeTypedUrlSpecifics("http://pie.com/",
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          "pie2",
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          2, 3, true));
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector expected_visits4;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow expected4(MakeTypedUrlRow("http://pie.com/", "pie",
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            2, 3, false, &expected_visits4));
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow new_row4(GURL("http://pie.com/"));
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<base::Time> new_visits4;
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(TypedUrlModelAssociator::DIFF_NODE_CHANGED |
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            TypedUrlModelAssociator::DIFF_VISITS_ADDED,
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            TypedUrlModelAssociator::MergeUrls(specs4, row4, &visits4,
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                               &new_row4, &new_visits4));
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(URLsEqual(new_row4, expected4));
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector visits5;
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow row5(MakeTypedUrlRow("http://pie.com/", "pie",
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       1, 4, false, &visits5));
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sync_pb::TypedUrlSpecifics specs5(MakeTypedUrlSpecifics("http://pie.com/",
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          "pie",
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                          2, 3, false));
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector expected_visits5;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow expected5(MakeTypedUrlRow("http://pie.com/", "pie",
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            2, 3, false, &expected_visits5));
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::URLRow new_row5(GURL("http://pie.com/"));
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<base::Time> new_visits5;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(TypedUrlModelAssociator::DIFF_ROW_CHANGED |
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            TypedUrlModelAssociator::DIFF_VISITS_ADDED,
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            TypedUrlModelAssociator::MergeUrls(specs5, row5, &visits5,
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                               &new_row5, &new_visits5));
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(URLsEqual(new_row5, expected5));
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TypedUrlModelAssociatorTest, DiffVisitsSame) {
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector old_visits;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sync_pb::TypedUrlSpecifics new_url;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int64 visits[] = { 1024, 2065, 65534, 1237684 };
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t c = 0; c < arraysize(visits); ++c) {
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    old_visits.push_back(history::VisitRow(
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        0, base::Time::FromInternalValue(visits[c]), 0, 0, 0));
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    new_url.add_visit(visits[c]);
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<base::Time> new_visits;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector removed_visits;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TypedUrlModelAssociator::DiffVisits(old_visits, new_url,
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      &new_visits, &removed_visits);
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(new_visits.empty());
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(removed_visits.empty());
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TypedUrlModelAssociatorTest, DiffVisitsRemove) {
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector old_visits;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sync_pb::TypedUrlSpecifics new_url;
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int64 visits_left[] = { 1, 1024, 1500, 2065, 6000,
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                65534, 1237684, 2237684 };
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int64 visits_right[] = { 1024, 2065, 65534, 1237684 };
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int64 visits_removed[] = { 1, 1500, 6000, 2237684 };
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t c = 0; c < arraysize(visits_left); ++c) {
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    old_visits.push_back(history::VisitRow(
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        0, base::Time::FromInternalValue(visits_left[c]), 0, 0, 0));
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t c = 0; c < arraysize(visits_right); ++c) {
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    new_url.add_visit(visits_right[c]);
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<base::Time> new_visits;
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector removed_visits;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TypedUrlModelAssociator::DiffVisits(old_visits, new_url,
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      &new_visits, &removed_visits);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(new_visits.empty());
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(removed_visits.size() == arraysize(visits_removed));
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t c = 0; c < arraysize(visits_removed); ++c) {
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(removed_visits[c].visit_time.ToInternalValue(),
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              visits_removed[c]);
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TypedUrlModelAssociatorTest, DiffVisitsAdd) {
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector old_visits;
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sync_pb::TypedUrlSpecifics new_url;
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int64 visits_left[] = { 1024, 2065, 65534, 1237684 };
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int64 visits_right[] = { 1, 1024, 1500, 2065, 6000,
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                65534, 1237684, 2237684 };
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int64 visits_added[] = { 1, 1500, 6000, 2237684 };
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t c = 0; c < arraysize(visits_left); ++c) {
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    old_visits.push_back(history::VisitRow(
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        0, base::Time::FromInternalValue(visits_left[c]), 0, 0, 0));
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t c = 0; c < arraysize(visits_right); ++c) {
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    new_url.add_visit(visits_right[c]);
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<base::Time> new_visits;
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history::VisitVector removed_visits;
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TypedUrlModelAssociator::DiffVisits(old_visits, new_url,
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      &new_visits, &removed_visits);
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(removed_visits.empty());
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_visits.size() == arraysize(visits_added));
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t c = 0; c < arraysize(visits_added); ++c) {
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(new_visits[c].ToInternalValue(),
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              visits_added[c]);
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
226