mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-31 10:47:27 +08:00 
			
		
		
		
	 f8c8b33da3
			
		
	
	f8c8b33da3
	
	
	
		
			
			* Add pprofLabelForThreadNames config The config is a string value that indicates the key of a pprof label whose value should be shown as a goroutine name in the threads view.
		
			
				
	
	
		
			341 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			341 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package dap
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| func TestListConfig(t *testing.T) {
 | |
| 	type args struct {
 | |
| 		args *launchAttachArgs
 | |
| 	}
 | |
| 	tests := []struct {
 | |
| 		name string
 | |
| 		args args
 | |
| 		want string
 | |
| 	}{
 | |
| 		{
 | |
| 			name: "empty",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{},
 | |
| 			},
 | |
| 			want: formatConfig(0, false, false, "", []string{}, false, [][2]string{}),
 | |
| 		},
 | |
| 		{
 | |
| 			name: "default values",
 | |
| 			args: args{
 | |
| 				args: &defaultArgs,
 | |
| 			},
 | |
| 			want: formatConfig(50, false, false, "", []string{}, false, [][2]string{}),
 | |
| 		},
 | |
| 		{
 | |
| 			name: "custom values",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					StackTraceDepth:              35,
 | |
| 					ShowGlobalVariables:          true,
 | |
| 					GoroutineFilters:             "SomeFilter",
 | |
| 					ShowPprofLabels:              []string{"SomeLabel"},
 | |
| 					substitutePathClientToServer: [][2]string{{"hello", "world"}},
 | |
| 					substitutePathServerToClient: [][2]string{{"world", "hello"}},
 | |
| 				},
 | |
| 			},
 | |
| 			want: formatConfig(35, true, false, "SomeFilter", []string{"SomeLabel"}, false, [][2]string{{"hello", "world"}}),
 | |
| 		},
 | |
| 	}
 | |
| 	for _, tt := range tests {
 | |
| 		t.Run(tt.name, func(t *testing.T) {
 | |
| 			if got := listConfig(tt.args.args); got != tt.want {
 | |
| 				t.Errorf("listConfig() = %v, want %v", got, tt.want)
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestConfigureSetSubstitutePath(t *testing.T) {
 | |
| 	type args struct {
 | |
| 		args *launchAttachArgs
 | |
| 		rest string
 | |
| 	}
 | |
| 	tests := []struct {
 | |
| 		name      string
 | |
| 		args      args
 | |
| 		wantRules [][2]string
 | |
| 		wantErr   bool
 | |
| 	}{
 | |
| 		// Test add rule.
 | |
| 		{
 | |
| 			name: "add rule",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{},
 | |
| 					substitutePathServerToClient: [][2]string{},
 | |
| 				},
 | |
| 				rest: "/path/to/client/dir /path/to/server/dir",
 | |
| 			},
 | |
| 			wantRules: [][2]string{{"/path/to/client/dir", "/path/to/server/dir"}},
 | |
| 			wantErr:   false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "add rule (multiple)",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{
 | |
| 						{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 						{"/path/to/client/dir/b", "/path/to/server/dir/b"},
 | |
| 					},
 | |
| 					substitutePathServerToClient: [][2]string{
 | |
| 						{"/path/to/server/dir/a", "/path/to/client/dir/a"},
 | |
| 						{"/path/to/server/dir/b", "/path/to/client/dir/b"},
 | |
| 					},
 | |
| 				},
 | |
| 				rest: "/path/to/client/dir/c /path/to/server/dir/b",
 | |
| 			},
 | |
| 			wantRules: [][2]string{
 | |
| 				{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 				{"/path/to/client/dir/b", "/path/to/server/dir/b"},
 | |
| 				{"/path/to/client/dir/c", "/path/to/server/dir/b"},
 | |
| 			},
 | |
| 			wantErr: false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "add rule from empty string",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{},
 | |
| 					substitutePathServerToClient: [][2]string{},
 | |
| 				},
 | |
| 				rest: `"" /path/to/client/dir`,
 | |
| 			},
 | |
| 			wantRules: [][2]string{{"", "/path/to/client/dir"}},
 | |
| 			wantErr:   false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "add rule to empty string",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{},
 | |
| 					substitutePathServerToClient: [][2]string{},
 | |
| 				},
 | |
| 				rest: `/path/to/client/dir ""`,
 | |
| 			},
 | |
| 			wantRules: [][2]string{{"/path/to/client/dir", ""}},
 | |
| 			wantErr:   false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "add rule from empty string(multiple)",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{
 | |
| 						{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 						{"/path/to/client/dir/b", "/path/to/server/dir/b"},
 | |
| 					},
 | |
| 					substitutePathServerToClient: [][2]string{
 | |
| 						{"/path/to/server/dir/a", "/path/to/client/dir/a"},
 | |
| 						{"/path/to/server/dir/b", "/path/to/client/dir/b"},
 | |
| 					},
 | |
| 				},
 | |
| 				rest: `"" /path/to/client/dir/c`,
 | |
| 			},
 | |
