chromium/chromeos/ash/components/local_search_service/local_search_service_proxy_unittest.cc

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

#include "chromeos/ash/components/local_search_service/public/cpp/local_search_service_proxy.h"

#include <memory>

#include "base/test/task_environment.h"
#include "chromeos/ash/components/local_search_service/local_search_service_provider_for_testing.h"
#include "components/prefs/testing_pref_service.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace ash::local_search_service {

class LocalSearchServiceProxyTest : public testing::Test {
 public:
  void SetUp() override {
    service_proxy_ =
        std::make_unique<LocalSearchServiceProxy>(/*for_testing=*/true);
  }

 protected:
  void CheckReporter(bool is_null_expected) {
    bool is_null = false;
    if (!service_proxy_->reporter_)
      is_null = true;
    ASSERT_EQ(is_null, is_null_expected);
  }

  void IndexGetSizeAndCheckResults(mojo::Remote<mojom::Index>* index_remote,
                                   uint32_t expected_num_items) {
    bool callback_done = false;
    uint32_t num_items = 0;
    (*index_remote)
        ->GetSize(base::BindOnce(
            [](bool* callback_done, uint32_t* num_items, uint64_t size) {
              *callback_done = true;
              *num_items = size;
            },
            &callback_done, &num_items));
    task_environment_.RunUntilIdle();
    ASSERT_TRUE(callback_done);
    EXPECT_EQ(num_items, expected_num_items);
  }

  TestingPrefServiceSimple pref_service_;
  content::BrowserTaskEnvironment task_environment_{
      base::test::TaskEnvironment::MainThreadType::DEFAULT,
      base::test::TaskEnvironment::ThreadPoolExecutionMode::QUEUED};

  std::unique_ptr<LocalSearchServiceProxy> service_proxy_;
  std::unique_ptr<LocalSearchServiceProvider> provider_;
};

TEST_F(LocalSearchServiceProxyTest, TestWithLocalState) {
  mojo::Remote<mojom::Index> index_remote;
  SearchMetricsReporter::RegisterLocalStatePrefs(pref_service_.registry());
  service_proxy_->SetLocalState(&pref_service_);
  service_proxy_->GetIndex(IndexId::kCrosSettings, Backend::kLinearMap,
                           index_remote.BindNewPipeAndPassReceiver());
  task_environment_.RunUntilIdle();

  // Check that index_remote is bound.
  IndexGetSizeAndCheckResults(&index_remote, 0u);

  // Check reporter
  CheckReporter(/*is_null_expected*/ false);
}

TEST_F(LocalSearchServiceProxyTest, TestWithoutLocalState) {
  mojo::Remote<mojom::Index> index_remote;
  service_proxy_->GetIndex(IndexId::kCrosSettings, Backend::kLinearMap,
                           index_remote.BindNewPipeAndPassReceiver());
  task_environment_.RunUntilIdle();

  // Check that index_remote is bound.
  IndexGetSizeAndCheckResults(&index_remote, 0u);

  // Check reporter
  CheckReporter(/*is_null_expected*/ true);
}

}  // namespace ash::local_search_service