Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(238)

Side by Side Diff: appengine/swarming/swarming_bot/bot_code/task_runner_test.py

Issue 1949613002: task_runner: always use run_isolated (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/luci-py@master
Patch Set: rebased Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « appengine/swarming/swarming_bot/bot_code/task_runner.py ('k') | client/run_isolated.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # coding=utf-8 2 # coding=utf-8
3 # Copyright 2013 The LUCI Authors. All rights reserved. 3 # Copyright 2013 The LUCI Authors. All rights reserved.
4 # Use of this source code is governed under the Apache License, Version 2.0 4 # Use of this source code is governed under the Apache License, Version 2.0
5 # that can be found in the LICENSE file. 5 # that can be found in the LICENSE file.
6 6
7 import base64 7 import base64
8 import json 8 import json
9 import logging 9 import logging
10 import os 10 import os
11 import re
11 import signal 12 import signal
12 import shutil
13 import sys 13 import sys
14 import tempfile 14 import tempfile
15 import time 15 import time
16 import unittest 16 import unittest
17 17
18 import test_env_bot_code 18 import test_env_bot_code
19 test_env_bot_code.setup_test_env() 19 test_env_bot_code.setup_test_env()
20 20
21 # Creates a server mock for functions in net.py. 21 # Creates a server mock for functions in net.py.
22 import net_utils 22 import net_utils
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 }, 114 },
115 kwargs) 115 kwargs)
116 return check_first 116 return check_first
117 117
118 118
119 class TestTaskRunner(TestTaskRunnerBase): 119 class TestTaskRunner(TestTaskRunnerBase):
120 def setUp(self): 120 def setUp(self):
121 super(TestTaskRunner, self).setUp() 121 super(TestTaskRunner, self).setUp()
122 self.mock(time, 'time', lambda: 1000000000.) 122 self.mock(time, 'time', lambda: 1000000000.)
123 123
124 def get_check_final(self, exit_code=0, output='hi\n', outputs_ref=None): 124 def get_check_final(self, exit_code=0, output_re=r'^hi\n$', outputs_ref=None):
125 def check_final(kwargs): 125 def check_final(kwargs):
126 # It makes the diffing easier. 126 # Ignore these values.
127 kwargs['data'].pop('bot_overhead', None)
128 kwargs['data'].pop('duration', None)
129
130 output = ''
127 if 'output' in kwargs['data']: 131 if 'output' in kwargs['data']:
128 kwargs['data']['output'] = base64.b64decode(kwargs['data']['output']) 132 output = base64.b64decode(kwargs['data'].pop('output'))
133 self.assertTrue(re.match(output_re, output))
134
129 expected = { 135 expected = {
130 'data': { 136 'data': {
131 'cost_usd': 10., 137 'cost_usd': 10.,
132 'duration': 0.,
133 'exit_code': exit_code, 138 'exit_code': exit_code,
134 'hard_timeout': False, 139 'hard_timeout': False,
135 'id': 'localhost', 140 'id': 'localhost',
136 'io_timeout': False, 141 'io_timeout': False,
137 'output': output,
138 'output_chunk_start': 0, 142 'output_chunk_start': 0,
139 'task_id': 23, 143 'task_id': 23,
140 }, 144 },
141 } 145 }
142 if outputs_ref: 146 if outputs_ref:
143 expected['data']['outputs_ref'] = outputs_ref 147 expected['data']['outputs_ref'] = outputs_ref
144 self.assertEqual(expected, kwargs) 148 self.assertEqual(expected, kwargs)
145 return check_final 149 return check_final
146 150
147 def _run_command(self, task_details): 151 def _run_command(self, task_details):
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 expected = { 325 expected = {
322 u'exit_code': 1, 326 u'exit_code': 1,
323 u'hard_timeout': False, 327 u'hard_timeout': False,
324 u'io_timeout': False, 328 u'io_timeout': False,
325 u'must_signal_internal_failure': None, 329 u'must_signal_internal_failure': None,
326 u'version': task_runner.OUT_VERSION, 330 u'version': task_runner.OUT_VERSION,
327 } 331 }
328 self.assertEqual(expected, self._run_command(task_details)) 332 self.assertEqual(expected, self._run_command(task_details))
329 333
330 def test_run_command_os_error(self): 334 def test_run_command_os_error(self):
331 # This runs the command for real. 335 self.requests(
332 # OS specific error, fix expectation for other OSes. 336 cost_usd=10.,
333 output = ( 337 exit_code=1,
334 'Command "executable_that_shouldnt_be_on_your_system ' 338 output_re=(
335 'thus_raising_OSError" failed to start.\n' 339 # This is a beginning of run_isolate.py's output if binary is not
336 'Error: [Error 2] The system cannot find the file specified' 340 # found.
337 ) if sys.platform == 'win32' else ( 341 r'^<The executable does not exist or a dependent library is '
338 'Command "executable_that_shouldnt_be_on_your_system ' 342 r'missing>'))
339 'thus_raising_OSError" failed to start.\n'
340 'Error: [Errno 2] No such file or directory')
341 self.requests(cost_usd=10., exit_code=1, output=output)
342 task_details = task_runner.TaskDetails( 343 task_details = task_runner.TaskDetails(
343 { 344 {
344 'bot_id': 'localhost', 345 'bot_id': 'localhost',
345 'command': [ 346 'command': [
346 'executable_that_shouldnt_be_on_your_system', 347 'executable_that_shouldnt_be_on_your_system',
347 'thus_raising_OSError', 348 'thus_raising_OSError',
348 ], 349 ],
349 'env': {}, 350 'env': {},
350 'extra_args': [], 351 'extra_args': [],
351 'grace_period': 30., 352 'grace_period': 30.,
352 'hard_timeout': 6, 353 'hard_timeout': 6,
353 'io_timeout': 6, 354 'io_timeout': 6,
354 'isolated': None, 355 'isolated': None,
355 'task_id': 23, 356 'task_id': 23,
356 }) 357 })
357 expected = { 358 expected = {
358 u'exit_code': 1, 359 u'exit_code': 1,
359 u'hard_timeout': False, 360 u'hard_timeout': False,
360 u'io_timeout': False, 361 u'io_timeout': False,
361 u'must_signal_internal_failure': None, 362 u'must_signal_internal_failure': None,
362 u'version': task_runner.OUT_VERSION, 363 u'version': task_runner.OUT_VERSION,
363 } 364 }
364 self.assertEqual(expected, self._run_command(task_details)) 365 self.assertEqual(expected, self._run_command(task_details))
365 366
366 def test_run_command_large(self): 367 def test_run_command_large(self):
367 # Method should have "self" as first argument - pylint: disable=E0213 368 # Method should have "self" as first argument - pylint: disable=E0213
368 class Popen(object): 369 class Popen(object):
369 """Mocks the process so we can control how data is returned.""" 370 """Mocks the process so we can control how data is returned."""
370 def __init__(self2, cmd, cwd, env, stdout, stderr, stdin, detached): 371 def __init__(self2, _cmd, cwd, env, stdout, stderr, stdin, detached):
371 self.assertEqual(task_details.command, cmd)
372 self.assertEqual(self.work_dir, cwd) 372 self.assertEqual(self.work_dir, cwd)
373 expected_env = os.environ.copy() 373 expected_env = os.environ.copy()
374 expected_env['foo'] = 'bar' 374 expected_env['foo'] = 'bar'
375 self.assertEqual(expected_env, env) 375 self.assertEqual(expected_env, env)
376 self.assertEqual(subprocess42.PIPE, stdout) 376 self.assertEqual(subprocess42.PIPE, stdout)
377 self.assertEqual(subprocess42.STDOUT, stderr) 377 self.assertEqual(subprocess42.STDOUT, stderr)
378 self.assertEqual(subprocess42.PIPE, stdin) 378 self.assertEqual(subprocess42.PIPE, stdin)
379 self.assertEqual(True, detached) 379 self.assertEqual(True, detached)
380 self2._out = [ 380 self2._out = [
381 'hi!\n', 381 'hi!\n',
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 ' except IOError:\n' 561 ' except IOError:\n'
562 ' pass;\n' 562 ' pass;\n'
563 'print(\'bye\');\n' 563 'print(\'bye\');\n'
564 'time.sleep(100)') % ( 564 'time.sleep(100)') % (
565 'signal.SIGBREAK' if sys.platform == 'win32' else 'signal.SIGTERM') 565 'signal.SIGBREAK' if sys.platform == 'win32' else 'signal.SIGTERM')
566 566
567 SCRIPT_HANG = 'import time; print(\'hi\'); time.sleep(100)' 567 SCRIPT_HANG = 'import time; print(\'hi\'); time.sleep(100)'
568 568
569 def get_check_final( 569 def get_check_final(
570 self, hard_timeout=False, io_timeout=False, exit_code=None, 570 self, hard_timeout=False, io_timeout=False, exit_code=None,
571 output='hi\n'): 571 output_re='^hi\n$'):
572 def check_final(kwargs): 572 def check_final(kwargs):
573 kwargs['data'].pop('bot_overhead', None)
573 if hard_timeout or io_timeout: 574 if hard_timeout or io_timeout:
574 self.assertLess(self.SHORT_TIME_OUT, kwargs['data'].pop('cost_usd')) 575 self.assertLess(self.SHORT_TIME_OUT, kwargs['data'].pop('cost_usd'))
575 self.assertLess(self.SHORT_TIME_OUT, kwargs['data'].pop('duration')) 576 self.assertLess(self.SHORT_TIME_OUT, kwargs['data'].pop('duration'))
576 else: 577 else:
577 self.assertLess(0., kwargs['data'].pop('cost_usd')) 578 self.assertLess(0., kwargs['data'].pop('cost_usd'))
578 self.assertLess(0., kwargs['data'].pop('duration')) 579 self.assertLess(0., kwargs['data'].pop('duration'))
579 # It makes the diffing easier. 580
580 kwargs['data']['output'] = base64.b64decode(kwargs['data']['output']) 581 output = ''
582 if 'output' in kwargs['data']:
583 output = base64.b64decode(kwargs['data'].pop('output'))
584 self.assertTrue(re.match(output_re, output))
585
581 self.assertEqual( 586 self.assertEqual(
582 { 587 {
583 'data': { 588 'data': {
584 'exit_code': exit_code, 589 'exit_code': exit_code,
585 'hard_timeout': hard_timeout, 590 'hard_timeout': hard_timeout,
586 'id': 'localhost', 591 'id': 'localhost',
587 'io_timeout': io_timeout, 592 'io_timeout': io_timeout,
588 'output': output,
589 'output_chunk_start': 0, 593 'output_chunk_start': 0,
590 'task_id': 23, 594 'task_id': 23,
591 }, 595 },
592 }, 596 },
593 kwargs) 597 kwargs)
594 return check_final 598 return check_final
595 599
596 def _load_and_run(self, manifest): 600 def _load_and_run(self, manifest):
597 # Dot not mock time since this test class is testing timeouts. 601 # Dot not mock time since this test class is testing timeouts.
598 server = 'https://localhost:1' 602 server = 'https://localhost:1'
(...skipping 17 matching lines...) Expand all
616 self.requests(hard_timeout=True, exit_code=sig) 620 self.requests(hard_timeout=True, exit_code=sig)
617 task_details = self.get_task_details( 621 task_details = self.get_task_details(
618 self.SCRIPT_HANG, hard_timeout=self.SHORT_TIME_OUT) 622 self.SCRIPT_HANG, hard_timeout=self.SHORT_TIME_OUT)
619 expected = { 623 expected = {
620 u'exit_code': sig, 624 u'exit_code': sig,
621 u'hard_timeout': True, 625 u'hard_timeout': True,
622 u'io_timeout': False, 626 u'io_timeout': False,
623 u'must_signal_internal_failure': None, 627 u'must_signal_internal_failure': None,
624 u'version': task_runner.OUT_VERSION, 628 u'version': task_runner.OUT_VERSION,
625 } 629 }
626 self.assertEqual(expected, self._run_command(task_details)) 630 actual = self._run_command(task_details)
631 actual.pop('bot_overhead', None)
632 self.assertEqual(expected, actual)
627 633
628 def test_io(self): 634 def test_io(self):
629 # Actually 0xc000013a 635 # Actually 0xc000013a
630 sig = -1073741510 if sys.platform == 'win32' else -signal.SIGTERM 636 sig = -1073741510 if sys.platform == 'win32' else -signal.SIGTERM
631 self.requests(io_timeout=True, exit_code=sig) 637 self.requests(io_timeout=True, exit_code=sig)
632 task_details = self.get_task_details( 638 task_details = self.get_task_details(
633 self.SCRIPT_HANG, io_timeout=self.SHORT_TIME_OUT) 639 self.SCRIPT_HANG, io_timeout=self.SHORT_TIME_OUT)
634 expected = { 640 expected = {
635 u'exit_code': sig, 641 u'exit_code': sig,
636 u'hard_timeout': False, 642 u'hard_timeout': False,
637 u'io_timeout': True, 643 u'io_timeout': True,
638 u'must_signal_internal_failure': None, 644 u'must_signal_internal_failure': None,
639 u'version': task_runner.OUT_VERSION, 645 u'version': task_runner.OUT_VERSION,
640 } 646 }
641 self.assertEqual(expected, self._run_command(task_details)) 647 self.assertEqual(expected, self._run_command(task_details))
642 648
643 def test_hard_signal(self): 649 def test_hard_signal(self):
644 self.requests( 650 self.requests(
645 hard_timeout=True, 651 hard_timeout=True,
646 exit_code=0, 652 exit_code=0,
647 output='hi\ngot signal %d\nbye\n' % task_runner.SIG_BREAK_OR_TERM) 653 output_re='^hi\ngot signal %d\nbye\n$' % task_runner.SIG_BREAK_OR_TERM)
648 task_details = self.get_task_details( 654 task_details = self.get_task_details(
649 self.SCRIPT_SIGNAL, hard_timeout=self.SHORT_TIME_OUT) 655 self.SCRIPT_SIGNAL, hard_timeout=self.SHORT_TIME_OUT)
650 # Returns 0 because the process cleaned up itself. 656 # Returns 0 because the process cleaned up itself.
651 expected = { 657 expected = {
652 u'exit_code': 0, 658 u'exit_code': 0,
653 u'hard_timeout': True, 659 u'hard_timeout': True,
654 u'io_timeout': False, 660 u'io_timeout': False,
655 u'must_signal_internal_failure': None, 661 u'must_signal_internal_failure': None,
656 u'version': task_runner.OUT_VERSION, 662 u'version': task_runner.OUT_VERSION,
657 } 663 }
658 self.assertEqual(expected, self._run_command(task_details)) 664 self.assertEqual(expected, self._run_command(task_details))
659 665
660 def test_io_signal(self): 666 def test_io_signal(self):
661 self.requests( 667 self.requests(
662 io_timeout=True, exit_code=0, 668 io_timeout=True, exit_code=0,
663 output='hi\ngot signal %d\nbye\n' % task_runner.SIG_BREAK_OR_TERM) 669 output_re='^hi\ngot signal %d\nbye\n$' % task_runner.SIG_BREAK_OR_TERM)
664 task_details = self.get_task_details( 670 task_details = self.get_task_details(
665 self.SCRIPT_SIGNAL, io_timeout=self.SHORT_TIME_OUT) 671 self.SCRIPT_SIGNAL, io_timeout=self.SHORT_TIME_OUT)
666 # Returns 0 because the process cleaned up itself. 672 # Returns 0 because the process cleaned up itself.
667 expected = { 673 expected = {
668 u'exit_code': 0, 674 u'exit_code': 0,
669 u'hard_timeout': False, 675 u'hard_timeout': False,
670 u'io_timeout': True, 676 u'io_timeout': True,
671 u'must_signal_internal_failure': None, 677 u'must_signal_internal_failure': None,
672 u'version': task_runner.OUT_VERSION, 678 u'version': task_runner.OUT_VERSION,
673 } 679 }
(...skipping 28 matching lines...) Expand all
702 u'io_timeout': True, 708 u'io_timeout': True,
703 u'must_signal_internal_failure': None, 709 u'must_signal_internal_failure': None,
704 u'version': task_runner.OUT_VERSION, 710 u'version': task_runner.OUT_VERSION,
705 } 711 }
706 self.assertEqual(expected, self._run_command(task_details)) 712 self.assertEqual(expected, self._run_command(task_details))
707 713
708 def test_hard_signal_no_grace(self): 714 def test_hard_signal_no_grace(self):
709 exit_code = 1 if sys.platform == 'win32' else -signal.SIGKILL 715 exit_code = 1 if sys.platform == 'win32' else -signal.SIGKILL
710 self.requests( 716 self.requests(
711 hard_timeout=True, exit_code=exit_code, 717 hard_timeout=True, exit_code=exit_code,
712 output='hi\ngot signal %d\nbye\n' % task_runner.SIG_BREAK_OR_TERM) 718 output_re='^hi\ngot signal %d\nbye\n$' % task_runner.SIG_BREAK_OR_TERM)
713 task_details = self.get_task_details( 719 task_details = self.get_task_details(
714 self.SCRIPT_SIGNAL_HANG, hard_timeout=self.SHORT_TIME_OUT, 720 self.SCRIPT_SIGNAL_HANG, hard_timeout=self.SHORT_TIME_OUT,
715 grace_period=self.SHORT_TIME_OUT) 721 grace_period=self.SHORT_TIME_OUT)
716 # Returns 0 because the process cleaned up itself. 722 # Returns 0 because the process cleaned up itself.
717 expected = { 723 expected = {
718 u'exit_code': exit_code, 724 u'exit_code': exit_code,
719 u'hard_timeout': True, 725 u'hard_timeout': True,
720 u'io_timeout': False, 726 u'io_timeout': False,
721 u'must_signal_internal_failure': None, 727 u'must_signal_internal_failure': None,
722 u'version': task_runner.OUT_VERSION, 728 u'version': task_runner.OUT_VERSION,
723 } 729 }
724 self.assertEqual(expected, self._run_command(task_details)) 730 self.assertEqual(expected, self._run_command(task_details))
725 731
726 def test_io_signal_no_grace(self): 732 def test_io_signal_no_grace(self):
727 exit_code = 1 if sys.platform == 'win32' else -signal.SIGKILL 733 exit_code = 1 if sys.platform == 'win32' else -signal.SIGKILL
728 self.requests( 734 self.requests(
729 io_timeout=True, exit_code=exit_code, 735 io_timeout=True, exit_code=exit_code,
730 output='hi\ngot signal %d\nbye\n' % task_runner.SIG_BREAK_OR_TERM) 736 output_re='^hi\ngot signal %d\nbye\n$' % task_runner.SIG_BREAK_OR_TERM)
731 task_details = self.get_task_details( 737 task_details = self.get_task_details(
732 self.SCRIPT_SIGNAL_HANG, io_timeout=self.SHORT_TIME_OUT, 738 self.SCRIPT_SIGNAL_HANG, io_timeout=self.SHORT_TIME_OUT,
733 grace_period=self.SHORT_TIME_OUT) 739 grace_period=self.SHORT_TIME_OUT)
734 # Returns 0 because the process cleaned up itself. 740 # Returns 0 because the process cleaned up itself.
735 expected = { 741 expected = {
736 u'exit_code': exit_code, 742 u'exit_code': exit_code,
737 u'hard_timeout': False, 743 u'hard_timeout': False,
738 u'io_timeout': True, 744 u'io_timeout': True,
739 u'must_signal_internal_failure': None, 745 u'must_signal_internal_failure': None,
740 u'version': task_runner.OUT_VERSION, 746 u'version': task_runner.OUT_VERSION,
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 while os.path.isfile(signal_file): 1038 while os.path.isfile(signal_file):
1033 time.sleep(0.01) 1039 time.sleep(0.01)
1034 # Send SIGTERM to task_runner itself. Ensure the right thing happen. 1040 # Send SIGTERM to task_runner itself. Ensure the right thing happen.
1035 # Note that on Windows, this is actually sending a SIGBREAK since there's no 1041 # Note that on Windows, this is actually sending a SIGBREAK since there's no
1036 # such thing as SIGTERM. 1042 # such thing as SIGTERM.
1037 proc.send_signal(signal.SIGTERM) 1043 proc.send_signal(signal.SIGTERM)
1038 proc.wait() 1044 proc.wait()
1039 task_runner_log = os.path.join(self.root_dir, 'logs', 'task_runner.log') 1045 task_runner_log = os.path.join(self.root_dir, 'logs', 'task_runner.log')
1040 with open(task_runner_log, 'rb') as f: 1046 with open(task_runner_log, 'rb') as f:
1041 logging.info('task_runner.log:\n---\n%s---', f.read()) 1047 logging.info('task_runner.log:\n---\n%s---', f.read())
1042 expected = {
1043 u'exit_code': 0,
1044 u'hard_timeout': False,
1045 u'io_timeout': False,
1046 u'must_signal_internal_failure': None,
1047 u'version': task_runner.OUT_VERSION,
1048 }
1049 self.assertEqual([], self._server.get_events()) 1048 self.assertEqual([], self._server.get_events())
1050 tasks = self._server.get_tasks() 1049 tasks = self._server.get_tasks()
1051 for task in tasks.itervalues(): 1050 for task in tasks.itervalues():
1052 for event in task: 1051 for event in task:
1053 event.pop('cost_usd') 1052 event.pop('cost_usd')
1054 event.pop('duration', None) 1053 event.pop('duration', None)
1055 event.pop('bot_overhead', None) 1054 event.pop('bot_overhead', None)
1056 expected = { 1055 expected = {
1057 '23': [ 1056 '23': [
1058 { 1057 {
1059 u'id': u'localhost', 1058 u'id': u'localhost',
1060 u'task_id': 23, 1059 u'task_id': 23,
1061 }, 1060 },
1062 { 1061 {
1063 u'exit_code': exit_code, 1062 u'exit_code': exit_code,
1064 u'hard_timeout': False, 1063 u'hard_timeout': False,
1065 u'id': u'localhost', 1064 u'id': u'localhost',
1066 u'io_timeout': False, 1065 u'io_timeout': False,
1067 u'task_id': 23, 1066 u'task_id': 23,
1068 }, 1067 },
1069 ], 1068 ],
1070 } 1069 }
1071 self.assertEqual(expected, tasks) 1070 self.assertEqual(expected, tasks)
1072 expected = { 1071 expected = {
1073 'swarming_bot.1.zip', 1072 'swarming_bot.1.zip',
1074 '4e019f31778ba7191f965469dc673280386bbd60-cacert.pem', 1073 '4e019f31778ba7191f965469dc673280386bbd60-cacert.pem',
1075 'work', 1074 'work',
1076 'logs', 1075 'logs',
1076 'isolated',
1077 # TODO(maruel): Move inside work. 1077 # TODO(maruel): Move inside work.
1078 'task_runner_in.json', 1078 'task_runner_in.json',
1079 'task_runner_out.json', 1079 'task_runner_out.json',
1080 } 1080 }
1081 self.assertEqual(expected, set(os.listdir(self.root_dir))) 1081 self.assertEqual(expected, set(os.listdir(self.root_dir)))
1082 expected = { 1082 expected = {
1083 u'exit_code': exit_code, 1083 u'exit_code': exit_code,
1084 u'hard_timeout': False, 1084 u'hard_timeout': False,
1085 u'io_timeout': False, 1085 u'io_timeout': False,
1086 u'must_signal_internal_failure': 1086 u'must_signal_internal_failure':
1087 u'task_runner received signal %d' % task_runner.SIG_BREAK_OR_TERM, 1087 u'task_runner received signal %d' % task_runner.SIG_BREAK_OR_TERM,
1088 u'version': 3, 1088 u'version': 3,
1089 } 1089 }
1090 with open(task_result_file, 'rb') as f: 1090 with open(task_result_file, 'rb') as f:
1091 self.assertEqual(expected, json.load(f)) 1091 self.assertEqual(expected, json.load(f))
1092 self.assertEqual(0, proc.returncode) 1092 self.assertEqual(0, proc.returncode)
1093 1093
1094 1094
1095 if __name__ == '__main__': 1095 if __name__ == '__main__':
1096 fix_encoding.fix_encoding() 1096 fix_encoding.fix_encoding()
1097 if '-v' in sys.argv: 1097 if '-v' in sys.argv:
1098 unittest.TestCase.maxDiff = None 1098 unittest.TestCase.maxDiff = None
1099 logging_utils.prepare_logging(None) 1099 logging_utils.prepare_logging(None)
1100 logging_utils.set_console_level( 1100 logging_utils.set_console_level(
1101 logging.DEBUG if '-v' in sys.argv else logging.CRITICAL+1) 1101 logging.DEBUG if '-v' in sys.argv else logging.CRITICAL+1)
1102 # Fix litteral text expectation. 1102 # Fix litteral text expectation.
1103 os.environ['LANG'] = 'en_US.UTF-8' 1103 os.environ['LANG'] = 'en_US.UTF-8'
1104 os.environ['LANGUAGE'] = 'en_US.UTF-8' 1104 os.environ['LANGUAGE'] = 'en_US.UTF-8'
1105 unittest.main() 1105 unittest.main()
OLDNEW
« no previous file with comments | « appengine/swarming/swarming_bot/bot_code/task_runner.py ('k') | client/run_isolated.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698