| 			wantRules: [][2]string{
 | |
| 				{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 				{"/path/to/client/dir/b", "/path/to/server/dir/b"},
 | |
| 				{"", "/path/to/client/dir/c"},
 | |
| 			},
 | |
| 			wantErr: false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "add rule to empty string(multiple)",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{
 | |
| 						{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 						{"/path/to/client/dir/b", "/path/to/server/dir/b"},
 | |
| 					},
 | |
| 					substitutePathServerToClient: [][2]string{
 | |
| 						{"/path/to/server/dir/a", "/path/to/client/dir/a"},
 | |
| 						{"/path/to/server/dir/b", "/path/to/client/dir/b"},
 | |
| 					},
 | |
| 				},
 | |
| 				rest: `/path/to/client/dir/c ""`,
 | |
| 			},
 | |
| 			wantRules: [][2]string{
 | |
| 				{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 				{"/path/to/client/dir/b", "/path/to/server/dir/b"},
 | |
| 				{"/path/to/client/dir/c", ""},
 | |
| 			},
 | |
| 			wantErr: false,
 | |
| 		},
 | |
| 		// Test modify rule.
 | |
| 		{
 | |
| 			name: "modify rule",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{{"/path/to/client/dir", "/path/to/server/dir"}},
 | |
| 					substitutePathServerToClient: [][2]string{{"/path/to/server/dir", "/path/to/client/dir"}},
 | |
| 				},
 | |
| 				rest: "/path/to/client/dir /new/path/to/server/dir",
 | |
| 			},
 | |
| 			wantRules: [][2]string{{"/path/to/client/dir", "/new/path/to/server/dir"}},
 | |
| 			wantErr:   false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "modify rule with from as empty string",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{{"", "/path/to/server/dir"}},
 | |
| 					substitutePathServerToClient: [][2]string{{"/path/to/server/dir", ""}},
 | |
| 				},
 | |
| 				rest: `"" /new/path/to/server/dir`,
 | |
| 			},
 | |
| 			wantRules: [][2]string{{"", "/new/path/to/server/dir"}},
 | |
| 			wantErr:   false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "modify rule with to as empty string",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{{"/path/to/client/dir", ""}},
 | |
| 					substitutePathServerToClient: [][2]string{{"", "/path/to/client/dir"}},
 | |
| 				},
 | |
| 				rest: `/path/to/client/dir ""`,
 | |
| 			},
 | |
| 			wantRules: [][2]string{{"/path/to/client/dir", ""}},
 | |
| 			wantErr:   false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "modify rule (multiple)",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{
 | |
| 						{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 						{"/path/to/client/dir/b", "/path/to/server/dir/b"},
 | |
| 						{"/path/to/client/dir/c", "/path/to/server/dir/b"},
 | |
| 					},
 | |
| 					substitutePathServerToClient: [][2]string{
 | |
| 						{"/path/to/server/dir/a", "/path/to/client/dir/a"},
 | |
| 						{"/path/to/server/dir/b", "/path/to/client/dir/b"},
 | |
| 						{"/path/to/server/dir/b", "/path/to/client/dir/c"},
 | |
| 					},
 | |
| 				},
 | |
| 				rest: "/path/to/client/dir/b /new/path",
 | |
| 			},
 | |
| 			wantRules: [][2]string{
 | |
| 				{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 				{"/path/to/client/dir/b", "/new/path"},
 | |
| 				{"/path/to/client/dir/c", "/path/to/server/dir/b"},
 | |
| 			},
 | |
| 			wantErr: false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "modify rule with from as empty string(multiple)",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{
 | |
| 						{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 						{"", "/path/to/server/dir/b"},
 | |
| 						{"/path/to/client/dir/c", "/path/to/server/dir/b"},
 | |
| 					},
 | |
| 					substitutePathServerToClient: [][2]string{
 | |
| 						{"/path/to/server/dir/a", "/path/to/client/dir/a"},
 | |
| 						{"/path/to/server/dir/b", ""},
 | |
| 						{"/path/to/server/dir/b", "/path/to/client/dir/c"},
 | |
| 					},
 | |
| 				},
 | |
| 				rest: `"" /new/path`,
 | |
| 			},
 | |
