def main(): parser = _get_arg_parser() options = parser.parse_args() tests.OPTIONS_INIT = True if isinstance(options, tuple): # Fallback to old optparse options = options[0] if options.show_tests: sys.path.insert(0, os.path.join(os.getcwd(), 'lib')) for name, _, description in tests.get_test_modules(): print("{0:22s} {1}".format(name, description)) sys.exit() tests.setup_logger(LOGGER, debug=options.debug, logfile=options.logfile) LOGGER.info( "MySQL Connector/Python unittest using Python v{0}".format( '.'.join([str(v) for v in sys.version_info[0:3]]))) # Check if we can test IPv6 if options.ipv6: if not tests.IPV6_AVAILABLE: LOGGER.error("Can not test IPv6: not available on your system") sys.exit(1) options.bind_address = '::' options.host = '::1' LOGGER.info("Testing using IPv6. Binding to :: and using host ::1") else: tests.IPV6_AVAILABLE = False if not options.mysql_sharedir: options.mysql_sharedir = os.path.join(options.mysql_basedir, 'share') LOGGER.debug("Setting default sharedir: %s", options.mysql_sharedir) if options.mysql_topdir != MYSQL_DEFAULT_TOPDIR: # Make sure the topdir is absolute if not os.path.isabs(options.mysql_topdir): options.mysql_topdir = os.path.join( os.path.dirname(os.path.realpath(__file__)), options.mysql_topdir ) # If Django was supplied, add Django to PYTHONPATH if options.django_path: sys.path.insert(0, options.django_path) try: import django tests.DJANGO_VERSION = django.VERSION[0:3] except ImportError: msg = "Could not find django package at {0}".format( options.django_path) LOGGER.error(msg) sys.exit(1) if sys.version_info[0] == 3 and tests.DJANGO_VERSION < (1, 5): LOGGER.error("Django older than v1.5 will not work with Python 3") sys.exit(1) if options.fabric_config: # URL example: fabric://user:[email protected]:32274 fab = urlsplit(options.fabric_config) tests.FABRIC_CONFIG = {} default_ports = { 'xmlrpc': 32274, 'mysql': 32275 } if options.fabric_protocol: tests.FABRIC_CONFIG['protocol'] = options.fabric_protocol else: tests.FABRIC_CONFIG['protocol'] = 'xmlrpc' LOGGER.info("Fabric will be tested using the '{}' protocol".format( tests.FABRIC_CONFIG['protocol'].upper())) tests.FABRIC_CONFIG = { 'host': fab.hostname, 'port': fab.port or default_ports[tests.FABRIC_CONFIG['protocol']], 'user': fab.username, 'password': fab.password, } # We have to at least run 1 MySQL server init_mysql_server(port=(options.port), options=options) tests.MYSQL_CAPI = options.mysql_capi if not options.skip_install: protobuf_include_dir = options.protobuf_include_dir or \ os.environ.get("MYSQLXPB_PROTOBUF_INCLUDE_DIR") protobuf_lib_dir = options.protobuf_lib_dir or \ os.environ.get("MYSQLXPB_PROTOBUF_LIB_DIR") protoc = options.protoc or os.environ.get("MYSQLXPB_PROTOC") if any((protobuf_include_dir, protobuf_lib_dir, protoc)): if not protobuf_include_dir: LOGGER.error("Unable to find Protobuf include directory.") sys.exit(1) if not protobuf_lib_dir: LOGGER.error("Unable to find Protobuf library directory.") sys.exit(1) if not protoc: LOGGER.error("Unable to find Protobuf protoc binary.") sys.exit(1) tests.install_connector(_TOPDIR, tests.TEST_BUILD_DIR, protobuf_include_dir, protobuf_lib_dir, protoc, options.mysql_capi, options.extra_compile_args, options.extra_link_args) # Which tests cases to run testcases = [] if options.testcase: for name, module, _ in tests.get_test_modules(): if name == options.testcase or module == options.testcase: LOGGER.info("Executing tests in module %s", module) testcases = [module] break if not testcases: LOGGER.error("Test case not valid; see --help-tests") sys.exit(1) elif options.onetest: LOGGER.info("Executing test: %s", options.onetest) testcases = [options.onetest] else: testcases = [mod[1] for mod in tests.get_test_modules()] # Load tests test_loader = unittest.TestLoader() testsuite = None if testcases: # Check if we nee to test anything with the C Extension if any(['cext' in case for case in testcases]): # Try to load the C Extension, and try to load the MySQL library tests.check_c_extension() testsuite = test_loader.loadTestsFromNames(testcases) else: LOGGER.error("No test cases loaded.") sys.exit(1) # Initialize the other MySQL Servers for i in range(1, tests.MYSQL_SERVERS_NEEDED): init_mysql_server(port=(options.port + i), options=options) LOGGER.info("Using MySQL server version %s", '.'.join([str(v) for v in tests.MYSQL_VERSION[0:3]])) LOGGER.info("Starting unit tests") was_successful = False try: # Run test cases if options.stats: if options.stats_host: stats_db_info = { 'host': options.stats_host, 'port': options.stats_port, 'user': options.stats_user, 'password': options.stats_password, 'database': options.stats_db, } cnxstats = mysql.connector.connect(**stats_db_info) setup_stats_db(cnxstats) else: cnxstats = None result = StatsTestRunner( verbosity=options.verbosity, dbcnx=cnxstats).run(testsuite) elif sys.version_info[0:2] == (2, 6): result = Python26TestRunner(verbosity=options.verbosity).run( testsuite) else: result = BasicTestRunner(verbosity=options.verbosity).run(testsuite) was_successful = result.wasSuccessful() except KeyboardInterrupt: LOGGER.info("Unittesting was interrupted") was_successful = False # Log messages added by test cases for msg in tests.MESSAGES['WARNINGS']: LOGGER.warning(msg) for msg in tests.MESSAGES['INFO']: LOGGER.info(msg) # Show skipped tests if len(tests.MESSAGES['SKIPPED']): LOGGER.info("Skipped tests: %d", len(tests.MESSAGES['SKIPPED'])) for msg in tests.MESSAGES['SKIPPED']: LOGGER.info("Skipped: " + msg) # Clean up try: tests.MYSQL_DUMMY_THREAD.join() tests.MYSQL_DUMMY.shutdown() tests.MYSQL_DUMMY.server_close() except: # Is OK when failed pass for mysql_server in tests.MYSQL_SERVERS: name = mysql_server.name if not options.keep: mysql_server.stop() if not mysql_server.wait_down(): LOGGER.error("Failed stopping MySQL server '%s'", name) else: mysql_server.remove() LOGGER.info("MySQL server '%s' stopped and cleaned up", name) elif not mysql_server.check_running(): mysql_server.start() if not mysql_server.wait_up(): LOGGER.error("MySQL could not be kept running; " "failed to restart") else: LOGGER.info("MySQL server kept running on %s:%d", mysql_server.bind_address, mysql_server.port ) # Make sure the DEVNULL file is closed try: mysqld.DEVNULL.close() except: pass txt = "" if not was_successful: txt = "not " LOGGER.info("MySQL Connector/Python unittests were %ssuccessful", txt) # Return result of tests as exit code sys.exit(not was_successful)
def main(): parser = _get_arg_parser() options = parser.parse_args() tests.OPTIONS_INIT = True if isinstance(options, tuple): # Fallback to old optparse options = options[0] if options.show_tests: sys.path.insert(0, os.path.join(os.getcwd(), 'lib')) for name, _, description in tests.get_test_modules(): print("{0:22s} {1}".format(name, description)) sys.exit() tests.setup_logger(LOGGER, debug=options.debug, logfile=options.logfile) LOGGER.info("MySQL Connector/Python unittest using Python v{0}".format( '.'.join([str(v) for v in sys.version_info[0:3]]))) # Check if we can test IPv6 if options.ipv6: if not tests.IPV6_AVAILABLE: LOGGER.error("Can not test IPv6: not available on your system") sys.exit(1) options.bind_address = '::' options.host = '::1' LOGGER.info("Testing using IPv6. Binding to :: and using host ::1") else: tests.IPV6_AVAILABLE = False if not options.mysql_sharedir: options.mysql_sharedir = os.path.join(options.mysql_basedir, 'share') LOGGER.debug("Setting default sharedir: %s", options.mysql_sharedir) if options.mysql_topdir != MYSQL_DEFAULT_TOPDIR: # Make sure the topdir is absolute if not os.path.isabs(options.mysql_topdir): options.mysql_topdir = os.path.join( os.path.dirname(os.path.realpath(__file__)), options.mysql_topdir) # If Django was supplied, add Django to PYTHONPATH if options.django_path: sys.path.insert(0, options.django_path) try: import django tests.DJANGO_VERSION = django.VERSION[0:3] except ImportError: msg = "Could not find django package at {0}".format( options.django_path) LOGGER.error(msg) sys.exit(1) if sys.version_info[0] == 3 and tests.DJANGO_VERSION < (1, 5): LOGGER.error("Django older than v1.5 will not work with Python 3") sys.exit(1) # We have to at least run 1 MySQL server init_mysql_server(port=(options.port), options=options) tests.MYSQL_CAPI = options.mysql_capi if not options.skip_install: protobuf_include_dir = options.protobuf_include_dir or \ os.environ.get("MYSQLXPB_PROTOBUF_INCLUDE_DIR") protobuf_lib_dir = options.protobuf_lib_dir or \ os.environ.get("MYSQLXPB_PROTOBUF_LIB_DIR") protoc = options.protoc or os.environ.get("MYSQLXPB_PROTOC") if any((protobuf_include_dir, protobuf_lib_dir, protoc)): if not protobuf_include_dir: LOGGER.error("Unable to find Protobuf include directory.") sys.exit(1) if not protobuf_lib_dir: LOGGER.error("Unable to find Protobuf library directory.") sys.exit(1) if not protoc: LOGGER.error("Unable to find Protobuf protoc binary.") sys.exit(1) tests.install_connector(_TOPDIR, tests.TEST_BUILD_DIR, protobuf_include_dir, protobuf_lib_dir, protoc, options.mysql_capi, options.extra_compile_args, options.extra_link_args, options.debug) if platform.system() in ("Darwin", "Linux") and tests.MYSQL_VERSION > (8, 0, 5): shutil.copytree(os.path.join(_TOPDIR, "mysql-vendor"), os.path.join(tests.TEST_BUILD_DIR, "mysql-vendor")) # Which tests cases to run testcases = [] if options.testcase: for name, module, _ in tests.get_test_modules(): if name == options.testcase or module == options.testcase: LOGGER.info("Executing tests in module %s", module) testcases = [module] break if not testcases: LOGGER.error("Test case not valid; see --help-tests") sys.exit(1) elif options.onetest: LOGGER.info("Executing test: %s", options.onetest) testcases = [options.onetest] else: testcases = [mod[1] for mod in tests.get_test_modules()] # Load tests test_loader = unittest.TestLoader() testsuite = None if testcases: # Check if we nee to test anything with the C Extension if any(['cext' in case for case in testcases]): # Try to load the C Extension, and try to load the MySQL library tests.check_c_extension() testsuite = test_loader.loadTestsFromNames(testcases)
_TOPDIR = os.path.dirname(os.path.realpath(__file__)) LOGGER = logging.getLogger(tests.LOGGER_NAME) tests.setup_logger(LOGGER) # Only run for supported Python Versions if not ((sys.version_info >= (2, 6) and sys.version_info < (3, 0)) or sys.version_info >= (3, 1)): LOGGER.error("Python v{0}.{1} is not supported".format( *sys.version_info[0:2])) else: # The following is only needed for running examples tests sys.path.insert(0, os.path.join( _TOPDIR, 'python{0}'.format(sys.version_info[0]))) # Install Connector/Python and add it to sys.path tests.TEST_BUILD_DIR = os.path.join(_TOPDIR, 'build', 'testing') tests.install_connector(_TOPDIR, tests.TEST_BUILD_DIR) sys.path.insert(0, tests.TEST_BUILD_DIR) import mysql.connector # MySQL option file template. Platform specifics dynamically added later. MY_CNF = """ # MySQL option file for MySQL Connector/Python tests [mysqld-5.6] innodb_compression_level = 0 innodb_compression_failure_threshold_pct = 0 lc_messages_dir = {lc_messages_dir} lc_messages = en_US [mysqld-5.5] lc_messages_dir = {lc_messages_dir}
def main(): parser = _get_arg_parser() options = parser.parse_args() tests.OPTIONS_INIT = True if isinstance(options, tuple): # Fallback to old optparse options = options[0] if options.show_tests: sys.path.insert(0, os.path.join(os.getcwd(), 'lib')) for name, _, description in tests.get_test_modules(): print("{0:22s} {1}".format(name, description)) sys.exit() tests.setup_logger(LOGGER, debug=options.debug, logfile=options.logfile) LOGGER.info( "MySQL Connector/Python unittest using Python v{0}".format( '.'.join([str(v) for v in sys.version_info[0:3]]))) # Check if we can test IPv6 if options.ipv6: if not tests.IPV6_AVAILABLE: LOGGER.error("Can not test IPv6: not available on your system") sys.exit(1) options.bind_address = '::' options.host = '::1' LOGGER.info("Testing using IPv6. Binding to :: and using host ::1") else: tests.IPV6_AVAILABLE = False if not options.mysql_sharedir: options.mysql_sharedir = os.path.join(options.mysql_basedir, 'share') LOGGER.debug("Setting default sharedir: %s", options.mysql_sharedir) if options.mysql_topdir != MYSQL_DEFAULT_TOPDIR: # Make sure the topdir is absolute if not os.path.isabs(options.mysql_topdir): options.mysql_topdir = os.path.join( os.path.dirname(os.path.realpath(__file__)), options.mysql_topdir ) # If Django was supplied, add Django to PYTHONPATH if options.django_path: sys.path.insert(0, options.django_path) try: import django tests.DJANGO_VERSION = django.VERSION[0:3] except ImportError: msg = "Could not find django package at {0}".format( options.django_path) LOGGER.error(msg) sys.exit(1) if sys.version_info[0] == 3 and tests.DJANGO_VERSION < (1, 5): LOGGER.error("Django older than v1.5 will not work with Python 3") sys.exit(1) if options.fabric_config: # URL example: fabric://user:[email protected]:32274 fab = urlsplit(options.fabric_config) tests.FABRIC_CONFIG = {} default_ports = { 'xmlrpc': 32274, 'mysql': 32275 } if options.fabric_protocol: tests.FABRIC_CONFIG['protocol'] = options.fabric_protocol else: tests.FABRIC_CONFIG['protocol'] = 'xmlrpc' LOGGER.info("Fabric will be tested using the '{}' protocol".format( tests.FABRIC_CONFIG['protocol'].upper())) tests.FABRIC_CONFIG = { 'host': fab.hostname, 'port': fab.port or default_ports[tests.FABRIC_CONFIG['protocol']], 'user': fab.username, 'password': fab.password, } # We have to at least run 1 MySQL server init_mysql_server(port=(options.port), options=options) tests.MYSQL_CAPI = options.mysql_capi if not options.skip_install: tests.install_connector(_TOPDIR, tests.TEST_BUILD_DIR, options.mysql_capi) # Which tests cases to run testcases = [] if options.testcase: for name, module, _ in tests.get_test_modules(): if name == options.testcase or module == options.testcase: LOGGER.info("Executing tests in module %s", module) testcases = [module] break if not testcases: LOGGER.error("Test case not valid; see --help-tests") sys.exit(1) elif options.onetest: LOGGER.info("Executing test: %s", options.onetest) testcases = [options.onetest] else: testcases = [mod[1] for mod in tests.get_test_modules()] # Load tests test_loader = unittest.TestLoader() testsuite = None if testcases: # Check if we nee to test anything with the C Extension if any(['cext' in case for case in testcases]): # Try to load the C Extension, and try to load the MySQL library tests.check_c_extension() testsuite = test_loader.loadTestsFromNames(testcases)
_TOPDIR = os.path.dirname(os.path.realpath(__file__)) LOGGER = logging.getLogger(tests.LOGGER_NAME) tests.setup_logger(LOGGER) # Only run for supported Python Versions if not ((sys.version_info >= (2, 6) and sys.version_info < (3, 0)) or sys.version_info >= (3, 1)): LOGGER.error( "Python v{0}.{1} is not supported".format(*sys.version_info[0:2])) else: # The following is only needed for running examples tests sys.path.insert( 0, os.path.join(_TOPDIR, 'python{0}'.format(sys.version_info[0]))) # Install Connector/Python and add it to sys.path tests.TEST_BUILD_DIR = os.path.join(_TOPDIR, 'build', 'testing') tests.install_connector(_TOPDIR, tests.TEST_BUILD_DIR) sys.path.insert(0, tests.TEST_BUILD_DIR) import mysql.connector # MySQL option file template. Platform specifics dynamically added later. MY_CNF = """ # MySQL option file for MySQL Connector/Python tests [mysqld-5.6] innodb_compression_level = 0 innodb_compression_failure_threshold_pct = 0 lc_messages_dir = {lc_messages_dir} lc_messages = en_US [mysqld-5.5] lc_messages_dir = {lc_messages_dir}