// 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.
#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_WEBAPKS_HELPER_H_
#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_WEBAPKS_HELPER_H_
#include "chrome/browser/android/webapk/webapk_registrar.h"
#include "chrome/browser/sync/test/integration/fake_server_match_status_checker.h"
#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace webapks_helper {
bool AreIconInfosMatching(const sync_pb::WebApkIconInfo& icon_info_1,
const sync_pb::WebApkIconInfo& icon_info_2);
// Matchers for sync_pb::WebApkSpecifics.
MATCHER_P(ServerManifestIdIs, manifest_id, "") {
return arg.manifest_id() == manifest_id;
}
MATCHER_P(ServerStartUrlIs, start_url, "") {
return arg.start_url() == start_url;
}
MATCHER_P(ServerNameIs, name, "") {
return arg.name() == name;
}
MATCHER_P(ServerThemeColorIs, theme_color, "") {
return arg.theme_color() == theme_color;
}
MATCHER_P(ServerScopeIs, scope, "") {
return arg.scope() == scope;
}
MATCHER_P(ServerLastUsedTimeWindowsEpochMicrosIs,
last_used_time_windows_epoch_micros,
"") {
return arg.last_used_time_windows_epoch_micros() ==
last_used_time_windows_epoch_micros;
}
MATCHER_P(ServerIconInfoIs, icon_info, "") {
return arg.icon_infos_size() == 1 &&
AreIconInfosMatching(arg.icon_infos(0), *icon_info);
}
// Matchers for std::pair<const webapps::AppId,
// std::unique_ptr<webapk::WebApkProto>> (ie, a single item from a
// webapk::Registry).
MATCHER_P(LocalAppIdIs, app_id, "") {
return arg.first == app_id;
}
MATCHER_P(LocalIsLocallyInstalledIs, is_locally_installed, "") {
return arg.second->is_locally_installed() == is_locally_installed;
}
MATCHER_P(LocalManifestIdIs, manifest_id, "") {
return arg.second->sync_data().manifest_id() == manifest_id;
}
MATCHER_P(LocalStartUrlIs, start_url, "") {
return arg.second->sync_data().start_url() == start_url;
}
MATCHER_P(LocalNameIs, name, "") {
return arg.second->sync_data().name() == name;
}
MATCHER_P(LocalThemeColorIs, theme_color, "") {
return arg.second->sync_data().theme_color() == theme_color;
}
MATCHER_P(LocalScopeIs, scope, "") {
return arg.second->sync_data().scope() == scope;
}
MATCHER_P(LocalLastUsedTimeWindowsEpochMicrosIs,
last_used_time_windows_epoch_micros,
"") {
return arg.second->sync_data().last_used_time_windows_epoch_micros() ==
last_used_time_windows_epoch_micros;
}
MATCHER_P(LocalIconInfoIs, icon_info, "") {
return arg.second->sync_data().icon_infos_size() == 1 &&
AreIconInfosMatching(arg.second->sync_data().icon_infos(0),
*icon_info);
}
// A helper class that waits for entries in the local webapk DB that match the
// given matchers.
class LocalWebApkMatchChecker : public SingleClientStatusChangeChecker {
public:
using Matcher = testing::Matcher<webapk::Registry>;
explicit LocalWebApkMatchChecker(int profile_index,
syncer::SyncServiceImpl* service,
const Matcher& matcher);
~LocalWebApkMatchChecker() override;
// StatusChangeChecker implementation.
bool IsExitConditionSatisfied(std::ostream* os) override;
// syncer::SyncServiceObserver implementation.
void OnSyncCycleCompleted(syncer::SyncService* sync) override;
private:
const int profile_index_;
const Matcher matcher_;
};
// A helper class that waits for the WEB_APK entities on the FakeServer to match
// a given GMock matcher.
class ServerWebApkMatchChecker
: public fake_server::FakeServerMatchStatusChecker {
public:
using Matcher = testing::Matcher<std::vector<sync_pb::WebApkSpecifics>>;
explicit ServerWebApkMatchChecker(const Matcher& matcher);
~ServerWebApkMatchChecker() override;
ServerWebApkMatchChecker(const ServerWebApkMatchChecker&) = delete;
ServerWebApkMatchChecker& operator=(const ServerWebApkMatchChecker&) = delete;
// FakeServer::Observer overrides.
void OnCommit(syncer::DataTypeSet committed_data_types) override;
// StatusChangeChecker overrides.
bool IsExitConditionSatisfied(std::ostream* os) override;
private:
const Matcher matcher_;
};
} // namespace webapks_helper
#endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_WEBAPKS_HELPER_H_