1*da0073e9SAndroid Build Coastguard Worker# Owner(s): ["module: unknown"] 2*da0073e9SAndroid Build Coastguard Worker 3*da0073e9SAndroid Build Coastguard Workerimport os 4*da0073e9SAndroid Build Coastguard Worker 5*da0073e9SAndroid Build Coastguard Workerfrom torch._utils_internal import justknobs_feature, JustKnobsConfig 6*da0073e9SAndroid Build Coastguard Workerfrom torch.testing._internal.common_utils import ( # type: ignore[attr-defined] 7*da0073e9SAndroid Build Coastguard Worker load_tests, 8*da0073e9SAndroid Build Coastguard Worker) 9*da0073e9SAndroid Build Coastguard Worker 10*da0073e9SAndroid Build Coastguard Worker 11*da0073e9SAndroid Build Coastguard Worker# load_tests from torch.testing._internal.common_utils is used to automatically filter tests for 12*da0073e9SAndroid Build Coastguard Worker# sharding on sandcastle. This line silences flake warnings 13*da0073e9SAndroid Build Coastguard Workerload_tests = load_tests 14*da0073e9SAndroid Build Coastguard Worker 15*da0073e9SAndroid Build Coastguard Workerfrom torch.testing._internal.common_utils import run_tests, TestCase 16*da0073e9SAndroid Build Coastguard Worker 17*da0073e9SAndroid Build Coastguard Worker 18*da0073e9SAndroid Build Coastguard Workerclass TestJustKnob(TestCase): 19*da0073e9SAndroid Build Coastguard Worker def test_justknob_config(self): 20*da0073e9SAndroid Build Coastguard Worker with self.subTest("Returns True"): 21*da0073e9SAndroid Build Coastguard Worker a = JustKnobsConfig() 22*da0073e9SAndroid Build Coastguard Worker self.assertTrue(a.get()) 23*da0073e9SAndroid Build Coastguard Worker with self.subTest("Returns False"): 24*da0073e9SAndroid Build Coastguard Worker a = JustKnobsConfig(name="fake_name", default=False) 25*da0073e9SAndroid Build Coastguard Worker self.assertFalse(a.get()) 26*da0073e9SAndroid Build Coastguard Worker with self.subTest("Returns True via config"): 27*da0073e9SAndroid Build Coastguard Worker a = JustKnobsConfig(name="fake_name", default=False) 28*da0073e9SAndroid Build Coastguard Worker a.set(True) 29*da0073e9SAndroid Build Coastguard Worker self.assertTrue(a.get()) 30*da0073e9SAndroid Build Coastguard Worker with self.subTest("Returns True via env"): 31*da0073e9SAndroid Build Coastguard Worker os.environ["FAKE_FEATURE"] = "1" 32*da0073e9SAndroid Build Coastguard Worker a = JustKnobsConfig( 33*da0073e9SAndroid Build Coastguard Worker name="fake_name", env_name="FAKE_FEATURE", default=False 34*da0073e9SAndroid Build Coastguard Worker ) 35*da0073e9SAndroid Build Coastguard Worker self.assertTrue(a.get()) 36*da0073e9SAndroid Build Coastguard Worker with self.subTest("Returns same value consistently"): 37*da0073e9SAndroid Build Coastguard Worker a = JustKnobsConfig(name="fake_name", default=False) 38*da0073e9SAndroid Build Coastguard Worker a.set(True) 39*da0073e9SAndroid Build Coastguard Worker self.assertTrue(a.get()) 40*da0073e9SAndroid Build Coastguard Worker a.set(False) 41*da0073e9SAndroid Build Coastguard Worker self.assertTrue(a.get()) 42*da0073e9SAndroid Build Coastguard Worker with self.subTest("Checks __bool__"): 43*da0073e9SAndroid Build Coastguard Worker a = JustKnobsConfig(name="fake_name", default=False) 44*da0073e9SAndroid Build Coastguard Worker if a: 45*da0073e9SAndroid Build Coastguard Worker raise RuntimeError("Should not be true") 46*da0073e9SAndroid Build Coastguard Worker self.assertFalse(a) 47*da0073e9SAndroid Build Coastguard Worker 48*da0073e9SAndroid Build Coastguard Worker def test_justknob_feature(self): 49*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS is True"): 50*da0073e9SAndroid Build Coastguard Worker self.assertTrue(justknobs_feature("testname")) 51*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS default=True"): 52*da0073e9SAndroid Build Coastguard Worker self.assertTrue(justknobs_feature("testname", default=True)) 53*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS default=False"): 54*da0073e9SAndroid Build Coastguard Worker self.assertFalse(justknobs_feature("testname", default=False)) 55*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS config=True, default=False"): 56*da0073e9SAndroid Build Coastguard Worker self.assertTrue( 57*da0073e9SAndroid Build Coastguard Worker justknobs_feature("testname", config_value=True, default=False) 58*da0073e9SAndroid Build Coastguard Worker ) 59*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS config=None, default=False"): 60*da0073e9SAndroid Build Coastguard Worker self.assertFalse( 61*da0073e9SAndroid Build Coastguard Worker justknobs_feature("testname", config_value=None, default=False) 62*da0073e9SAndroid Build Coastguard Worker ) 63*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS config=False, default=True"): 64*da0073e9SAndroid Build Coastguard Worker self.assertFalse( 65*da0073e9SAndroid Build Coastguard Worker justknobs_feature("testname", config_value=False, default=True) 66*da0073e9SAndroid Build Coastguard Worker ) 67*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS env is missing, config=False, default=True"): 68*da0073e9SAndroid Build Coastguard Worker self.assertFalse( 69*da0073e9SAndroid Build Coastguard Worker justknobs_feature( 70*da0073e9SAndroid Build Coastguard Worker "testname", config_value=False, env_name="NOTDEFINED", default=False 71*da0073e9SAndroid Build Coastguard Worker ) 72*da0073e9SAndroid Build Coastguard Worker ) 73*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS env is missing, default=False"): 74*da0073e9SAndroid Build Coastguard Worker self.assertFalse( 75*da0073e9SAndroid Build Coastguard Worker justknobs_feature("testname", env_name="NOTDEFINED", default=False) 76*da0073e9SAndroid Build Coastguard Worker ) 77*da0073e9SAndroid Build Coastguard Worker with self.subTest( 78*da0073e9SAndroid Build Coastguard Worker "OSS config overrides env, config=True, env=False, default=False" 79*da0073e9SAndroid Build Coastguard Worker ): 80*da0073e9SAndroid Build Coastguard Worker os.environ["FEATURE_ENV"] = "0" 81*da0073e9SAndroid Build Coastguard Worker self.assertTrue( 82*da0073e9SAndroid Build Coastguard Worker justknobs_feature( 83*da0073e9SAndroid Build Coastguard Worker "testname", 84*da0073e9SAndroid Build Coastguard Worker config_value=True, 85*da0073e9SAndroid Build Coastguard Worker env_name="FEATURE_ENV", 86*da0073e9SAndroid Build Coastguard Worker default=False, 87*da0073e9SAndroid Build Coastguard Worker ) 88*da0073e9SAndroid Build Coastguard Worker ) 89*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS env overrides default, , default=False"): 90*da0073e9SAndroid Build Coastguard Worker os.environ["FEATURE_ENV"] = "1" 91*da0073e9SAndroid Build Coastguard Worker self.assertTrue( 92*da0073e9SAndroid Build Coastguard Worker justknobs_feature("testname", env_name="FEATURE_ENV", default=False) 93*da0073e9SAndroid Build Coastguard Worker ) 94*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS env truthy, config=False, default=False"): 95*da0073e9SAndroid Build Coastguard Worker os.environ["FEATURE_ENV"] = "1" 96*da0073e9SAndroid Build Coastguard Worker self.assertTrue( 97*da0073e9SAndroid Build Coastguard Worker justknobs_feature( 98*da0073e9SAndroid Build Coastguard Worker "testname", 99*da0073e9SAndroid Build Coastguard Worker env_name="FEATURE_ENV", 100*da0073e9SAndroid Build Coastguard Worker default=False, 101*da0073e9SAndroid Build Coastguard Worker ) 102*da0073e9SAndroid Build Coastguard Worker ) 103*da0073e9SAndroid Build Coastguard Worker os.environ["FEATURE_ENV"] = "true" 104*da0073e9SAndroid Build Coastguard Worker self.assertTrue( 105*da0073e9SAndroid Build Coastguard Worker justknobs_feature( 106*da0073e9SAndroid Build Coastguard Worker "testname", 107*da0073e9SAndroid Build Coastguard Worker env_name="FEATURE_ENV", 108*da0073e9SAndroid Build Coastguard Worker default=False, 109*da0073e9SAndroid Build Coastguard Worker ) 110*da0073e9SAndroid Build Coastguard Worker ) 111*da0073e9SAndroid Build Coastguard Worker os.environ["FEATURE_ENV"] = "TRUE" 112*da0073e9SAndroid Build Coastguard Worker self.assertTrue( 113*da0073e9SAndroid Build Coastguard Worker justknobs_feature( 114*da0073e9SAndroid Build Coastguard Worker "testname", 115*da0073e9SAndroid Build Coastguard Worker env_name="FEATURE_ENV", 116*da0073e9SAndroid Build Coastguard Worker default=False, 117*da0073e9SAndroid Build Coastguard Worker ) 118*da0073e9SAndroid Build Coastguard Worker ) 119*da0073e9SAndroid Build Coastguard Worker os.environ["FEATURE_ENV"] = "very weird true" 120*da0073e9SAndroid Build Coastguard Worker self.assertTrue( 121*da0073e9SAndroid Build Coastguard Worker justknobs_feature( 122*da0073e9SAndroid Build Coastguard Worker "testname", 123*da0073e9SAndroid Build Coastguard Worker env_name="FEATURE_ENV", 124*da0073e9SAndroid Build Coastguard Worker default=False, 125*da0073e9SAndroid Build Coastguard Worker ) 126*da0073e9SAndroid Build Coastguard Worker ) 127*da0073e9SAndroid Build Coastguard Worker with self.subTest("OSS env false, default=True"): 128*da0073e9SAndroid Build Coastguard Worker os.environ["FEATURE_ENV"] = "0" 129*da0073e9SAndroid Build Coastguard Worker self.assertFalse( 130*da0073e9SAndroid Build Coastguard Worker justknobs_feature("testname", env_name="FEATURE_ENV", default=True) 131*da0073e9SAndroid Build Coastguard Worker ) 132*da0073e9SAndroid Build Coastguard Worker os.environ["FEATURE_ENV"] = "false" 133*da0073e9SAndroid Build Coastguard Worker self.assertFalse( 134*da0073e9SAndroid Build Coastguard Worker justknobs_feature("testname", env_name="FEATURE_ENV", default=True) 135*da0073e9SAndroid Build Coastguard Worker ) 136*da0073e9SAndroid Build Coastguard Worker os.environ["FEATURE_ENV"] = "FALSE" 137*da0073e9SAndroid Build Coastguard Worker self.assertFalse( 138*da0073e9SAndroid Build Coastguard Worker justknobs_feature("testname", env_name="FEATURE_ENV", default=True) 139*da0073e9SAndroid Build Coastguard Worker ) 140*da0073e9SAndroid Build Coastguard Worker 141*da0073e9SAndroid Build Coastguard Worker 142*da0073e9SAndroid Build Coastguard Workerif __name__ == "__main__": 143*da0073e9SAndroid Build Coastguard Worker run_tests() 144