blob: ba9e8460ed951266647f98e57eb65952bdc473c7 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.android_webview.test;
import static org.chromium.android_webview.test.OnlyRunIn.ProcessMode.SINGLE_PROCESS;
import androidx.test.filters.MediumTest;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.android_webview.AwFeatureList;
import org.chromium.android_webview.VariationsSeedLoader;
import org.chromium.android_webview.common.AwFeatures;
import org.chromium.android_webview.common.variations.VariationsUtils;
import org.chromium.android_webview.test.util.VariationsTestUtils;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.components.variations.StudyOuterClass.Study;
import org.chromium.components.variations.StudyOuterClass.Study.Experiment;
import org.chromium.components.variations.StudyOuterClass.Study.Experiment.FeatureAssociation;
import org.chromium.components.variations.VariationsSeedOuterClass.VariationsSeed;
import org.chromium.components.variations.firstrun.VariationsSeedFetcher.SeedInfo;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Date;
/**
* Tests that seeds saved to disk get loaded correctly on WebView startup.
*/
@RunWith(AwJUnit4ClassRunner.class)
@OnlyRunIn(SINGLE_PROCESS)
public class VariationsTest {
@Rule
public AwActivityTestRule mActivityTestRule = new AwActivityTestRule() {
@Override
public boolean needsBrowserProcessStarted() {
// Don't start the browser process automatically so we can do some setup in the test
// beforehand.
return false;
}
};
private void createAndLoadSeedFile(FeatureAssociation features) throws FileNotFoundException {
// Disable seed verification so we don't reject the fake seed created below.
VariationsTestUtils.disableSignatureVerificationForTesting();
// Write a fake seed to disk that will enable a Feature.
VariationsSeed seed =
VariationsSeed.newBuilder()
.addStudy(Study.newBuilder()
.setName("TestStudy")
.addExperiment(Experiment.newBuilder()
.setName("default")
.setProbabilityWeight(100)
.setFeatureAssociation(features)))
.build();
SeedInfo seedInfo = new SeedInfo();
seedInfo.signature = "";
seedInfo.country = "US";
seedInfo.isGzipCompressed = false;
seedInfo.date = new Date().getTime();
seedInfo.seedData = seed.toByteArray();
FileOutputStream out = new FileOutputStream(VariationsUtils.getNewSeedFile());
VariationsUtils.writeSeed(out, seedInfo);
// Because our tests bypass WebView's glue layer, we need to load the seed manually.
TestThreadUtils.runOnUiThreadBlocking(() -> {
VariationsSeedLoader loader = new VariationsSeedLoader();
loader.startVariationsInit();
loader.finishVariationsInit();
});
}
@Test
@MediumTest
// This flag forces the variations service to load the seed file from disk rather than using
// fieldtrial_testing_config.json.
// TODO(crbug.com/1098037): Reference this via a Java VariationsSwitches class.
@CommandLineFlags.Add("disable-field-trial-config")
public void testFeatureEnabled() throws Exception {
try {
FeatureAssociation features =
FeatureAssociation.newBuilder()
.addEnableFeature(VariationsTestUtils.TEST_FEATURE_NAME)
.build();
createAndLoadSeedFile(features);
// The seed should be loaded during browser process startup.
mActivityTestRule.startBrowserProcess();
TestThreadUtils.runOnUiThreadBlocking(() -> {
Assert.assertTrue("TEST_FEATURE_NAME should be enabled",
AwFeatureList.isEnabled(AwFeatures.WEBVIEW_TEST_FEATURE));
});
} finally {
VariationsTestUtils.deleteSeeds();
}
}
@Test
@MediumTest
// This flag forces the variations service to load the seed file from disk rather than using
// fieldtrial_testing_config.json.
// TODO(crbug.com/1098037): Reference this via a Java VariationsSwitches class.
@CommandLineFlags.Add("disable-field-trial-config")
public void testSeedFreshnessHistogramWritten() throws Exception {
String seedFreshnessHistogramName = "Variations.SeedFreshness";
try {
createAndLoadSeedFile(FeatureAssociation.getDefaultInstance());
Assert.assertEquals("SeedFreshness should not be written to initially", 0,
RecordHistogram.getHistogramTotalCountForTesting(seedFreshnessHistogramName));
// The seed should be loaded during browser process startup.
mActivityTestRule.startBrowserProcess();
Assert.assertEquals("SeedFreshness should have been written to once", 1,
RecordHistogram.getHistogramTotalCountForTesting(seedFreshnessHistogramName));
Assert.assertEquals("The value written to SeedFreshness should be 0 (<1 minute)", 1,
RecordHistogram.getHistogramValueCountForTesting(
seedFreshnessHistogramName, 0));
} finally {
VariationsTestUtils.deleteSeeds();
}
}
}