blob: 5521c42b8c0cc54c85138693944e5ccdc09fb5ea [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/variations/model/variations_app_interface.h"
#import <string>
#import "base/base64.h"
#import "base/metrics/field_trial.h"
#import "base/run_loop.h"
#import "base/test/bind.h"
#import "base/threading/thread.h"
#import "components/prefs/pref_service.h"
#import "components/variations/pref_names.h"
#import "components/variations/service/variations_service.h"
#import "components/variations/variations_test_utils.h"
#import "ios/chrome/browser/shared/model/application_context/application_context.h"
#import "ios/chrome/test/app/chrome_test_util.h"
namespace {
variations::SeedReaderWriter* GetSeedReaderWriter() {
return GetApplicationContext()
->GetVariationsService()
->GetSeedStoreForTesting()
->GetSeedReaderWriterForTesting();
}
variations::SeedReaderWriter* GetSafeSeedReaderWriter() {
return GetApplicationContext()
->GetVariationsService()
->GetSeedStoreForTesting()
->GetSafeSeedReaderWriterForTesting();
}
} // namespace
@implementation VariationsAppInterface
+ (void)clearVariationsPrefs {
PrefService* prefService = GetApplicationContext()->GetLocalState();
// Clear variations seed prefs.
GetSeedReaderWriter()->ClearSeedInfo();
// Here session country is cleared for testing, but it should not be cleared
// for the regular seed.
GetSeedReaderWriter()->ClearSessionCountry();
GetApplicationContext()
->GetVariationsService()
->GetSeedStoreForTesting()
->ClearPermanentConsistencyCountryAndVersion();
prefService->ClearPref(
variations::prefs::kVariationsPermanentOverriddenCountry);
// Clear variations safe seed prefs.
GetSafeSeedReaderWriter()->ClearSeedInfo();
GetSafeSeedReaderWriter()->ClearSessionCountry();
GetSafeSeedReaderWriter()->ClearPermanentConsistencyCountryAndVersion();
prefService->ClearPref(variations::prefs::kVariationsSafeSeedLocale);
// Clear variations policy prefs.
prefService->ClearPref(variations::prefs::kVariationsRestrictionsByPolicy);
prefService->ClearPref(variations::prefs::kVariationsRestrictParameter);
// Clear prefs that may trigger variations safe mode.
prefService->ClearPref(variations::prefs::kVariationsCrashStreak);
prefService->ClearPref(variations::prefs::kVariationsFailedToFetchSeedStreak);
}
+ (BOOL)fieldTrialExistsForTestSeed {
return variations::FieldTrialListHasAllStudiesFrom(variations::kTestSeedData);
}
+ (void)hasSafeSeed:(void (^)(BOOL hasSeed))completion {
GetSafeSeedReaderWriter()->ReadSeedData(base::BindLambdaForTesting(
[completion](variations::SeedReaderWriter::ReadSeedDataResult result) {
BOOL hasSeed = (result.result != variations::LoadSeedResult::kEmpty);
completion(hasSeed);
}));
}
+ (void)setTestSafeSeedAndSignature {
std::string seed_data;
base::Base64Decode(variations::kTestSeedData.base64_uncompressed_data,
&seed_data);
GetSafeSeedReaderWriter()->StoreValidatedSeedInfo(
variations::ValidatedSeedInfo{
.seed_data = seed_data,
.signature = variations::kTestSeedData.base64_signature,
.milestone = 92, // Milestone number is arbitrary.
.seed_date = base::Time::Now(),
.client_fetch_time = base::Time::Now(),
.session_country_code = "us",
.permanent_country_code = "us",
// Permanent version is not stored in the safe seed, only the country.
.permanent_country_version = "",
});
}
+ (void)setCrashingRegularSeedAndSignature {
std::string seed_data;
base::Base64Decode(variations::kCrashingSeedData.base64_uncompressed_data,
&seed_data);
GetSeedReaderWriter()->StoreValidatedSeedInfo(variations::ValidatedSeedInfo{
.seed_data = seed_data,
.signature = variations::kCrashingSeedData.base64_signature,
.milestone = 92, // Milestone number is arbitrary.
.seed_date = base::Time::Now(),
.client_fetch_time = base::Time::Now(),
.session_country_code = "us",
.permanent_country_code = "us",
.permanent_country_version = "1.2.3.4",
});
}
+ (int)crashStreak {
PrefService* prefService = GetApplicationContext()->GetLocalState();
return prefService->GetInteger(variations::prefs::kVariationsCrashStreak);
}
+ (void)setCrashValue:(int)value {
PrefService* prefService = GetApplicationContext()->GetLocalState();
prefService->SetInteger(variations::prefs::kVariationsCrashStreak, value);
}
+ (int)failedFetchStreak {
PrefService* prefService = GetApplicationContext()->GetLocalState();
return prefService->GetInteger(
variations::prefs::kVariationsFailedToFetchSeedStreak);
}
+ (void)setFetchFailureValue:(int)value {
PrefService* prefService = GetApplicationContext()->GetLocalState();
prefService->SetInteger(variations::prefs::kVariationsFailedToFetchSeedStreak,
value);
}
@end