chromium/chrome/browser/ash/mahi/mahi_cache_manager_unittest.cc

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

#include "chrome/browser/ash/mahi/mahi_cache_manager.h"

#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace ash {

class MahiCacheManagerTest : public testing::Test {
 public:
  MahiCacheManagerTest() = default;

  MahiCacheManagerTest(const MahiCacheManagerTest&) = delete;
  MahiCacheManagerTest& operator=(const MahiCacheManagerTest&) = delete;

  ~MahiCacheManagerTest() override = default;

  MahiCacheManager* GetMahiCacheManager() { return mahi_cache_manager_.get(); }

  std::map<GURL, MahiCacheManager::MahiData> GetPageCache() {
    return mahi_cache_manager_->page_cache_;
  }

  // testing::Test:
  void SetUp() override {
    mahi_cache_manager_ = std::make_unique<MahiCacheManager>();
    mahi_cache_manager_->page_cache_[GURL("http://url1.com/")] =
        MahiCacheManager::MahiData(
            "http://url1.com", u"title 1", u"page content 1",
            /* favicon_image = */ std::nullopt, u"summary 1",
            {{u"Question 1", u"Answer 1"}, {u"Question 2", u"Answer 2"}});

    // Next item in the cache is logged 5 hours later.
    task_environment_.FastForwardBy(base::Hours(5));

    mahi_cache_manager_->page_cache_[GURL("http://url2.com/")] =
        MahiCacheManager::MahiData(
            "http://url2.com", u"title 2", u"page content 2",
            /* favicon_image = */ std::nullopt, u"summary 2",
            {{u"question 1", u"answer 1"}});
  }

  void TearDown() override { mahi_cache_manager_.reset(); }

 protected:
  base::test::TaskEnvironment task_environment_{
      base::test::TaskEnvironment::TimeSource::MOCK_TIME};

 private:
  std::unique_ptr<MahiCacheManager> mahi_cache_manager_;
};

TEST_F(MahiCacheManagerTest, AddNewURL) {
  EXPECT_EQ(GetPageCache().size(), 2u);
  GetMahiCacheManager()->AddCacheForUrl("http://url3.com",
                                        {"http://url3.com",
                                         u"title 3",
                                         u"page content 3",
                                         /* favicon_image = */ std::nullopt,
                                         u"summary 3",
                                         {{u"new question", u"new answer"}}});
  EXPECT_EQ(GetPageCache().size(), 3u);
}

TEST_F(MahiCacheManagerTest, ReplacingExistingURLWithNewContent) {
  MahiCacheManager::MahiData new_data(
      "http://url1.com", u"New title", u"New content",
      /* favicon_image = */ std::nullopt, u"New summary",
      {{u"new question", u"new answer"}});
  GetMahiCacheManager()->AddCacheForUrl("http://url1.com", new_data);
  EXPECT_EQ(GetPageCache().size(), 2u);
  EXPECT_EQ(GetPageCache().at(GURL("http://url1.com")).url, new_data.url);
  EXPECT_EQ(GetPageCache().at(GURL("http://url1.com")).title, new_data.title);
  EXPECT_EQ(GetPageCache().at(GURL("http://url1.com")).page_content,
            new_data.page_content);
  EXPECT_EQ(GetPageCache().at(GURL("http://url1.com")).summary,
            new_data.summary);
  EXPECT_EQ(GetPageCache().at(GURL("http://url1.com")).previous_qa.size(), 1u);
}

TEST_F(MahiCacheManagerTest, ReplaceSummaryWithExistingUrl) {
  EXPECT_EQ(GetPageCache().size(), 2u);
  GetMahiCacheManager()->TryToUpdateSummaryForUrl("http://url1.com",
                                                  u"new summary");
  auto result = GetMahiCacheManager()->GetSummaryForUrl("http://url1.com");
  EXPECT_TRUE(result.has_value());
  EXPECT_EQ(result.value(), u"new summary");
  EXPECT_EQ(GetPageCache().size(), 2u);
}

TEST_F(MahiCacheManagerTest, UpdateSummaryDoesNothingIfURLIsntInCache) {
  EXPECT_EQ(GetPageCache().size(), 2u);
  GetMahiCacheManager()->TryToUpdateSummaryForUrl("http://not-there.com",
                                                  u"new summary");
  auto result = GetMahiCacheManager()->GetSummaryForUrl("http://not-there.com");
  EXPECT_FALSE(result.has_value());
  EXPECT_EQ(GetPageCache().size(), 2u);
}

