__init__.py 5.18 KB
Newer Older
André Anjos's avatar
André Anjos committed
1 2 3
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
###################################################################################
#                                                                                 #
# Copyright (c) 2019 Idiap Research Institute, http://www.idiap.ch/               #
# Contact: beat.support@idiap.ch                                                  #
#                                                                                 #
# Redistribution and use in source and binary forms, with or without              #
# modification, are permitted provided that the following conditions are met:     #
#                                                                                 #
# 1. Redistributions of source code must retain the above copyright notice, this  #
# list of conditions and the following disclaimer.                                #
#                                                                                 #
# 2. Redistributions in binary form must reproduce the above copyright notice,    #
# this list of conditions and the following disclaimer in the documentation       #
# and/or other materials provided with the distribution.                          #
#                                                                                 #
# 3. Neither the name of the copyright holder nor the names of its contributors   #
# may be used to endorse or promote products derived from this software without   #
# specific prior written permission.                                              #
#                                                                                 #
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND #
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED   #
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE          #
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE    #
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL      #
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      #
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER      #
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,   #
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE   #
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.            #
#                                                                                 #
###################################################################################

André Anjos's avatar
André Anjos committed
36 37 38

# Basic setup for command test

Samuel GAIST's avatar
Samuel GAIST committed
39
import contextlib
André Anjos's avatar
André Anjos committed
40
import os
41
import shutil
42
import subprocess  # nosec
Samuel GAIST's avatar
Samuel GAIST committed
43 44
import sys
import tempfile
45
import urllib
André Anjos's avatar
André Anjos committed
46

Samuel GAIST's avatar
Samuel GAIST committed
47 48
import pkg_resources

49
from beat.core.test import teardown_package as bc_teardown_package
Samuel GAIST's avatar
Samuel GAIST committed
50
from beat.core.test import tmp_prefix  # noqa forward import
André Anjos's avatar
André Anjos committed
51

52
platform = os.environ.get("BEAT_CMDLINE_TEST_PLATFORM", "")
André Anjos's avatar
André Anjos committed
53 54 55 56

disconnected = True
if platform:

57 58 59 60
    # the special name 'django' makes as believe it is connected
    if platform.startswith("django://"):
        # sets up django infrastructure, preloads test data
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", platform[9:])
61 62
        from distutils.version import LooseVersion

63
        import django
André Anjos's avatar
André Anjos committed
64

65
        django.setup()
André Anjos's avatar
André Anjos committed
66

67 68
        # presets django database for tests
        from django.core.management import call_command
André Anjos's avatar
André Anjos committed
69

70 71 72 73 74 75 76 77
        if LooseVersion(
            pkg_resources.get_distribution("django").version
        ) >= LooseVersion("3"):
            kwargs = dict(verbosity=1)
        else:
            kwargs = dict(verbose=1)

        call_command("install", "test", **kwargs)
78 79 80 81 82 83 84 85 86 87 88 89 90 91

        disconnected = False

    else:  # test it, actually
        # some patching to prevent common problems
        if not platform.endswith("/"):
            platform += "/"
        if not platform.startswith("http"):
            platform = "http://" + platform
        try:
            code = urllib.request.urlopen(platform).getcode()  # nosec
            disconnected = code != 200
        except (IOError, urllib.URLError):
            disconnected = True
André Anjos's avatar
André Anjos committed
92
else:
93
    platform = "User did not set $BEAT_CMDLINE_TEST_PLATFORM"
André Anjos's avatar
André Anjos committed
94

95 96
user = "user"  # nosec
token = "3"  # nosec
97 98


99 100 101 102
if sys.platform == "darwin":
    prefix_folder = tempfile.mkdtemp(
        prefix=__name__, suffix=".prefix", dir="/tmp"  # nosec
    )
103
else:
104
    prefix_folder = tempfile.mkdtemp(prefix=__name__, suffix=".prefix")  # nosec
105

106
prefix = os.path.join(prefix_folder, "prefix")
107 108 109


def setup_package():
110
    prefixes = [
111 112
        pkg_resources.resource_filename("beat.backend.python.test", "prefix"),
        pkg_resources.resource_filename("beat.core.test", "prefix"),
113
        pkg_resources.resource_filename("beat.cmdline.test", "prefix"),
114
    ]
115

116
    for path in prefixes:
117
        subprocess.check_call(["rsync", "-arz", path, prefix_folder])  # nosec
118 119 120


def teardown_package():
121
    shutil.rmtree(prefix_folder)
122
    bc_teardown_package()
André Anjos's avatar
André Anjos committed
123 124 125 126


@contextlib.contextmanager
def temp_cwd():
127
    tempdir = tempfile.mkdtemp(prefix=__name__, suffix=".cwd")
André Anjos's avatar
André Anjos committed
128 129
    curdir = os.getcwd()
    os.chdir(tempdir)
130 131
    try:
        yield tempdir
André Anjos's avatar
André Anjos committed
132
    finally:
133 134
        os.chdir(curdir)
        shutil.rmtree(tempdir)