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)