Skip to content

Commit b5946a1

Browse files
committed
Merge pull request #1349 from dhermes/move-system-test-runner-to-python
Move system test runner from bash to Python
2 parents 972e875 + d6c3b87 commit b5946a1

File tree

9 files changed

+261
-132
lines changed

9 files changed

+261
-132
lines changed

scripts/attempt_system_tests.py

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# Copyright 2016 Google Inc. All rights reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
"""Attempt to run system tests.
16+
17+
If the system tests are being run on Travis, no test need be run if
18+
the build is for a PR and not a merged commit.
19+
20+
If being run as part of a Travis build for a merged commit, the
21+
encrypted `key.json` file need be decrypted before running tests.
22+
"""
23+
24+
25+
import os
26+
import subprocess
27+
import sys
28+
29+
from system_tests.run_system_test import run_module_tests
30+
31+
32+
MODULES = (
33+
'datastore',
34+
'storage',
35+
'pubsub',
36+
'bigquery',
37+
)
38+
SCRIPTS_DIR = os.path.dirname(__file__)
39+
ENCRYPTED_KEYFILE = os.path.abspath(
40+
os.path.join(SCRIPTS_DIR, '..', 'system_tests', 'key.json.enc'))
41+
42+
43+
def check_environment():
44+
"""Check what environment this is running in.
45+
46+
In particular, if the environment is Travis.
47+
48+
:rtype: tuple
49+
:returns: A pair of booleans. The first indicates if the test
50+
is running in Travis and the second indicates if
51+
the current build is a non-PR for a merge to master.
52+
"""
53+
if os.getenv('TRAVIS') == 'true':
54+
is_travis = True
55+
non_pr = (os.getenv('TRAVIS_PULL_REQUEST') == 'false' and
56+
os.getenv('TRAVIS_BRANCH') == 'master')
57+
else:
58+
is_travis = non_pr = False
59+
60+
return is_travis, non_pr
61+
62+
63+
def decrypt_keyfile():
64+
"""Decrypt a keyfile."""
65+
print('Running in Travis during merge, decrypting stored '
66+
'key file.')
67+
68+
encrypted_key = os.getenv('encrypted_a1b222e8c14d_key')
69+
encrypted_iv = os.getenv('encrypted_a1b222e8c14d_iv')
70+
out_file = os.getenv('GOOGLE_APPLICATION_CREDENTIALS')
71+
# Convert encrypted key file into decrypted file to be used.
72+
subprocess.call([
73+
'openssl', 'aes-256-cbc',
74+
'-K', encrypted_key,
75+
'-iv', encrypted_iv,
76+
'-in', ENCRYPTED_KEYFILE,
77+
'-out', out_file, '-d'
78+
])
79+
80+
81+
def prepare_to_run():
82+
"""Prepare to run system tests.
83+
84+
If on Travis during a PR, exit the entire program; there is
85+
no need to run the system tests.
86+
87+
If on Travis during a build for a non-PR merge to master,
88+
decrypts stored keyfile.
89+
"""
90+
is_travis, non_pr = check_environment()
91+
# Nothing to prepare outside of Travis. Proceed to tests.
92+
if not is_travis:
93+
return
94+
95+
# On a Travis PR, exit the program.
96+
if not non_pr:
97+
print('Running in Travis during non-merge to master, '
98+
'doing nothing.')
99+
sys.exit(0)
100+
101+
# On a Travis build for a merge commit to master, decrypt.
102+
decrypt_keyfile()
103+
104+
105+
def main():
106+
"""Run all the system tests if necessary."""
107+
prepare_to_run()
108+
for module in MODULES:
109+
run_module_tests(module)
110+
111+
112+
if __name__ == '__main__':
113+
main()

scripts/run_system_tests.sh

Lines changed: 0 additions & 41 deletions
This file was deleted.

system_tests/bigquery.py

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,23 @@
2222
from gcloud import bigquery
2323

2424

25-
_helpers.PROJECT = TESTS_PROJECT
26-
CLIENT = bigquery.Client()
2725
DATASET_NAME = 'system_tests_%012d' % (1000 * time.time(),)
2826

2927

28+
class Config(object):
29+
"""Run-time configuration to be modified at set-up.
30+
31+
This is a mutable stand-in to allow test set-up to modify
32+
global state.
33+
"""
34+
CLIENT = None
35+
36+
37+
def setUpModule():
38+
_helpers.PROJECT = TESTS_PROJECT
39+
Config.CLIENT = bigquery.Client()
40+
41+
3042
class TestBigQuery(unittest2.TestCase):
3143

3244
def setUp(self):
@@ -37,26 +49,26 @@ def tearDown(self):
3749
doomed.delete()
3850

3951
def test_create_dataset(self):
40-
dataset = CLIENT.dataset(DATASET_NAME)
52+
dataset = Config.CLIENT.dataset(DATASET_NAME)
4153
self.assertFalse(dataset.exists())
4254
dataset.create()
4355
self.to_delete.append(dataset)
4456
self.assertTrue(dataset.exists())
4557
self.assertEqual(dataset.name, DATASET_NAME)
4658