TEST_F(MahiCacheManagerTest, GetSummaryFromTheCacheSameURL) {
  auto result = GetMahiCacheManager()->GetSummaryForUrl("http://url1.com");
  EXPECT_TRUE(result.has_value());
  EXPECT_EQ(result.value(), u"summary 1");
}

TEST_F(MahiCacheManagerTest, GetSummaryFromTheCacheDifferentURL) {
  auto result =
      GetMahiCacheManager()->GetSummaryForUrl("http://url1.com/search");
  EXPECT_FALSE(result.has_value());
}

TEST_F(MahiCacheManagerTest, GetSummaryFromTheCacheWithRef) {
  auto result = GetMahiCacheManager()->GetSummaryForUrl("http://url1.com/#ref");
  EXPECT_TRUE(result.has_value());
  EXPECT_EQ(result.value(), u"summary 1");
}

TEST_F(MahiCacheManagerTest, GetQAFromCacheSameURL) {
  auto result = GetMahiCacheManager()->GetQAForUrl("http://url1.com");
  EXPECT_EQ(result.size(), 2u);
  EXPECT_EQ(result[0].question, u"Question 1");
  EXPECT_EQ(result[0].answer, u"Answer 1");
  EXPECT_EQ(result[1].question, u"Question 2");
  EXPECT_EQ(result[1].answer, u"Answer 2");
}

TEST_F(MahiCacheManagerTest, GetQAFromCacheURLWithRef) {
  auto result = GetMahiCacheManager()->GetQAForUrl("http://url1.com/#ref");
  EXPECT_EQ(result.size(), 2u);
  EXPECT_EQ(result[0].question, u"Question 1");
  EXPECT_EQ(result[0].answer, u"Answer 1");
  EXPECT_EQ(result[1].question, u"Question 2");
  EXPECT_EQ(result[1].answer, u"Answer 2");
}

TEST_F(MahiCacheManagerTest, ClearCacheSuccessfully) {
  // Current cache size.
  EXPECT_EQ(GetPageCache().size(), 2u);

  // Clear the cache.
  GetMahiCacheManager()->ClearCache();
  EXPECT_EQ(GetPageCache().size(), 0u);
}

TEST_F(MahiCacheManagerTest, CorrectlyClearCacheWithRetention) {
  // Current cache size.
  EXPECT_EQ(GetPageCache().size(), 2u);

  // Fast forward 162h (24 * 7 - 6). At this point no cache is deleted yet.
  task_environment_.FastForwardBy(base::Hours(24 * 7 - 6));
  EXPECT_EQ(GetPageCache().size(), 2u);

  // Two hours later, the first cache should be deleted.
  task_environment_.FastForwardBy(base::Hours(2));
  EXPECT_EQ(GetPageCache().size(), 1u);
  auto result = GetMahiCacheManager()->GetSummaryForUrl("http://url2.com");
  EXPECT_TRUE(result.has_value());
  EXPECT_EQ(result.value(), u"summary 2");

  // Four hours later, the second cache should be deleted.
  task_environment_.FastForwardBy(base::Hours(4));
  EXPECT_EQ(GetPageCache().size(), 0u);
}

TEST_F(MahiCacheManagerTest, GetCorrectPageContentFromURL) {
  // Get correct content if the url is found.
  auto result = GetMahiCacheManager()->GetPageContentForUrl("http://url1.com");
  EXPECT_EQ(result, u"page content 1");

  // No url is found
  result = GetMahiCacheManager()->GetPageContentForUrl("http://notfound.com");
  EXPECT_EQ(result, u"");
}

TEST_F(MahiCacheManagerTest, DeleteExistingURL) {
  // Current cache size.
  EXPECT_EQ(GetPageCache().size(), 2u);

  GetMahiCacheManager()->DeleteCacheForUrl("http://url1.com");
  EXPECT_EQ(GetPageCache().size(), 1u);
}

TEST_F(MahiCacheManagerTest, DeleteURLNotInCache) {
  // Current cache size.
  EXPECT_EQ(GetPageCache().size(), 2u);

  GetMahiCacheManager()->DeleteCacheForUrl("http://notthere.com");
  EXPECT_EQ(GetPageCache().size(), 2u);
}

TEST_F(MahiCacheManagerTest, OnlyStoreHTTPOrHTTPS) {
  EXPECT_EQ(GetPageCache().size(), 2u);

  GetMahiCacheManager()->AddCacheForUrl("file:///file/path",
                                        {"file:///file/path",
                                         u"local file",
                                         u"local content",
                                         /* favicon_image = */ std::nullopt,
                                         u"summary",
                                         {{u"new question", u"new answer"}}});

  EXPECT_EQ(GetPageCache().size(), 2u);
}

}  // namespace ash