-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathtest_examples.py
More file actions
145 lines (125 loc) · 5.31 KB
/
test_examples.py
File metadata and controls
145 lines (125 loc) · 5.31 KB
1
2
3
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
"""
Unit tests for the Deis example-[language] projects.
Run these tests with "python -m unittest client.tests.test_examples"
or with "./manage.py test client.ExamplesTest".
"""
from __future__ import unicode_literals
from unittest import TestCase
from uuid import uuid4
import pexpect
import time
from .utils import DEIS
from .utils import DEIS_TEST_FLAVOR
from .utils import EXAMPLES
from .utils import clone
from .utils import purge
from .utils import register
class ExamplesTest(TestCase):
@classmethod
def setUpClass(cls):
cls.username, cls.password = register()
# create a new formation
cls.formation = "{}-test-formation-{}".format(
cls.username, uuid4().hex[:4])
child = pexpect.spawn("{} formations:create {} --flavor={}".format(
DEIS, cls.formation, DEIS_TEST_FLAVOR))
child.expect("created {}.*to scale a basic formation".format(
cls.formation))
child.expect(pexpect.EOF)
# scale the formation runtime=1
child = pexpect.spawn("{} nodes:scale {} runtime=1".format(
DEIS, cls.formation), timeout=10 * 60)
child.expect('Scaling nodes...')
child.expect(r'done in \d+s')
child.expect(pexpect.EOF)
@classmethod
def tearDownClass(cls):
# scale formation runtime=0
child = pexpect.spawn("{} nodes:scale {} runtime=0".format(
DEIS, cls.formation), timeout=3 * 60)
child.expect('Scaling nodes...')
child.expect(r'done in \d+s')
child.expect(pexpect.EOF)
# destroy the formation
child = pexpect.spawn("{} formations:destroy {} --confirm={}".format(
DEIS, cls.formation, cls.formation))
child.expect('done in ', timeout=5 * 60)
child.expect(pexpect.EOF)
purge(cls.username, cls.password)
def _test_example(self, repo_name, build_timeout=120, run_timeout=60):
# `git clone` the example app repository
_repo_type, repo_url = EXAMPLES[repo_name]
# print repo_name, repo_type, repo_url
clone(repo_url, repo_name)
# create an App
child = pexpect.spawn("{} create --formation={}".format(
DEIS, self.formation))
child.expect('done, created (?P<name>[-_\w]+)', timeout=60)
app = child.match.group('name')
try:
child.expect('Git remote deis added')
child.expect(pexpect.EOF)
child = pexpect.spawn('git push deis master')
# check git output for repo_type, e.g. "Clojure app detected"
# TODO: for some reason, the next regex times out...
# child.expect("{} app detected".format(repo_type), timeout=5 * 60)
child.expect('Launching... ', timeout=build_timeout)
child.expect('deployed to Deis(?P<url>.+)To learn more', timeout=run_timeout)
url = child.match.group('url')
child.expect(' -> master')
child.expect(pexpect.EOF, timeout=10)
# try to fetch the URL with curl a few times, ignoring 502's
for _ in range(6):
child = pexpect.spawn("curl -s {}".format(url))
i = child.expect(['Powered by Deis', '502 Bad Gateway'], timeout=5)
child.expect(pexpect.EOF)
if i == 0:
break
time.sleep(10)
else:
raise RuntimeError('Persistent 502 Bad Gateway')
# `deis config:set POWERED_BY="Automated Testing"`
child = pexpect.spawn(
"{} config:set POWERED_BY='Automated Testing'".format(DEIS))
child.expect(pexpect.EOF, timeout=3 * 60)
# then re-fetch the URL with curl and recheck the output
for _ in range(6):
child = pexpect.spawn("curl -s {}".format(url))
child.expect(['Powered by Automated Testing', '502 Bad Gateway'], timeout=5)
child.expect(pexpect.EOF)
if i == 0:
break
time.sleep(10)
else:
raise RuntimeError('Config:set not working')
finally:
# destroy the app
child = pexpect.spawn(
"{} apps:destroy --app={} --confirm={}".format(DEIS, app, app),
timeout=5 * 60)
child.expect('Git remote deis removed')
child.expect(pexpect.EOF)
def test_clojure_ring(self):
self._test_example('example-clojure-ring')
def _test_dart(self):
# TODO: fix broken buildpack / example app
self._test_example('example-dart')
def test_go(self):
self._test_example('example-go')
def test_java_jetty(self):
self._test_example('example-java-jetty')
def test_nodejs_express(self):
self._test_example('example-nodejs-express')
def test_perl(self):
self._test_example('example-perl', build_timeout=600)
def test_php(self):
self._test_example('example-php')
def _test_play(self):
# TODO: fix broken buildpack / example app
self._test_example('example-play', build_timeout=720)
def test_python_flask(self):
self._test_example('example-python-flask')
def test_ruby_sinatra(self):
self._test_example('example-ruby-sinatra')
def test_scala(self):
self._test_example('example-scala', build_timeout=720)