blob: 5c3f6aed5d3ddf670783b9e39b45a52b4bc0f9ac [file] [log] [blame]
// 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.
package org.chromium.base;
import androidx.test.filters.SmallTest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runner.RunWith;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.test.BaseJUnit4ClassRunner;
import org.chromium.base.test.util.Batch;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Feature;
import java.util.List;
/**
* Test class for {@link CommandLineFlags}.
*/
@RunWith(CommandLineFlagsTest.ClassRunner.class)
@Batch(Batch.UNIT_TESTS)
@CommandLineFlags.
Add({CommandLineFlagsTest.FLAG_1, "flagwithvalue=foo", "enable-features=feature1,feature2"})
public class CommandLineFlagsTest {
public static class ClassRunner extends BaseJUnit4ClassRunner {
public ClassRunner(final Class<?> klass) throws InitializationError {
super(klass);
}
// Verify class-level modifications are reset after class finishes.
@Override
protected List<ClassHook> getPostClassHooks() {
return addToList(ClassRunner.super.getPostClassHooks(), (targetContext, testClass) -> {
verifyCommandLine(false, false, false, false, false, false, false);
Assert.assertFalse(CommandLine.getInstance().hasSwitch("flagwithvalue"));
String enabledFeatures =
CommandLine.getInstance().getSwitchValue("enable-features");
if (enabledFeatures != null) {
Assert.assertFalse(enabledFeatures.contains("feature1"));
Assert.assertFalse(enabledFeatures.contains("feature2"));
}
});
}
// Verify that after each test, flags are reset to class-level state.
@Override
protected List<TestHook> getPostTestHooks() {
return addToList(ClassRunner.super.getPostTestHooks(),
(targetContext, testMethod) -> { verifyClassLevelStateOnly(); });
}
}
static final String FLAG_1 = "flag1";
private static final String FLAG_2 = "flag2";
private static final String FLAG_3 = "flag3";
private static final String FLAG_4 = "flag4";
private static final String FLAG_5 = "flag5";
private static final String FLAG_6 = "flag6";
private static final String FLAG_7 = "flag7";
@CommandLineFlags.Add(FLAG_2)
private static class EmptyRule implements TestRule {
@Override
public Statement apply(Statement base, Description description) {
return base;
}
}
@CommandLineFlags.Add(FLAG_3)
private static class MyRule extends EmptyRule {
@CommandLineFlags.Add(FLAG_4)
private static class InnerRule extends EmptyRule {}
@SuppressWarnings("UnusedNestedClass")
@CommandLineFlags.Add(FLAG_5)
private static class UnusedRule extends EmptyRule {}
@Rule
public InnerRule mInnerRule = new InnerRule();
}
@Rule
public MyRule mRule = new MyRule();
@Before
public void setUp() {
LibraryLoader.getInstance().ensureInitialized();
}
private static void verifyCommandLine(boolean flag1, boolean flag2, boolean flag3,
boolean flag4, boolean flag5, boolean flag6, boolean flag7) {
CommandLine cmdLine = CommandLine.getInstance();
Assert.assertEquals(flag1, cmdLine.hasSwitch(FLAG_1));
Assert.assertEquals(flag2, cmdLine.hasSwitch(FLAG_2));
Assert.assertEquals(flag3, cmdLine.hasSwitch(FLAG_3));
Assert.assertEquals(flag4, cmdLine.hasSwitch(FLAG_4));
Assert.assertEquals(flag5, cmdLine.hasSwitch(FLAG_5));
Assert.assertEquals(flag6, cmdLine.hasSwitch(FLAG_6));
Assert.assertEquals(flag7, cmdLine.hasSwitch(FLAG_7));
}
private static void verifyClassLevelStateOnly() {
verifyCommandLine(true, true, true, true, false, false, false);
Assert.assertEquals("foo", CommandLine.getInstance().getSwitchValue("flagwithvalue"));
String enabledFeatures = CommandLine.getInstance().getSwitchValue("enable-features");
Assert.assertTrue(enabledFeatures.contains("feature1"));
Assert.assertTrue(enabledFeatures.contains("feature2"));
Assert.assertFalse(
CommandLine.getInstance().getSwitchValue("enable-features").contains("feature3"));
String disabledFeatures = CommandLine.getInstance().getSwitchValue("disable-features");
if (disabledFeatures != null) Assert.assertFalse(disabledFeatures.contains("feature2"));
}
@Test
@SmallTest
@Feature({"CommandLine"})
public void testNoMethodModifications() {
verifyClassLevelStateOnly();
}
@Test
@SmallTest
@Feature({"CommandLine"})
@CommandLineFlags.Add({FLAG_1, FLAG_6})
public void testMethodAdd() {
verifyCommandLine(true, true, true, true, false, true, false);
}
@Test
@SmallTest
@Feature({"CommandLine"})
@CommandLineFlags.Remove({FLAG_4, FLAG_7})
public void testMethodRemove() {
verifyCommandLine(true, true, true, false, false, false, false);
}
@Test
@SmallTest
@Feature({"CommandLine"})
@CommandLineFlags.Add({"flagwithvalue=bar"})
public void testOverrideFlagValue() {
Assert.assertEquals("bar", CommandLine.getInstance().getSwitchValue("flagwithvalue"));
}
@Test
@SmallTest
@Feature({"CommandLine"})
@CommandLineFlags.Add({"enable-features=feature3", "disable-features=feature2"})
public void testFeatures() {
String enabledFeatures = CommandLine.getInstance().getSwitchValue("enable-features");
Assert.assertTrue(enabledFeatures.contains("feature1"));
Assert.assertTrue(enabledFeatures.contains("feature2"));
Assert.assertTrue(enabledFeatures.contains("feature3"));
Assert.assertTrue(
CommandLine.getInstance().getSwitchValue("disable-features").contains("feature2"));
}
}