mirror of
				https://github.com/go-delve/delve.git
				synced 2025-11-04 06:32:16 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			108 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package terminal
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"net/rpc"
 | 
						|
	"runtime"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/go-delve/delve/pkg/config"
 | 
						|
)
 | 
						|
 | 
						|
type tRule struct {
 | 
						|
	from string
 | 
						|
	to   string
 | 
						|
}
 | 
						|
 | 
						|
type tCase struct {
 | 
						|
	rules []tRule
 | 
						|
	path  string
 | 
						|
	res   string
 | 
						|
}
 | 
						|
 | 
						|
func platformCases() []tCase {
 | 
						|
	casesUnix := []tCase{
 | 
						|
		// Should not depend on separator at the end of rule path
 | 
						|
		{[]tRule{{"/tmp/path", "/new/path2"}}, "/tmp/path/file.go", "/new/path2/file.go"},
 | 
						|
		{[]tRule{{"/tmp/path/", "/new/path2/"}}, "/tmp/path/file.go", "/new/path2/file.go"},
 | 
						|
		{[]tRule{{"/tmp/path/", "/new/path2"}}, "/tmp/path/file.go", "/new/path2/file.go"},
 | 
						|
		{[]tRule{{"/tmp/path", "/new/path2/"}}, "/tmp/path/file.go", "/new/path2/file.go"},
 | 
						|
		// Should apply only for directory names
 | 
						|
		{[]tRule{{"/tmp/path", "/new/path2"}}, "/tmp/path-2/file.go", "/tmp/path-2/file.go"},
 | 
						|
		// First matched rule should be used
 | 
						|
		{[]tRule{
 | 
						|
			{"/tmp/path1", "/new/path1"},
 | 
						|
			{"/tmp/path2", "/new/path2"},
 | 
						|
			{"/tmp/path2", "/new/path3"}}, "/tmp/path2/file.go", "/new/path2/file.go"},
 | 
						|
	}
 | 
						|
	casesLinux := []tCase{
 | 
						|
		// Should be case-sensitive
 | 
						|
		{[]tRule{{"/tmp/path", "/new/path2"}}, "/TmP/path/file.go", "/TmP/path/file.go"},
 | 
						|
	}
 | 
						|
	casesFreebsd := []tCase{
 | 
						|
		// Should be case-sensitive
 | 
						|
		{[]tRule{{"/tmp/path", "/new/path2"}}, "/TmP/path/file.go", "/TmP/path/file.go"},
 | 
						|
	}
 | 
						|
	casesDarwin := []tCase{
 | 
						|
		// Can be either case-sensitive or case-insensitive depending on
 | 
						|
		// filesystem settings, we always treat it as case-sensitive.
 | 
						|
		{[]tRule{{"/tmp/path", "/new/path2"}}, "/TmP/PaTh/file.go", "/TmP/PaTh/file.go"},
 | 
						|
	}
 | 
						|
	casesWindows := []tCase{
 | 
						|
		// Should not depend on separator at the end of rule path
 | 
						|
		{[]tRule{{`c:\tmp\path`, `d:\new\path2`}}, `c:\tmp\path\file.go`, `d:\new\path2\file.go`},
 | 
						|
		{[]tRule{{`c:\tmp\path\`, `d:\new\path2\`}}, `c:\tmp\path\file.go`, `d:\new\path2\file.go`},
 | 
						|
		{[]tRule{{`c:\tmp\path`, `d:\new\path2\`}}, `c:\tmp\path\file.go`, `d:\new\path2\file.go`},
 | 
						|
		{[]tRule{{`c:\tmp\path\`, `d:\new\path2`}}, `c:\tmp\path\file.go`, `d:\new\path2\file.go`},
 | 
						|
		// Should apply only for directory names
 | 
						|
		{[]tRule{{`c:\tmp\path`, `d:\new\path2`}}, `c:\tmp\path-2\file.go`, `c:\tmp\path-2\file.go`},
 | 
						|
		// Should be case-insensitive
 | 
						|
		{[]tRule{{`c:\tmp\path`, `d:\new\path2`}}, `C:\TmP\PaTh\file.go`, `d:\new\path2\file.go`},
 | 
						|
	}
 | 
						|
 | 
						|
	if runtime.GOOS == "windows" {
 | 
						|
		return casesWindows
 | 
						|
	}
 | 
						|
	if runtime.GOOS == "darwin" {
 | 
						|
		return append(casesUnix, casesDarwin...)
 | 
						|
	}
 | 
						|
	if runtime.GOOS == "linux" {
 | 
						|
		return append(casesUnix, casesLinux...)
 | 
						|
	}
 | 
						|
	if runtime.GOOS == "freebsd" {
 | 
						|
		return append(casesUnix, casesFreebsd...)
 | 
						|
	}
 | 
						|
	return casesUnix
 | 
						|
}
 | 
						|
 | 
						|
func TestSubstitutePath(t *testing.T) {
 | 
						|
	for _, c := range platformCases() {
 | 
						|
		var subRules config.SubstitutePathRules
 | 
						|
		for _, r := range c.rules {
 | 
						|
			subRules = append(subRules, config.SubstitutePathRule{From: r.from, To: r.to})
 | 
						|
		}
 | 
						|
		res := New(nil, &config.Config{SubstitutePath: subRules}).substitutePath(c.path)
 | 
						|
		if c.res != res {
 | 
						|
			t.Errorf("terminal.SubstitutePath(%q) => %q, want %q", c.path, res, c.res)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestIsErrProcessExited(t *testing.T) {
 | 
						|
	tests := []struct {
 | 
						|
		name   string
 | 
						|
		err    error
 | 
						|
		result bool
 | 
						|
	}{
 | 
						|
		{"empty error", errors.New(""), false},
 | 
						|
		{"non-ServerError", errors.New("Process 33122 has exited with status 0"), false},
 | 
						|
		{"ServerError with zero status", rpc.ServerError("Process 33122 has exited with status 0"), true},
 | 
						|
		{"ServerError with non-zero status", rpc.ServerError("Process 2 has exited with status 25"), true},
 | 
						|
	}
 | 
						|
	for _, test := range tests {
 | 
						|
		if isErrProcessExited(test.err) != test.result {
 | 
						|
			t.Error(test.name)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |