From 5a321ee929f41e6ab136995f11c2d4e48e625077 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Fri, 30 Jun 2017 16:01:30 +0000 Subject: [PATCH] [lit] Clean output directories before running tests. Presently lit leaks files in the tests' output directories. Specifically, if a test creates output files, lit makes no effort to remove them prior to the next test run. This is problematic because it leads to false positives whenever a test passes because stale files were present. In general it is a source of flakiness that should be removed. This patch addresses this by building the list of all test directories that are part of the current run set, and then deleting those directories and recreating them anew. This gives each test a clean baseline to start from. Differential Revision: https://reviews.llvm.org/D34732 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306832 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../split-dwarf-addr-object-relocation.cpp | 7 +++ .../split-dwarf-addr-object-relocation.dwo | Bin 1056 -> 1056 bytes .../split-dwarf-addr-object-relocation.o | Bin 2968 -> 3360 bytes .../Inputs/split-dwarf-multiple-cu.dwo | Bin 1040 -> 1168 bytes .../Inputs/split-dwarf-multiple-cu.o | Bin 2992 -> 3728 bytes .../Inputs/split-dwarf-multiple-cu1.cpp | 2 + .../Inputs/split-dwarf-multiple-cu2.cpp | 7 +++ test/DebugInfo/Inputs/split-dwarf-test | Bin 9208 -> 9624 bytes test/DebugInfo/Inputs/split-dwarf-test.dwo | Bin 1377 -> 1088 bytes test/DebugInfo/llvm-symbolizer.test | 8 +-- test/Other/lit-globbing.ll | 56 +++++++++--------- test/Unit/lit.cfg | 8 ++- utils/lit/lit/Test.py | 16 +++-- utils/lit/lit/TestRunner.py | 54 +++++++---------- utils/lit/lit/run.py | 20 +++++++ 15 files changed, 104 insertions(+), 74 deletions(-) create mode 100644 test/DebugInfo/Inputs/split-dwarf-addr-object-relocation.cpp create mode 100644 test/DebugInfo/Inputs/split-dwarf-multiple-cu1.cpp create mode 100644 test/DebugInfo/Inputs/split-dwarf-multiple-cu2.cpp diff --git a/test/DebugInfo/Inputs/split-dwarf-addr-object-relocation.cpp b/test/DebugInfo/Inputs/split-dwarf-addr-object-relocation.cpp new file mode 100644 index 00000000000..d7361f475a2 --- /dev/null +++ b/test/DebugInfo/Inputs/split-dwarf-addr-object-relocation.cpp @@ -0,0 +1,7 @@ +void f1(); +__attribute__((always_inline)) void f2() { + f1(); +} +void f3() { + f2(); +} diff --git a/test/DebugInfo/Inputs/split-dwarf-addr-object-relocation.dwo b/test/DebugInfo/Inputs/split-dwarf-addr-object-relocation.dwo index 2a3bc57caa6de0845e445c1b9d072d8671989023..44bdaf4bffe0de44c6926eea479b35e4d988b60d 100644 GIT binary patch delta 39 ucmZ3$v4CSji=>&Mg|ViBMovyyu6{{TX}KGL)`m-Z3a)7e zO$y+>HUUlj6+H|;bO&{Wy>66(2838>#k?x6NSvY-qa|frmsZu!$#@ZVnFFpChj;8c zd}qJx_2urJ!d&V#L`A#VEorR1yz$W=r> zOQaPb&rRQcCOO73gB)g&W?{s0;6`1Z6@#Nt$q|Ppq9-NlhCET6#m~`lDoe-t~rzIukDbOQcQ@LtB0ghs&UC8b##nSgrZiFL}*daQBY96 z4uTGGa_L~m)S;y!XBTec!!zoyP}iuc!u7;tmtH)r5E? z{QXx``Pc2%O1mY<6B%_{cb~Z3y49;Ij|Q}6WdBD6Z;T<-=z$k-<2lFtm?-NMVu79& z!tvlmsZd;8TwAKNR@?6u3SkhAkA)>3(deDfGU2N^fKwxdQL{-d<_sS@W)5fO$03(z z{``&L-ztPKIJ?+L9Ad?>v6-C3P4WVlsdY51S?`w_jp=C&3rykdZ}QlfY9uiy2uo&ILZmn%9YCjsG%PF|GxE%UbCw zejMySa!zyDG4J<*OG`;fQTrwDnx`ZFlA=j84TTvyLtV_J6*cfaJxrf)Y^jn+M)P-< zGJVK#-~F3*k_WN-TfRL{U$lcC#18#EvaI$n?Ua36|71pAmE+pQu2VKTCO$hg*@&e- GwcS71z-H6{ diff --git a/test/DebugInfo/Inputs/split-dwarf-multiple-cu.dwo b/test/DebugInfo/Inputs/split-dwarf-multiple-cu.dwo index 4df9894b089a0d4537f6ee7d62d5763dec16b092..94cc3e9d0f7a7bf049ccf7e26fac242e74aaed4c 100644 GIT binary patch delta 387 zcmbQhF@bY}2IGW@ngIr8h8D(}3K}^%Wx4t#MWuP!3dTS&OA}3olGNf7eV5dv(sa+f zw0wQfyn@n_V*QB@;!1{k$pr-rnGBhECAd{F8cm#~THnUNz|aB2JwUu4h>rpBNg%!e z#Hv8d0>lgq9E=Q%EDTIixvB?k>aKD#F{=Ot8JU=VGcdETvM`tedB_S`_vt>^v8(9K zO%^tGMkYp9MsASuFb+;eRyIi>lZh3?X9HqaLB3AD1Oo%mI-rOhH#g867CnZ%COaS(Bxx_H02E@KoX9B7$Tqo>@#^FNrUb^z zlQ%M%a|$y8Edc_J$sd6{YbY;ivLUlM=UgZ+Z*n2CITJV2 delta 313 zcmbQhIe}w>2BW}4%>YGX6EkB?1&y4XvRwU=qSCx<1!DuCn4u;^qF!=A0YlQnU#j(y z3=9nMK%54|nLu0s#G*jV0>lgq9E=Q%EDTK2%l5v1=z8d&DMEq?B*7dUp}J$fmw`4j z3o9cNP=Fh#fH91XospGQ62xQ$5o|y#$gshw$xgM&PMDRs$!?<)I|BogAmaunYcxS- zJ%+p{JD?IPZfkCPNd=&REP9NBjdnt84id;R3=FK3e=}a4e2yuJv3Rl}vpMHxpj{xK rFu4%OyA0tl1Wn!ug&Dgdhhkz zc<$=+DaRothn}I4q$ts~nGwGhvTJmK&eQhhhrj&+`R(ti-)%O6LiM23s})*N8k((i! z@*K!u(+|?py%1hM^~NbqoabkXAEKGDiQnIPZ2{8w$-vd!Kf9mTODH za9A12=8WF}`T+U|k0#4)=- zJJgP^byi&C=vq)ub5}it;7p2NjKsL+iVIA6VH8(;#ZeoxKA(!c&PPNduYbK2l*&8? zy=bf}*YletFYpfo^2+@_c~#t%yR22VR4(`YA$g%;q;23T70Vvq0e9krt-#T8q6ZqZ>FKrk4L8-DY)_#4r)?@E6XWmkNyx6;E z^6ZM*>HE`2Yr^RMR$Sk|%5%)12i6pjF)K}QUS!;|$fJFwIQkiwxp!EktN3Bk{)(jI z^5d*PT-~2)r~XeUAR}x+I$k#TP$55uGQMbn%&VWm;SH;TF@7if4Fdyf`)@FoRKIzt zUtJtfKfEKmemEcOm<-XCBrw6Yl7N~1b{JbenBc!IhWefn6J-1M7)x6JO=-x@&@1{% z!aM_VWs}Kyb^S{Tsr2Icge(fvNA9s(P{}aaSm<-WJ0#52b*nmFfCn^7o zTyAE5e2?1sKVuB3)Q;JZjwHXH`-lo|W=0ySQ`s@5P zDfnPg^2GEK~5CQj1^g3{1XCyfs(KGJ|vw4lWb;tNsHg-shJsoxE<~xr}>Zy6V-jnhC z?2i@2uE-KB&W;Ye6XjbBO^Jk;`8c*eWj|K2hNIb~OocnXW+%=r&1gfr)K z5YJ9=NeTRWdA9FdrGk)vx(#-#1MpdOU{dvV&L?YjsoAp?r41}F6(%=yFc*6)C)r}=&u(f7cNUWSBm z4Q?C9BTH%%;Yd;xz8fx#nlbaBR5Ebc?B;oxHf?iUYFYSZW?%-rW~DL;4fNUz%Z8m@ zkxYX+f<|4UObt4qt;ae{OumNY*|2Da`Dr@)*2o2S(K~^d2=S2ww6F+K79m!f-vXnb zmW)D}I9fy85NZD;7qqk>ObLP`d$*np5dt_`2>>Hlc&997LNwzpQI%U9Gf#-j8?YR- zl{$wH!Oi@k;CpTO9c}oFBEu!gKOr)FN`&}O8$tvYLb;gy2V9pg(br(XuTZZ!Cp({n NytTtTBLQy+`WwX;oU{M{ diff --git a/test/DebugInfo/Inputs/split-dwarf-multiple-cu1.cpp b/test/DebugInfo/Inputs/split-dwarf-multiple-cu1.cpp new file mode 100644 index 00000000000..9bed4bf8b5e --- /dev/null +++ b/test/DebugInfo/Inputs/split-dwarf-multiple-cu1.cpp @@ -0,0 +1,2 @@ +extern int i; +int i; diff --git a/test/DebugInfo/Inputs/split-dwarf-multiple-cu2.cpp b/test/DebugInfo/Inputs/split-dwarf-multiple-cu2.cpp new file mode 100644 index 00000000000..1d17cf38037 --- /dev/null +++ b/test/DebugInfo/Inputs/split-dwarf-multiple-cu2.cpp @@ -0,0 +1,7 @@ +void f1(); +inline __attribute__((always_inline)) void f2() { + f1(); +} +void f3() { + f2(); +} diff --git a/test/DebugInfo/Inputs/split-dwarf-test b/test/DebugInfo/Inputs/split-dwarf-test index 4d6aa0cd98a34dbda578f74b1174b56542859fad..0e9d4c880bb08676aed49e826ebfcbfe5fc830b1 100755 GIT binary patch literal 9624 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 J@DY5f_&0WIiG2V7 literal 9208 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 diff --git a/test/DebugInfo/Inputs/split-dwarf-test.dwo b/test/DebugInfo/Inputs/split-dwarf-test.dwo index 588374d7d21e1830d12b1bee2dfa67ce640322c4..fb5eb9c0ffa9901c1721206b8b9e93d7ecef9224 100644 GIT binary patch delta 273 zcmaFJb%0}nhNuG*0~|PjSq=;w6K&P(P4x`)3=}jCHgL@Nu}wYd1?9jo_PhOCB^y^du$EMfacW#aRU&y192A+_XDv95VHU= z0|N&m10xFqlWcMD`2rqu;fcR?O+Lc7g`I(c8z{***^xdd3g7NZXL1uNJIu=H-4#w}31A%-CW(h{;$rG8?S(D%@w@tnXYw|%RdB)nw4}qj5P(++_FW3wQ29?Q)%;uaA zp*)|-3xO&Uz$$bZA%ewVu_Cb80;rfESWIv-Ba1laMyOcR|Nc> %t.input RUN: echo "%p/Inputs/fission-ranges.elf-x86_64 0x720" >> %t.input RUN: echo "%p/Inputs/arange-overlap.elf-x86_64 0x714" >> %t.input RUN: cp %p/Inputs/split-dwarf-test.dwo %T -RUN: echo "%p/Inputs/split-dwarf-test 0x4005d4" >> %t.input -RUN: echo "%p/Inputs/split-dwarf-test 0x4005c4" >> %t.input +RUN: echo "%p/Inputs/split-dwarf-test 0x400504" >> %t.input +RUN: echo "%p/Inputs/split-dwarf-test 0x4004f0" >> %t.input RUN: echo "%p/Inputs/cross-cu-inlining.x86_64-macho.o 0x17" >> %t.input RUN: cp %p/Inputs/split-dwarf-multiple-cu.dwo %T RUN: echo "%p/Inputs/split-dwarf-multiple-cu.o 0x4" >> %t.input @@ -141,9 +141,9 @@ CHECK-NEXT: main CHECK-NEXT: /tmp{{[/\\]}}cross-cu-inlining.c:11:0 CHECK: f2 -CHECK-NEXT: b.cpp:3:3 +CHECK-NEXT: split-dwarf-multiple-cu2.cpp:3:3 CHECK-NEXT: f3 -CHECK-NEXT: b.cpp:6:0 +CHECK-NEXT: split-dwarf-multiple-cu2.cpp:6:0 CHECK: f2 CHECK-NEXT: split-dwarf-addr-object-relocation.cpp:3:3 diff --git a/test/Other/lit-globbing.ll b/test/Other/lit-globbing.ll index 5a668a90a40..b60510ab8b2 100644 --- a/test/Other/lit-globbing.ll +++ b/test/Other/lit-globbing.ll @@ -1,28 +1,28 @@ -RUN: echo TA > %T/TA.txt -RUN: echo TB > %T/TB.txt -RUN: echo TAB > %T/TAB.txt - -RUN: echo %T/TA* | FileCheck -check-prefix=STAR %s -RUN: echo %T/'TA'* | FileCheck -check-prefix=STAR %s -RUN: echo %T/T'A'* | FileCheck -check-prefix=STAR %s - -RUN: echo %T/T?.txt | FileCheck -check-prefix=QUESTION %s -RUN: echo %T/'T'?.txt | FileCheck -check-prefix=QUESTION %s - -RUN: echo %T/T??.txt | FileCheck -check-prefix=QUESTION2 %s -RUN: echo %T/'T'??.txt | FileCheck -check-prefix=QUESTION2 %s - -RUN: echo 'T*' 'T?.txt' 'T??.txt' | FileCheck -check-prefix=QUOTEDARGS %s - -STAR-NOT: TB.txt -STAR: {{(TA.txt.*TAB.txt|TAB.txt.*TA.txt)}} - -QUESTION-NOT: TAB.txt -QUESTION: {{(TA.txt.*TB.txt|TB.txt.*TA.txt)}} - -QUESTION2-NOT: TA.txt -QUESTION2-NOT: TB.txt -QUESTION2: TAB.txt - -QUOTEDARGS-NOT: .txt -QUOTEDARGS: T* T?.txt T??.txt +RUN: echo XXA > %T/XXA.txt +RUN: echo XXB > %T/XXB.txt +RUN: echo XXAB > %T/XXAB.txt + +RUN: echo %T/XXA* | FileCheck -check-prefix=STAR %s +RUN: echo %T/'XXA'* | FileCheck -check-prefix=STAR %s +RUN: echo %T/XX'A'* | FileCheck -check-prefix=STAR %s + +RUN: echo %T/XX?.txt | FileCheck -check-prefix=QUESTION %s +RUN: echo %T/'XX'?.txt | FileCheck -check-prefix=QUESTION %s + +RUN: echo %T/XX??.txt | FileCheck -check-prefix=QUESTION2 %s +RUN: echo %T/'XX'??.txt | FileCheck -check-prefix=QUESTION2 %s + +RUN: echo 'XX*' 'XX?.txt' 'XX??.txt' | FileCheck -check-prefix=QUOTEDARGS %s + +STAR-NOT: XXB.txt +STAR: {{(XXA.txt.*XXAB.txt|XXAB.txt.*XXA.txt)}} + +QUESTION-NOT: XXAB.txt +QUESTION: {{(XXA.txt.*XXB.txt|XXB.txt.*XXA.txt)}} + +QUESTION2-NOT: XXA.txt +QUESTION2-NOT: XXB.txt +QUESTION2: XXAB.txt + +QUOTEDARGS-NOT: .txt +QUOTEDARGS: XX* XX?.txt XX??.txt diff --git a/test/Unit/lit.cfg b/test/Unit/lit.cfg index dac0bf829ba..a3c00d6d18c 100644 --- a/test/Unit/lit.cfg +++ b/test/Unit/lit.cfg @@ -39,9 +39,11 @@ for symbolizer in ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']: config.environment[symbolizer] = os.environ[symbolizer] # Win32 seeks DLLs along %PATH%. -if sys.platform in ['win32', 'cygwin'] and os.path.isdir(config.shlibdir): - config.environment['PATH'] = os.path.pathsep.join(( - config.shlibdir, config.environment['PATH'])) +if sys.platform in ['win32', 'cygwin']: + shlibdir = getattr(config, 'shlibdir', None) + if shlibdir is not None and os.path.isdir(shlibdir): + config.environment['PATH'] = os.path.pathsep.join(( + config.shlibdir, config.environment['PATH'])) # Win32 may use %SYSTEMDRIVE% during file system shell operations, so propogate. if sys.platform == 'win32' and 'SYSTEMDRIVE' in os.environ: diff --git a/utils/lit/lit/Test.py b/utils/lit/lit/Test.py index 1a9e3fe80fb..dc82670358a 100644 --- a/utils/lit/lit/Test.py +++ b/utils/lit/lit/Test.py @@ -172,7 +172,7 @@ class TestSuite: return os.path.join(self.source_root, *components) def getExecPath(self, components): - return os.path.join(self.exec_root, *components) + return os.path.join(self.exec_root, "Output", *components) class Test: """Test - Information on a single test instance.""" @@ -222,10 +222,13 @@ class Test: # Syntax error in an XFAIL line. self.result.code = UNRESOLVED self.result.output = str(e) - + def getFullName(self): return self.suite.config.name + ' :: ' + '/'.join(self.path_in_suite) + def getTestBaseName(self): + return self.path_in_suite[-1] + def getFilePath(self): if self.file_path: return self.file_path @@ -234,8 +237,11 @@ class Test: def getSourcePath(self): return self.suite.getSourcePath(self.path_in_suite) - def getExecPath(self): - return self.suite.getExecPath(self.path_in_suite) + def getTempFilePrefix(self): + return self.suite.getExecPath(self.path_in_suite) + ".tmp" + + def getTempFileDir(self): + return os.path.dirname(self.getTempFilePrefix()) def isExpectedToFail(self): """ @@ -347,7 +353,7 @@ class Test: safe_name = self.suite.name.replace(".","-") if safe_test_path: - class_name = safe_name + "." + "/".join(safe_test_path) + class_name = safe_name + "." + "/".join(safe_test_path) else: class_name = safe_name + "." + safe_name diff --git a/utils/lit/lit/TestRunner.py b/utils/lit/lit/TestRunner.py index 37b03cc19f8..e72be025308 100644 --- a/utils/lit/lit/TestRunner.py +++ b/utils/lit/lit/TestRunner.py @@ -123,7 +123,7 @@ class ShellCommandResult(object): self.exitCode = exitCode self.timeoutReached = timeoutReached self.outputFiles = list(outputFiles) - + def executeShCmd(cmd, shenv, results, timeout=0): """ Wrapper around _executeShCmd that handles @@ -501,7 +501,7 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper): data = None if data is not None: output_files.append((name, path, data)) - + results.append(ShellCommandResult( cmd.commands[i], out, err, res, timeoutHelper.timeoutReached(), output_files)) @@ -573,7 +573,7 @@ def executeScriptInternal(test, litConfig, tmpBase, commands, cwd): else: out += data out += "\n" - + if result.stdout.strip(): out += '# command output:\n%s\n' % (result.stdout,) if result.stderr.strip(): @@ -690,37 +690,28 @@ def parseIntegratedTestScriptCommands(source_path, keywords): finally: f.close() -def getTempPaths(test): - """Get the temporary location, this is always relative to the test suite - root, not test source root.""" - execpath = test.getExecPath() - execdir,execbase = os.path.split(execpath) - tmpDir = os.path.join(execdir, 'Output') - tmpBase = os.path.join(tmpDir, execbase) - return tmpDir, tmpBase - -def getDefaultSubstitutions(test, tmpDir, tmpBase, normalize_slashes=False): +def getDefaultSubstitutions(test, normalize_slashes=False): sourcepath = test.getSourcePath() sourcedir = os.path.dirname(sourcepath) + tmpDir = test.getTempFileDir() + tmpPrefix = test.getTempFilePrefix() + baseName = test.getTestBaseName() # Normalize slashes, if requested. if normalize_slashes: sourcepath = sourcepath.replace('\\', '/') sourcedir = sourcedir.replace('\\', '/') tmpDir = tmpDir.replace('\\', '/') - tmpBase = tmpBase.replace('\\', '/') # We use #_MARKER_# to hide %% while we do the other substitutions. substitutions = [] substitutions.extend([('%%', '#_MARKER_#')]) substitutions.extend(test.config.substitutions) - tmpName = tmpBase + '.tmp' - baseName = os.path.basename(tmpBase) substitutions.extend([('%s', sourcepath), ('%S', sourcedir), ('%p', sourcedir), ('%{pathsep}', os.pathsep), - ('%t', tmpName), + ('%t', tmpPrefix), ('%basename_t', baseName), ('%T', tmpDir), ('#_MARKER_#', '%')]) @@ -730,7 +721,7 @@ def getDefaultSubstitutions(test, tmpDir, tmpBase, normalize_slashes=False): ('%/s', sourcepath.replace('\\', '/')), ('%/S', sourcedir.replace('\\', '/')), ('%/p', sourcedir.replace('\\', '/')), - ('%/t', tmpBase.replace('\\', '/') + '.tmp'), + ('%/t', tmpPrefix.replace('\\', '/')), ('%/T', tmpDir.replace('\\', '/')), ]) @@ -740,7 +731,7 @@ def getDefaultSubstitutions(test, tmpDir, tmpBase, normalize_slashes=False): ('%:s', re.sub(r'^(.):', r'\1', sourcepath)), ('%:S', re.sub(r'^(.):', r'\1', sourcedir)), ('%:p', re.sub(r'^(.):', r'\1', sourcedir)), - ('%:t', re.sub(r'^(.):', r'\1', tmpBase) + '.tmp'), + ('%:t', re.sub(r'^(.):', r'\1', tmpPrefix)), ('%:T', re.sub(r'^(.):', r'\1', tmpDir)), ]) else: @@ -748,7 +739,7 @@ def getDefaultSubstitutions(test, tmpDir, tmpBase, normalize_slashes=False): ('%:s', sourcepath), ('%:S', sourcedir), ('%:p', sourcedir), - ('%:t', tmpBase + '.tmp'), + ('%:t', tmpPrefix), ('%:T', tmpDir), ]) return substitutions @@ -779,7 +770,7 @@ class ParserKind(object): TAG: A keyword taking no value. Ex 'END.' COMMAND: A keyword taking a list of shell commands. Ex 'RUN:' LIST: A keyword taking a comma-separated list of values. - BOOLEAN_EXPR: A keyword taking a comma-separated list of + BOOLEAN_EXPR: A keyword taking a comma-separated list of boolean expressions. Ex 'XFAIL:' CUSTOM: A keyword with custom parsing semantics. """ @@ -951,14 +942,14 @@ def parseIntegratedTestScript(test, additional_parsers=[], IntegratedTestKeywordParser('REQUIRES:', ParserKind.BOOLEAN_EXPR, initial_value=test.requires), IntegratedTestKeywordParser('REQUIRES-ANY:', ParserKind.CUSTOM, - IntegratedTestKeywordParser._handleRequiresAny, - initial_value=test.requires), + IntegratedTestKeywordParser._handleRequiresAny, + initial_value=test.requires), IntegratedTestKeywordParser('UNSUPPORTED:', ParserKind.BOOLEAN_EXPR, initial_value=test.unsupported), IntegratedTestKeywordParser('END.', ParserKind.TAG) ] keyword_parsers = {p.keyword: p for p in builtin_parsers} - + # Install user-defined additional parsers. for parser in additional_parsers: if not isinstance(parser, IntegratedTestKeywordParser): @@ -968,7 +959,7 @@ def parseIntegratedTestScript(test, additional_parsers=[], raise ValueError("Parser for keyword '%s' already exists" % parser.keyword) keyword_parsers[parser.keyword] = parser - + # Collect the test lines from the script. sourcepath = test.getSourcePath() for line_number, command_type, ln in \ @@ -1014,12 +1005,8 @@ def parseIntegratedTestScript(test, additional_parsers=[], return script - def _runShTest(test, litConfig, useExternalSh, script, tmpBase): - # Create the output directory if it does not already exist. - lit.util.mkdir_p(os.path.dirname(tmpBase)) - - execdir = os.path.dirname(test.getExecPath()) + execdir = os.path.dirname(test.getTempFileDir()) if useExternalSh: res = executeScript(test, litConfig, tmpBase, script, execdir) else: @@ -1063,10 +1050,8 @@ def executeShTest(test, litConfig, useExternalSh, return script if litConfig.noExecute: return lit.Test.Result(Test.PASS) - - tmpDir, tmpBase = getTempPaths(test) substitutions = list(extra_substitutions) - substitutions += getDefaultSubstitutions(test, tmpDir, tmpBase, + substitutions += getDefaultSubstitutions(test, normalize_slashes=useExternalSh) script = applySubstitutions(script, substitutions) @@ -1075,7 +1060,8 @@ def executeShTest(test, litConfig, useExternalSh, if hasattr(test.config, 'test_retry_attempts'): attempts += test.config.test_retry_attempts for i in range(attempts): - res = _runShTest(test, litConfig, useExternalSh, script, tmpBase) + res = _runShTest(test, litConfig, useExternalSh, script, + test.getTempFilePrefix()) if res.code != Test.FAIL: break # If we had to run the test more than once, count it as a flaky pass. These diff --git a/utils/lit/lit/run.py b/utils/lit/lit/run.py index 1290c142c83..bdaf1415a1c 100644 --- a/utils/lit/lit/run.py +++ b/utils/lit/lit/run.py @@ -1,4 +1,5 @@ import os +import shutil import sys import threading import time @@ -74,6 +75,25 @@ class Run(object): if not self.tests or jobs == 0: return + # Create fresh output directories for each test we're going to run. + # This guarantees that test runs will not remnants of previous test + # runs' output. + clean_paths = set() + for test in self.tests: + clean_paths.add(os.path.normpath(test.getTempFileDir())) + clean_paths = list(clean_paths) + # Sort by number of path components, to ensure that parent directories + # get deleted and re-created before child directories. + clean_paths.sort(key=lambda x: len(x.split(os.sep))) + for base in clean_paths: + if os.path.exists(base): + if not os.path.islink(base) and os.path.isdir(base): + shutil.rmtree(base, True) + else: + os.unlink(os.path) + if not os.path.exists(base): + lit.util.mkdir_p(base) + # Set up semaphores to limit parallelism of certain classes of tests. # For example, some ASan tests require lots of virtual memory and run # faster with less parallelism on OS X. -- 2.50.1