__init__.py 4.95 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 39

# Basic setup for command test

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

47
import urllib
André Anjos's avatar
André Anjos committed
48

49 50
from beat.core.test import tmp_prefix  # noqa forward import
from beat.core.test import teardown_package as bc_teardown_package
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 61
    # 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:])
        import django
André Anjos's avatar
André Anjos committed
62

63
        django.setup()
André Anjos's avatar
André Anjos committed
64

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

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
        call_command("install", "test", interactive=False, verbose=1)

        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
83
else:
84
    platform = "User did not set $BEAT_CMDLINE_TEST_PLATFORM"
André Anjos's avatar
André Anjos committed
85

86 87
user = "user"  # nosec
token = "3"  # nosec
88 89


90 91 92 93
if sys.platform == "darwin":
    prefix_folder = tempfile.mkdtemp(
        prefix=__name__, suffix=".prefix", dir="/tmp"  # nosec
    )
94
else:
95
    prefix_folder = tempfile.mkdtemp(prefix=__name__, suffix=".prefix")  # nosec
96

97
prefix = os.path.join(prefix_folder, "prefix")
98 99 100


def setup_package():
101
    prefixes = [
102 103
        pkg_resources.resource_filename("beat.backend.python.test", "prefix"),
        pkg_resources.resource_filename("beat.core.test", "prefix"),
104
        pkg_resources.resource_filename("beat.cmdline.test", "prefix"),
105
    ]
106

107
    for path in prefixes:
108
        subprocess.check_call(["rsync", "-arz", path, prefix_folder])  # nosec
109 110 111


def teardown_package():
112
    shutil.rmtree(prefix_folder)
113
    bc_teardown_package()
André Anjos's avatar
André Anjos committed
114 115 116 117


@contextlib.contextmanager
def temp_cwd():
118
    tempdir = tempfile.mkdtemp(prefix=__name__, suffix=".cwd")
André Anjos's avatar
André Anjos committed
119 120
    curdir = os.getcwd()
    os.chdir(tempdir)
121 122
    try:
        yield tempdir
André Anjos's avatar
André Anjos committed
123
    finally:
124 125
        os.chdir(curdir)
        shutil.rmtree(tempdir)