go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/lucicfg/testdata/misc/experiments.star (about) 1 load("@stdlib//internal/experiments.star", "experiments") 2 load("@stdlib//internal/lucicfg.star", "lucicfg") 3 4 def test_happy_path(): 5 exp1 = experiments.register("unittest.exp_id1") 6 exp2 = experiments.register("unittest.exp_id2") 7 exp3 = experiments.register("unittest.exp_id3") 8 9 assert.true(not exp1.is_enabled()) 10 assert.true(not exp2.is_enabled()) 11 assert.true(not exp3.is_enabled()) 12 13 lucicfg.enable_experiment("unittest.exp_id1") 14 lucicfg.enable_experiment("unittest.exp_id2") 15 16 assert.true(exp1.is_enabled()) 17 assert.true(exp2.is_enabled()) 18 assert.true(not exp3.is_enabled()) 19 20 assert.eq(__native__.list_enabled_experiments(), ["unittest.exp_id1", "unittest.exp_id2"]) 21 22 exp1.require() # doesn't fail 23 exp2.require() 24 assert.fails(exp3.require, 'requires enabling the experiment "unittest.exp_id3"') 25 26 def test_double_registration(): 27 exp1 = experiments.register("unittest.exp_id") 28 exp2 = experiments.register("unittest.exp_id") 29 lucicfg.enable_experiment("unittest.exp_id") 30 assert.true(exp1.is_enabled()) 31 assert.true(exp2.is_enabled()) 32 33 def test_unknown_id(): 34 exp1 = experiments.register("unittest.exp_id1") 35 exp2 = experiments.register("unittest.exp_id2") 36 lucicfg.enable_experiment("unittest.zzz") 37 38 # Still can be potentially registered later, should be enabled once queried. 39 zzz = experiments.register("unittest.zzz") 40 assert.true(zzz.is_enabled()) 41 assert.eq(__native__.list_enabled_experiments(), ["unittest.zzz"]) 42 43 def test_bad_types(): 44 assert.fails(lambda: experiments.register(None), "got NoneType, want string") 45 assert.fails(lambda: lucicfg.enable_experiment(None), "got NoneType, want string") 46 47 def test_auto_enable(): 48 # Note: in tests lucicfg has phony version "1.1.1" (see starlark_test.go), 49 # so all check_version checks below should not exceed it. 50 51 experiments.register("unitest.new1", "1.1.1") 52 experiments.register("unitest.old1", "1.0.0") 53 experiments.register("unitest.manual1") 54 assert.eq(__native__.list_enabled_experiments(), []) 55 56 lucicfg.check_version("1.0.5") 57 assert.eq(__native__.list_enabled_experiments(), ["unitest.old1"]) 58 59 experiments.register("unitest.new2", "1.1.1") 60 experiments.register("unitest.old2", "1.0.0") 61 experiments.register("unitest.manual2") 62 assert.eq(__native__.list_enabled_experiments(), ["unitest.old1", "unitest.old2"]) 63 64 lucicfg.check_version("1.1.1") 65 assert.eq(__native__.list_enabled_experiments(), [ 66 "unitest.new1", 67 "unitest.new2", 68 "unitest.old1", 69 "unitest.old2", 70 ]) 71 72 # No "rollbacks" to enabled experiments. 73 lucicfg.check_version("1.0.5") 74 assert.eq(__native__.list_enabled_experiments(), [ 75 "unitest.new1", 76 "unitest.new2", 77 "unitest.old1", 78 "unitest.old2", 79 ]) 80 81 # Remembers highest version ever passed to check_version. 82 exp = experiments.register("unitest.new3", "1.1.1") 83 assert.true(exp.is_enabled()) 84 85 def with_clean_state(cb): 86 __native__.clear_state() 87 cb() 88 __native__.clear_state() 89 90 with_clean_state(test_happy_path) 91 with_clean_state(test_double_registration) 92 with_clean_state(test_unknown_id) 93 with_clean_state(test_bad_types) 94 with_clean_state(test_auto_enable)