split_variations_cmd_unittest.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. # Copyright 2019 The Chromium Authors. All rights reserved.
  2. # Use of this source code is governed by a BSD-style license that can be
  3. # found in the LICENSE file.
  4. import unittest
  5. import os
  6. import split_variations_cmd
  7. _ENABLE_FEATURES_SWITCH_NAME = 'enable-features'
  8. _DISABLE_FEATURES_SWITCH_NAME = 'disable-features'
  9. _FORCE_FIELD_TRIALS_SWITCH_NAME = 'force-fieldtrials'
  10. _FORCE_FIELD_TRIAL_PARAMS_SWITCH_NAME = 'force-fieldtrial-params'
  11. class SplitVariationsCmdUnittest(unittest.TestCase):
  12. def _CompareCommandLineSwitches(self, filename, cmd_list):
  13. """Compares two sets of command line switches.
  14. Args:
  15. filename: Name to a file that contains a set of commandline switches.
  16. cmd_list: A list of strings in the form of '--switch_name=switch_value'.
  17. Return True if they contain the same switches and each switch's values
  18. are the same.
  19. """
  20. assert os.path.isfile(filename)
  21. data = None
  22. with open(filename, 'r') as f:
  23. data = f.read().replace('\n', ' ')
  24. switches = split_variations_cmd.ParseCommandLineSwitchesString(data)
  25. if len(switches) != len(cmd_list):
  26. return False
  27. for switch_name, switch_value in switches.items():
  28. switch_string = '--%s="%s"' % (switch_name, switch_value)
  29. if switch_string not in cmd_list:
  30. return False
  31. return True
  32. def _GetUnittestDataDir(self):
  33. return os.path.join(os.path.dirname(__file__), 'unittest_data')
  34. def _VerifySplits(self, switch_name, splits, ref_switch_data):
  35. """Verifies splitting commandline switches works correctly.
  36. Compare that when we combine switch data from all |splits| into one,
  37. it's exactly the same as the |ref_switch_data|. Also check the splits are
  38. almost evenly distributed, that is, their data size are almost the same.
  39. Args:
  40. switch_name: The name of the switch that is verified.
  41. splits: A list of {switch_name: [items]} dictionaries.
  42. Each list element represents one of the split switch sets.
  43. |items| is a list of items representing switch value.
  44. ref_switch_data: A {switch_name: [items]} dictionary.
  45. This is the switch set before splitting.
  46. |items| is a list of items representing switch value.
  47. """
  48. data_lists = [
  49. split[switch_name] for split in splits if switch_name in split]
  50. if len(data_lists) == 0:
  51. self.assertFalse(ref_switch_data)
  52. return
  53. max_size = max(len(data) for data in data_lists)
  54. min_size = min(len(data) for data in data_lists)
  55. if switch_name != _FORCE_FIELD_TRIAL_PARAMS_SWITCH_NAME:
  56. self.assertTrue(max_size - min_size <= 1)
  57. joined_switch_data = []
  58. for data in data_lists:
  59. joined_switch_data.extend(data)
  60. self.assertEqual(ref_switch_data, joined_switch_data)
  61. def testLoadFromFileAndSaveToStrings(self):
  62. # Verifies we load data from the file and save it to a list of strings,
  63. # the two data sets contain the same command line switches.
  64. data_file = os.path.join(self._GetUnittestDataDir(), 'variations_cmd.txt')
  65. assert os.path.isfile(data_file)
  66. data = split_variations_cmd.ParseVariationsCmdFromFile(data_file)
  67. cmd_list = split_variations_cmd.VariationsCmdToStrings(data)
  68. self.assertTrue(self._CompareCommandLineSwitches(data_file, cmd_list))
  69. def _testSplitVariationsCmdHelper(self, input_data):
  70. # Verifies we correctly and (almost) evenly split one set of command line
  71. # switches into two sets.
  72. splits = split_variations_cmd.SplitVariationsCmd(input_data)
  73. switches = [_ENABLE_FEATURES_SWITCH_NAME,
  74. _DISABLE_FEATURES_SWITCH_NAME,
  75. _FORCE_FIELD_TRIALS_SWITCH_NAME,
  76. _FORCE_FIELD_TRIAL_PARAMS_SWITCH_NAME]
  77. for switch in switches:
  78. self._VerifySplits(switch, splits, input_data.get(switch, []))
  79. # Verify both split variations are valid.
  80. for variations_cmd in splits:
  81. cmd_list = split_variations_cmd.VariationsCmdToStrings(variations_cmd)
  82. split_variations_cmd.ParseVariationsCmdFromString(' '.join(cmd_list))
  83. def testSplitVariationsCmd(self):
  84. input_file = os.path.join(self._GetUnittestDataDir(), 'variations_cmd.txt')
  85. assert os.path.isfile(input_file)
  86. data = split_variations_cmd.ParseVariationsCmdFromFile(input_file)
  87. self._testSplitVariationsCmdHelper(data)
  88. def testSplitVariationsCmdWithMissingEnableDisableFeatures(self):
  89. input_string = (
  90. '--force-fieldtrials="Tria1/Disabled/*Trial2/Enabled/" '
  91. '--force-fieldtrial-params="Trial2.Enabled:age/18/gender/male" '
  92. '--disable-features="FeatureA<FeatureA"')
  93. data = split_variations_cmd.ParseVariationsCmdFromString(input_string)
  94. self._testSplitVariationsCmdHelper(data)
  95. def testSplitVariationsCmdWithMissingForceFieldTrialParams(self):
  96. input_string = (
  97. '--force-fieldtrials="*Trial2/Enabled/" '
  98. '--enable-features="FeatureA<FeatureA,FeatureB<FeatureB" '
  99. '--disable-features="FeatureC<FeatureC,FeatureD<FeatureD"')
  100. data = split_variations_cmd.ParseVariationsCmdFromString(input_string)
  101. self._testSplitVariationsCmdHelper(data)
  102. def testSplitVariationsCmdNoFurtherSplit(self):
  103. input_string = (
  104. '--force-fieldtrials="*Trial2/Enabled/" '
  105. '--enable-features="FeatureA<FeatureA" '
  106. '--disable-features="FeatureC<FeatureC"')
  107. splits = split_variations_cmd.SplitVariationsCmdFromString(input_string)
  108. self.assertEqual(1, len(splits))
  109. if __name__ == '__main__':
  110. unittest.main()