Merge lp:~frankban/juju-quickstart/support-old-series into lp:juju-quickstart

Proposed by Francesco Banconi
Status: Merged
Merged at revision: 117
Proposed branch: lp:~frankban/juju-quickstart/support-old-series
Merge into: lp:juju-quickstart
Diff against target: 446 lines (+265/-35)
10 files modified
HACKING.rst (+41/-0)
Makefile (+10/-0)
quickstart/juju.py (+2/-2)
quickstart/manage.py (+0/-1)
quickstart/platform_support.py (+1/-4)
quickstart/tests/functional/__init__.py (+41/-0)
quickstart/tests/functional/test_functional.py (+139/-0)
quickstart/tests/test_juju.py (+30/-22)
setup.cfg (+0/-1)
tox.ini (+1/-5)
To merge this branch: bzr merge lp:~frankban/juju-quickstart/support-old-series
Reviewer Review Type Date Requested Status
Juju GUI Hackers Pending
Review via email: mp+248150@code.launchpad.net

Description of the change

Enable tests for trusty and utopic.

Fix the unit test suite so that tests pass
when run in trusty and utopic scenarios.

Also add some simple functional tests. In those
tests, Quickstart is run against a real Juju env.

See the changes in the HACKING file for instructions
about running functional tests.

To QA this, run `make check` and `make fcheck`: the
latter can take some time.

https://codereview.appspot.com/197240043/

To post a comment you must log in.
Revision history for this message
Francesco Banconi (frankban) wrote :

Reviewers: mp+248150_code.launchpad.net,

Message:
Please take a look.

Description:
Enable tests for trusty and utopic.

Fix the unit test suite so that tests pass
when run in trusty and utopic scenarios.

Also add some simple functional tests. In those
tests, Quickstart is run against a real Juju env.

See the changes in the HACKING file for instructions
about running functional tests.

To QA this, run `make check` and `make fcheck`: the
latter can take some time.

https://code.launchpad.net/~frankban/juju-quickstart/support-old-series/+merge/248150

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/197240043/

Affected files (+265, -35 lines):
   M HACKING.rst
   M Makefile
   A [revision details]
   M quickstart/juju.py
   M quickstart/manage.py
   M quickstart/platform_support.py
   A quickstart/tests/functional/__init__.py
   A quickstart/tests/functional/test_functional.py
   M quickstart/tests/test_juju.py
   M setup.cfg
   M tox.ini

Revision history for this message
Brad Crittenden (bac) wrote :

LGTM. No QA.

https://codereview.appspot.com/197240043/diff/1/quickstart/tests/functional/test_functional.py
File quickstart/tests/functional/test_functional.py (right):

https://codereview.appspot.com/197240043/diff/1/quickstart/tests/functional/test_functional.py#newcode87
quickstart/tests/functional/test_functional.py:87: cls.retcode,
cls.output, cls.error = run_quickstart(cls.env_name)
Thanks for the thoughtful test implementation.

It may be worth noting that run_quickstart only happens once per suite
not once per test as it isn't super obvious since we don't use
setUpClass all that much.

https://codereview.appspot.com/197240043/

138. By Francesco Banconi

Changes as per review.

Revision history for this message
Francesco Banconi (frankban) wrote :
Revision history for this message
Jeff Pihach (hatch) wrote :

LGTM Thanks for getting this working! I'll QA once we chat about my
comment.

https://codereview.appspot.com/197240043/diff/20001/quickstart/tests/functional/test_functional.py
File quickstart/tests/functional/test_functional.py (right):

https://codereview.appspot.com/197240043/diff/20001/quickstart/tests/functional/test_functional.py#newcode46
quickstart/tests/functional/test_functional.py:46: env_name =
envs.get_default_env_name()
As a precautionary measure I would prefer if there was a default
environment name for these tests. That way there would be no possible
way someone would accidentally run these tests on a live environment.

https://codereview.appspot.com/197240043/

Revision history for this message
Jeff Pihach (hatch) wrote :

QA OK Thanks for this branch!

https://codereview.appspot.com/197240043/

Revision history for this message
Francesco Banconi (frankban) wrote :

*** Submitted:

Enable tests for trusty and utopic.

Fix the unit test suite so that tests pass
when run in trusty and utopic scenarios.