| 			wantRules: [][2]string{
 | |
| 				{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 				{"", "/new/path"},
 | |
| 				{"/path/to/client/dir/c", "/path/to/server/dir/b"},
 | |
| 			},
 | |
| 			wantErr: false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "modify rule with to as empty string(multiple)",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{
 | |
| 						{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 						{"/path/to/client/dir/b", "/path/to/server/dir/b"},
 | |
| 						{"/path/to/client/dir/c", "/path/to/server/dir/b"},
 | |
| 					},
 | |
| 					substitutePathServerToClient: [][2]string{
 | |
| 						{"/path/to/server/dir/a", "/path/to/client/dir/a"},
 | |
| 						{"/path/to/server/dir/b", "/path/to/client/dir/b"},
 | |
| 						{"/path/to/server/dir/b", "/path/to/client/dir/c"},
 | |
| 					},
 | |
| 				},
 | |
| 				rest: `/path/to/client/dir/b ""`,
 | |
| 			},
 | |
| 			wantRules: [][2]string{
 | |
| 				{"/path/to/client/dir/a", "/path/to/server/dir/a"},
 | |
| 				{"/path/to/client/dir/b", ""},
 | |
| 				{"/path/to/client/dir/c", "/path/to/server/dir/b"},
 | |
| 			},
 | |
| 			wantErr: false,
 | |
| 		},
 | |
| 		// Test delete rule.
 | |
| 		{
 | |
| 			name: "delete rule",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{{"/path/to/client/dir", "/path/to/server/dir"}},
 | |
| 					substitutePathServerToClient: [][2]string{{"/path/to/server/dir", "/path/to/client/dir"}},
 | |
| 				},
 | |
| 				rest: "/path/to/client/dir",
 | |
| 			},
 | |
| 			wantRules: [][2]string{},
 | |
| 			wantErr:   false,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "delete rule, empty string",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{{"", "/path/to/server/dir"}},
 | |
| 					substitutePathServerToClient: [][2]string{{"/path/to/server/dir", ""}},
 | |
| 				},
 | |
| 				rest: `""`,
 | |
| 			},
 | |
| 			wantRules: [][2]string{},
 | |
| 			wantErr:   false,
 | |
| 		},
 | |
| 		// Test invalid input.
 | |
| 		{
 | |
| 			name: "error on delete nonexistent rule",
 | |
| 			args: args{
 | |
| 				args: &launchAttachArgs{
 | |
| 					substitutePathClientToServer: [][2]string{{"/path/to/client/dir", "/path/to/server/dir"}},
 | |
| 					substitutePathServerToClient: [][2]string{{"/path/to/server/dir", "/path/to/client/dir"}},
 | |
| 				},
 | |
| 				rest: "/path/to/server/dir",
 | |
| 			},
 | |
| 			wantRules: [][2]string{{"/path/to/client/dir", "/path/to/server/dir"}},
 | |
| 			wantErr:   true,
 | |
| 		},
 | |
| 	}
 | |
| 	for _, tt := range tests {
 | |
| 		t.Run(tt.name, func(t *testing.T) {
 | |
| 			err := configureSetSubstitutePath(tt.args.args, tt.args.rest)
 | |
| 			if (err != nil) != tt.wantErr {
 | |
| 				t.Errorf("configureSetSubstitutePath() error = %v, wantErr %v", err, tt.wantErr)
 | |
| 				return
 | |
| 			}
 | |
| 			if len(tt.args.args.substitutePathClientToServer) != len(tt.wantRules) {
 | |
| 				t.Errorf("configureSetSubstitutePath() got substitutePathClientToServer=%v, want %d rules", tt.args.args.substitutePathClientToServer, len(tt.wantRules))
 | |
| 				return
 | |
| 			}
 | |
| 			gotClient2Server := tt.args.args.substitutePathClientToServer
 | |
| 			gotServer2Client := tt.args.args.substitutePathServerToClient
 | |
| 			for i, rule := range tt.wantRules {
 | |
| 				if gotClient2Server[i][0] != rule[0] || gotClient2Server[i][1] != rule[1] {
 | |
| 					t.Errorf("configureSetSubstitutePath() got substitutePathClientToServer[%d]=%#v,\n want %#v rules", i, gotClient2Server[i], rule)
 | |
| 				}
 | |
| 				if gotServer2Client[i][1] != rule[0] || gotServer2Client[i][0] != rule[1] {
 | |
| 					reverseRule := [2]string{rule[1], rule[0]}
 | |
| 					t.Errorf("configureSetSubstitutePath() got substitutePathServerToClient[%d]=%#v,\n want %#v rules", i, gotClient2Server[i], reverseRule)
 | |
| 				}
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 |