| 677 | self.use_term_control = use_term_control |
| 678 | |
| 679 | def get_next(self): |
| 680 | while self.num_running < self.num_jobs and self.test_list: |
| 681 | # Add tests |
| 682 | self.num_running += 1 |
| 683 | test = self.test_list.pop(0) |
| 684 | portseed = len(self.test_list) |
| 685 | portseed_arg = ["--portseed={}".format(portseed)] |
| 686 | log_stdout = tempfile.SpooledTemporaryFile(max_size=2**16) |
| 687 | log_stderr = tempfile.SpooledTemporaryFile(max_size=2**16) |
| 688 | test_argv = test.split() |
| 689 | testdir = "{}/{}_{}".format(self.tmpdir, re.sub(".py$", "", test_argv[0]), portseed) |
| 690 | tmpdir_arg = ["--tmpdir={}".format(testdir)] |
| 691 | self.jobs.append((test, |
| 692 | time.time(), |
| 693 | subprocess.Popen([sys.executable, self.tests_dir + test_argv[0]] + test_argv[1:] + self.flags + portseed_arg + tmpdir_arg, |
| 694 | universal_newlines=True, |
| 695 | stdout=log_stdout, |
| 696 | stderr=log_stderr), |
| 697 | testdir, |
| 698 | log_stdout, |
| 699 | log_stderr)) |
| 700 | if not self.jobs: |
| 701 | raise IndexError('pop from empty list') |
| 702 | |
| 703 | # Print remaining running jobs when all jobs have been started. |
| 704 | if not self.test_list: |
| 705 | print("Remaining jobs: [{}]".format(", ".join(j[0] for j in self.jobs))) |
| 706 | |
| 707 | dot_count = 0 |
| 708 | while True: |
| 709 | # Return all procs that have finished, if any. Otherwise sleep until there is one. |
| 710 | time.sleep(.5) |
| 711 | ret = [] |
| 712 | for job in self.jobs: |
| 713 | (name, start_time, proc, testdir, log_out, log_err) = job |
| 714 | if proc.poll() is not None: |
| 715 | log_out.seek(0), log_err.seek(0) |
| 716 | [stdout, stderr] = [log_file.read().decode('utf-8') for log_file in (log_out, log_err)] |
| 717 | log_out.close(), log_err.close() |
| 718 | if proc.returncode == TEST_EXIT_PASSED and stderr == "": |
| 719 | status = "Passed" |
| 720 | elif proc.returncode == TEST_EXIT_SKIPPED: |
| 721 | status = "Skipped" |
| 722 | else: |
| 723 | status = "Failed" |
| 724 | self.num_running -= 1 |
| 725 | self.jobs.remove(job) |
| 726 | if self.use_term_control: |
| 727 | clearline = '\r' + (' ' * dot_count) + '\r' |
| 728 | print(clearline, end='', flush=True) |
| 729 | dot_count = 0 |
| 730 | ret.append((TestResult(name, status, int(time.time() - start_time)), testdir, stdout, stderr)) |
| 731 | if ret: |
| 732 | return ret |
| 733 | if self.use_term_control: |
| 734 | print('.', end='', flush=True) |
| 735 | dot_count += 1 |
| 736 | |