Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

#!/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 shutil
import sys
import mozunit
import pytest
from moztest.selftest.fixtures import binary_fixture # noqa: F401
from mozversion import errors, get_version
"""test getting application version information from a binary path"""
@pytest.fixture()
def fake_binary(tmpdir):
binary = tmpdir.join("binary")
binary.write("foobar")
return str(binary)
@pytest.fixture(name="application_ini")
def fixture_application_ini(tmpdir):
ini = tmpdir.join("application.ini")
ini.write(
"""[App]
ID = AppID
Name = AppName
CodeName = AppCodeName
Version = AppVersion
BuildID = AppBuildID
SourceRepository = AppSourceRepo
SourceStamp = AppSourceStamp
Vendor = AppVendor"""
)
return str(ini)
@pytest.fixture(name="platform_ini")
def fixture_platform_ini(tmpdir):
ini = tmpdir.join("platform.ini")
ini.write(
"""[Build]
BuildID = PlatformBuildID
Milestone = PlatformMilestone
SourceStamp = PlatformSourceStamp
SourceRepository = PlatformSourceRepo"""
)
return str(ini)
def test_real_binary(binary): # noqa: F811
if not binary:
pytest.skip("No binary found")
v = get_version(binary)
assert isinstance(v, dict)
def test_binary(fake_binary, application_ini, platform_ini):
_check_version(get_version(fake_binary))
@pytest.mark.skipif(
not hasattr(os, "symlink"), reason="os.symlink not supported on this platform"
)
def test_symlinked_binary(fake_binary, application_ini, platform_ini, tmpdir):
# create a symlink of the binary in another directory and check
# version against this symlink
symlink = str(tmpdir.join("symlink"))
os.symlink(fake_binary, symlink)
_check_version(get_version(symlink))
def test_binary_in_current_path(fake_binary, application_ini, platform_ini, tmpdir):
os.chdir(str(tmpdir))
_check_version(get_version())
def test_with_ini_files_on_osx(
fake_binary, application_ini, platform_ini, monkeypatch, tmpdir
):
monkeypatch.setattr(sys, "platform", "darwin")
# get_version is working with ini files next to the binary
_check_version(get_version(binary=fake_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 = tmpdir.mkdir("Contents")
moved_binary = str(contents_dir.join(os.path.basename(fake_binary)))
shutil.move(fake_binary, moved_binary)
resources_dir = str(tmpdir.mkdir("Resources"))
shutil.move(application_ini, resources_dir)
shutil.move(platform_ini, resources_dir)
_check_version(get_version(binary=moved_binary))
def test_invalid_binary_path(tmpdir):
with pytest.raises(IOError):
get_version(str(tmpdir.join("invalid")))
def test_without_ini_files(fake_binary):
"""With missing ini files an exception should be thrown"""
with pytest.raises(errors.AppNotFoundError):
get_version(fake_binary)
def test_without_platform_ini_file(fake_binary, application_ini):
"""With a missing platform.ini file an exception should be thrown"""
with pytest.raises(errors.AppNotFoundError):
get_version(fake_binary)
def test_without_application_ini_file(fake_binary, platform_ini):
"""With a missing application.ini file an exception should be thrown"""
with pytest.raises(errors.AppNotFoundError):
get_version(fake_binary)
def test_with_exe(application_ini, platform_ini, tmpdir):
"""Test that we can resolve .exe files"""
binary = tmpdir.join("binary.exe")
binary.write("foobar")
_check_version(get_version(os.path.splitext(str(binary))[0]))
def test_not_found_with_binary_specified(fake_binary):
with pytest.raises(errors.LocalAppNotFoundError):
get_version(fake_binary)
def _check_version(version):
assert version.get("application_id") == "AppID"
assert version.get("application_name") == "AppName"
assert version.get("application_display_name") == "AppCodeName"
assert version.get("application_version") == "AppVersion"
assert version.get("application_buildid") == "AppBuildID"
assert version.get("application_repository") == "AppSourceRepo"
assert version.get("application_changeset") == "AppSourceStamp"
assert version.get("application_vendor") == "AppVendor"
assert version.get("platform_name") is None
assert version.get("platform_buildid") == "PlatformBuildID"
assert version.get("platform_repository") == "PlatformSourceRepo"
assert version.get("platform_changeset") == "PlatformSourceStamp"
assert version.get("invalid_key") is None
assert version.get("platform_version") == "PlatformMilestone"
if __name__ == "__main__":
mozunit.main()