Merge ~sylvain-pineau/checkbox-ng:submission-description into checkbox-ng:master
- Git
- lp:~sylvain-pineau/checkbox-ng
- submission-description
- Merge into master
Proposed by
Sylvain Pineau
Status: | Merged |
---|---|
Approved by: | Sylvain Pineau |
Approved revision: | 94a4b08d7dad93cbb586bc9b9d78e711dcbb7e71 |
Merged at revision: | 7e275c4d221dbc4203f286cdbaa2cbaf888b9841 |
Proposed branch: | ~sylvain-pineau/checkbox-ng:submission-description |
Merge into: | checkbox-ng:master |
Diff against target: |
282 lines (+55/-17) 7 files modified
checkbox_ng/launcher/subcommands.py (+27/-3) plainbox/impl/exporter/jinja2.py (+7/-0) plainbox/impl/exporter/test_jinja2.py (+2/-0) plainbox/impl/providers/exporters/data/checkbox.json (+5/-0) plainbox/impl/session/state.py (+1/-1) plainbox/impl/session/test_state.py (+1/-1) plainbox/impl/session/test_suspend.py (+12/-12) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Maciej Kisielewski (community) | Approve | ||
Sheila Miguez (community) | Approve | ||
Sylvain Pineau (community) | Needs Resubmitting | ||
Review via email:
|
Commit message
Description of the change
Add support for a submission description field.
A new -m parameter can now be used to pass a multiline var, (with both checkbox-cli launcher|submit) e.g:
$ checkbox-cli submit xxxxxxxxxxxxxx submission.tar.xz -m "sdfsdf
sfsdfg set se t
serzret
Or using a launcher:
$ ./canonical-
Tested on staging: https:/
To post a comment you must log in.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Sylvain Pineau (sylvain-pineau) wrote : | # |
Few replies inline, I'm reworking app_blob
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Sylvain Pineau (sylvain-pineau) wrote : | # |
Reworked version with app_blob defaulting to b''.
review:
Needs Resubmitting
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Maciej Kisielewski (kissiel) wrote : | # |
Great stuff, +1.
Also thanks for the explanation!
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/checkbox_ng/launcher/subcommands.py b/checkbox_ng/launcher/subcommands.py | |||
2 | index ae2b9b8..00205a9 100644 | |||
3 | --- a/checkbox_ng/launcher/subcommands.py | |||
4 | +++ b/checkbox_ng/launcher/subcommands.py | |||
5 | @@ -18,8 +18,10 @@ | |||
6 | 18 | """ | 18 | """ |
7 | 19 | Definition of sub-command classes for checkbox-cli | 19 | Definition of sub-command classes for checkbox-cli |
8 | 20 | """ | 20 | """ |
9 | 21 | from argparse import ArgumentTypeError | ||
10 | 21 | from argparse import SUPPRESS | 22 | from argparse import SUPPRESS |
11 | 22 | from collections import defaultdict | 23 | from collections import defaultdict |
12 | 24 | from tempfile import TemporaryDirectory | ||
13 | 23 | import copy | 25 | import copy |
14 | 24 | import datetime | 26 | import datetime |
15 | 25 | import fnmatch | 27 | import fnmatch |
16 | @@ -30,6 +32,7 @@ import operator | |||
17 | 30 | import os | 32 | import os |
18 | 31 | import re | 33 | import re |
19 | 32 | import sys | 34 | import sys |
20 | 35 | import tarfile | ||
21 | 33 | import time | 36 | import time |
22 | 34 | 37 | ||
23 | 35 | from guacamole import Command | 38 | from guacamole import Command |
24 | @@ -89,22 +92,39 @@ class Submit(Command): | |||
25 | 89 | parser.add_argument( | 92 | parser.add_argument( |
26 | 90 | "-s", "--staging", action="store_true", | 93 | "-s", "--staging", action="store_true", |
27 | 91 | help=_("Use staging environment")) | 94 | help=_("Use staging environment")) |
28 | 95 | parser.add_argument( | ||
29 | 96 | "-m", "--message", | ||
30 | 97 | help=_("Submission description")) | ||
31 | 92 | 98 | ||
32 | 93 | def invoked(self, ctx): | 99 | def invoked(self, ctx): |
33 | 94 | transport_cls = None | 100 | transport_cls = None |
34 | 95 | enc = None | ||
35 | 96 | mode = 'rb' | 101 | mode = 'rb' |
36 | 97 | options_string = "secure_id={0}".format(ctx.args.secure_id) | 102 | options_string = "secure_id={0}".format(ctx.args.secure_id) |
37 | 98 | url = ('https://certification.canonical.com/' | 103 | url = ('https://certification.canonical.com/' |
38 | 99 | 'api/v1/submission/{}/'.format(ctx.args.secure_id)) | 104 | 'api/v1/submission/{}/'.format(ctx.args.secure_id)) |
39 | 105 | submission_file = ctx.args.submission | ||
40 | 100 | if ctx.args.staging: | 106 | if ctx.args.staging: |
41 | 101 | url = ('https://certification.staging.canonical.com/' | 107 | url = ('https://certification.staging.canonical.com/' |
42 | 102 | 'api/v1/submission/{}/'.format(ctx.args.secure_id)) | 108 | 'api/v1/submission/{}/'.format(ctx.args.secure_id)) |
43 | 103 | from checkbox_ng.certification import SubmissionServiceTransport | 109 | from checkbox_ng.certification import SubmissionServiceTransport |
44 | 104 | transport_cls = SubmissionServiceTransport | 110 | transport_cls = SubmissionServiceTransport |
45 | 105 | transport = transport_cls(url, options_string) | 111 | transport = transport_cls(url, options_string) |
46 | 112 | if ctx.args.message: | ||
47 | 113 | tmpdir = TemporaryDirectory() | ||
48 | 114 | with tarfile.open(ctx.args.submission) as tar: | ||
49 | 115 | tar.extractall(tmpdir.name) | ||
50 | 116 | with open(os.path.join(tmpdir.name, 'submission.json')) as f: | ||
51 | 117 | json_payload = json.load(f) | ||
52 | 118 | with open(os.path.join(tmpdir.name, 'submission.json'), 'w') as f: | ||
53 | 119 | json_payload['description'] = ctx.args.message | ||
54 | 120 | json.dump(json_payload, f, sort_keys=True, indent=4) | ||
55 | 121 | new_subm_file = os.path.join( | ||
56 | 122 | tmpdir.name, os.path.basename(ctx.args.submission)) | ||
57 | 123 | with tarfile.open(new_subm_file, mode='w:xz') as tar: | ||
58 | 124 | tar.add(tmpdir.name, arcname='') | ||
59 | 125 | submission_file = new_subm_file | ||
60 | 106 | try: | 126 | try: |
62 | 107 | with open(ctx.args.submission, mode, encoding=enc) as subm_file: | 127 | with open(submission_file, mode) as subm_file: |
63 | 108 | result = transport.send(subm_file) | 128 | result = transport.send(subm_file) |
64 | 109 | except (TransportError, OSError) as exc: | 129 | except (TransportError, OSError) as exc: |
65 | 110 | raise SystemExit(exc) | 130 | raise SystemExit(exc) |
66 | @@ -377,7 +397,8 @@ class Launcher(Command, MainLoopStage): | |||
67 | 377 | raise SystemExit(_("No test plan selected.")) | 397 | raise SystemExit(_("No test plan selected.")) |
68 | 378 | self.ctx.sa.select_test_plan(tp_id) | 398 | self.ctx.sa.select_test_plan(tp_id) |
69 | 379 | self.ctx.sa.update_app_blob(json.dumps( | 399 | self.ctx.sa.update_app_blob(json.dumps( |
71 | 380 | {'testplan_id': tp_id, }).encode("UTF-8")) | 400 | {'testplan_id': tp_id, |
72 | 401 | 'description': self.ctx.args.message, }).encode("UTF-8")) | ||
73 | 381 | bs_jobs = self.ctx.sa.get_bootstrap_todo_list() | 402 | bs_jobs = self.ctx.sa.get_bootstrap_todo_list() |
74 | 382 | self._run_bootstrap_jobs(bs_jobs) | 403 | self._run_bootstrap_jobs(bs_jobs) |
75 | 383 | self.ctx.sa.finish_bootstrap() | 404 | self.ctx.sa.finish_bootstrap() |
76 | @@ -785,6 +806,9 @@ class Launcher(Command, MainLoopStage): | |||
77 | 785 | '--title', action='store', metavar='SESSION_NAME', | 806 | '--title', action='store', metavar='SESSION_NAME', |
78 | 786 | help=_('title of the session to use')) | 807 | help=_('title of the session to use')) |
79 | 787 | parser.add_argument( | 808 | parser.add_argument( |
80 | 809 | "-m", "--message", | ||
81 | 810 | help=_("submission description")) | ||
82 | 811 | parser.add_argument( | ||
83 | 788 | '--dont-suppress-output', action='store_true', default=False, | 812 | '--dont-suppress-output', action='store_true', default=False, |
84 | 789 | help=_('Absolutely always show command output')) | 813 | help=_('Absolutely always show command output')) |
85 | 790 | # the next to options are and should be exact copies of what the | 814 | # the next to options are and should be exact copies of what the |
86 | diff --git a/plainbox/impl/exporter/jinja2.py b/plainbox/impl/exporter/jinja2.py | |||
87 | index 8bced61..37ad825 100644 | |||
88 | --- a/plainbox/impl/exporter/jinja2.py | |||
89 | +++ b/plainbox/impl/exporter/jinja2.py | |||
90 | @@ -152,11 +152,18 @@ class Jinja2SessionStateExporter(ISessionStateExporter): | |||
91 | 152 | Byte stream to write to. | 152 | Byte stream to write to. |
92 | 153 | 153 | ||
93 | 154 | """ | 154 | """ |
94 | 155 | try: | ||
95 | 156 | state = session_manager.state | ||
96 | 157 | app_blob = state.metadata.app_blob | ||
97 | 158 | app_blob_data = json.loads(app_blob.decode("UTF-8")) | ||
98 | 159 | except ValueError: | ||
99 | 160 | app_blob_data = {} | ||
100 | 155 | data = { | 161 | data = { |
101 | 156 | 'OUTCOME_METADATA_MAP': OUTCOME_METADATA_MAP, | 162 | 'OUTCOME_METADATA_MAP': OUTCOME_METADATA_MAP, |
102 | 157 | 'client_name': self._client_name, | 163 | 'client_name': self._client_name, |
103 | 158 | 'client_version': self._client_version, | 164 | 'client_version': self._client_version, |
104 | 159 | 'manager': session_manager, | 165 | 'manager': session_manager, |
105 | 166 | 'app_blob': app_blob_data, | ||
106 | 160 | 'options': self.option_list, | 167 | 'options': self.option_list, |
107 | 161 | 'system_id': self._system_id, | 168 | 'system_id': self._system_id, |
108 | 162 | 'timestamp': self._timestamp, | 169 | 'timestamp': self._timestamp, |
109 | diff --git a/plainbox/impl/exporter/test_jinja2.py b/plainbox/impl/exporter/test_jinja2.py | |||
110 | index d35455d..6ae5ce0 100644 | |||
111 | --- a/plainbox/impl/exporter/test_jinja2.py | |||
112 | +++ b/plainbox/impl/exporter/test_jinja2.py | |||
113 | @@ -31,6 +31,7 @@ import os | |||
114 | 31 | 31 | ||
115 | 32 | from plainbox.impl.exporter.jinja2 import Jinja2SessionStateExporter | 32 | from plainbox.impl.exporter.jinja2 import Jinja2SessionStateExporter |
116 | 33 | from plainbox.impl.result import MemoryJobResult | 33 | from plainbox.impl.result import MemoryJobResult |
117 | 34 | from plainbox.impl.session.state import SessionMetaData | ||
118 | 34 | from plainbox.impl.unit.exporter import ExporterUnitSupport | 35 | from plainbox.impl.unit.exporter import ExporterUnitSupport |
119 | 35 | from plainbox.impl.unit.job import JobDefinition | 36 | from plainbox.impl.unit.job import JobDefinition |
120 | 36 | from plainbox.vendor import mock | 37 | from plainbox.vendor import mock |
121 | @@ -47,6 +48,7 @@ class Jinja2SessionStateExporterTests(TestCase): | |||
122 | 47 | job = mock.Mock(spec_set=JobDefinition, id='job_id') | 48 | job = mock.Mock(spec_set=JobDefinition, id='job_id') |
123 | 48 | job.tr_summary.return_value = 'job name' | 49 | job.tr_summary.return_value = 'job name' |
124 | 49 | self.manager_single_job = mock.Mock(state=mock.Mock( | 50 | self.manager_single_job = mock.Mock(state=mock.Mock( |
125 | 51 | metadata=SessionMetaData(), | ||
126 | 50 | run_list=[job], | 52 | run_list=[job], |
127 | 51 | job_state_map={ | 53 | job_state_map={ |
128 | 52 | job.id: mock.Mock(result=result, job=job) | 54 | job.id: mock.Mock(result=result, job=job) |
129 | diff --git a/plainbox/impl/providers/exporters/data/checkbox.json b/plainbox/impl/providers/exporters/data/checkbox.json | |||
130 | index cd49b05..4257bca 100644 | |||
131 | --- a/plainbox/impl/providers/exporters/data/checkbox.json | |||
132 | +++ b/plainbox/impl/providers/exporters/data/checkbox.json | |||
133 | @@ -3,6 +3,11 @@ | |||
134 | 3 | {%- set resource_map = state.resource_map -%} | 3 | {%- set resource_map = state.resource_map -%} |
135 | 4 | {%- set job_state_map = state.job_state_map -%} | 4 | {%- set job_state_map = state.job_state_map -%} |
136 | 5 | { | 5 | { |
137 | 6 | {%- if "description" in app_blob %} | ||
138 | 7 | {%- if app_blob['description'] %} | ||
139 | 8 | "description": {{ app_blob['description'] | jsonify | safe }}, | ||
140 | 9 | {%- endif %} | ||
141 | 10 | {%- endif %} | ||
142 | 6 | {%- if ns ~ 'package' in state.resource_map %} | 11 | {%- if ns ~ 'package' in state.resource_map %} |
143 | 7 | "packages": [ | 12 | "packages": [ |
144 | 8 | {%- set package_resource_list = state.resource_map[ns ~ 'package'] %} | 13 | {%- set package_resource_list = state.resource_map[ns ~ 'package'] %} |
145 | diff --git a/plainbox/impl/session/state.py b/plainbox/impl/session/state.py | |||
146 | index 825137c..9993689 100644 | |||
147 | --- a/plainbox/impl/session/state.py | |||
148 | +++ b/plainbox/impl/session/state.py | |||
149 | @@ -75,7 +75,7 @@ class SessionMetaData: | |||
150 | 75 | FLAG_TESTPLANLESS = "testplanless" | 75 | FLAG_TESTPLANLESS = "testplanless" |
151 | 76 | 76 | ||
152 | 77 | def __init__(self, title=None, flags=None, running_job_name=None, | 77 | def __init__(self, title=None, flags=None, running_job_name=None, |
154 | 78 | app_blob=None, app_id=None): | 78 | app_blob=b'', app_id=None): |
155 | 79 | """Initialize a new session state meta-data object.""" | 79 | """Initialize a new session state meta-data object.""" |
156 | 80 | if flags is None: | 80 | if flags is None: |
157 | 81 | flags = [] | 81 | flags = [] |
158 | diff --git a/plainbox/impl/session/test_state.py b/plainbox/impl/session/test_state.py | |||
159 | index fcb93f7..83fe78f 100644 | |||
160 | --- a/plainbox/impl/session/test_state.py | |||
161 | +++ b/plainbox/impl/session/test_state.py | |||
162 | @@ -802,7 +802,7 @@ class SessionMetadataTests(TestCase): | |||
163 | 802 | 802 | ||
164 | 803 | def test_app_blob_default_value(self): | 803 | def test_app_blob_default_value(self): |
165 | 804 | metadata = SessionMetaData() | 804 | metadata = SessionMetaData() |
167 | 805 | self.assertIs(metadata.app_blob, None) | 805 | self.assertIs(metadata.app_blob, b'') |
168 | 806 | 806 | ||
169 | 807 | def test_app_blob_assignment(self): | 807 | def test_app_blob_assignment(self): |
170 | 808 | metadata = SessionMetaData() | 808 | metadata = SessionMetaData() |
171 | diff --git a/plainbox/impl/session/test_suspend.py b/plainbox/impl/session/test_suspend.py | |||
172 | index a2f2aad..ab4c6ca 100644 | |||
173 | --- a/plainbox/impl/session/test_suspend.py | |||
174 | +++ b/plainbox/impl/session/test_suspend.py | |||
175 | @@ -367,7 +367,7 @@ class SessionSuspendHelper2Tests(SessionSuspendHelper1Tests): | |||
176 | 367 | 'title': None, | 367 | 'title': None, |
177 | 368 | 'flags': [], | 368 | 'flags': [], |
178 | 369 | 'running_job_name': None, | 369 | 'running_job_name': None, |
180 | 370 | 'app_blob': None | 370 | 'app_blob': '' |
181 | 371 | }) | 371 | }) |
182 | 372 | 372 | ||
183 | 373 | def test_repr_SessionMetaData_typical_metadata(self): | 373 | def test_repr_SessionMetaData_typical_metadata(self): |
184 | @@ -403,7 +403,7 @@ class SessionSuspendHelper2Tests(SessionSuspendHelper1Tests): | |||
185 | 403 | 'title': None, | 403 | 'title': None, |
186 | 404 | 'flags': [], | 404 | 'flags': [], |
187 | 405 | 'running_job_name': None, | 405 | 'running_job_name': None, |
189 | 406 | 'app_blob': None, | 406 | 'app_blob': '', |
190 | 407 | }, | 407 | }, |
191 | 408 | }) | 408 | }) |
192 | 409 | 409 | ||
193 | @@ -427,7 +427,7 @@ class SessionSuspendHelper2Tests(SessionSuspendHelper1Tests): | |||
194 | 427 | self.assertEqual(gzip.decompress(data), ( | 427 | self.assertEqual(gzip.decompress(data), ( |
195 | 428 | b'{"session":{"desired_job_list":[],"jobs":{},' | 428 | b'{"session":{"desired_job_list":[],"jobs":{},' |
196 | 429 | b'"mandatory_job_list":[],"metadata":' | 429 | b'"mandatory_job_list":[],"metadata":' |
198 | 430 | b'{"app_blob":null,"flags":[],"running_job_name":null,"title":null' | 430 | b'{"app_blob":"","flags":[],"running_job_name":null,"title":null' |
199 | 431 | b'},"results":{}},"version":2}')) | 431 | b'},"results":{}},"version":2}')) |
200 | 432 | 432 | ||
201 | 433 | 433 | ||
202 | @@ -458,7 +458,7 @@ class SessionSuspendHelper3Tests(SessionSuspendHelper2Tests): | |||
203 | 458 | 'title': None, | 458 | 'title': None, |
204 | 459 | 'flags': [], | 459 | 'flags': [], |
205 | 460 | 'running_job_name': None, | 460 | 'running_job_name': None, |
207 | 461 | 'app_blob': None, | 461 | 'app_blob': '', |
208 | 462 | 'app_id': None | 462 | 'app_id': None |
209 | 463 | }) | 463 | }) |
210 | 464 | 464 | ||
211 | @@ -497,7 +497,7 @@ class SessionSuspendHelper3Tests(SessionSuspendHelper2Tests): | |||
212 | 497 | 'title': None, | 497 | 'title': None, |
213 | 498 | 'flags': [], | 498 | 'flags': [], |
214 | 499 | 'running_job_name': None, | 499 | 'running_job_name': None, |
216 | 500 | 'app_blob': None, | 500 | 'app_blob': '', |
217 | 501 | 'app_id': None, | 501 | 'app_id': None, |
218 | 502 | }, | 502 | }, |
219 | 503 | }) | 503 | }) |
220 | @@ -521,7 +521,7 @@ class SessionSuspendHelper3Tests(SessionSuspendHelper2Tests): | |||
221 | 521 | self.assertEqual(gzip.decompress(data), ( | 521 | self.assertEqual(gzip.decompress(data), ( |
222 | 522 | b'{"session":{"desired_job_list":[],"jobs":{},' | 522 | b'{"session":{"desired_job_list":[],"jobs":{},' |
223 | 523 | b'"mandatory_job_list":[],"metadata":' | 523 | b'"mandatory_job_list":[],"metadata":' |
225 | 524 | b'{"app_blob":null,"app_id":null,"flags":[],' | 524 | b'{"app_blob":"","app_id":null,"flags":[],' |
226 | 525 | b'"running_job_name":null,"title":null},"results":{}},' | 525 | b'"running_job_name":null,"title":null},"results":{}},' |
227 | 526 | b'"version":3}')) | 526 | b'"version":3}')) |
228 | 527 | 527 | ||
229 | @@ -590,7 +590,7 @@ class SessionSuspendHelper4Tests(SessionSuspendHelper3Tests): | |||
230 | 590 | 'title': None, | 590 | 'title': None, |
231 | 591 | 'flags': [], | 591 | 'flags': [], |
232 | 592 | 'running_job_name': None, | 592 | 'running_job_name': None, |
234 | 593 | 'app_blob': None, | 593 | 'app_blob': '', |
235 | 594 | 'app_id': None, | 594 | 'app_id': None, |
236 | 595 | }, | 595 | }, |
237 | 596 | }) | 596 | }) |
238 | @@ -614,7 +614,7 @@ class SessionSuspendHelper4Tests(SessionSuspendHelper3Tests): | |||
239 | 614 | self.assertEqual(gzip.decompress(data), ( | 614 | self.assertEqual(gzip.decompress(data), ( |
240 | 615 | b'{"session":{"desired_job_list":[],"jobs":{},' | 615 | b'{"session":{"desired_job_list":[],"jobs":{},' |
241 | 616 | b'"mandatory_job_list":[],"metadata":' | 616 | b'"mandatory_job_list":[],"metadata":' |
243 | 617 | b'{"app_blob":null,"app_id":null,"flags":[],' | 617 | b'{"app_blob":"","app_id":null,"flags":[],' |
244 | 618 | b'"running_job_name":null,"title":null},"results":{}},' | 618 | b'"running_job_name":null,"title":null},"results":{}},' |
245 | 619 | b'"version":4}')) | 619 | b'"version":4}')) |
246 | 620 | 620 | ||
247 | @@ -654,7 +654,7 @@ class SessionSuspendHelper5Tests(SessionSuspendHelper4Tests): | |||
248 | 654 | self.assertEqual(gzip.decompress(data), ( | 654 | self.assertEqual(gzip.decompress(data), ( |
249 | 655 | b'{"session":{"desired_job_list":[],"jobs":{},' | 655 | b'{"session":{"desired_job_list":[],"jobs":{},' |
250 | 656 | b'"mandatory_job_list":[],"metadata":' | 656 | b'"mandatory_job_list":[],"metadata":' |
252 | 657 | b'{"app_blob":null,"app_id":null,"flags":[],' | 657 | b'{"app_blob":"","app_id":null,"flags":[],' |
253 | 658 | b'"running_job_name":null,"title":null},"results":{}},' | 658 | b'"running_job_name":null,"title":null},"results":{}},' |
254 | 659 | b'"version":5}')) | 659 | b'"version":5}')) |
255 | 660 | 660 | ||
256 | @@ -694,7 +694,7 @@ class SessionSuspendHelper6Tests(SessionSuspendHelper5Tests): | |||
257 | 694 | self.assertEqual(gzip.decompress(data), ( | 694 | self.assertEqual(gzip.decompress(data), ( |
258 | 695 | b'{"session":{"desired_job_list":[],"jobs":{},' | 695 | b'{"session":{"desired_job_list":[],"jobs":{},' |
259 | 696 | b'"mandatory_job_list":[],"metadata":' | 696 | b'"mandatory_job_list":[],"metadata":' |
261 | 697 | b'{"app_blob":null,"app_id":null,"flags":[],' | 697 | b'{"app_blob":"","app_id":null,"flags":[],' |
262 | 698 | b'"running_job_name":null,"title":null},"results":{}},' | 698 | b'"running_job_name":null,"title":null},"results":{}},' |
263 | 699 | b'"version":6}')) | 699 | b'"version":6}')) |
264 | 700 | 700 | ||
265 | @@ -746,7 +746,7 @@ class SessionSuspendHelper6Tests(SessionSuspendHelper5Tests): | |||
266 | 746 | 'title': None, | 746 | 'title': None, |
267 | 747 | 'flags': [], | 747 | 'flags': [], |
268 | 748 | 'running_job_name': None, | 748 | 'running_job_name': None, |
270 | 749 | 'app_blob': None, | 749 | 'app_blob': '', |
271 | 750 | 'app_id': None, | 750 | 'app_id': None, |
272 | 751 | }, | 751 | }, |
273 | 752 | }) | 752 | }) |
274 | @@ -766,7 +766,7 @@ class SessionSuspendHelper6Tests(SessionSuspendHelper5Tests): | |||
275 | 766 | 'title': None, | 766 | 'title': None, |
276 | 767 | 'flags': [], | 767 | 'flags': [], |
277 | 768 | 'running_job_name': None, | 768 | 'running_job_name': None, |
279 | 769 | 'app_blob': None, | 769 | 'app_blob': '', |
280 | 770 | 'app_id': None, | 770 | 'app_id': None, |
281 | 771 | }, | 771 | }, |
282 | 772 | }) | 772 | }) |
Couple of (non-blocking) things inline I'd recommend changing.