Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/ntp_tiles/most_visited_sites.h" | 5 #include "components/ntp_tiles/most_visited_sites.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <ostream> | |
| 10 #include <vector> | 11 #include <vector> |
| 11 | 12 |
| 12 #include "base/macros.h" | 13 #include "base/macros.h" |
| 13 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
| 16 #include "testing/gmock/include/gmock/gmock.h" | |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 18 |
| 17 namespace ntp_tiles { | 19 namespace ntp_tiles { |
| 18 | 20 |
| 21 // Defined for googletest. Must be defined in the same namespace. | |
|
Marc Treib
2016/12/13 16:44:15
I think it's also possible to define an "operator<
mastiz
2016/12/14 08:54:27
I *think*, for test-oriented printing, which is th
Marc Treib
2016/12/14 09:27:34
I guess it's just me being unfamiliar with the tes
| |
| 22 void PrintTo(const NTPTile& tile, std::ostream* os) { | |
| 23 *os << "{\"" << tile.title << "\", \"" << tile.url << "\", " | |
| 24 << static_cast<int>(tile.source) << "}"; | |
| 25 } | |
| 26 | |
| 19 namespace { | 27 namespace { |
| 20 | 28 |
| 21 struct TitleURL { | 29 using testing::AllOf; |
| 22 TitleURL(const std::string& title, const std::string& url) | 30 using testing::ElementsAre; |
| 23 : title(base::UTF8ToUTF16(title)), url(url) {} | |
| 24 TitleURL(const base::string16& title, const std::string& url) | |
| 25 : title(title), url(url) {} | |
| 26 | 31 |
| 27 base::string16 title; | 32 MATCHER_P(HasSource, |
| 28 std::string url; | 33 source, |
| 34 std::string("has source ") + | |
| 35 testing::PrintToString(static_cast<int>(source))) { | |
| 36 return arg.source == source; | |
| 37 } | |
| 29 | 38 |
| 30 bool operator==(const TitleURL& other) const { | 39 MATCHER_P(HasTitle, title, "") { |
| 31 return title == other.title && url == other.url; | 40 return arg.title == base::ASCIIToUTF16(title); |
| 32 } | 41 } |
| 33 }; | |
| 34 | 42 |
| 35 static const size_t kNumSites = 4; | 43 MATCHER_P(HasUrl, url, "") { |
| 44 return arg.url == GURL(url); | |
| 45 } | |
| 36 | 46 |
| 37 } // namespace | 47 NTPTile MakeTile(const std::string& title, |
| 48 const std::string& url, | |
| 49 NTPTileSource source) { | |
| 50 NTPTile tile; | |
| 51 tile.title = base::ASCIIToUTF16(title); | |
| 52 tile.url = GURL(url); | |
| 53 tile.source = source; | |
| 54 return tile; | |
| 55 } | |
| 38 | 56 |
| 39 // This a test for MostVisitedSites::MergeTiles(...) method, and thus has the | 57 // This a test for MostVisitedSites::MergeTiles(...) method, and thus has the |
| 40 // same scope as the method itself. This tests merging popular sites with | 58 // same scope as the method itself. This tests merging popular sites with |
| 41 // personal tiles. | 59 // personal tiles. |
| 42 // More important things out of the scope of testing presently: | 60 // More important things out of the scope of testing presently: |
| 43 // - Removing blacklisted tiles. | 61 // - Removing blacklisted tiles. |
| 44 // - Correct host extraction from the URL. | 62 // - Correct host extraction from the URL. |
| 45 // - Ensuring personal tiles are not duplicated in popular tiles. | 63 // - Ensuring personal tiles are not duplicated in popular tiles. |
| 46 class MostVisitedSitesTest : public testing::Test { | 64 // |
| 47 protected: | 65 // TODO(mastiz): Add tests for the functionality listed above. |
| 48 void Check(const std::vector<TitleURL>& popular_sites, | 66 TEST(MostVisitedSitesTest, ShouldMergeTilesWithPersonalOnly) { |
| 49 const std::vector<TitleURL>& whitelist_entry_points, | 67 std::vector<NTPTile> personal_tiles{ |
| 50 const std::vector<TitleURL>& personal_sites, | 68 MakeTile("Site 1", "https://www.site1.com/", NTPTileSource::TOP_SITES), |
| 51 const std::vector<bool>& expected_sites_is_personal, | 69 MakeTile("Site 2", "https://www.site2.com/", NTPTileSource::TOP_SITES), |
| 52 const std::vector<TitleURL>& expected_sites) { | 70 MakeTile("Site 3", "https://www.site3.com/", NTPTileSource::TOP_SITES), |
| 53 NTPTilesVector personal_tiles; | 71 MakeTile("Site 4", "https://www.site4.com/", NTPTileSource::TOP_SITES), |
| 54 for (const TitleURL& site : personal_sites) | |
| 55 personal_tiles.push_back(MakeTileFrom(site, true, false)); | |
| 56 NTPTilesVector whitelist_tiles; | |
| 57 for (const TitleURL& site : whitelist_entry_points) | |
| 58 whitelist_tiles.push_back(MakeTileFrom(site, false, true)); | |
| 59 NTPTilesVector popular_tiles; | |
| 60 for (const TitleURL& site : popular_sites) | |
| 61 popular_tiles.push_back(MakeTileFrom(site, false, false)); | |
| 62 NTPTilesVector result_tiles = MostVisitedSites::MergeTiles( | |
| 63 std::move(personal_tiles), std::move(whitelist_tiles), | |
| 64 std::move(popular_tiles)); | |
| 65 std::vector<TitleURL> result_sites; | |
| 66 std::vector<bool> result_is_personal; | |
| 67 result_sites.reserve(result_tiles.size()); | |
| 68 result_is_personal.reserve(result_tiles.size()); | |
| 69 for (const auto& tile : result_tiles) { | |
| 70 result_sites.push_back(TitleURL(tile.title, tile.url.spec())); | |
| 71 result_is_personal.push_back(tile.source != NTPTileSource::POPULAR); | |
| 72 } | |
| 73 EXPECT_EQ(expected_sites_is_personal, result_is_personal); | |
| 74 EXPECT_EQ(expected_sites, result_sites); | |
| 75 } | |
| 76 static NTPTile MakeTileFrom(const TitleURL& title_url, | |
| 77 bool is_personal, | |
| 78 bool whitelist) { | |
| 79 NTPTile tile; | |
| 80 tile.title = title_url.title; | |
| 81 tile.url = GURL(title_url.url); | |
| 82 tile.source = whitelist ? NTPTileSource::WHITELIST | |
| 83 : (is_personal ? NTPTileSource::TOP_SITES | |
| 84 : NTPTileSource::POPULAR); | |
| 85 return tile; | |
| 86 } | |
| 87 }; | |
| 88 | |
| 89 TEST_F(MostVisitedSitesTest, PersonalSites) { | |
| 90 std::vector<TitleURL> personal_sites{ | |
| 91 TitleURL("Site 1", "https://www.site1.com/"), | |
| 92 TitleURL("Site 2", "https://www.site2.com/"), | |
| 93 TitleURL("Site 3", "https://www.site3.com/"), | |
| 94 TitleURL("Site 4", "https://www.site4.com/"), | |
| 95 }; | 72 }; |
| 96 // Without any popular tiles, the result after merge should be the personal | 73 // Without any popular tiles, the result after merge should be the personal |
| 97 // tiles. | 74 // tiles. |
| 98 std::vector<bool> expected_sites_source(kNumSites, true /*personal source*/); | 75 EXPECT_THAT( |
| 99 Check(std::vector<TitleURL>(), std::vector<TitleURL>(), personal_sites, | 76 MostVisitedSites::MergeTiles(std::move(personal_tiles), |
| 100 expected_sites_source, personal_sites); | 77 /*whitelist_tiles=*/{}, |
| 78 /*popular_tiles=*/{}), | |
| 79 ElementsAre(AllOf(HasSource(NTPTileSource::TOP_SITES), HasTitle("Site 1"), | |
| 80 HasUrl("https://www.site1.com/")), | |
|
Marc Treib
2016/12/13 16:44:15
Instead of checking three separate properties, cou
mastiz
2016/12/14 08:54:27
Done.
| |
| 81 AllOf(HasSource(NTPTileSource::TOP_SITES), HasTitle("Site 2"), | |
| 82 HasUrl("https://www.site2.com/")), | |
| 83 AllOf(HasSource(NTPTileSource::TOP_SITES), HasTitle("Site 3"), | |
| 84 HasUrl("https://www.site3.com/")), | |
| 85 AllOf(HasSource(NTPTileSource::TOP_SITES), HasTitle("Site 4"), | |
| 86 HasUrl("https://www.site4.com/")))); | |
| 101 } | 87 } |
| 102 | 88 |
| 103 TEST_F(MostVisitedSitesTest, PopularSites) { | 89 TEST(MostVisitedSitesTest, ShouldMergeTilesWithPopularOnly) { |
| 104 std::vector<TitleURL> popular_sites{ | 90 std::vector<NTPTile> popular_tiles{ |
| 105 TitleURL("Site 1", "https://www.site1.com/"), | 91 MakeTile("Site 1", "https://www.site1.com/", NTPTileSource::POPULAR), |
| 106 TitleURL("Site 2", "https://www.site2.com/"), | 92 MakeTile("Site 2", "https://www.site2.com/", NTPTileSource::POPULAR), |
| 107 TitleURL("Site 3", "https://www.site3.com/"), | 93 MakeTile("Site 3", "https://www.site3.com/", NTPTileSource::POPULAR), |
| 108 TitleURL("Site 4", "https://www.site4.com/"), | 94 MakeTile("Site 4", "https://www.site4.com/", NTPTileSource::POPULAR), |
| 109 }; | 95 }; |
| 110 // Without any personal tiles, the result after merge should be the popular | 96 // Without any personal tiles, the result after merge should be the popular |
| 111 // tiles. | 97 // tiles. |
| 112 std::vector<bool> expected_sites_source(kNumSites, false /*popular source*/); | 98 EXPECT_THAT( |
| 113 Check(popular_sites, std::vector<TitleURL>(), std::vector<TitleURL>(), | 99 MostVisitedSites::MergeTiles(/*personal_tiles=*/{}, |
| 114 expected_sites_source, popular_sites); | 100 /*whitelist_tiles=*/{}, |
| 101 /*popular_tiles=*/std::move(popular_tiles)), | |
| 102 ElementsAre(AllOf(HasSource(NTPTileSource::POPULAR), HasTitle("Site 1"), | |
| 103 HasUrl("https://www.site1.com/")), | |
| 104 AllOf(HasSource(NTPTileSource::POPULAR), HasTitle("Site 2"), | |
| 105 HasUrl("https://www.site2.com/")), | |
| 106 AllOf(HasSource(NTPTileSource::POPULAR), HasTitle("Site 3"), | |
| 107 HasUrl("https://www.site3.com/")), | |
| 108 AllOf(HasSource(NTPTileSource::POPULAR), HasTitle("Site 4"), | |
| 109 HasUrl("https://www.site4.com/")))); | |
| 115 } | 110 } |
| 116 | 111 |
| 117 TEST_F(MostVisitedSitesTest, PersonalPrecedePopularSites) { | 112 TEST(MostVisitedSitesTest, ShouldMergeTilesFavoringPersonalOverPopular) { |
| 118 std::vector<TitleURL> popular_sites{ | 113 std::vector<NTPTile> popular_tiles{ |
| 119 TitleURL("Site 1", "https://www.site1.com/"), | 114 MakeTile("Site 1", "https://www.site1.com/", NTPTileSource::POPULAR), |
| 120 TitleURL("Site 2", "https://www.site2.com/"), | 115 MakeTile("Site 2", "https://www.site2.com/", NTPTileSource::POPULAR), |
| 121 }; | 116 }; |
| 122 std::vector<TitleURL> personal_sites{ | 117 std::vector<NTPTile> personal_tiles{ |
| 123 TitleURL("Site 3", "https://www.site3.com/"), | 118 MakeTile("Site 3", "https://www.site3.com/", NTPTileSource::TOP_SITES), |
| 124 TitleURL("Site 4", "https://www.site4.com/"), | 119 MakeTile("Site 4", "https://www.site4.com/", NTPTileSource::TOP_SITES), |
| 125 }; | 120 }; |
| 126 // Personal tiles should precede popular tiles. | 121 EXPECT_THAT( |
| 127 std::vector<TitleURL> expected_sites{ | 122 MostVisitedSites::MergeTiles(std::move(personal_tiles), |
| 128 TitleURL("Site 3", "https://www.site3.com/"), | 123 /*whitelist_tiles=*/{}, |
| 129 TitleURL("Site 4", "https://www.site4.com/"), | 124 /*popular_tiles=*/std::move(popular_tiles)), |
| 130 TitleURL("Site 1", "https://www.site1.com/"), | 125 ElementsAre(AllOf(HasSource(NTPTileSource::TOP_SITES), HasTitle("Site 3"), |
| 131 TitleURL("Site 2", "https://www.site2.com/"), | 126 HasUrl("https://www.site3.com/")), |
| 132 }; | 127 AllOf(HasSource(NTPTileSource::TOP_SITES), HasTitle("Site 4"), |
| 133 std::vector<bool> expected_sites_source{true, true, false, false}; | 128 HasUrl("https://www.site4.com/")), |
| 134 Check(popular_sites, std::vector<TitleURL>(), personal_sites, | 129 AllOf(HasSource(NTPTileSource::POPULAR), HasTitle("Site 1"), |
| 135 expected_sites_source, expected_sites); | 130 HasUrl("https://www.site1.com/")), |
| 131 AllOf(HasSource(NTPTileSource::POPULAR), HasTitle("Site 2"), | |
| 132 HasUrl("https://www.site2.com/")))); | |
| 136 } | 133 } |
| 137 | 134 |
| 135 } // namespace | |
| 138 } // namespace ntp_tiles | 136 } // namespace ntp_tiles |
| OLD | NEW |