Also add some simple functional tests. In those
tests, Quickstart is run against a real Juju env.

See the changes in the HACKING file for instructions
about running functional tests.

To QA this, run `make check` and `make fcheck`: the
latter can take some time.

R=bac, jeff.pihach
CC=
https://codereview.appspot.com/197240043

https://codereview.appspot.com/197240043/

Revision history for this message
Francesco Banconi (frankban) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'HACKING.rst'
--- HACKING.rst 2015-01-30 09:28:38 +0000
+++ HACKING.rst 2015-02-03 14:13:23 +0000
@@ -67,6 +67,43 @@
6767
68Run ``make help`` for more information about all the available make targets.68Run ``make help`` for more information about all the available make targets.
6969
70Running functional tests
71~~~~~~~~~~~~~~~~~~~~~~~~
72
73The Juju Quickstart test suite includes functional tests exercising the
74application execution against a real Juju environment. Functional tests are
75not run by default (i.e. when using ``make test`` or ``make check``), but they
76can be activated by setting the ``JUJU_QUICKSTART_FTESTS`` environment variable
77to ``1``, or, in a simpler way, by running ``make ftest`` or ``make fcheck``.
78
79Note that functional tests are not intended to be run in the day-by-day
80development process. Their goal is to automate part of the release QA.
81
82Functional tests require:
83
84- some time to complete their execution: a real Juju environment is
85 bootstrapped in the process;
86- a Juju home correctly set up with at least one environment defined in the
87 ``environments.yaml`` file;
88- SSH keys already generated for the user running the tests;
89- a working Internet connection.
90
91By default, the current default environment is used to run those tests.
92To change the environment, use the JUJU_ENV environment variable, e.g.::
93
94 make fcheck JUJU_ENV=myenv
95
96The environment used by the functional suite is destroyed after the tests
97complete. For this reason, **ensure the selected environment is not in use**.
98
99To run the test using a customized build of Juju, pass the ``JUJU`` environment
100variable to ``make``, e.g.::
101
102 make fcheck JUJU=$GOPATH/bin/juju
103
104Also note that when running functional tests against a local environment, the
105password for sudo privileges may be asked while the suite is run.
106
70Requirements107Requirements
71~~~~~~~~~~~~108~~~~~~~~~~~~
72109
@@ -157,6 +194,10 @@
157Pre-release QA194Pre-release QA
158~~~~~~~~~~~~~~195~~~~~~~~~~~~~~
159196
197Run the Quickstart functional tests on all supported platforms::
198
199 make fcheck
200
160The general steps for manual QA (until we get a continuous integration set up201The general steps for manual QA (until we get a continuous integration set up
161with functional tests) should be run on trusty, utopic and vivid.202with functional tests) should be run on trusty, utopic and vivid.
162203
163204
=== modified file 'Makefile'
--- Makefile 2015-01-30 16:34:50 +0000
+++ Makefile 2015-02-03 14:13:23 +0000
@@ -66,6 +66,14 @@
66 # Remove the virtualenv used in previous configurations.66 # Remove the virtualenv used in previous configurations.
67 rm -rfv .venv/67 rm -rfv .venv/
6868
69.PHONY: fcheck
70fcheck: setup
71 $(MAKE) check JUJU_QUICKSTART_FTESTS=1
72
73.PHONY: ftest
74ftest: setup
75 $(MAKE) test JUJU_QUICKSTART_FTESTS=1
76
69.PHONY: help77.PHONY: help
70help:78help:
71 @echo -e 'Juju Quickstart - list of make targets:\n'79 @echo -e 'Juju Quickstart - list of make targets:\n'
@@ -73,6 +81,8 @@
73 @echo 'make test - Run tests.'81 @echo 'make test - Run tests.'
74 @echo 'make lint - Run linter and pep8.'82 @echo 'make lint - Run linter and pep8.'
75 @echo 'make check - Run all the tests and lint in all supported scenarios.'83 @echo 'make check - Run all the tests and lint in all supported scenarios.'
84 @echo 'make ftest - Run tests (including functional tests).'
85 @echo 'make fcheck - Run functional tests and lint in all scenarios.'
76 @echo 'make source - Create source package.'86 @echo 'make source - Create source package.'
77 @echo 'make install - Install on local system.'87 @echo 'make install - Install on local system.'
78 @echo 'make clean - Get rid of bytecode files, build and dist dirs, venvs.'88 @echo 'make clean - Get rid of bytecode files, build and dist dirs, venvs.'
7989
=== modified file 'quickstart/juju.py'
--- quickstart/juju.py 2014-12-16 11:10:10 +0000
+++ quickstart/juju.py 2015-02-03 14:13:23 +0000
@@ -148,7 +148,7 @@
148 Overridden to add logging in the case the payload is text.148 Overridden to add logging in the case the payload is text.
149 """149 """
150 if opcode == OPCODE_TEXT:150 if opcode == OPCODE_TEXT:
151 message = payload.decode('utf-8')151 message = payload.decode('utf-8', 'ignore')
152 logging.debug('API message: --> {}'.format(message))152 logging.debug('API message: --> {}'.format(message))
153 return super(WebSocketConnection, self).send(payload, opcode=opcode)153 return super(WebSocketConnection, self).send(payload, opcode=opcode)
154154
@@ -159,6 +159,6 @@
159 """159 """
160 data = super(WebSocketConnection, self).recv()160 data = super(WebSocketConnection, self).recv()
161 if isinstance(data, bytes):161 if isinstance(data, bytes):
162 message = data.decode('utf-8')162 message = data.decode('utf-8', 'ignore')
163 logging.debug('API message: <-- {}'.format(message))163 logging.debug('API message: <-- {}'.format(message))
164 return data164 return data
165165
=== modified file 'quickstart/manage.py'
--- quickstart/manage.py 2015-01-12 12:10:38 +0000
+++ quickstart/manage.py 2015-02-03 14:13:23 +0000
@@ -386,7 +386,6 @@
386386
387 Exit with an error if the provided arguments are not valid.387 Exit with an error if the provided arguments are not valid.
388 """388 """
389
390 # Determine the host platform. This needs to be done early as it affects389 # Determine the host platform. This needs to be done early as it affects
391 # the options we present.390 # the options we present.
392 platform = platform_support.get_platform()391 platform = platform_support.get_platform()
393392
=== modified file 'quickstart/platform_support.py'
--- quickstart/platform_support.py 2014-08-25 16:57:41 +0000
+++ quickstart/platform_support.py 2015-02-03 14:13:23 +0000
@@ -55,10 +55,7 @@
5555
5656
57def get_platform():57def get_platform():
58 """Return the platform of the host.58 """Return the platform of the host."""
59
60 Raises UnsupportedOS if a platform we don't support is detected.
61 """
62 system = platform.system()59 system = platform.system()
63 if system == 'Darwin':60 if system == 'Darwin':
64 return settings.OSX61 return settings.OSX
6562
=== added directory 'quickstart/tests/functional'
=== added file 'quickstart/tests/functional/__init__.py'
--- quickstart/tests/functional/__init__.py 1970-01-01 00:00:00 +0000
+++ quickstart/tests/functional/__init__.py 2015-02-03 14:13:23 +0000
@@ -0,0 +1,41 @@
1# This file is part of the Juju Quickstart Plugin, which lets users set up a
2# Juju environment in very few steps (https://launchpad.net/juju-quickstart).
3# Copyright (C) 2015 Canonical Ltd.
4#
5# This program is free software: you can redistribute it and/or modify it under
6# the terms of the GNU Affero General Public License version 3, as published by
7# the Free Software Foundation.
8#
9# This program is distributed in the hope that it will be useful, but WITHOUT
10# ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
11# SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12# Affero General Public License for more details.
13#
14# You should have received a copy of the GNU Affero General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17"""Juju Quickstart functional tests package.
18
19This package includes functional tests for Juju Quickstart.
20In those tests, Juju Quickstart is run to bootstrap and deploy the Juju GUI
21in a real Juju environment. For this reason, completing the suite takes a
22while. Therefore tests are disabled by default, and are intended to be only run
23before releasing a new version of the application.
24
25To run the tests, set the JUJU_QUICKSTART_FTESTS environment variable to "1",
26or use "make ftest/fcheck".
27
28Functional tests require:
29- a Juju home correctly set up with at least one environment defined in the
30 environments.yaml file;
31- SSH keys already generated for the user running the tests;
32- a working Internet connection.
33
34By default, the current default environment is used to run the application.
35To change the environment, set the JUJU_ENV environment variable, e.g.:
36
37 make fcheck JUJU_ENV=myenv
38
39Also note that when running functional tests against a local environment, the
40password for sudo privileges may be asked while the suite is run.
41"""
042
=== added file 'quickstart/tests/functional/test_functional.py'
--- quickstart/tests/functional/test_functional.py 1970-01-01 00:00:00 +0000
+++ quickstart/tests/functional/test_functional.py 2015-02-03 14:13:23 +0000
@@ -0,0 +1,139 @@
1# This file is part of the Juju Quickstart Plugin, which lets users set up a
2# Juju environment in very few steps (https://launchpad.net/juju-quickstart).
3# Copyright (C) 2015 Canonical Ltd.
4#
5# This program is free software: you can redistribute it and/or modify it under
6# the terms of the GNU Affero General Public License version 3, as published by
7# the Free Software Foundation.
8#
9# This program is distributed in the hope that it will be useful, but WITHOUT
10# ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
11# SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12# Affero General Public License for more details.
13#
14# You should have received a copy of the GNU Affero General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17"""Functional tests for Juju Quickstart."""
18
19from __future__ import unicode_literals
20
21import functools
22import json
23import os
24import unittest
25
26import quickstart
27from quickstart import (
28 platform_support,
29 settings,
30 utils,
31)
32from quickstart.models import envs
33
34
35# Define the name of the environment variable used to run the functional tests.
36FTEST_ENV_VAR = 'JUJU_QUICKSTART_FTESTS'
37
38
39def skip_if_disbled(func):
40 """Decorate a test method so that it is only run when required/possible."""
41 # Check that functional tests are enabled.
42 if os.getenv(FTEST_ENV_VAR) != '1':
43 return unittest.skip(
44 'to run functional tests, set {} to "1"'.format(FTEST_ENV_VAR))
45 # Check that a Juju environment can be found.
46 env_name = envs.get_default_env_name()
47 if env_name is None:
48 return unittest.skip('cannot find a configured Juju environment')
49
50 @functools.wraps(func)
51 def decorated(cls_or_self):
52 # Decorate the function to update the received class or instance with
53 # the Juju env name.
54 cls_or_self.env_name = env_name
55 return func(cls_or_self)
56
57 return decorated
58
59
60def run_juju(*args):
61 """Run the juju command with the given args.
62
63 Return a tuple including the command exit code, its output and error.
64 """
65 platform = platform_support.get_platform()
66 cmd, _ = platform_support.get_juju_command(platform)
67 return utils.call(cmd, *args)
68
69
70def run_quickstart(env_name, *args):
71 """Run the Juju Quickstart command.
72
73 Return a tuple including the command exit code, its output and error.
74 """
75 package_dir = os.path.dirname(quickstart.__file__)
76 cmd = os.path.abspath(os.path.join(package_dir, '..', 'juju-quickstart'))
77 return utils.call(
78 cmd, '-e', env_name, '--distro-only', '--no-browser', *args)
79
80
81class TestFunctional(unittest.TestCase):
82
83 @classmethod
84 @skip_if_disbled
85 def setUpClass(cls):
86 # Run Juju Quickstart to bootstrap Juju and deploy the Juju GUI.
87 # Note that this is done once per suite. The resulting environment is
88 # then destroyed when the suite completes.
89 cls.retcode, cls.output, cls.error = run_quickstart(cls.env_name)
90
91 @classmethod
92 @skip_if_disbled
93 def tearDownClass(cls):
94 # Destroy the environment.
95 run_juju('destroy-environment', cls.env_name, '-y', '--force')
96
97 def test_executed(self):
98 # The application successfully completed its execution.
99 self.assertEqual(0, self.retcode)
100 self.assertIn('done!', self.output)
101 self.assertEqual('', self.error)
102
103 def test_gui_started(self):
104 # At the end of the process, the Juju GUI unit is started.
105 retcode, output, _ = run_juju(
106 'status', '-e', self.env_name, '--format', 'json')
107 self.assertEqual(0, retcode)
108 status = json.loads(output)
109 # The Juju GUI service is exposed.
110 service = status['services'][settings.JUJU_GUI_SERVICE_NAME]
111 self.assertTrue(service['exposed'])
112 # The Juju GUI unit is started.
113 unit = service['units']['{}/0'.format(settings.JUJU_GUI_SERVICE_NAME)]
114 self.assertEqual('started', unit['agent-state'])
115
116 def test_idempotent(self):
117 # The application can be run again on an already bootstrapped
118 # environment.
119 retcode, output, error = run_quickstart(self.env_name)
120 self.assertEqual(0, retcode)
121 msg = 'reusing the already bootstrapped {} environment'
122 self.assertIn(msg.format(self.env_name), output)
123 self.assertEqual('', error)
124
125 def test_version(self):
126 # The application correctly prints out its own version.
127 retcode, output, error = run_quickstart(self.env_name, '--version')
128 self.assertEqual(0, retcode)
129 self.assertEqual('', output)
130 self.assertEqual(
131 'juju-quickstart {}\n'.format(quickstart.get_version()), error)
132
133 def test_bundle_deployment(self):
134 # The application can be used to deploy bundles.
135 retcode, output, error = run_quickstart(
136 self.env_name, 'bundle:mediawiki/single')
137 self.assertEqual(0, retcode)
138 self.assertIn('bundle deployment request accepted', output)
139 self.assertEqual('', error)
0140
=== modified file 'quickstart/tests/test_juju.py'
--- quickstart/tests/test_juju.py 2014-12-16 15:53:25 +0000
+++ quickstart/tests/test_juju.py 2015-02-03 14:13:23 +0000
@@ -63,8 +63,13 @@
63 api_url = self.api_url63 api_url = self.api_url
64 with mock.patch('websocket.create_connection') as mock_connect:64 with mock.patch('websocket.create_connection') as mock_connect:
65 self.env = juju.Environment(api_url)65 self.env = juju.Environment(api_url)
66 mock_connect.assert_called_once_with(66 # In old versions of jujuclient the SSL options are not passed as
67 api_url, origin=api_url, sslopt=juju.SSLOPT)67 # kwargs to create_connection.
68 if len(mock_connect.call_args[1]) == 1:
69 mock_connect.assert_called_once_with(api_url, origin=api_url)
70 else:
71 mock_connect.assert_called_once_with(
72 api_url, origin=api_url, sslopt=juju.SSLOPT)
68 # Keep track of watcher changes in the changesets list.73 # Keep track of watcher changes in the changesets list.
69 self.changesets = []74 self.changesets = []
7075
@@ -345,49 +350,52 @@
345350
346 def setUp(self):351 def setUp(self):
347 self.conn = juju.WebSocketConnection()352 self.conn = juju.WebSocketConnection()
348 # The send method calls the send_frame one.
349 self.conn.send_frame = self.mock_send = mock.Mock()
350 # The recv method calls the recv_data one.
351 self.conn.recv_data = self.mock_recv = mock.Mock()
352353
353 def test_send(self):354 def test_send(self):
354 # Outgoing messages are properly logged.355 # Outgoing messages are properly logged.
355 with helpers.assert_logs(['API message: --> my message'], 'debug'):356 with helpers.assert_logs(['API message: --> my message'], 'debug'):
356 self.conn.send('my message')357 with mock.patch('websocket.WebSocket.send') as mock_send:
357 self.assertTrue(self.mock_send.called)358 self.conn.send('my message')
359 mock_send.assert_called_once_with(
360 'my message', opcode=juju.OPCODE_TEXT)
358361
359 def test_send_unicode(self):362 def test_send_unicode(self):
360 # Outgoing unicode messages are properly logged.363 # Outgoing unicode messages are properly logged.
361 expected = 'API message: --> {}'.format(self.snowman)364 expected = 'API message: --> {}'.format(self.snowman)
362 with helpers.assert_logs([expected], 'debug'):365 with helpers.assert_logs([expected], 'debug'):
363 self.conn.send(self.snowman.encode('utf-8'))366 with mock.patch('websocket.WebSocket.send') as mock_send:
364 self.assertTrue(self.mock_send.called)367 self.conn.send(self.snowman.encode('utf-8'))
368 mock_send.assert_called_once_with(
369 self.snowman.encode('utf-8'), opcode=juju.OPCODE_TEXT)
365370
366 def test_send_not_text(self):371 def test_send_not_text(self):
367 # Outgoing non-textual messages are not logged.372 # Outgoing non-textual messages are not logged.
368 with helpers.assert_logs([], 'debug'):373 with helpers.assert_logs([], 'debug'):
369 self.conn.send(0x0, opcode=websocket.ABNF.OPCODE_BINARY)374 with mock.patch('websocket.WebSocket.send') as mock_send:
370 self.assertTrue(self.mock_send.called)375 self.conn.send(0x0, opcode=websocket.ABNF.OPCODE_BINARY)
376 mock_send.assert_called_once_with(
377 0x0, opcode=websocket.ABNF.OPCODE_BINARY)
371378
372 def test_recv(self):379 def test_recv(self):
373 # Incoming messages are properly logged.380 # Incoming messages are properly logged.
374 self.mock_recv.return_value = (juju.OPCODE_TEXT, b'my message')
375 with helpers.assert_logs(['API message: <-- my message'], 'debug'):381 with helpers.assert_logs(['API message: <-- my message'], 'debug'):
376 self.conn.recv()382 with mock.patch('websocket.WebSocket.recv') as mock_recv:
377 self.mock_recv.assert_called_once_with()383 mock_recv.return_value = (b'my message')
384 message = self.conn.recv()
385 self.assertEqual('my message', message)
378386
379 def test_recv_unicode(self):387 def test_recv_unicode(self):
380 # Incoming unicode messages are properly logged.388 # Incoming unicode messages are properly logged.
381 self.mock_recv.return_value = (
382 juju.OPCODE_TEXT, self.snowman.encode('utf-8'))
383 expected = 'API message: <-- {}'.format(self.snowman)389 expected = 'API message: <-- {}'.format(self.snowman)
384 with helpers.assert_logs([expected], 'debug'):390 with helpers.assert_logs([expected], 'debug'):
385 self.conn.recv()391 with mock.patch('websocket.WebSocket.recv') as mock_recv:
386 self.mock_recv.assert_called_once_with()392 mock_recv.return_value = self.snowman.encode('utf-8')
393 message = self.conn.recv()
394 self.assertEqual(self.snowman.encode('utf-8'), message)
387395
388 def test_recv_not_text(self):396 def test_recv_not_text(self):
389 # Incoming non-textual messages are not logged.397 # Incoming non-textual messages are not logged.
390 self.mock_recv.return_value = (websocket.ABNF.OPCODE_BINARY, 0x0)
391 with helpers.assert_logs([], 'debug'):398 with helpers.assert_logs([], 'debug'):
392 self.conn.recv()399 with mock.patch('websocket.WebSocket.recv') as mock_recv:
393 self.mock_recv.assert_called_once_with()400 mock_recv.return_value = 0x0
401 self.conn.recv()
394402
=== modified file 'setup.cfg'
--- setup.cfg 2015-01-16 12:32:38 +0000
+++ setup.cfg 2015-02-03 14:13:23 +0000
@@ -15,6 +15,5 @@
15# along with this program. If not, see <http://www.gnu.org/licenses/>.15# along with this program. If not, see <http://www.gnu.org/licenses/>.
1616
17[nosetests]17[nosetests]
18detailed-errors=1
19nocapture=118nocapture=1
20verbosity=219verbosity=2
2120
=== modified file 'tox.ini'
--- tox.ini 2015-01-30 09:28:38 +0000
+++ tox.ini 2015-02-03 14:13:23 +0000
@@ -18,11 +18,7 @@
18# The envlist option must only include platform scenarios. In essence, those18# The envlist option must only include platform scenarios. In essence, those
19# are used to test Juju Quickstart with the specific dependencies present in19# are used to test Juju Quickstart with the specific dependencies present in
20# each supported OS platform.20# each supported OS platform.
21envlist = pypi,ppa,vivid21envlist = pypi,ppa,trusty,utopic,vivid
22# XXX frankban: currently tests do not pass on trusty and utopic scenarios.
23# Fix the tests, then remove the line above and uncomment the line below.
24# envlist = pypi,ppa,trusty,utopic,vivid
25
2622
27# Define the base requirements and commands to use when testing the program.23# Define the base requirements and commands to use when testing the program.
2824

Subscribers

People subscribed via source and target branches