from nose.tools import eq_ as eq
from nose.tools import *
+from unittest import TestCase
-from ceph_argparse import validate_command, parse_json_funcsigs
+from ceph_argparse import validate_command, parse_json_funcsigs, validate, \
+ parse_funcsig, ArgumentError, ArgumentTooFew, ArgumentMissing, \
+ ArgumentNumber, ArgumentValid
import os
+import random
import re
+import string
import sys
import json
try:
def test_list(self):
self.check_no_arg('config-key', 'list')
+
+
+class TestValidate(TestCase):
+
+ ARGS = 0
+ KWARGS = 1
+ KWARGS_EQ = 2
+ MIXED = 3
+
+ def setUp(self):
+ self.prefix = ['some', 'random', 'cmd']
+ self.args_dict = [
+ {'name': 'variable_one', 'type': 'CephString'},
+ {'name': 'variable_two', 'type': 'CephString'},
+ {'name': 'variable_three', 'type': 'CephString'},
+ {'name': 'variable_four', 'type': 'CephInt'},
+ {'name': 'variable_five', 'type': 'CephString'}]
+ self.args = []
+ for d in self.args_dict:
+ if d['type'] == 'CephInt':
+ val = "{}".format(random.randint(0, 100))
+ elif d['type'] == 'CephString':
+ letters = string.ascii_letters
+ str_len = random.randint(5, 10)
+ val = ''.join(random.choice(letters) for _ in range(str_len))
+ else:
+ self.skipTest()
+
+ self.args.append((d['name'], val))
+
+ self.sig = parse_funcsig(self.prefix + self.args_dict)
+
+ @nottest
+ def arg_kwarg_test(self, prefix, args, sig, arg_type=0):
+ """
+ Runs validate in different arg/kargs ways.
+
+ :param prefix: List of prefix commands (that can't be kwarged)
+ :param args: a list of kwarg, arg pairs: [(k1, v1), (k2, v2), ...]
+ :param sig: The sig to match
+ :param arg_type: how to build the args to send. As positional args (ARGS),
+ as long kwargs (KWARGS [--k v]), other style long kwargs
+ (KWARGS_EQ (--k=v]), and mixed (MIXED) where there will be
+ a random mix of the above.
+ :return: None, the method will assert.
+ """
+ final_args = list(prefix)
+ for k, v in args:
+ a_type = arg_type
+ if a_type == self.MIXED:
+ a_type = random.choice((self.ARGS,
+ self.KWARGS,
+ self.KWARGS_EQ))
+ if a_type == self.ARGS:
+ final_args.append(v)
+ elif a_type == self.KWARGS:
+ final_args.extend(["--{}".format(k), v])
+ else:
+ final_args.append("--{}={}".format(k, v))
+
+ try:
+ validate(final_args, sig)
+ except (ArgumentError, ArgumentMissing,
+ ArgumentNumber, ArgumentTooFew, ArgumentValid) as ex:
+ self.fail("Validation failed: {}".format(str(ex)))
+
+ def test_args_and_kwargs_validate(self):
+ for arg_type in (self.ARGS, self.KWARGS, self.KWARGS_EQ, self.MIXED):
+ self.arg_kwarg_test(self.prefix, self.args, self.sig, arg_type)
+
# Local Variables:
# compile-command: "cd ../.. ; make -j4 &&
# PYTHONPATH=pybind nosetests --stop \