Hi Enrico, Could you explain what was the motivation behind this change?
I am asking because, I have just learned that this commit has caused all libc++ tests to be skipped on linux*, silently decreasing test coverage on linux. I would like to replace this with some other mechanism, which is not prone to accidental silent skips, like a dotest flag to skip libc++ or something, but I'd like to understand the original motivation first. pl * the problem seems to be that on linux, we do not have the list of modules until we actually start the process, so this code will not find the library, as it runs before that. If is considered a bug then we can look into that separately, but I'd still like to avoid these kinds of skips. On 18 September 2015 at 21:12, Enrico Granata via lldb-commits <lldb-commits@lists.llvm.org> wrote: > Author: enrico > Date: Fri Sep 18 15:12:52 2015 > New Revision: 248028 > > URL: http://llvm.org/viewvc/llvm-project?rev=248028&view=rev > Log: > Make libc++ tests skip themselves if libc++ is not actually loaded in the > target > > > Modified: > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/initializerlist/TestInitializerList.py > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/iterator/TestDataFormatterLibccIterator.py > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/TestDataFormatterLibcxxList.py > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/map/TestDataFormatterLibccMap.py > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/multiset/TestDataFormatterLibcxxMultiSet.py > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/set/TestDataFormatterLibcxxSet.py > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/unordered/TestDataFormatterUnordered.py > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py > > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py > lldb/trunk/test/lldbutil.py > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/initializerlist/TestInitializerList.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/initializerlist/TestInitializerList.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/initializerlist/TestInitializerList.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/initializerlist/TestInitializerList.py > Fri Sep 18 15:12:52 2015 > @@ -36,6 +36,8 @@ class InitializerListTestCase(TestBase): > """Test that that file and class static variables display > correctly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > + > bkpt = > self.target().FindBreakpointByID(lldbutil.run_break_set_by_source_regexp > (self, "Set break point at this line.")) > > self.runCmd("run", RUN_SUCCEEDED) > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/iterator/TestDataFormatterLibccIterator.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/iterator/TestDataFormatterLibccIterator.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/iterator/TestDataFormatterLibccIterator.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/iterator/TestDataFormatterLibccIterator.py > Fri Sep 18 15:12:52 2015 > @@ -37,6 +37,8 @@ class LibcxxIteratorDataFormatterTestCas > """Test that libc++ iterators format properly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > + > lldbutil.run_break_set_by_file_and_line (self, "main.cpp", > self.line, num_expected_locations=-1) > > self.runCmd("run", RUN_SUCCEEDED) > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/TestDataFormatterLibcxxList.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/TestDataFormatterLibcxxList.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/TestDataFormatterLibcxxList.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/TestDataFormatterLibcxxList.py > Fri Sep 18 15:12:52 2015 > @@ -2,7 +2,7 @@ > Test lldb data formatter subsystem. > """ > > -import os, time > +import os, time, re > import unittest2 > import lldb > from lldbtest import * > @@ -39,6 +39,8 @@ class LibcxxListDataFormatterTestCase(Te > def data_formatter_commands(self): > """Test that that file and class static variables display > correctly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > + > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > > lldbutil.run_break_set_by_file_and_line (self, "main.cpp", > self.line, num_expected_locations=-1) > lldbutil.run_break_set_by_file_and_line (self, "main.cpp", > self.line2, num_expected_locations=-1) > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/map/TestDataFormatterLibccMap.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/map/TestDataFormatterLibccMap.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/map/TestDataFormatterLibccMap.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/map/TestDataFormatterLibccMap.py > Fri Sep 18 15:12:52 2015 > @@ -35,6 +35,8 @@ class LibcxxMapDataFormatterTestCase(Tes > """Test that that file and class static variables display > correctly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > + > bkpt = > self.target().FindBreakpointByID(lldbutil.run_break_set_by_source_regexp > (self, "Set break point at this line.")) > > self.runCmd("run", RUN_SUCCEEDED) > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py > Fri Sep 18 15:12:52 2015 > @@ -34,6 +34,8 @@ class LibcxxMultiMapDataFormatterTestCas > def data_formatter_commands(self): > """Test that that file and class static variables display > correctly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > + > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > > bkpt = > self.target().FindBreakpointByID(lldbutil.run_break_set_by_source_regexp > (self, "Set break point at this line.")) > > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/multiset/TestDataFormatterLibcxxMultiSet.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/multiset/TestDataFormatterLibcxxMultiSet.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/multiset/TestDataFormatterLibcxxMultiSet.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/multiset/TestDataFormatterLibcxxMultiSet.py > Fri Sep 18 15:12:52 2015 > @@ -34,6 +34,8 @@ class LibcxxMultiSetDataFormatterTestCas > def data_formatter_commands(self): > """Test that that file and class static variables display > correctly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > + > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > > bkpt = > self.target().FindBreakpointByID(lldbutil.run_break_set_by_source_regexp > (self, "Set break point at this line.")) > > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/set/TestDataFormatterLibcxxSet.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/set/TestDataFormatterLibcxxSet.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/set/TestDataFormatterLibcxxSet.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/set/TestDataFormatterLibcxxSet.py > Fri Sep 18 15:12:52 2015 > @@ -34,6 +34,8 @@ class LibcxxSetDataFormatterTestCase(Tes > def data_formatter_commands(self): > """Test that that file and class static variables display > correctly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > + > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > > bkpt = > self.target().FindBreakpointByID(lldbutil.run_break_set_by_source_regexp > (self, "Set break point at this line.")) > > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py > Fri Sep 18 15:12:52 2015 > @@ -38,6 +38,8 @@ class LibcxxStringDataFormatterTestCase( > """Test that that file and class static variables display > correctly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > + > lldbutil.run_break_set_by_file_and_line (self, "main.cpp", > self.line, num_expected_locations=-1) > > self.runCmd("run", RUN_SUCCEEDED) > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/unordered/TestDataFormatterUnordered.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/unordered/TestDataFormatterUnordered.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/unordered/TestDataFormatterUnordered.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/unordered/TestDataFormatterUnordered.py > Fri Sep 18 15:12:52 2015 > @@ -39,6 +39,8 @@ class LibcxxUnorderedDataFormatterTestCa > """Test that that file and class static variables display > correctly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > + > lldbutil.run_break_set_by_source_regexp (self, "Set break point at > this line.") > > self.runCmd("run", RUN_SUCCEEDED) > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py > Fri Sep 18 15:12:52 2015 > @@ -37,6 +37,8 @@ class LibcxxVBoolDataFormatterTestCase(T > """Test that that file and class static variables display > correctly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > + > lldbutil.run_break_set_by_file_and_line (self, "main.cpp", > self.line, num_expected_locations=-1) > > self.runCmd("run", RUN_SUCCEEDED) > > Modified: > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py > (original) > +++ > lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py > Fri Sep 18 15:12:52 2015 > @@ -34,6 +34,8 @@ class LibcxxVectorDataFormatterTestCase( > def data_formatter_commands(self): > """Test that that file and class static variables display > correctly.""" > self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) > + > + lldbutil.skip_if_library_missing(self, self.target(), > lldbutil.PrintableRegex("libc\+\+")) > > bkpt = > self.target().FindBreakpointByID(lldbutil.run_break_set_by_source_regexp > (self, "break here")) > > > Modified: lldb/trunk/test/lldbutil.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lldbutil.py?rev=248028&r1=248027&r2=248028&view=diff > ============================================================================== > --- lldb/trunk/test/lldbutil.py (original) > +++ lldb/trunk/test/lldbutil.py Fri Sep 18 15:12:52 2015 > @@ -7,6 +7,7 @@ They can also be useful for general purp > import lldb > import os, sys > import StringIO > +import re > > # =================================================== > # Utilities for locating/checking executable programs > @@ -957,3 +958,38 @@ def get_signal_number(signal_name): > return signal_number > # No remote platform; fall back to using local python signals. > return getattr(signal, signal_name) > + > +class PrintableRegex(object): > + def __init__(self, text): > + self.regex = re.compile(text) > + self.text = text > + > + def match(self, str): > + return self.regex.match(str) > + > + def __str__(self): > + return "%s" % (self.text) > + > + def __repr__(self): > + return "re.compile(%s) -> %s" % (self.text, self.regex) > + > +def skip_if_callable(test, callable, reason): > + if callable(test) == True: > + test.skipTest(reason) > + return True > + return False > + > +def skip_if_library_missing(test, target, library): > + def find_library(target, library): > + for module in target.modules: > + filename = module.file.GetFilename() > + if isinstance(library, str): > + if library == filename: > + return False > + elif hasattr(library, 'match'): > + if library.match(filename): > + return False > + return True > + def find_library_callable(test): > + return find_library(target, library) > + return skip_if_callable(test, find_library_callable, "could not find > library matching '%s' in target %s" % (library, target)) > > > _______________________________________________ > lldb-commits mailing list > lldb-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits