示例#1
0
    def setUp(self):
        super(MarkFlagsAsMutualExclusiveTest, self).setUp()
        self.flag_values = _flagvalues.FlagValues()

        _defines.DEFINE_string('flag_one',
                               None,
                               'flag one',
                               flag_values=self.flag_values)
        _defines.DEFINE_string('flag_two',
                               None,
                               'flag two',
                               flag_values=self.flag_values)
        _defines.DEFINE_string('flag_three',
                               None,
                               'flag three',
                               flag_values=self.flag_values)
        _defines.DEFINE_integer('int_flag_one',
                                None,
                                'int flag one',
                                flag_values=self.flag_values)
        _defines.DEFINE_integer('int_flag_two',
                                None,
                                'int flag two',
                                flag_values=self.flag_values)
        _defines.DEFINE_multi_string('multi_flag_one',
                                     None,
                                     'multi flag one',
                                     flag_values=self.flag_values)
        _defines.DEFINE_multi_string('multi_flag_two',
                                     None,
                                     'multi flag two',
                                     flag_values=self.flag_values)
示例#2
0
 def setUp(self):
     super(MultiFlagsValidatorTest, self).setUp()
     self.flag_values = _flagvalues.FlagValues()
     self.call_args = []
     _defines.DEFINE_integer('foo',
                             1,
                             'Usual integer flag',
                             flag_values=self.flag_values)
     _defines.DEFINE_integer('bar',
                             2,
                             'Usual integer flag',
                             flag_values=self.flag_values)
示例#3
0
 def test_allow_override(self):
     first = _defines.DEFINE_integer('int_flag',
                                     1,
                                     'help',
                                     flag_values=self.fv,
                                     allow_override=1)
     second = _defines.DEFINE_integer('int_flag',
                                      2,
                                      'help',
                                      flag_values=self.fv,
                                      allow_override=1)
     self.parse_flags('--int_flag=3')
     self.assertEqual(3, first.value)
     self.assertEqual(3, second.value)
示例#4
0
 def test_set_default(self):
     fv = _flagvalues.FlagValues()
     fv.mark_as_parsed()
     with self.assertRaises(_exceptions.UnrecognizedFlagError):
         fv.set_default('changelist', 1)
     _defines.DEFINE_integer('changelist', 0, 'help', flag_values=fv)
     self.assertEqual(0, fv.changelist)
     fv.set_default('changelist', 2)
     self.assertEqual(2, fv.changelist)