4759
def test_reload_dataset(self):
48-
dataset = CLIENT.dataset(DATASET_NAME)
60+
dataset = Config.CLIENT.dataset(DATASET_NAME)
4961
dataset.friendly_name = 'Friendly'
5062
dataset.description = 'Description'
5163
dataset.create()
5264
self.to_delete.append(dataset)
53-
other = CLIENT.dataset(DATASET_NAME)
65+
other = Config.CLIENT.dataset(DATASET_NAME)
5466
other.reload()
5567
self.assertEqual(other.friendly_name, 'Friendly')
5668
self.assertEqual(other.description, 'Description')
5769

5870
def test_patch_dataset(self):
59-
dataset = CLIENT.dataset(DATASET_NAME)
71+
dataset = Config.CLIENT.dataset(DATASET_NAME)
6072
self.assertFalse(dataset.exists())
6173
dataset.create()
6274
self.to_delete.append(dataset)
@@ -68,7 +80,7 @@ def test_patch_dataset(self):
6880
self.assertEqual(dataset.description, 'Description')
6981

7082
def test_update_dataset(self):
71-
dataset = CLIENT.dataset(DATASET_NAME)
83+
dataset = Config.CLIENT.dataset(DATASET_NAME)
7284
self.assertFalse(dataset.exists())
7385
dataset.create()
7486
self.to_delete.append(dataset)
@@ -90,20 +102,20 @@ def test_list_datasets(self):
90102
'newest%d' % (1000 * time.time(),),
91103
]
92104
for dataset_name in datasets_to_create:
93-
dataset = CLIENT.dataset(dataset_name)
105+
dataset = Config.CLIENT.dataset(dataset_name)
94106
dataset.create()
95107
self.to_delete.append(dataset)
96108

97109
# Retrieve the datasets.
98-
all_datasets, token = CLIENT.list_datasets()
110+
all_datasets, token = Config.CLIENT.list_datasets()
99111
self.assertTrue(token is None)
100112
created = [dataset for dataset in all_datasets
101113
if dataset.name in datasets_to_create and
102-
dataset.project == CLIENT.project]
114+
dataset.project == Config.CLIENT.project]
103115
self.assertEqual(len(created), len(datasets_to_create))
104116

105117
def test_create_table(self):
106-
dataset = CLIENT.dataset(DATASET_NAME)
118+
dataset = Config.CLIENT.dataset(DATASET_NAME)
107119
self.assertFalse(dataset.exists())
108120
dataset.create()
109121
self.to_delete.append(dataset)
@@ -119,7 +131,7 @@ def test_create_table(self):
119131
self.assertEqual(table.name, TABLE_NAME)
120132

121133
def test_list_tables(self):
122-
dataset = CLIENT.dataset(DATASET_NAME)
134+
dataset = Config.CLIENT.dataset(DATASET_NAME)
123135
self.assertFalse(dataset.exists())
124136
dataset.create()
125137
self.to_delete.append(dataset)
@@ -145,7 +157,7 @@ def test_list_tables(self):
145157
self.assertEqual(len(created), len(tables_to_create))
146158

147159
def test_patch_table(self):
148-
dataset = CLIENT.dataset(DATASET_NAME)
160+
dataset = Config.CLIENT.dataset(DATASET_NAME)
149161
self.assertFalse(dataset.exists())
150162
dataset.create()
151163
self.to_delete.append(dataset)
@@ -165,7 +177,7 @@ def test_patch_table(self):
165177
self.assertEqual(table.description, 'Description')
166178

167179
def test_update_table(self):
168-
dataset = CLIENT.dataset(DATASET_NAME)
180+
dataset = Config.CLIENT.dataset(DATASET_NAME)
169181
self.assertFalse(dataset.exists())
170182
dataset.create()
171183
self.to_delete.append(dataset)
@@ -203,7 +215,7 @@ def test_load_table_then_dump_table(self):
203215
('Bhettye Rhubble', 27, None),
204216
]
205217
ROW_IDS = range(len(ROWS))
206-
dataset = CLIENT.dataset(DATASET_NAME)
218+
dataset = Config.CLIENT.dataset(DATASET_NAME)
207219
self.assertFalse(dataset.exists())
208220
dataset.create()
209221
self.to_delete.append(dataset)
@@ -270,7 +282,7 @@ def test_load_table_from_storage_then_dump_table(self):
270282

271283
self.to_delete.insert(0, blob)
272284

273-
dataset = CLIENT.dataset(DATASET_NAME)
285+
dataset = Config.CLIENT.dataset(DATASET_NAME)
274286
dataset.create()
275287
self.to_delete.append(dataset)
276288

@@ -281,7 +293,7 @@ def test_load_table_from_storage_then_dump_table(self):
281293
table.create()
282294
self.to_delete.insert(0, table)
283295

284-
job = CLIENT.load_table_from_storage(
296+
job = Config.CLIENT.load_table_from_storage(
285297
'bq_load_storage_test_%d' % (TIMESTAMP,), table, GS_URL)
286298
job.create_disposition = 'CREATE_NEVER'
287299
job.skip_leading_rows = 1

0 commit comments

Comments
 (0)