1# -*- coding: utf-8 -*- 2 3import os 4import sys 5import importlib 6 7from mutagen._compat import StringIO, text_type, PY2 8from mutagen._senf import fsnative 9 10from tests import TestCase 11 12 13def get_var(tool_name, entry="main"): 14 mod = importlib.import_module( 15 "mutagen._tools.%s" % tool_name.replace("-", "_")) 16 return getattr(mod, entry) 17 18 19class _TTools(TestCase): 20 TOOL_NAME = None 21 22 def setUp(self): 23 self.assertTrue(isinstance(self.TOOL_NAME, text_type)) 24 self._main = get_var(self.TOOL_NAME) 25 26 def get_var(self, name): 27 return get_var(self.TOOL_NAME, name) 28 29 def call2(self, *args): 30 for arg in args: 31 self.assertTrue(isinstance(arg, fsnative)) 32 old_stdout = sys.stdout 33 old_stderr = sys.stderr 34 try: 35 out = StringIO() 36 err = StringIO() 37 sys.stdout = out 38 sys.stderr = err 39 try: 40 ret = self._main([fsnative(self.TOOL_NAME)] + list(args)) 41 except SystemExit as e: 42 ret = e.code 43 ret = ret or 0 44 out_val = out.getvalue() 45 err_val = err.getvalue() 46 if os.name == "nt" and PY2: 47 encoding = getattr(sys.stdout, "encoding", None) or "mbcs" 48 out_val = text_type(out_val, encoding) 49 err_val = text_type(err_val, encoding) 50 return (ret, out_val, err_val) 51 finally: 52 sys.stdout = old_stdout 53 sys.stderr = old_stderr 54 55 def call(self, *args): 56 return self.call2(*args)[:2] 57 58 def tearDown(self): 59 del self._main 60