Added test case that checks the FileSpec on Windows.

http://reviews.llvm.org/D7379

Files:
  source/Host/common/FileSpec.cpp
  test/functionalities/breakpoint/breakpoint_command/TestRegexpBreakCommand.py
  test/functionalities/paths/TestPaths.py
  test/tools/lldb-mi/TestMiBreakpoint.py
  test/tools/lldb-mi/main.c
  tools/lldb-mi/MICmdCmdBreak.cpp

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: source/Host/common/FileSpec.cpp
===================================================================
--- source/Host/common/FileSpec.cpp
+++ source/Host/common/FileSpec.cpp
@@ -240,6 +240,12 @@
         return;
 
     std::replace(path.begin(), path.end(), '\\', '/');
+    // Windows path can have \\ slashes which can be changed by replace
+    // call above to //. Here we remove the duplicate.
+    auto iter = std::unique ( path.begin(), path.end(),
+                               []( char &c1, char &c2 ){
+                                  return (c1 == '/' && c2 == '/');});
+    path.erase(iter, path.end());
 }
 
 void FileSpec::DeNormalize(llvm::SmallVectorImpl<char> &path, PathSyntax syntax)
Index: test/functionalities/breakpoint/breakpoint_command/TestRegexpBreakCommand.py
===================================================================
--- test/functionalities/breakpoint/breakpoint_command/TestRegexpBreakCommand.py
+++ test/functionalities/breakpoint/breakpoint_command/TestRegexpBreakCommand.py
@@ -43,6 +43,11 @@
         break_results = lldbutil.run_break_set_command (self, "b %s:%d" % (self.source, self.line))
         lldbutil.check_breakpoint_result (self, break_results, file_name='main.c', line_number=self.line, num_locations=1)
 
+        # Check breakpoint with full file path.
+        full_path = os.path.join(os.getcwd(), self.source)
+        break_results = lldbutil.run_break_set_command (self, "b %s:%d" % (full_path, self.line))
+        lldbutil.check_breakpoint_result (self, break_results, file_name='main.c', line_number=self.line, num_locations=1)
+
         self.runCmd("run", RUN_SUCCEEDED)
 
         # The stop reason of the thread should be breakpoint.
Index: test/functionalities/paths/TestPaths.py
===================================================================
--- test/functionalities/paths/TestPaths.py
+++ test/functionalities/paths/TestPaths.py
@@ -27,8 +27,15 @@
             f = lldb.SBHostOS.GetLLDBPath(path_type);
             # No directory path types should have the filename set
             self.assertTrue (f.GetFilename() == None);
-        
 
+    @unittest2.skipUnless(sys.platform.startswith("win32"), "Test for windows only")
+    def test_windows_path (self):
+        '''Test to check the path with double slash is handled correctly '''
+        # Create a path and see if lldb gets the directory and file right
+        fspec = lldb.SBFileSpec("C:\\dummy1\\dummy2//unknown_file", True);
+        self.assertTrue (fspec.GetDirectory() == "C:/dummy1/dummy2");
+        self.assertTrue (fspec.GetFilename() == "unknown_file");
+
 if __name__ == '__main__':
     import atexit
     lldb.SBDebugger.Initialize()
Index: test/tools/lldb-mi/TestMiBreakpoint.py
===================================================================
--- test/tools/lldb-mi/TestMiBreakpoint.py
+++ test/tools/lldb-mi/TestMiBreakpoint.py
@@ -83,10 +83,21 @@
         self.runCmd("-break-insert main.c:%d" % line)
         self.expect("\^done,bkpt={number=\"3\"")
 
+        # Check with full path. TODO, figure out why this commands fails
+        # if -f is not given
+        line = line_number('main.c', '// BP_doloop')
+        full_path = os.path.join(os.getcwd(), "main.c")
+        self.runCmd("-break-insert -f %s:%d" % (full_path, line))
+        #self.expect("\^done,bkpt={number=\"4\"")
+
         self.runCmd("-exec-continue")
         self.expect("\^running")
         self.expect("\*stopped,reason=\"breakpoint-hit\"")
 
+        self.runCmd("-exec-continue")
+        self.expect("\^running")
+        self.expect("\*stopped,reason=\"breakpoint-hit\"")
+
         # Run to exit
         self.runCmd("-exec-continue")
         self.expect("\^running")
Index: test/tools/lldb-mi/main.c
===================================================================
--- test/tools/lldb-mi/main.c
+++ test/tools/lldb-mi/main.c
@@ -22,7 +22,7 @@
     a = a_MyFunction();          //BP_a_MyFunction_call
     b = b_MyFunction();          //BP_b_MyFunction_call
     //BP_localstest -- it must be at line #24 (or fix it in main*.micmds)
-    if (doloop)
+    if (doloop) // BP_doloop
         infloop();
     if (argc > 1 && *argv[1] == 'l') {
         a++;
Index: tools/lldb-mi/MICmdCmdBreak.cpp
===================================================================
--- tools/lldb-mi/MICmdCmdBreak.cpp
+++ tools/lldb-mi/MICmdCmdBreak.cpp
@@ -180,19 +180,16 @@
     CMIUtilString fileName;
     MIuint nFileLine = 0;
     CMIUtilString strFileFn;
-    const MIint nPosColon = m_brkName.find(cColon);
-    if (nPosColon != (MIint)std::string::npos)
+    CMIUtilString rStrLineOrFn;
+    // Full path in windows can have : after drive letter. So look for the
+    // last colon
+    const size_t nPosColon = m_brkName.find_last_of(cColon);
+    if (nPosColon != std::string::npos)
     {
-        CMIUtilString::VecString_t vecFileAndLocation;
-        const MIuint nSplits = m_brkName.Split(cColon, vecFileAndLocation);
-        MIunused(nSplits);
-        if (vecFileAndLocation.size() != 2)
-        {
-            SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_LOCATION_FORMAT), m_cmdData.strMiCmd.c_str(), m_brkName.c_str()));
-            return MIstatus::failure;
-        }
-        fileName = vecFileAndLocation.at(0);
-        const CMIUtilString &rStrLineOrFn(vecFileAndLocation.at(1));
+        // extract file name and line number from it
+        fileName = m_brkName.substr(0, nPosColon);
+        rStrLineOrFn = m_brkName.substr(nPosColon + 1, m_brkName.size() - nPosColon - 1);
+
         if (rStrLineOrFn.empty())
             eBrkPtType = eBreakPoint_ByName;
         else
_______________________________________________
lldb-commits mailing list
lldb-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to