Merge lp:~toykeeper/lrt/add-reboot-test into lp:lrt
- add-reboot-test
- Merge into trunk
Status: | Needs review |
---|---|
Proposed branch: | lp:~toykeeper/lrt/add-reboot-test |
Merge into: | lp:lrt |
Diff against target: |
1178 lines (+1158/-0) 4 files modified
reboot-test/COPYING (+674/-0) reboot-test/README (+21/-0) reboot-test/reboot-test.py (+457/-0) reboot-test/reboot-test.sh (+6/-0) |
To merge this branch: | bzr merge lp:~toykeeper/lrt/add-reboot-test |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Canonical Platform QA Team | Pending | ||
Review via email:
|
Commit message
Added a reboot stress test.
Not yet complete, but works well enough to get some useful results.
Description of the change
Added a reboot stress test.
Not yet complete, but works well enough to get some useful results.
- 101. By Selene ToyKeeper
-
Fixed a bug where crash dump collector would sometimes miss files
(and then delete them despite the failed transfer).
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Max Brustkern (nuclearbob) wrote : | # |
I'm working on a version that'll do NFSS uploads. I started by addressing all the flake8 stuff, and pushed it here:
lp:~canonical-platform-qa/lrt/add-reboot-test
We can figure out whether to work from that or merge other changes you make into it. I also had some additional thoughts.
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Selene ToyKeeper (toykeeper) wrote : | # |
I'll re-push after addressing some of the comments below. I also made it work with python3.
- 102. By Selene ToyKeeper
-
Addressed some review comments...
Added GPL.
Added -o / --out option to set the results dir.
Converted fatal error to an exception.
Tiny amount of refactoring. - 103. By Selene ToyKeeper
-
PEP8 fixes (except for visual indent).
Also made 'adb shell never returned' error more useful when failing during shutdown. - 104. By Selene ToyKeeper
-
Made reboot-test work on both python2 and python3.
Added --delete to remove output dir before running test.
Cleaned up run() a little.
Forced LANG because it doesn't work on LANG=C any more.
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Max Brustkern (nuclearbob) wrote : | # |
Responding to old diff comments, looking at new diff now.
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Max Brustkern (nuclearbob) wrote : | # |
Only a few comments on the updates.
Unmerged revisions
- 104. By Selene ToyKeeper
-
Made reboot-test work on both python2 and python3.
Added --delete to remove output dir before running test.
Cleaned up run() a little.
Forced LANG because it doesn't work on LANG=C any more. - 103. By Selene ToyKeeper
-
PEP8 fixes (except for visual indent).
Also made 'adb shell never returned' error more useful when failing during shutdown. - 102. By Selene ToyKeeper
-
Addressed some review comments...
Added GPL.
Added -o / --out option to set the results dir.
Converted fatal error to an exception.
Tiny amount of refactoring. - 101. By Selene ToyKeeper
-
Fixed a bug where crash dump collector would sometimes miss files
(and then delete them despite the failed transfer). - 100. By Selene ToyKeeper
-
Minor comment cleaning.
- 99. By Selene ToyKeeper
-
Imported reboot test from my +junk branch.
It's not finished, but it does work well enough to get useful results.
Preview Diff
1 | === added directory 'reboot-test' |
2 | === added file 'reboot-test/COPYING' |
3 | --- reboot-test/COPYING 1970-01-01 00:00:00 +0000 |
4 | +++ reboot-test/COPYING 2015-06-26 01:10:52 +0000 |
5 | @@ -0,0 +1,674 @@ |
6 | + GNU GENERAL PUBLIC LICENSE |
7 | + Version 3, 29 June 2007 |
8 | + |
9 | + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
10 | + Everyone is permitted to copy and distribute verbatim copies |
11 | + of this license document, but changing it is not allowed. |
12 | + |
13 | + Preamble |
14 | + |
15 | + The GNU General Public License is a free, copyleft license for |
16 | +software and other kinds of works. |
17 | + |
18 | + The licenses for most software and other practical works are designed |
19 | +to take away your freedom to share and change the works. By contrast, |
20 | +the GNU General Public License is intended to guarantee your freedom to |
21 | +share and change all versions of a program--to make sure it remains free |
22 | +software for all its users. We, the Free Software Foundation, use the |
23 | +GNU General Public License for most of our software; it applies also to |
24 | +any other work released this way by its authors. You can apply it to |
25 | +your programs, too. |
26 | + |
27 | + When we speak of free software, we are referring to freedom, not |
28 | +price. Our General Public Licenses are designed to make sure that you |
29 | +have the freedom to distribute copies of free software (and charge for |
30 | +them if you wish), that you receive source code or can get it if you |
31 | +want it, that you can change the software or use pieces of it in new |
32 | +free programs, and that you know you can do these things. |
33 | + |
34 | + To protect your rights, we need to prevent others from denying you |
35 | +these rights or asking you to surrender the rights. Therefore, you have |
36 | +certain responsibilities if you distribute copies of the software, or if |
37 | +you modify it: responsibilities to respect the freedom of others. |
38 | + |
39 | + For example, if you distribute copies of such a program, whether |
40 | +gratis or for a fee, you must pass on to the recipients the same |
41 | +freedoms that you received. You must make sure that they, too, receive |
42 | +or can get the source code. And you must show them these terms so they |
43 | +know their rights. |
44 | + |
45 | + Developers that use the GNU GPL protect your rights with two steps: |
46 | +(1) assert copyright on the software, and (2) offer you this License |
47 | +giving you legal permission to copy, distribute and/or modify it. |
48 | + |
49 | + For the developers' and authors' protection, the GPL clearly explains |
50 | +that there is no warranty for this free software. For both users' and |
51 | +authors' sake, the GPL requires that modified versions be marked as |
52 | +changed, so that their problems will not be attributed erroneously to |
53 | +authors of previous versions. |
54 | + |
55 | + Some devices are designed to deny users access to install or run |
56 | +modified versions of the software inside them, although the manufacturer |
57 | +can do so. This is fundamentally incompatible with the aim of |
58 | +protecting users' freedom to change the software. The systematic |
59 | +pattern of such abuse occurs in the area of products for individuals to |
60 | +use, which is precisely where it is most unacceptable. Therefore, we |
61 | +have designed this version of the GPL to prohibit the practice for those |
62 | +products. If such problems arise substantially in other domains, we |
63 | +stand ready to extend this provision to those domains in future versions |
64 | +of the GPL, as needed to protect the freedom of users. |
65 | + |
66 | + Finally, every program is threatened constantly by software patents. |
67 | +States should not allow patents to restrict development and use of |
68 | +software on general-purpose computers, but in those that do, we wish to |
69 | +avoid the special danger that patents applied to a free program could |
70 | +make it effectively proprietary. To prevent this, the GPL assures that |
71 | +patents cannot be used to render the program non-free. |
72 | + |
73 | + The precise terms and conditions for copying, distribution and |
74 | +modification follow. |
75 | + |
76 | + TERMS AND CONDITIONS |
77 | + |
78 | + 0. Definitions. |
79 | + |
80 | + "This License" refers to version 3 of the GNU General Public License. |
81 | + |
82 | + "Copyright" also means copyright-like laws that apply to other kinds of |
83 | +works, such as semiconductor masks. |
84 | + |
85 | + "The Program" refers to any copyrightable work licensed under this |
86 | +License. Each licensee is addressed as "you". "Licensees" and |
87 | +"recipients" may be individuals or organizations. |
88 | + |
89 | + To "modify" a work means to copy from or adapt all or part of the work |
90 | +in a fashion requiring copyright permission, other than the making of an |
91 | +exact copy. The resulting work is called a "modified version" of the |
92 | +earlier work or a work "based on" the earlier work. |
93 | + |
94 | + A "covered work" means either the unmodified Program or a work based |
95 | +on the Program. |
96 | + |
97 | + To "propagate" a work means to do anything with it that, without |
98 | +permission, would make you directly or secondarily liable for |
99 | +infringement under applicable copyright law, except executing it on a |
100 | +computer or modifying a private copy. Propagation includes copying, |
101 | +distribution (with or without modification), making available to the |
102 | +public, and in some countries other activities as well. |
103 | + |
104 | + To "convey" a work means any kind of propagation that enables other |
105 | +parties to make or receive copies. Mere interaction with a user through |
106 | +a computer network, with no transfer of a copy, is not conveying. |
107 | + |
108 | + An interactive user interface displays "Appropriate Legal Notices" |
109 | +to the extent that it includes a convenient and prominently visible |
110 | +feature that (1) displays an appropriate copyright notice, and (2) |
111 | +tells the user that there is no warranty for the work (except to the |
112 | +extent that warranties are provided), that licensees may convey the |
113 | +work under this License, and how to view a copy of this License. If |
114 | +the interface presents a list of user commands or options, such as a |
115 | +menu, a prominent item in the list meets this criterion. |
116 | + |
117 | + 1. Source Code. |
118 | + |
119 | + The "source code" for a work means the preferred form of the work |
120 | +for making modifications to it. "Object code" means any non-source |
121 | +form of a work. |
122 | + |
123 | + A "Standard Interface" means an interface that either is an official |
124 | +standard defined by a recognized standards body, or, in the case of |
125 | +interfaces specified for a particular programming language, one that |
126 | +is widely used among developers working in that language. |
127 | + |
128 | + The "System Libraries" of an executable work include anything, other |
129 | +than the work as a whole, that (a) is included in the normal form of |
130 | +packaging a Major Component, but which is not part of that Major |
131 | +Component, and (b) serves only to enable use of the work with that |
132 | +Major Component, or to implement a Standard Interface for which an |
133 | +implementation is available to the public in source code form. A |
134 | +"Major Component", in this context, means a major essential component |
135 | +(kernel, window system, and so on) of the specific operating system |
136 | +(if any) on which the executable work runs, or a compiler used to |
137 | +produce the work, or an object code interpreter used to run it. |
138 | + |
139 | + The "Corresponding Source" for a work in object code form means all |
140 | +the source code needed to generate, install, and (for an executable |
141 | +work) run the object code and to modify the work, including scripts to |
142 | +control those activities. However, it does not include the work's |
143 | +System Libraries, or general-purpose tools or generally available free |
144 | +programs which are used unmodified in performing those activities but |
145 | +which are not part of the work. For example, Corresponding Source |
146 | +includes interface definition files associated with source files for |
147 | +the work, and the source code for shared libraries and dynamically |
148 | +linked subprograms that the work is specifically designed to require, |
149 | +such as by intimate data communication or control flow between those |
150 | +subprograms and other parts of the work. |
151 | + |
152 | + The Corresponding Source need not include anything that users |
153 | +can regenerate automatically from other parts of the Corresponding |
154 | +Source. |
155 | + |
156 | + The Corresponding Source for a work in source code form is that |
157 | +same work. |
158 | + |
159 | + 2. Basic Permissions. |
160 | + |
161 | + All rights granted under this License are granted for the term of |
162 | +copyright on the Program, and are irrevocable provided the stated |
163 | +conditions are met. This License explicitly affirms your unlimited |
164 | +permission to run the unmodified Program. The output from running a |
165 | +covered work is covered by this License only if the output, given its |
166 | +content, constitutes a covered work. This License acknowledges your |
167 | +rights of fair use or other equivalent, as provided by copyright law. |
168 | + |
169 | + You may make, run and propagate covered works that you do not |
170 | +convey, without conditions so long as your license otherwise remains |
171 | +in force. You may convey covered works to others for the sole purpose |
172 | +of having them make modifications exclusively for you, or provide you |
173 | +with facilities for running those works, provided that you comply with |
174 | +the terms of this License in conveying all material for which you do |
175 | +not control copyright. Those thus making or running the covered works |
176 | +for you must do so exclusively on your behalf, under your direction |
177 | +and control, on terms that prohibit them from making any copies of |
178 | +your copyrighted material outside their relationship with you. |
179 | + |
180 | + Conveying under any other circumstances is permitted solely under |
181 | +the conditions stated below. Sublicensing is not allowed; section 10 |
182 | +makes it unnecessary. |
183 | + |
184 | + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. |
185 | + |
186 | + No covered work shall be deemed part of an effective technological |
187 | +measure under any applicable law fulfilling obligations under article |
188 | +11 of the WIPO copyright treaty adopted on 20 December 1996, or |
189 | +similar laws prohibiting or restricting circumvention of such |
190 | +measures. |
191 | + |
192 | + When you convey a covered work, you waive any legal power to forbid |
193 | +circumvention of technological measures to the extent such circumvention |
194 | +is effected by exercising rights under this License with respect to |
195 | +the covered work, and you disclaim any intention to limit operation or |
196 | +modification of the work as a means of enforcing, against the work's |
197 | +users, your or third parties' legal rights to forbid circumvention of |
198 | +technological measures. |
199 | + |
200 | + 4. Conveying Verbatim Copies. |
201 | + |
202 | + You may convey verbatim copies of the Program's source code as you |
203 | +receive it, in any medium, provided that you conspicuously and |
204 | +appropriately publish on each copy an appropriate copyright notice; |
205 | +keep intact all notices stating that this License and any |
206 | +non-permissive terms added in accord with section 7 apply to the code; |
207 | +keep intact all notices of the absence of any warranty; and give all |
208 | +recipients a copy of this License along with the Program. |
209 | + |
210 | + You may charge any price or no price for each copy that you convey, |
211 | +and you may offer support or warranty protection for a fee. |
212 | + |
213 | + 5. Conveying Modified Source Versions. |
214 | + |
215 | + You may convey a work based on the Program, or the modifications to |
216 | +produce it from the Program, in the form of source code under the |
217 | +terms of section 4, provided that you also meet all of these conditions: |
218 | + |
219 | + a) The work must carry prominent notices stating that you modified |
220 | + it, and giving a relevant date. |
221 | + |
222 | + b) The work must carry prominent notices stating that it is |
223 | + released under this License and any conditions added under section |
224 | + 7. This requirement modifies the requirement in section 4 to |
225 | + "keep intact all notices". |
226 | + |
227 | + c) You must license the entire work, as a whole, under this |
228 | + License to anyone who comes into possession of a copy. This |
229 | + License will therefore apply, along with any applicable section 7 |
230 | + additional terms, to the whole of the work, and all its parts, |
231 | + regardless of how they are packaged. This License gives no |
232 | + permission to license the work in any other way, but it does not |
233 | + invalidate such permission if you have separately received it. |
234 | + |
235 | + d) If the work has interactive user interfaces, each must display |
236 | + Appropriate Legal Notices; however, if the Program has interactive |
237 | + interfaces that do not display Appropriate Legal Notices, your |
238 | + work need not make them do so. |
239 | + |
240 | + A compilation of a covered work with other separate and independent |
241 | +works, which are not by their nature extensions of the covered work, |
242 | +and which are not combined with it such as to form a larger program, |
243 | +in or on a volume of a storage or distribution medium, is called an |
244 | +"aggregate" if the compilation and its resulting copyright are not |
245 | +used to limit the access or legal rights of the compilation's users |
246 | +beyond what the individual works permit. Inclusion of a covered work |
247 | +in an aggregate does not cause this License to apply to the other |
248 | +parts of the aggregate. |
249 | + |
250 | + 6. Conveying Non-Source Forms. |
251 | + |
252 | + You may convey a covered work in object code form under the terms |
253 | +of sections 4 and 5, provided that you also convey the |
254 | +machine-readable Corresponding Source under the terms of this License, |
255 | +in one of these ways: |
256 | + |
257 | + a) Convey the object code in, or embodied in, a physical product |
258 | + (including a physical distribution medium), accompanied by the |
259 | + Corresponding Source fixed on a durable physical medium |
260 | + customarily used for software interchange. |
261 | + |
262 | + b) Convey the object code in, or embodied in, a physical product |
263 | + (including a physical distribution medium), accompanied by a |
264 | + written offer, valid for at least three years and valid for as |
265 | + long as you offer spare parts or customer support for that product |
266 | + model, to give anyone who possesses the object code either (1) a |
267 | + copy of the Corresponding Source for all the software in the |
268 | + product that is covered by this License, on a durable physical |
269 | + medium customarily used for software interchange, for a price no |
270 | + more than your reasonable cost of physically performing this |
271 | + conveying of source, or (2) access to copy the |
272 | + Corresponding Source from a network server at no charge. |
273 | + |
274 | + c) Convey individual copies of the object code with a copy of the |
275 | + written offer to provide the Corresponding Source. This |
276 | + alternative is allowed only occasionally and noncommercially, and |
277 | + only if you received the object code with such an offer, in accord |
278 | + with subsection 6b. |
279 | + |
280 | + d) Convey the object code by offering access from a designated |
281 | + place (gratis or for a charge), and offer equivalent access to the |
282 | + Corresponding Source in the same way through the same place at no |
283 | + further charge. You need not require recipients to copy the |
284 | + Corresponding Source along with the object code. If the place to |
285 | + copy the object code is a network server, the Corresponding Source |
286 | + may be on a different server (operated by you or a third party) |
287 | + that supports equivalent copying facilities, provided you maintain |
288 | + clear directions next to the object code saying where to find the |
289 | + Corresponding Source. Regardless of what server hosts the |
290 | + Corresponding Source, you remain obligated to ensure that it is |
291 | + available for as long as needed to satisfy these requirements. |
292 | + |
293 | + e) Convey the object code using peer-to-peer transmission, provided |
294 | + you inform other peers where the object code and Corresponding |
295 | + Source of the work are being offered to the general public at no |
296 | + charge under subsection 6d. |
297 | + |
298 | + A separable portion of the object code, whose source code is excluded |
299 | +from the Corresponding Source as a System Library, need not be |
300 | +included in conveying the object code work. |
301 | + |
302 | + A "User Product" is either (1) a "consumer product", which means any |
303 | +tangible personal property which is normally used for personal, family, |
304 | +or household purposes, or (2) anything designed or sold for incorporation |
305 | +into a dwelling. In determining whether a product is a consumer product, |
306 | +doubtful cases shall be resolved in favor of coverage. For a particular |
307 | +product received by a particular user, "normally used" refers to a |
308 | +typical or common use of that class of product, regardless of the status |
309 | +of the particular user or of the way in which the particular user |
310 | +actually uses, or expects or is expected to use, the product. A product |
311 | +is a consumer product regardless of whether the product has substantial |
312 | +commercial, industrial or non-consumer uses, unless such uses represent |
313 | +the only significant mode of use of the product. |
314 | + |
315 | + "Installation Information" for a User Product means any methods, |
316 | +procedures, authorization keys, or other information required to install |
317 | +and execute modified versions of a covered work in that User Product from |
318 | +a modified version of its Corresponding Source. The information must |
319 | +suffice to ensure that the continued functioning of the modified object |
320 | +code is in no case prevented or interfered with solely because |
321 | +modification has been made. |
322 | + |
323 | + If you convey an object code work under this section in, or with, or |
324 | +specifically for use in, a User Product, and the conveying occurs as |
325 | +part of a transaction in which the right of possession and use of the |
326 | +User Product is transferred to the recipient in perpetuity or for a |
327 | +fixed term (regardless of how the transaction is characterized), the |
328 | +Corresponding Source conveyed under this section must be accompanied |
329 | +by the Installation Information. But this requirement does not apply |
330 | +if neither you nor any third party retains the ability to install |
331 | +modified object code on the User Product (for example, the work has |
332 | +been installed in ROM). |
333 | + |
334 | + The requirement to provide Installation Information does not include a |
335 | +requirement to continue to provide support service, warranty, or updates |
336 | +for a work that has been modified or installed by the recipient, or for |
337 | +the User Product in which it has been modified or installed. Access to a |
338 | +network may be denied when the modification itself materially and |
339 | +adversely affects the operation of the network or violates the rules and |
340 | +protocols for communication across the network. |
341 | + |
342 | + Corresponding Source conveyed, and Installation Information provided, |
343 | +in accord with this section must be in a format that is publicly |
344 | +documented (and with an implementation available to the public in |
345 | +source code form), and must require no special password or key for |
346 | +unpacking, reading or copying. |
347 | + |
348 | + 7. Additional Terms. |
349 | + |
350 | + "Additional permissions" are terms that supplement the terms of this |
351 | +License by making exceptions from one or more of its conditions. |
352 | +Additional permissions that are applicable to the entire Program shall |
353 | +be treated as though they were included in this License, to the extent |
354 | +that they are valid under applicable law. If additional permissions |
355 | +apply only to part of the Program, that part may be used separately |
356 | +under those permissions, but the entire Program remains governed by |
357 | +this License without regard to the additional permissions. |
358 | + |
359 | + When you convey a copy of a covered work, you may at your option |
360 | +remove any additional permissions from that copy, or from any part of |
361 | +it. (Additional permissions may be written to require their own |
362 | +removal in certain cases when you modify the work.) You may place |
363 | +additional permissions on material, added by you to a covered work, |
364 | +for which you have or can give appropriate copyright permission. |
365 | + |
366 | + Notwithstanding any other provision of this License, for material you |
367 | +add to a covered work, you may (if authorized by the copyright holders of |
368 | +that material) supplement the terms of this License with terms: |
369 | + |
370 | + a) Disclaiming warranty or limiting liability differently from the |
371 | + terms of sections 15 and 16 of this License; or |
372 | + |
373 | + b) Requiring preservation of specified reasonable legal notices or |
374 | + author attributions in that material or in the Appropriate Legal |
375 | + Notices displayed by works containing it; or |
376 | + |
377 | + c) Prohibiting misrepresentation of the origin of that material, or |
378 | + requiring that modified versions of such material be marked in |
379 | + reasonable ways as different from the original version; or |
380 | + |
381 | + d) Limiting the use for publicity purposes of names of licensors or |
382 | + authors of the material; or |
383 | + |
384 | + e) Declining to grant rights under trademark law for use of some |
385 | + trade names, trademarks, or service marks; or |
386 | + |
387 | + f) Requiring indemnification of licensors and authors of that |
388 | + material by anyone who conveys the material (or modified versions of |
389 | + it) with contractual assumptions of liability to the recipient, for |
390 | + any liability that these contractual assumptions directly impose on |
391 | + those licensors and authors. |
392 | + |
393 | + All other non-permissive additional terms are considered "further |
394 | +restrictions" within the meaning of section 10. If the Program as you |
395 | +received it, or any part of it, contains a notice stating that it is |
396 | +governed by this License along with a term that is a further |
397 | +restriction, you may remove that term. If a license document contains |
398 | +a further restriction but permits relicensing or conveying under this |
399 | +License, you may add to a covered work material governed by the terms |
400 | +of that license document, provided that the further restriction does |
401 | +not survive such relicensing or conveying. |
402 | + |
403 | + If you add terms to a covered work in accord with this section, you |
404 | +must place, in the relevant source files, a statement of the |
405 | +additional terms that apply to those files, or a notice indicating |
406 | +where to find the applicable terms. |
407 | + |
408 | + Additional terms, permissive or non-permissive, may be stated in the |
409 | +form of a separately written license, or stated as exceptions; |
410 | +the above requirements apply either way. |
411 | + |
412 | + 8. Termination. |
413 | + |
414 | + You may not propagate or modify a covered work except as expressly |
415 | +provided under this License. Any attempt otherwise to propagate or |
416 | +modify it is void, and will automatically terminate your rights under |
417 | +this License (including any patent licenses granted under the third |
418 | +paragraph of section 11). |
419 | + |
420 | + However, if you cease all violation of this License, then your |
421 | +license from a particular copyright holder is reinstated (a) |
422 | +provisionally, unless and until the copyright holder explicitly and |
423 | +finally terminates your license, and (b) permanently, if the copyright |
424 | +holder fails to notify you of the violation by some reasonable means |
425 | +prior to 60 days after the cessation. |
426 | + |
427 | + Moreover, your license from a particular copyright holder is |
428 | +reinstated permanently if the copyright holder notifies you of the |
429 | +violation by some reasonable means, this is the first time you have |
430 | +received notice of violation of this License (for any work) from that |
431 | +copyright holder, and you cure the violation prior to 30 days after |
432 | +your receipt of the notice. |
433 | + |
434 | + Termination of your rights under this section does not terminate the |
435 | +licenses of parties who have received copies or rights from you under |
436 | +this License. If your rights have been terminated and not permanently |
437 | +reinstated, you do not qualify to receive new licenses for the same |
438 | +material under section 10. |
439 | + |
440 | + 9. Acceptance Not Required for Having Copies. |
441 | + |
442 | + You are not required to accept this License in order to receive or |
443 | +run a copy of the Program. Ancillary propagation of a covered work |
444 | +occurring solely as a consequence of using peer-to-peer transmission |
445 | +to receive a copy likewise does not require acceptance. However, |
446 | +nothing other than this License grants you permission to propagate or |
447 | +modify any covered work. These actions infringe copyright if you do |
448 | +not accept this License. Therefore, by modifying or propagating a |
449 | +covered work, you indicate your acceptance of this License to do so. |
450 | + |
451 | + 10. Automatic Licensing of Downstream Recipients. |
452 | + |
453 | + Each time you convey a covered work, the recipient automatically |
454 | +receives a license from the original licensors, to run, modify and |
455 | +propagate that work, subject to this License. You are not responsible |
456 | +for enforcing compliance by third parties with this License. |
457 | + |
458 | + An "entity transaction" is a transaction transferring control of an |
459 | +organization, or substantially all assets of one, or subdividing an |
460 | +organization, or merging organizations. If propagation of a covered |
461 | +work results from an entity transaction, each party to that |
462 | +transaction who receives a copy of the work also receives whatever |
463 | +licenses to the work the party's predecessor in interest had or could |
464 | +give under the previous paragraph, plus a right to possession of the |
465 | +Corresponding Source of the work from the predecessor in interest, if |
466 | +the predecessor has it or can get it with reasonable efforts. |
467 | + |
468 | + You may not impose any further restrictions on the exercise of the |
469 | +rights granted or affirmed under this License. For example, you may |
470 | +not impose a license fee, royalty, or other charge for exercise of |
471 | +rights granted under this License, and you may not initiate litigation |
472 | +(including a cross-claim or counterclaim in a lawsuit) alleging that |
473 | +any patent claim is infringed by making, using, selling, offering for |
474 | +sale, or importing the Program or any portion of it. |
475 | + |
476 | + 11. Patents. |
477 | + |
478 | + A "contributor" is a copyright holder who authorizes use under this |
479 | +License of the Program or a work on which the Program is based. The |
480 | +work thus licensed is called the contributor's "contributor version". |
481 | + |
482 | + A contributor's "essential patent claims" are all patent claims |
483 | +owned or controlled by the contributor, whether already acquired or |
484 | +hereafter acquired, that would be infringed by some manner, permitted |
485 | +by this License, of making, using, or selling its contributor version, |
486 | +but do not include claims that would be infringed only as a |
487 | +consequence of further modification of the contributor version. For |
488 | +purposes of this definition, "control" includes the right to grant |
489 | +patent sublicenses in a manner consistent with the requirements of |
490 | +this License. |
491 | + |
492 | + Each contributor grants you a non-exclusive, worldwide, royalty-free |
493 | +patent license under the contributor's essential patent claims, to |
494 | +make, use, sell, offer for sale, import and otherwise run, modify and |
495 | +propagate the contents of its contributor version. |
496 | + |
497 | + In the following three paragraphs, a "patent license" is any express |
498 | +agreement or commitment, however denominated, not to enforce a patent |
499 | +(such as an express permission to practice a patent or covenant not to |
500 | +sue for patent infringement). To "grant" such a patent license to a |
501 | +party means to make such an agreement or commitment not to enforce a |
502 | +patent against the party. |
503 | + |
504 | + If you convey a covered work, knowingly relying on a patent license, |
505 | +and the Corresponding Source of the work is not available for anyone |
506 | +to copy, free of charge and under the terms of this License, through a |
507 | +publicly available network server or other readily accessible means, |
508 | +then you must either (1) cause the Corresponding Source to be so |
509 | +available, or (2) arrange to deprive yourself of the benefit of the |
510 | +patent license for this particular work, or (3) arrange, in a manner |
511 | +consistent with the requirements of this License, to extend the patent |
512 | +license to downstream recipients. "Knowingly relying" means you have |
513 | +actual knowledge that, but for the patent license, your conveying the |
514 | +covered work in a country, or your recipient's use of the covered work |
515 | +in a country, would infringe one or more identifiable patents in that |
516 | +country that you have reason to believe are valid. |
517 | + |
518 | + If, pursuant to or in connection with a single transaction or |
519 | +arrangement, you convey, or propagate by procuring conveyance of, a |
520 | +covered work, and grant a patent license to some of the parties |
521 | +receiving the covered work authorizing them to use, propagate, modify |
522 | +or convey a specific copy of the covered work, then the patent license |
523 | +you grant is automatically extended to all recipients of the covered |
524 | +work and works based on it. |
525 | + |
526 | + A patent license is "discriminatory" if it does not include within |
527 | +the scope of its coverage, prohibits the exercise of, or is |
528 | +conditioned on the non-exercise of one or more of the rights that are |
529 | +specifically granted under this License. You may not convey a covered |
530 | +work if you are a party to an arrangement with a third party that is |
531 | +in the business of distributing software, under which you make payment |
532 | +to the third party based on the extent of your activity of conveying |
533 | +the work, and under which the third party grants, to any of the |
534 | +parties who would receive the covered work from you, a discriminatory |
535 | +patent license (a) in connection with copies of the covered work |
536 | +conveyed by you (or copies made from those copies), or (b) primarily |
537 | +for and in connection with specific products or compilations that |
538 | +contain the covered work, unless you entered into that arrangement, |
539 | +or that patent license was granted, prior to 28 March 2007. |
540 | + |
541 | + Nothing in this License shall be construed as excluding or limiting |
542 | +any implied license or other defenses to infringement that may |
543 | +otherwise be available to you under applicable patent law. |
544 | + |
545 | + 12. No Surrender of Others' Freedom. |
546 | + |
547 | + If conditions are imposed on you (whether by court order, agreement or |
548 | +otherwise) that contradict the conditions of this License, they do not |
549 | +excuse you from the conditions of this License. If you cannot convey a |
550 | +covered work so as to satisfy simultaneously your obligations under this |
551 | +License and any other pertinent obligations, then as a consequence you may |
552 | +not convey it at all. For example, if you agree to terms that obligate you |
553 | +to collect a royalty for further conveying from those to whom you convey |
554 | +the Program, the only way you could satisfy both those terms and this |
555 | +License would be to refrain entirely from conveying the Program. |
556 | + |
557 | + 13. Use with the GNU Affero General Public License. |
558 | + |
559 | + Notwithstanding any other provision of this License, you have |
560 | +permission to link or combine any covered work with a work licensed |
561 | +under version 3 of the GNU Affero General Public License into a single |
562 | +combined work, and to convey the resulting work. The terms of this |
563 | +License will continue to apply to the part which is the covered work, |
564 | +but the special requirements of the GNU Affero General Public License, |
565 | +section 13, concerning interaction through a network will apply to the |
566 | +combination as such. |
567 | + |
568 | + 14. Revised Versions of this License. |
569 | + |
570 | + The Free Software Foundation may publish revised and/or new versions of |
571 | +the GNU General Public License from time to time. Such new versions will |
572 | +be similar in spirit to the present version, but may differ in detail to |
573 | +address new problems or concerns. |
574 | + |
575 | + Each version is given a distinguishing version number. If the |
576 | +Program specifies that a certain numbered version of the GNU General |
577 | +Public License "or any later version" applies to it, you have the |
578 | +option of following the terms and conditions either of that numbered |
579 | +version or of any later version published by the Free Software |
580 | +Foundation. If the Program does not specify a version number of the |
581 | +GNU General Public License, you may choose any version ever published |
582 | +by the Free Software Foundation. |
583 | + |
584 | + If the Program specifies that a proxy can decide which future |
585 | +versions of the GNU General Public License can be used, that proxy's |
586 | +public statement of acceptance of a version permanently authorizes you |
587 | +to choose that version for the Program. |
588 | + |
589 | + Later license versions may give you additional or different |
590 | +permissions. However, no additional obligations are imposed on any |
591 | +author or copyright holder as a result of your choosing to follow a |
592 | +later version. |
593 | + |
594 | + 15. Disclaimer of Warranty. |
595 | + |
596 | + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY |
597 | +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT |
598 | +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY |
599 | +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, |
600 | +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
601 | +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM |
602 | +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF |
603 | +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
604 | + |
605 | + 16. Limitation of Liability. |
606 | + |
607 | + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
608 | +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS |
609 | +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY |
610 | +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE |
611 | +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF |
612 | +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD |
613 | +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), |
614 | +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF |
615 | +SUCH DAMAGES. |
616 | + |
617 | + 17. Interpretation of Sections 15 and 16. |
618 | + |
619 | + If the disclaimer of warranty and limitation of liability provided |
620 | +above cannot be given local legal effect according to their terms, |
621 | +reviewing courts shall apply local law that most closely approximates |
622 | +an absolute waiver of all civil liability in connection with the |
623 | +Program, unless a warranty or assumption of liability accompanies a |
624 | +copy of the Program in return for a fee. |
625 | + |
626 | + END OF TERMS AND CONDITIONS |
627 | + |
628 | + How to Apply These Terms to Your New Programs |
629 | + |
630 | + If you develop a new program, and you want it to be of the greatest |
631 | +possible use to the public, the best way to achieve this is to make it |
632 | +free software which everyone can redistribute and change under these terms. |
633 | + |
634 | + To do so, attach the following notices to the program. It is safest |
635 | +to attach them to the start of each source file to most effectively |
636 | +state the exclusion of warranty; and each file should have at least |
637 | +the "copyright" line and a pointer to where the full notice is found. |
638 | + |
639 | + <one line to give the program's name and a brief idea of what it does.> |
640 | + Copyright (C) <year> <name of author> |
641 | + |
642 | + This program is free software: you can redistribute it and/or modify |
643 | + it under the terms of the GNU General Public License as published by |
644 | + the Free Software Foundation, either version 3 of the License, or |
645 | + (at your option) any later version. |
646 | + |
647 | + This program is distributed in the hope that it will be useful, |
648 | + but WITHOUT ANY WARRANTY; without even the implied warranty of |
649 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
650 | + GNU General Public License for more details. |
651 | + |
652 | + You should have received a copy of the GNU General Public License |
653 | + along with this program. If not, see <http://www.gnu.org/licenses/>. |
654 | + |
655 | +Also add information on how to contact you by electronic and paper mail. |
656 | + |
657 | + If the program does terminal interaction, make it output a short |
658 | +notice like this when it starts in an interactive mode: |
659 | + |
660 | + <program> Copyright (C) <year> <name of author> |
661 | + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
662 | + This is free software, and you are welcome to redistribute it |
663 | + under certain conditions; type `show c' for details. |
664 | + |
665 | +The hypothetical commands `show w' and `show c' should show the appropriate |
666 | +parts of the General Public License. Of course, your program's commands |
667 | +might be different; for a GUI interface, you would use an "about box". |
668 | + |
669 | + You should also get your employer (if you work as a programmer) or school, |
670 | +if any, to sign a "copyright disclaimer" for the program, if necessary. |
671 | +For more information on this, and how to apply and follow the GNU GPL, see |
672 | +<http://www.gnu.org/licenses/>. |
673 | + |
674 | + The GNU General Public License does not permit incorporating your program |
675 | +into proprietary programs. If your program is a subroutine library, you |
676 | +may consider it more useful to permit linking proprietary applications with |
677 | +the library. If this is what you want to do, use the GNU Lesser General |
678 | +Public License instead of this License. But first, please read |
679 | +<http://www.gnu.org/philosophy/why-not-lgpl.html>. |
680 | |
681 | === added file 'reboot-test/README' |
682 | --- reboot-test/README 1970-01-01 00:00:00 +0000 |
683 | +++ reboot-test/README 2015-06-26 01:10:52 +0000 |
684 | @@ -0,0 +1,21 @@ |
685 | +Reboot test |
686 | +=========== |
687 | + |
688 | +This reboots an Ubuntu Touch device in a loop, checking for errors and |
689 | +gathering logs during each boot. The test output is a summary of execution |
690 | +plus a directory tree full of files collected during the test. The output |
691 | +is designed to aid debugging after errors occur, and might not be a simple |
692 | +pass/fail result. |
693 | + |
694 | +Test setup: |
695 | + - Flash the Device Under Test (DUT). |
696 | + - Manually complete the welcome wizard and edges tutorial, and otherwise |
697 | + get the device to the state you wish to test. |
698 | + - Start the test. |
699 | + - Wait, then analyze the results. |
700 | + |
701 | +Example: |
702 | + rm -rf results |
703 | + ./reboot-test.sh 30m |
704 | + |
705 | +Use './reboot-test.py --help' to discover more options. |
706 | |
707 | === added file 'reboot-test/reboot-test.py' |
708 | --- reboot-test/reboot-test.py 1970-01-01 00:00:00 +0000 |
709 | +++ reboot-test/reboot-test.py 2015-06-26 01:10:52 +0000 |
710 | @@ -0,0 +1,457 @@ |
711 | +#!/usr/bin/env python |
712 | +# |
713 | +# Reboot stress test |
714 | +# Copyright (C) 2015 Canonical |
715 | +# |
716 | +# This program is free software: you can redistribute it and/or modify it |
717 | +# under the terms of the GNU General Public License version 3, as |
718 | +# published by the Free Software Foundation. |
719 | +# |
720 | +# This program is distributed in the hope that it will be useful, |
721 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
722 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
723 | +# GNU General Public License for more details. |
724 | +# |
725 | +# You should have received a copy of the GNU General Public License |
726 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. |
727 | +# |
728 | + |
729 | +import os |
730 | +import shutil |
731 | +import subprocess |
732 | +import sys |
733 | +import threading |
734 | +import time |
735 | + |
736 | +try: |
737 | + # only exists in python3 |
738 | + import statistics |
739 | +except ImportError: |
740 | + statistics = None |
741 | + |
742 | + |
743 | +# TODO: get config from config file / CLI instead of globals |
744 | +class empty: |
745 | + pass |
746 | +cfg = empty |
747 | +# reboot_method: |
748 | +# adb : fastest, but doesn't allow system to shut down properly or boot fully |
749 | +# shell : doesn't wait for UI to fully boot |
750 | +# autopilot : actually press the reboot widget in the shutdown dialog |
751 | +# (not yet implemented, and requires autopilot on device) |
752 | +cfg.reboot_method = 'shell' |
753 | +# Wait methods: |
754 | +# adb : adb wait-for-device |
755 | +# ... : wait until greeter is visible |
756 | +# swipe : swipe away greeter then wait for UI to settle |
757 | +cfg.wait_method = 'swipe' |
758 | +cfg.dut_passwd = '0000' |
759 | +cfg.timeout = 5 * 60 |
760 | +cfg.verbose = False |
761 | +cfg.continue_after_error = False |
762 | +cfg.basedir = 'results' |
763 | +cfg.delete_first = False |
764 | + |
765 | +errors = [] |
766 | + |
767 | +# TODO: implement "unplugged mode" (runs on DUT, no host connected during test) |
768 | + |
769 | + |
770 | +def main(args): |
771 | + """reboot-test.py: reboots a device many times to look for anomalies |
772 | + Usage: reboot-test.sh [options] [runtime] |
773 | + Runtime (default 30m): 5m, 1h, 24h, 2d, etc |
774 | + Options: |
775 | + -h --help Print this message and exit. |
776 | + -v --verbose Print extra debugging info. |
777 | + -o D --out Make directory D and save results there. |
778 | + --delete rm -rf the output directory before starting test. |
779 | + -t N --timeout Give up on stalled steps after N seconds. |
780 | + -c --continue-after-error Keep trying after test error. |
781 | + (assumes a human is around to recover device) |
782 | + -m M --reboot-method Use a specific algorithm for rebooting the device. |
783 | + ([shell] or adb) (only with USB connected) |
784 | + adb: Run 'adb reboot', skips OS shutdown tasks. |
785 | + shell: Run 'reboot' on DUT. |
786 | + -w M --wait-method Wait for this state before starting next reboot. |
787 | + ([swipe] or adb) (only with USB connected) |
788 | + adb: adb wait-for-device only |
789 | + swipe: dismiss greeter and wait for UI to settle |
790 | + """ |
791 | + |
792 | + global cfg |
793 | + test_duration = 30 * 60 |
794 | + |
795 | + # just so we know later how the test was invoked |
796 | + log('reboot-test.py %s' % (' '.join(args))) |
797 | + |
798 | + i = 0 |
799 | + while i < len(args): |
800 | + a = args[i] |
801 | + if a in ('-h', '--help'): |
802 | + log(main.__doc__) |
803 | + return |
804 | + elif a in ('-o', '--out'): |
805 | + i += 1 |
806 | + cfg.basedir = args[i] |
807 | + elif a in ('--delete'): |
808 | + cfg.delete_first = True |
809 | + elif a in ('-t', '--timeout'): |
810 | + i += 1 |
811 | + cfg.timeout = parse_duration(args[i]) |
812 | + elif a in ('-v', '--verbose'): |
813 | + cfg.verbose = True |
814 | + elif a in ('-c', '--continue-after-error'): |
815 | + cfg.continue_after_error = True |
816 | + elif a in ('-m', '--reboot-method'): |
817 | + i += 1 |
818 | + cfg.reboot_method = args[i] |
819 | + elif a in ('-w', '--wait-method'): |
820 | + i += 1 |
821 | + cfg.wait_method = args[i] |
822 | + elif a in ('-u', '--unplugged',): |
823 | + cfg.unplugged = True |
824 | + else: |
825 | + test_duration = parse_duration(a) |
826 | + i += 1 |
827 | + |
828 | + start_time = time.time() |
829 | + end_time = start_time + test_duration |
830 | + h = float(test_duration) / 60 / 60 |
831 | + m = (h % 1.0) * 60 |
832 | + h = int(h) |
833 | + log('Rebooting for %ih%.0fm until %s' % (h, m, fmt_time(end_time))) |
834 | + if cfg.delete_first and os.path.exists(cfg.basedir): |
835 | + shutil.rmtree(cfg.basedir) |
836 | + if not os.path.exists(cfg.basedir): |
837 | + os.makedirs(cfg.basedir) |
838 | + |
839 | + # Get some data before the test starts |
840 | + collect_logs(None) |
841 | + |
842 | + try: |
843 | + boots = [start_time] |
844 | + while time.time() < (start_time + test_duration): |
845 | + boot_num = len(boots) |
846 | + log('Boot %i... %s' % (boot_num, fmt_time(time.time()))) |
847 | + err = reboot(boot_num) |
848 | + if err: |
849 | + warning('Reboot error.') |
850 | + time.sleep(5) |
851 | + continue |
852 | + wait_for_boot(boot_num) |
853 | + collect_logs(boot_num) |
854 | + cleanup(boot_num) |
855 | + boots.append(time.time()) |
856 | + except RuntimeError as e: |
857 | + # Abort test if a major error occurred |
858 | + boots.append(time.time()) # note when the test aborted |
859 | + log('Aborting test due to error.') |
860 | + |
861 | + boot_lengths = [boots[n]-boots[n-1] for n in range(1, len(boots))] |
862 | + |
863 | + # statistics: |
864 | + # * num boots |
865 | + # ? list of boots |
866 | + # * shortest boots |
867 | + # * longest boots |
868 | + # * avg boot (mean) |
869 | + # * std deviation |
870 | + |
871 | + def print_boot(i, t): |
872 | + extra = '' |
873 | + if t >= cfg.timeout: |
874 | + extra = ' (FAIL)' |
875 | + log(' Boot %i: %.0f seconds%s' % (i+1, t, extra)) |
876 | + |
877 | + log('Number of reboots: %i' % (len(boot_lengths))) |
878 | + for i, t in enumerate(boot_lengths): |
879 | + print_boot(i, t) |
880 | + |
881 | + by_len = [(t, i) for i, t in enumerate(boot_lengths)] |
882 | + by_len.sort() |
883 | + |
884 | + log('Shortest boots:') |
885 | + for t, i in by_len[:3]: |
886 | + print_boot(i, t) |
887 | + |
888 | + log('Longest boots:') |
889 | + for t, i in by_len[-3:]: |
890 | + print_boot(i, t) |
891 | + |
892 | + avg_boot_time = sum(boot_lengths) / len(boot_lengths) |
893 | + log('Avg boot time: %.1f seconds' % (avg_boot_time)) |
894 | + |
895 | + if statistics: |
896 | + stdev = statistics.stdev(boot_lengths) |
897 | + log('Standard deviation: %.1f seconds' % (stdev)) |
898 | + |
899 | + # report any errors detected |
900 | + if errors: |
901 | + log('%i error(s):' % (len(errors))) |
902 | + for e in errors: |
903 | + log(e) |
904 | + |
905 | + |
906 | +def reboot(boot_num): |
907 | + info('reboot(%s)' % (boot_num)) |
908 | + if cfg.reboot_method == 'adb': |
909 | + err, output = run(['adb', 'reboot']) |
910 | + if err or ('error' in output): |
911 | + error('reboot failed: %s' % (output)) |
912 | + elif cfg.reboot_method == 'shell': |
913 | + err, output = run_dut_sudo(['reboot']) |
914 | + if err or ('error' in output): |
915 | + error('reboot failed: %s' % (output)) |
916 | + # wait until reboot actually starts |
917 | + run_with_timeout(['adb', 'shell', '#', |
918 | + "if this failed, the device didn't shut down"], fatal=True) |
919 | + elif cfg.reboot_method == 'autopilot': |
920 | + raise NotImplementedError('autopilot reboot method not implemented') |
921 | + else: |
922 | + raise ValueError('Unknown reboot method %s' % (cfg.reboot_method)) |
923 | + return err |
924 | + |
925 | + |
926 | +def wait_for_boot(boot_num): |
927 | + info('wait_for_boot(%s)' % (boot_num)) |
928 | + |
929 | + if cfg.wait_method not in ('adb', 'swipe',): |
930 | + raise ValueError('Unknown wait method %s' % (cfg.wait_method)) |
931 | + |
932 | + # basic boot wait, with a timeout |
933 | + # TODO: while waiting, check for other signs of life in case adb failed |
934 | + if cfg.wait_method in ('adb', 'swipe',): |
935 | + run_with_timeout(['adb', 'wait-for-device'], fatal=True) |
936 | + |
937 | + # ensure the UI actually started and got far enough to log in |
938 | + if cfg.wait_method in ('swipe',): |
939 | + for i in range(cfg.timeout): |
940 | + err, out = run(['adb', 'shell', |
941 | + 'gdbus call --session --dest com.canonical.UnityGreeter ' |
942 | + '--object-path / ' |
943 | + '--method com.canonical.UnityGreeter.HideGreeter ' |
944 | + '&& echo Greeter unlocked']) |
945 | + if 'Greeter unlocked' in out: |
946 | + # give it a few seconds to render the scopes |
947 | + # (5 seconds was consistently not long enough) |
948 | + time.sleep(10) |
949 | + return |
950 | + time.sleep(1) |
951 | + |
952 | + error('wait_for_boot(%i) timed out during swipe' % (boot_num)) |
953 | + |
954 | + |
955 | +def collect_logs(boot_num): |
956 | + info('collect_logs(%s)' % (boot_num)) |
957 | + |
958 | + def save_dut_cmd(cmd, sudo=False, name=None, per_run=True): |
959 | + if not name: |
960 | + name = '_'.join(cmd).replace('/', '-').replace(' ', '_') |
961 | + func = run_dut |
962 | + if sudo: |
963 | + func = run_dut_sudo |
964 | + err, out = func(cmd) |
965 | + dest = name |
966 | + if per_run: |
967 | + dest = os.path.join(local_path, name) |
968 | + open(dest, 'w').write(out) |
969 | + |
970 | + def get_file(src, dest=None): |
971 | + if not dest: |
972 | + dest = os.path.join(cfg.basedir, src) |
973 | + d = os.path.dirname(dest) |
974 | + if not os.path.exists(d): |
975 | + os.makedirs(d) |
976 | + err, output = run(['adb', 'pull', src, dest]) |
977 | + if err or ('does not exist' in output): |
978 | + warning('Error pulling file: %s (%s)' % (src, output)) |
979 | + return |
980 | + try: |
981 | + size = os.path.getsize(dest) |
982 | + assert(size > 0) |
983 | + except Exception as e: |
984 | + warning('%s is empty or missing: %s' % (src, str(e))) |
985 | + |
986 | + # Collect initial data from before test starts |
987 | + if boot_num is None: |
988 | + dest = os.path.join(cfg.basedir, 'channel.ini') |
989 | + get_file('/etc/system-image/channel.ini', dest) |
990 | + |
991 | + dest = os.path.join(cfg.basedir, 'ls-alR') |
992 | + save_dut_cmd(['ls', '-alR', '/'], sudo=True, name=dest, per_run=False) |
993 | + return |
994 | + # Make a place to store the per-boot logs |
995 | + else: |
996 | + local_path = os.path.join(cfg.basedir, str(boot_num)) |
997 | + if not os.path.exists(local_path): |
998 | + os.makedirs(local_path) |
999 | + |
1000 | + # Collect dmesg |
1001 | + save_dut_cmd(['dmesg', '--color=never'], sudo=True, name='dmesg') |
1002 | + |
1003 | + # Collect syslog? (maybe at end of testing instead of each boot?) |
1004 | + dest = os.path.join(cfg.basedir, 'syslog') |
1005 | + get_file('/var/log/syslog', dest) |
1006 | + |
1007 | + # Collect process list |
1008 | + save_dut_cmd(['ps', 'axuwww']) |
1009 | + |
1010 | + # Network state |
1011 | + save_dut_cmd(['ifconfig', '-a']) |
1012 | + save_dut_cmd(['iwconfig']) |
1013 | + save_dut_cmd(['ip', 'ro']) |
1014 | + |
1015 | + # TODO: Check for crash on previous boot (how?) |
1016 | + |
1017 | + # Check for crash dump files |
1018 | + err, out = run_dut(['ls', '/var/crash']) |
1019 | + if out: |
1020 | + names = out.split() |
1021 | + warning('Crash dumps detected: %s' % (' '.join(names))) |
1022 | + dest = os.path.join(local_path, 'var-crash') |
1023 | + if not os.path.exists(dest): |
1024 | + os.mkdir(dest) |
1025 | + # 'adb pull' gets permission issues |
1026 | + run_dut_sudo(['chmod', 'a+r', '/var/crash/*']) |
1027 | + for name in names: |
1028 | + src = '/var/crash/%s' % (name) |
1029 | + err, output = run(['adb', 'pull', src, dest]) |
1030 | + info('err, output: %s, %s' % (err, output)) |
1031 | + # delete crash dump only if pull was successful |
1032 | + if err or ('failed' in output): |
1033 | + warning('adb pull failed: %s' % (output)) |
1034 | + else: |
1035 | + run_dut_sudo(['rm', '-f', src]) |
1036 | + # TODO: try to force whoopsie upload of .crash files? |
1037 | + |
1038 | + # screenshot |
1039 | + dest = os.path.join(local_path, 'screen.png') |
1040 | + run(['phablet-screenshot', dest]) |
1041 | + |
1042 | + |
1043 | +def cleanup(boot_num): |
1044 | + info('cleanup(%s)' % (boot_num)) |
1045 | + # clear QML cache to simulate first boot (ish) |
1046 | + run_dut(['rm', '-rf', '~/.cache/QML']) |
1047 | + |
1048 | + |
1049 | +def setup_autopilot(): |
1050 | + """Not used yet. |
1051 | + #bzr branch lp:ubuntu-test-cases/touch |
1052 | + #adb push touch/utils/target/unlock_screen.py /sbin/ |
1053 | + adb shell apt-get install unity8-autopilot |
1054 | + #adb shell 'sudo -i -u phablet |
1055 | + bash -ic "/usr/bin/python /sbin/unlock_screen.py"' |
1056 | + """ |
1057 | + pass |
1058 | + |
1059 | + |
1060 | +def run(cmd): |
1061 | + """Execute a command (tuple), return its errcode and text output""" |
1062 | + info('run(%s)' % (cmd)) |
1063 | + err = 0 |
1064 | + output = '' |
1065 | + |
1066 | + # catches stdout+stderr+retcode |
1067 | + p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, |
1068 | + stderr=subprocess.PIPE, close_fds=True, universal_newlines=True) |
1069 | + stdout, stderr = p.communicate() |
1070 | + #err = p.wait() |
1071 | + err = p.returncode |
1072 | + # combine stdout + stderr into one |
1073 | + if stdout.strip(): |
1074 | + output = stdout |
1075 | + if stderr: |
1076 | + output = output + '\nStderr:\n' + stderr |
1077 | + |
1078 | + return (err, output) |
1079 | + |
1080 | + |
1081 | +def run_dut(cmd): |
1082 | + """Run a command on the Device Under Test""" |
1083 | + info('run_dut(%s)' % (cmd)) |
1084 | + adb_cmd = ['adb', 'shell'] + cmd |
1085 | + return run(adb_cmd) |
1086 | + |
1087 | + |
1088 | +def run_dut_sudo(cmd): |
1089 | + """Run a command as root on the Device Under Test""" |
1090 | + info('run_dut_sudo(%s)' % (cmd)) |
1091 | + sudo_cmd = ['adb', 'shell', 'echo', cfg.dut_passwd, '|', 'sudo', '-S'] \ |
1092 | + + cmd |
1093 | + return run(sudo_cmd) |
1094 | + |
1095 | + |
1096 | +def run_with_timeout(cmd, fatal=False): |
1097 | + info('run_with_timeout(%s,%s)' % (cmd, fatal)) |
1098 | + cmd_returned = [False] # use a list to work around a scoping issue |
1099 | + |
1100 | + def cmd_wait(): |
1101 | + err, output = run(cmd) |
1102 | + cmd_returned[0] = True |
1103 | + |
1104 | + waiting = threading.Thread(target=cmd_wait) |
1105 | + waiting.setDaemon(True) # don't block sys.exit() |
1106 | + waiting.start() |
1107 | + i = 0 |
1108 | + while (not cmd_returned[0]) and (i < cfg.timeout): |
1109 | + i += 1 |
1110 | + time.sleep(1) |
1111 | + if not cmd_returned[0]: |
1112 | + text = '"%s" never returned' % (' '.join(cmd)) |
1113 | + if fatal: |
1114 | + error(text) |
1115 | + else: |
1116 | + return text |
1117 | + |
1118 | + |
1119 | +def fmt_time(t=None): |
1120 | + if not t: |
1121 | + t = time.time() |
1122 | + return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t)) |
1123 | + |
1124 | + |
1125 | +def log(msg): |
1126 | + print(msg) |
1127 | + sys.stdout.flush() |
1128 | + |
1129 | + |
1130 | +def errlog(lvl, msg): |
1131 | + text = ' %s %s : %s' % (lvl, fmt_time(), msg) |
1132 | + errors.append(text) |
1133 | + log(text) |
1134 | + |
1135 | + |
1136 | +def error(msg): |
1137 | + errlog('E', msg) |
1138 | + if cfg.continue_after_error: |
1139 | + log('Continuing test despite error.') |
1140 | + else: |
1141 | + raise RuntimeError(msg) |
1142 | + |
1143 | + |
1144 | +def warning(msg): |
1145 | + errlog('W', msg) |
1146 | + |
1147 | + |
1148 | +def info(msg): |
1149 | + if cfg.verbose: |
1150 | + log(' I: %s' % (msg)) |
1151 | + |
1152 | + |
1153 | +def parse_duration(text): |
1154 | + info('parse_duration(%s)' % (text)) |
1155 | + multiplier = 1 |
1156 | + durations = dict(m=60, h=60*60, d=60*60*24) |
1157 | + last = text[-1:] |
1158 | + if last in durations: |
1159 | + multiplier = durations[last] |
1160 | + text = text[:-1] |
1161 | + base = int(text) |
1162 | + return base * multiplier |
1163 | + |
1164 | + |
1165 | +if __name__ == "__main__": |
1166 | + import sys |
1167 | + main(sys.argv[1:]) |
1168 | |
1169 | === added file 'reboot-test/reboot-test.sh' |
1170 | --- reboot-test/reboot-test.sh 1970-01-01 00:00:00 +0000 |
1171 | +++ reboot-test/reboot-test.sh 2015-06-26 01:10:52 +0000 |
1172 | @@ -0,0 +1,6 @@ |
1173 | +#!/bin/sh |
1174 | + |
1175 | +LOG=results/reboot-test.log |
1176 | + |
1177 | +mkdir results 2>&1 | tee $LOG |
1178 | +LANG=en_US.UTF-8 ./reboot-test.py "$@" 2>&1 | tee -a $LOG |
I have a bunch of questions! I can keep working with this as we work on getting it landed. I'm trying to have a daily job setup for it by EOD.