def setUp(self):
   super(ProvPyConverterTestCase, self).setUp()
   self.provpy = ProvPyConverter()
   self.in_file = None
   self.out_file = None
   self.config = {}  
   self.config[ProvPyConverter.EXECUTABLE] = "python"
   script = os.path.join(
     os.path.dirname(os.path.abspath(inspect.getfile(
           inspect.currentframe()))), "prov_convert_dummy.py")
   self.config[ProvPyConverter.ARGUMENTS] = " ".join(
     [script,
      "-f", ProvPyConverter.FORMAT,
      ProvPyConverter.INPUT,
      ProvPyConverter.OUTPUT])
   self.config[ProvPyConverter.INPUT_FORMATS] = [
     standards.JSON]
   self.config[ProvPyConverter.OUTPUT_FORMATS] = [
     standards.PROVN, standards.PROVX, standards.JSON]
class ProvPyConverterTestCase(unittest.TestCase):

  def setUp(self):
    super(ProvPyConverterTestCase, self).setUp()
    self.provpy = ProvPyConverter()
    self.in_file = None
    self.out_file = None
    self.config = {}  
    self.config[ProvPyConverter.EXECUTABLE] = "python"
    script = os.path.join(
      os.path.dirname(os.path.abspath(inspect.getfile(
            inspect.currentframe()))), "prov_convert_dummy.py")
    self.config[ProvPyConverter.ARGUMENTS] = " ".join(
      [script,
       "-f", ProvPyConverter.FORMAT,
       ProvPyConverter.INPUT,
       ProvPyConverter.OUTPUT])
    self.config[ProvPyConverter.INPUT_FORMATS] = [
      standards.JSON]
    self.config[ProvPyConverter.OUTPUT_FORMATS] = [
      standards.PROVN, standards.PROVX, standards.JSON]

  def tearDown(self):
    super(ProvPyConverterTestCase, self).tearDown()
    for tmp in [self.in_file, self.out_file]:
      if tmp != None and os.path.isfile(tmp):
        os.remove(tmp)

  def test_init(self):
    self.assertEqual("", self.provpy.executable)
    self.assertEqual([], self.provpy.arguments)
    self.assertEqual([], self.provpy.input_formats)
    self.assertEqual([], self.provpy.output_formats)

  def test_configure(self):
    self.provpy.configure(self.config)
    self.assertEqual(self.config[ProvPyConverter.EXECUTABLE].split(), 
                     self.provpy.executable)
    self.assertEqual(self.config[ProvPyConverter.ARGUMENTS].split(), 
                     self.provpy.arguments)
    self.assertEqual(self.config[ProvPyConverter.INPUT_FORMATS], 
                     self.provpy.input_formats)
    self.assertEqual(self.config[ProvPyConverter.OUTPUT_FORMATS], 
                     self.provpy.output_formats)

  def test_configure_no_format(self):
    self.config[ProvPyConverter.ARGUMENTS] = " ".join(
      ["prov_convert_dummy.py",
       ProvPyConverter.INPUT,
       ProvPyConverter.OUTPUT])
    with self.assertRaises(ConfigError):
      self.provpy.configure(self.config)

  def test_configure_no_input(self):
    self.config[ProvPyConverter.ARGUMENTS] = " ".join(
      ["prov_convert_dummy.py",
       "-f", ProvPyConverter.FORMAT,
       ProvPyConverter.OUTPUT])
    with self.assertRaises(ConfigError):
      self.provpy.configure(self.config)

  def test_configure_no_output(self):
    self.config[ProvPyConverter.ARGUMENTS] = " ".join(
      ["prov_convert_dummy.py",
       "-f", ProvPyConverter.FORMAT,
       ProvPyConverter.INPUT])
    with self.assertRaises(ConfigError):
      self.provpy.configure(self.config)

  def test_convert(self):
    self.provpy.configure(self.config)
    (_, self.in_file) = tempfile.mkstemp(suffix="." + standards.JSON)
    self.out_file = "convert." + standards.PROVN
    self.provpy.convert(self.in_file, self.out_file)

  def test_convert_non_canonical_output(self):
    self.provpy.configure(self.config)
    (_, self.in_file) = tempfile.mkstemp(suffix="." + standards.JSON)
    self.out_file = "convert." + standards.PROVX
    self.provpy.convert(self.in_file, self.out_file)

  def test_convert_oserror(self):
    self.config[ProvPyConverter.EXECUTABLE] = "/nosuchexecutable"
    self.provpy.configure(self.config)
    (_, self.in_file) = tempfile.mkstemp(suffix="." + standards.JSON)
    self.out_file = "convert_oserror." + standards.PROVN
    with self.assertRaises(OSError):
      self.provpy.convert(self.in_file, self.out_file)

  def test_convert_missing_input_file(self):
    self.provpy.configure(self.config)
    self.in_file = "nosuchfile.json"
    self.out_file = "convert_missing_input_file." + standards.JSON
    with self.assertRaises(ConversionError):
      self.provpy.convert(self.in_file, self.out_file)

  def test_convert_invalid_input_format(self):
    self.provpy.configure(self.config)
    (_, self.in_file) = tempfile.mkstemp(suffix=".nosuchformat")
    self.out_file = "convert_invalid_input_format." + standards.PROVX
    with self.assertRaises(ConversionError):
      self.provpy.convert(self.in_file, self.out_file)

  def test_convert_invalid_output_format(self):
    self.provpy.configure(self.config)
    (_, self.in_file) = tempfile.mkstemp(suffix="." + standards.JSON)
    self.out_file = "convert_invalid_output_format.nosuchformat"
    with self.assertRaises(ConversionError):
      self.provpy.convert(self.in_file, self.out_file)