OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 # valgrind_test.py | 6 # valgrind_test.py |
7 | 7 |
8 """Runs an exe through Valgrind and puts the intermediate files in a | 8 """Runs an exe through Valgrind and puts the intermediate files in a |
9 directory. | 9 directory. |
10 """ | 10 """ |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 logging.error("Setup failed") | 200 logging.error("Setup failed") |
201 end = datetime.datetime.now() | 201 end = datetime.datetime.now() |
202 seconds = (end - start).seconds | 202 seconds = (end - start).seconds |
203 hours = seconds / 3600 | 203 hours = seconds / 3600 |
204 seconds = seconds % 3600 | 204 seconds = seconds % 3600 |
205 minutes = seconds / 60 | 205 minutes = seconds / 60 |
206 seconds = seconds % 60 | 206 seconds = seconds % 60 |
207 logging.info("elapsed time: %02d:%02d:%02d" % (hours, minutes, seconds)) | 207 logging.info("elapsed time: %02d:%02d:%02d" % (hours, minutes, seconds)) |
208 return retcode | 208 return retcode |
209 | 209 |
| 210 def Run(self, args, module): |
| 211 MODULES_TO_SANITY_CHECK = ["base"] |
| 212 |
| 213 # TODO(timurrrr): this is a temporary workaround for http://crbug.com/47844 |
| 214 if self.ToolName() == "tsan" and common.IsMac(): |
| 215 MODULES_TO_SANITY_CHECK = [] |
| 216 |
| 217 check_sanity = module in MODULES_TO_SANITY_CHECK |
| 218 return self.Main(args, check_sanity) |
| 219 |
210 | 220 |
211 class ValgrindTool(BaseTool): | 221 class ValgrindTool(BaseTool): |
212 """Abstract class for running Valgrind tools. | 222 """Abstract class for running Valgrind tools. |
213 | 223 |
214 Always subclass this and implement ToolSpecificFlags() and | 224 Always subclass this and implement ToolSpecificFlags() and |
215 ExtendOptionParser() for tool-specific stuff. | 225 ExtendOptionParser() for tool-specific stuff. |
216 """ | 226 """ |
217 def __init__(self): | 227 def __init__(self): |
218 super(ValgrindTool, self).__init__() | 228 super(ValgrindTool, self).__init__() |
219 self.RegisterOptionParserHook(ValgrindTool.ExtendOptionParser) | 229 self.RegisterOptionParserHook(ValgrindTool.ExtendOptionParser) |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
864 return ThreadSanitizerRV1Windows() | 874 return ThreadSanitizerRV1Windows() |
865 else: | 875 else: |
866 return ThreadSanitizerRV1Posix() | 876 return ThreadSanitizerRV1Posix() |
867 | 877 |
868 def RV2Factory(self): | 878 def RV2Factory(self): |
869 if common.IsWindows(): | 879 if common.IsWindows(): |
870 return ThreadSanitizerRV2Windows() | 880 return ThreadSanitizerRV2Windows() |
871 else: | 881 else: |
872 return ThreadSanitizerRV2Posix() | 882 return ThreadSanitizerRV2Posix() |
873 | 883 |
| 884 def ToolName(self): |
| 885 return "tsan" |
| 886 |
874 def Main(self, args, check_sanity): | 887 def Main(self, args, check_sanity): |
875 logging.info("Running a TSan + RaceVerifier test. For more information, " + | 888 logging.info("Running a TSan + RaceVerifier test. For more information, " + |
876 "see " + self.MORE_INFO_URL) | 889 "see " + self.MORE_INFO_URL) |
877 cmd1 = self.RV1Factory() | 890 cmd1 = self.RV1Factory() |
878 ret = cmd1.Main(args, check_sanity) | 891 ret = cmd1.Main(args, check_sanity) |
879 # Verify race reports, if there are any. | 892 # Verify race reports, if there are any. |
880 if ret == -1: | 893 if ret == -1: |
881 logging.info("Starting pass 2 of 2. Running the same binary in " + | 894 logging.info("Starting pass 2 of 2. Running the same binary in " + |
882 "RaceVerifier mode to confirm possible race reports.") | 895 "RaceVerifier mode to confirm possible race reports.") |
883 logging.info("For more information, see " + self.MORE_INFO_URL) | 896 logging.info("For more information, see " + self.MORE_INFO_URL) |
884 cmd2 = self.RV2Factory() | 897 cmd2 = self.RV2Factory() |
885 ret = cmd2.Main(args, check_sanity) | 898 ret = cmd2.Main(args, check_sanity) |
886 else: | 899 else: |
887 logging.info("No reports, skipping RaceVerifier second pass") | 900 logging.info("No reports, skipping RaceVerifier second pass") |
888 logging.info("Please see " + self.MORE_INFO_URL + " for more information " + | 901 logging.info("Please see " + self.MORE_INFO_URL + " for more information " + |
889 "on RaceVerifier") | 902 "on RaceVerifier") |
890 return ret | 903 return ret |
891 | 904 |
| 905 def Run(self, args, module): |
| 906 return self.Main(args, False) |
| 907 |
892 | 908 |
893 class ToolFactory: | 909 class ToolFactory: |
894 def Create(self, tool_name): | 910 def Create(self, tool_name): |
895 if tool_name == "memcheck" and not common.IsWine(): | 911 if tool_name == "memcheck" and not common.IsWine(): |
896 return Memcheck() | 912 return Memcheck() |
897 if tool_name == "wine_memcheck" and common.IsWine(): | 913 if tool_name == "wine_memcheck" and common.IsWine(): |
898 return Memcheck() | 914 return Memcheck() |
899 if tool_name == "tsan": | 915 if tool_name == "tsan": |
900 if common.IsWindows(): | 916 if common.IsWindows(): |
901 return ThreadSanitizerWindows() | 917 return ThreadSanitizerWindows() |
902 else: | 918 else: |
903 return ThreadSanitizerPosix() | 919 return ThreadSanitizerPosix() |
904 if tool_name == "drmemory": | 920 if tool_name == "drmemory": |
905 return DrMemory() | 921 return DrMemory() |
906 if tool_name == "tsan_rv": | 922 if tool_name == "tsan_rv": |
907 return RaceVerifier() | 923 return RaceVerifier() |
908 try: | 924 try: |
909 platform_name = common.PlatformNames()[0] | 925 platform_name = common.PlatformNames()[0] |
910 except common.NotImplementedError: | 926 except common.NotImplementedError: |
911 platform_name = sys.platform + "(Unknown)" | 927 platform_name = sys.platform + "(Unknown)" |
912 raise RuntimeError, "Unknown tool (tool=%s, platform=%s)" % (tool_name, | 928 raise RuntimeError, "Unknown tool (tool=%s, platform=%s)" % (tool_name, |
913 platform_name) | 929 platform_name) |
914 | 930 |
915 def RunTool(argv, module): | 931 def CreateTool(tool): |
916 # TODO(timurrrr): customize optparse instead | 932 return ToolFactory().Create(tool) |
917 tool_name = "memcheck" | |
918 args = argv[1:] | |
919 for arg in args: | |
920 if arg.startswith("--tool="): | |
921 tool_name = arg[7:] | |
922 args.remove(arg) | |
923 break | |
924 | 933 |
925 tool = ToolFactory().Create(tool_name) | 934 if __name__ == '__main__': |
926 MODULES_TO_SANITY_CHECK = ["base"] | 935 logging.error(sys.argv[0] + " can not be run from command line") |
927 | 936 sys.exit(1) |
928 # TODO(timurrrr): this is a temporary workaround for http://crbug.com/47844 | |
929 if tool_name == "tsan" and common.IsMac(): | |
930 MODULES_TO_SANITY_CHECK = [] | |
931 | |
932 check_sanity = module in MODULES_TO_SANITY_CHECK | |
933 return tool.Main(args, check_sanity) | |
934 | |
935 if __name__ == "__main__": | |
936 if sys.argv.count("-v") > 0 or sys.argv.count("--verbose") > 0: | |
937 logging_utils.config_root(logging.DEBUG) | |
938 else: | |
939 logging_utils.config_root() | |
940 # TODO(timurrrr): valgrind tools may use -v/--verbose as well | |
941 | |
942 ret = RunTool(sys.argv) | |
943 sys.exit(ret) | |
OLD | NEW |