#!/usr/bin/env python # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. import os import sys import tempfile import shutil import unittest import mozfile from mozversion import errors, get_version class BinaryTest(unittest.TestCase): """test getting application version information from a binary path""" application_ini = """[App] ID = AppID Name = AppName CodeName = AppCodeName Version = AppVersion BuildID = AppBuildID SourceRepository = AppSourceRepo SourceStamp = AppSourceStamp Vendor = AppVendor """ platform_ini = """[Build] BuildID = PlatformBuildID Milestone = PlatformMilestone SourceStamp = PlatformSourceStamp SourceRepository = PlatformSourceRepo """ def setUp(self): self.cwd = os.getcwd() self.tempdir = tempfile.mkdtemp() self.binary = os.path.join(self.tempdir, 'binary') with open(self.binary, 'w') as f: f.write('foobar') def tearDown(self): os.chdir(self.cwd) mozfile.remove(self.tempdir) @unittest.skipIf(not os.environ.get('BROWSER_PATH'), 'No binary has been specified.') def test_real_binary(self): v = get_version(os.environ.get('BROWSER_PATH')) self.assertTrue(isinstance(v, dict)) def test_binary(self): self._write_ini_files() self._check_version(get_version(self.binary)) @unittest.skipIf(not hasattr(os, 'symlink'), 'os.symlink not supported on this platform') def test_symlinked_binary(self): self._write_ini_files() # create a symlink of the binary in another directory and check # version against this symlink tempdir = tempfile.mkdtemp() try: browser_link = os.path.join(tempdir, os.path.basename(self.binary)) os.symlink(self.binary, browser_link) self._check_version(get_version(browser_link)) finally: mozfile.remove(tempdir) def test_binary_in_current_path(self): self._write_ini_files() os.chdir(self.tempdir) self._check_version(get_version()) def test_with_ini_files_on_osx(self): self._write_ini_files() platform = sys.platform sys.platform = 'darwin' try: # get_version is working with ini files next to the binary self._check_version(get_version(binary=self.binary)) # or if they are in the Resources dir # in this case the binary must be in a Contents dir, next # to the Resources dir contents_dir = os.path.join(self.tempdir, 'Contents') os.mkdir(contents_dir) moved_binary = os.path.join(contents_dir, os.path.basename(self.binary)) shutil.move(self.binary, moved_binary) resources_dir = os.path.join(self.tempdir, 'Resources') os.mkdir(resources_dir) for ini_file in ('application.ini', 'platform.ini'): shutil.move(os.path.join(self.tempdir, ini_file), resources_dir) self._check_version(get_version(binary=moved_binary)) finally: sys.platform = platform def test_invalid_binary_path(self): self.assertRaises(IOError, get_version, os.path.join(self.tempdir, 'invalid')) def test_without_ini_files(self): """With missing ini files an exception should be thrown""" self.assertRaises(errors.AppNotFoundError, get_version, self.binary) def test_without_platform_ini_file(self): """With a missing platform.ini file an exception should be thrown""" self._write_ini_files(platform=False) self.assertRaises(errors.AppNotFoundError, get_version, self.binary) def test_without_application_ini_file(self): """With a missing application.ini file an exception should be thrown""" self._write_ini_files(application=False) self.assertRaises(errors.AppNotFoundError, get_version, self.binary) def test_with_exe(self): """Test that we can resolve .exe files""" self._write_ini_files() exe_name_unprefixed = self.binary + '1' exe_name = exe_name_unprefixed + '.exe' with open(exe_name, 'w') as f: f.write('foobar') self._check_version(get_version(exe_name_unprefixed)) def test_not_found_with_binary_specified(self): self.assertRaises(errors.LocalAppNotFoundError, get_version, self.binary) def _write_ini_files(self, application=True, platform=True): if application: with open(os.path.join(self.tempdir, 'application.ini'), 'w') as f: f.writelines(self.application_ini) if platform: with open(os.path.join(self.tempdir, 'platform.ini'), 'w') as f: f.writelines(self.platform_ini) def _check_version(self, version): self.assertEqual(version.get('application_id'), 'AppID') self.assertEqual(version.get('application_name'), 'AppName') self.assertEqual( version.get('application_display_name'), 'AppCodeName') self.assertEqual(version.get('application_version'), 'AppVersion') self.assertEqual(version.get('application_buildid'), 'AppBuildID') self.assertEqual( version.get('application_repository'), 'AppSourceRepo') self.assertEqual( version.get('application_changeset'), 'AppSourceStamp') self.assertEqual(version.get('application_vendor'), 'AppVendor') self.assertIsNone(version.get('platform_name')) self.assertEqual(version.get('platform_buildid'), 'PlatformBuildID') self.assertEqual( version.get('platform_repository'), 'PlatformSourceRepo') self.assertEqual( version.get('platform_changeset'), 'PlatformSourceStamp') self.assertIsNone(version.get('invalid_key')) self.assertEqual( version.get('platform_version'), 'PlatformMilestone') if __name__ == '__main__': unittest.main()