示例#5
0
    def test_validator_not_called_when_other_flag_is_changed(self):
        def checker(x):
            self.call_args.append(x)
            return True

        _defines.DEFINE_integer('test_flag',
                                1,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _defines.DEFINE_integer('other_flag',
                                2,
                                'Other integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', )
        self.flag_values(argv)
        self.assertEqual(1, self.flag_values.test_flag)
        self.flag_values.other_flag = 3
        self.assertEqual([1], self.call_args)
示例#6
0
    def test_copy(self):
        fv = _flagvalues.FlagValues()
        _defines.DEFINE_integer('answer', 0, 'help', flag_values=fv)
        fv(['', '--answer=1'])

        with self.assertRaisesRegexp(
                TypeError, 'FlagValues does not support shallow copies'):
            copy.copy(fv)

        fv2 = copy.deepcopy(fv)
        self.assertEqual(fv2.answer, 1)

        fv2.answer = 42
        self.assertEqual(fv2.answer, 42)
        self.assertEqual(fv.answer, 1)
示例#7
0
 def _define_flag_and_validators(self, first_validator, second_validator):
     local_flags = _flagvalues.FlagValues()
     _defines.DEFINE_integer('test_flag',
                             2,
                             'test flag',
                             flag_values=local_flags)
     _validators.register_validator('test_flag',
                                    first_validator,
                                    message='',
                                    flag_values=local_flags)
     _validators.register_validator('test_flag',
                                    second_validator,
                                    message='',
                                    flag_values=local_flags)
     argv = ('./program', )
     local_flags(argv)
示例#8
0
    def test_validator_not_called_when_other_flag_is_changed(self):
        def checker(flags_dict):
            self.call_args.append(flags_dict)
            return True

        _defines.DEFINE_integer('other_flag',
                                3,
                                'Other integer flag',
                                flag_values=self.flag_values)
        _validators.register_multi_flags_validator(
            ['foo', 'bar'], checker, flag_values=self.flag_values)

        argv = ('./program', )
        self.flag_values(argv)
        self.flag_values.other_flag = 3
        self.assertEqual([{'foo': 1, 'bar': 2}], self.call_args)
示例#9
0
    def test_default_value_not_used_success(self):
        def checker(x):
            self.call_args.append(x)
            return True

        _defines.DEFINE_integer('test_flag',
                                None,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', '--test_flag=1')
        self.flag_values(argv)
        self.assertEqual(1, self.flag_values.test_flag)
        self.assertEqual([1], self.call_args)
示例#10
0
    def test_error_message_when_checker_raises_exception_on_start(self):
        def checker(x):
            self.call_args.append(x)
            raise _exceptions.ValidationError('Specific message')

        _defines.DEFINE_integer('test_flag',
                                None,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', '--test_flag=1')
        with self.assertRaises(_exceptions.IllegalFlagValueError) as cm:
            self.flag_values(argv)
        self.assertEqual('flag --test_flag=1: Specific message',
                         str(cm.exception))
        self.assertEqual([1], self.call_args)
示例#11
0
    def test_validator_as_decorator(self):
        _defines.DEFINE_integer('test_flag',
                                None,
                                'Simple integer flag',
                                flag_values=self.flag_values)

        @_validators.validator('test_flag', flag_values=self.flag_values)
        def checker(x):
            self.call_args.append(x)
            return True

        argv = ('./program', )
        self.flag_values(argv)
        self.assertIsNone(self.flag_values.test_flag)
        self.flag_values.test_flag = 2
        self.assertEqual(2, self.flag_values.test_flag)
        self.assertEqual([None, 2], self.call_args)
        # Check that 'Checker' is still a function and has not been replaced.
        self.assertTrue(checker(3))
        self.assertEqual([None, 2, 3], self.call_args)
示例#12
0
    def setUp(self):
        super(MarkBoolFlagsAsMutualExclusiveTest, self).setUp()
        self.flag_values = _flagvalues.FlagValues()

        _defines.DEFINE_boolean('false_1',
                                False,
                                'default false 1',
                                flag_values=self.flag_values)
        _defines.DEFINE_boolean('false_2',
                                False,
                                'default false 2',
                                flag_values=self.flag_values)
        _defines.DEFINE_boolean('true_1',
                                True,
                                'default true 1',
                                flag_values=self.flag_values)
        _defines.DEFINE_integer('non_bool',
                                None,
                                'non bool',
                                flag_values=self.flag_values)
示例#13
0
    def test_exception_raised_if_checker_fails(self):
        def checker(x):
            self.call_args.append(x)
            return x == 1

        _defines.DEFINE_integer('test_flag',
                                None,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', '--test_flag=1')
        self.flag_values(argv)
        with self.assertRaises(_exceptions.IllegalFlagValueError) as cm:
            self.flag_values.test_flag = 2
        self.assertEqual('flag --test_flag=2: Errors happen',
                         str(cm.exception))
        self.assertEqual([1, 2], self.call_args)
示例#14
0
    def test_error_message_when_checker_returns_false_on_start(self):
        def checker(x):
            self.call_args.append(x)
            return False

        _defines.DEFINE_integer('test_flag',
                                None,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', '--test_flag=1')
        try:
            self.flag_values(argv)
            raise AssertionError('IllegalFlagValueError expected')
        except _exceptions.IllegalFlagValueError as e:
            self.assertEqual('flag --test_flag=1: Errors happen', str(e))
        self.assertEqual([1], self.call_args)
示例#15
0
    def test_exception_raised_if_checker_raises_exception(self):
        def checker(x):
            self.call_args.append(x)
            if x == 1:
                return True
            raise _exceptions.ValidationError('Specific message')

        _defines.DEFINE_integer('test_flag',
                                None,
                                'Usual integer flag',
                                flag_values=self.flag_values)
        _validators.register_validator('test_flag',
                                       checker,
                                       message='Errors happen',
                                       flag_values=self.flag_values)

        argv = ('./program', '--test_flag=1')
        self.flag_values(argv)
        try:
            self.flag_values.test_flag = 2
            raise AssertionError('IllegalFlagValueError expected')
        except _exceptions.IllegalFlagValueError as e:
            self.assertEqual('flag --test_flag=2: Specific message', str(e))
        self.assertEqual([1, 2], self.call_args)
示例#16
0
    def test_unregistered_flags_are_cleaned_up(self):
        fv = _flagvalues.FlagValues()
        module, module_name = _helpers.get_calling_module_object_and_name()

        # Define first flag.
        _defines.DEFINE_integer('cores', 4, '', flag_values=fv, short_name='c')
        old_cores_flag = fv['cores']
        fv.register_key_flag_for_module(module_name, old_cores_flag)
        self.assertEqual(fv.flags_by_module_dict(),
                         {module_name: [old_cores_flag]})
        self.assertEqual(fv.flags_by_module_id_dict(),
                         {id(module): [old_cores_flag]})
        self.assertEqual(fv.key_flags_by_module_dict(),
                         {module_name: [old_cores_flag]})

        # Redefine the same flag.
        _defines.DEFINE_integer('cores',
                                4,
                                '',
                                flag_values=fv,
                                short_name='c',
                                allow_override=True)
        new_cores_flag = fv['cores']
        self.assertNotEqual(old_cores_flag, new_cores_flag)
        self.assertEqual(fv.flags_by_module_dict(),
                         {module_name: [new_cores_flag]})
        self.assertEqual(fv.flags_by_module_id_dict(),
                         {id(module): [new_cores_flag]})
        # old_cores_flag is removed from key flags, and the new_cores_flag is
        # not automatically added because it must be registered explicitly.
        self.assertEqual(fv.key_flags_by_module_dict(), {module_name: []})

        # Define a new flag but with the same short_name.
        _defines.DEFINE_integer('changelist',
                                0,
                                '',
                                flag_values=fv,
                                short_name='c',
                                allow_override=True)
        old_changelist_flag = fv['changelist']
        fv.register_key_flag_for_module(module_name, old_changelist_flag)
        # The short named flag -c is overridden to be the old_changelist_flag.
        self.assertEqual(fv['c'], old_changelist_flag)
        self.assertNotEqual(fv['c'], new_cores_flag)
        self.assertEqual(fv.flags_by_module_dict(),
                         {module_name: [new_cores_flag, old_changelist_flag]})
        self.assertEqual(fv.flags_by_module_id_dict(),
                         {id(module): [new_cores_flag, old_changelist_flag]})
        self.assertEqual(fv.key_flags_by_module_dict(),
                         {module_name: [old_changelist_flag]})

        # Define a flag only with the same long name.
        _defines.DEFINE_integer('changelist',
                                0,
                                '',
                                flag_values=fv,
                                short_name='l',
                                allow_override=True)
        new_changelist_flag = fv['changelist']
        self.assertNotEqual(old_changelist_flag, new_changelist_flag)
        self.assertEqual(
            fv.flags_by_module_dict(), {
                module_name:
                [new_cores_flag, old_changelist_flag, new_changelist_flag]
            })
        self.assertEqual(fv.flags_by_module_id_dict(), {
            id(module):
            [new_cores_flag, old_changelist_flag, new_changelist_flag]
        })
        self.assertEqual(fv.key_flags_by_module_dict(),
                         {module_name: [old_changelist_flag]})

        # Delete the new changelist's long name, it should still be registered
        # because of its short name.
        del fv.changelist
        self.assertNotIn('changelist', fv)
        self.assertEqual(
            fv.flags_by_module_dict(), {
                module_name:
                [new_cores_flag, old_changelist_flag, new_changelist_flag]
            })
        self.assertEqual(fv.flags_by_module_id_dict(), {
            id(module):
            [new_cores_flag, old_changelist_flag, new_changelist_flag]
        })
        self.assertEqual(fv.key_flags_by_module_dict(),
                         {module_name: [old_changelist_flag]})

        # Delete the new changelist's short name, it should be removed.
        del fv.l
        self.assertNotIn('l', fv)
        self.assertEqual(fv.flags_by_module_dict(),
                         {module_name: [new_cores_flag, old_changelist_flag]})
        self.assertEqual(fv.flags_by_module_id_dict(),
                         {id(module): [new_cores_flag, old_changelist_flag]})
        self.assertEqual(fv.key_flags_by_module_dict(),
                         {module_name: [old_changelist_flag]})
示例#17
0
    def _test_find_module_or_id_defining_flag(self, test_id):
        """Tests for find_module_defining_flag and find_module_id_defining_flag.

    Args:
      test_id: True to test find_module_id_defining_flag, False to test
          find_module_defining_flag.
    """
        fv = _flagvalues.FlagValues()
        current_module, current_module_name = (
            _helpers.get_calling_module_object_and_name())
        alt_module_name = _flagvalues.__name__

        if test_id:
            current_module_or_id = id(current_module)
            alt_module_or_id = id(_flagvalues)
            testing_fn = fv.find_module_id_defining_flag
        else:
            current_module_or_id = current_module_name
            alt_module_or_id = alt_module_name
            testing_fn = fv.find_module_defining_flag

        # Define first flag.
        _defines.DEFINE_integer('cores', 4, '', flag_values=fv, short_name='c')
        module_or_id_cores = testing_fn('cores')
        self.assertEqual(module_or_id_cores, current_module_or_id)
        module_or_id_c = testing_fn('c')
        self.assertEqual(module_or_id_c, current_module_or_id)

        # Redefine the same flag in another module.
        _defines.DEFINE_integer('cores',
                                4,
                                '',
                                flag_values=fv,
                                module_name=alt_module_name,
                                short_name='c',
                                allow_override=True)
        module_or_id_cores = testing_fn('cores')
        self.assertEqual(module_or_id_cores, alt_module_or_id)
        module_or_id_c = testing_fn('c')
        self.assertEqual(module_or_id_c, alt_module_or_id)

        # Define a new flag but with the same short_name.
        _defines.DEFINE_integer('changelist',
                                0,
                                '',
                                flag_values=fv,
                                short_name='c',
                                allow_override=True)
        module_or_id_cores = testing_fn('cores')
        self.assertEqual(module_or_id_cores, alt_module_or_id)
        module_or_id_changelist = testing_fn('changelist')
        self.assertEqual(module_or_id_changelist, current_module_or_id)
        module_or_id_c = testing_fn('c')
        self.assertEqual(module_or_id_c, current_module_or_id)

        # Define a flag in another module only with the same long name.
        _defines.DEFINE_integer('changelist',
                                0,
                                '',
                                flag_values=fv,
                                module_name=alt_module_name,
                                short_name='l',
                                allow_override=True)
        module_or_id_cores = testing_fn('cores')
        self.assertEqual(module_or_id_cores, alt_module_or_id)
        module_or_id_changelist = testing_fn('changelist')
        self.assertEqual(module_or_id_changelist, alt_module_or_id)
        module_or_id_c = testing_fn('c')
        self.assertEqual(module_or_id_c, current_module_or_id)
        module_or_id_l = testing_fn('l')
        self.assertEqual(module_or_id_l, alt_module_or_id)

        # Delete the changelist flag, its short name should still be registered.
        del fv.changelist
        module_or_id_changelist = testing_fn('changelist')
        self.assertEqual(module_or_id_changelist, None)
        module_or_id_c = testing_fn('c')
        self.assertEqual(module_or_id_c, current_module_or_id)
        module_or_id_l = testing_fn('l')
        self.assertEqual(module_or_id_l, alt_module_or_id)