@@ -2,6 +2,7 @@ package cli_test
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
"io"
6
7
"net"
7
8
"os"
@@ -26,6 +27,36 @@ import (
26
27
"github.com/coder/coder/pty/ptytest"
27
28
)
28
29
30
+ func sshConfigFileNames (t * testing.T ) (sshConfig string , coderConfig string ) {
31
+ t .Helper ()
32
+ tmpdir := t .TempDir ()
33
+ dotssh := filepath .Join (tmpdir , ".ssh" )
34
+ err := os .Mkdir (dotssh , 0o700 )
35
+ require .NoError (t , err )
36
+ n1 := filepath .Join (dotssh , "config" )
37
+ n2 := filepath .Join (dotssh , "coder" )
38
+ return n1 , n2
39
+ }
40
+
41
+ func sshConfigFileCreate (t * testing.T , name string , data io.Reader ) {
42
+ t .Helper ()
43
+ t .Logf ("Writing %s" , name )
44
+ f , err := os .Create (name )
45
+ require .NoError (t , err )
46
+ n , err := io .Copy (f , data )
47
+ t .Logf ("Wrote %d" , n )
48
+ require .NoError (t , err )
49
+ err = f .Close ()
50
+ require .NoError (t , err )
51
+ }
52
+
53
+ func sshConfigFileRead (t * testing.T , name string ) string {
54
+ t .Helper ()
55
+ b , err := os .ReadFile (name )
56
+ require .NoError (t , err )
57
+ return string (b )
58
+ }
59
+
29
60
func TestConfigSSH (t * testing.T ) {
30
61
t .Parallel ()
31
62
@@ -78,13 +109,6 @@ func TestConfigSSH(t *testing.T) {
78
109
t .Cleanup (func () {
79
110
_ = agentCloser .Close ()
80
111
})
81
- tmpdir := t .TempDir ()
82
- tempFile , err := os .CreateTemp (tmpdir , "config" )
83
- require .NoError (t , err )
84
- _ = tempFile .Close ()
85
- coderTempFile , err := os .CreateTemp (tmpdir , "coder" )
86
- require .NoError (t , err )
87
- _ = coderTempFile .Close ()
88
112
resources := coderdtest .AwaitWorkspaceAgents (t , client , workspace .LatestBuild .ID )
89
113
agentConn , err := client .DialWorkspaceAgent (context .Background (), resources [0 ].Agents [0 ].ID , nil )
90
114
require .NoError (t , err )
@@ -111,61 +135,52 @@ func TestConfigSSH(t *testing.T) {
111
135
_ = listener .Close ()
112
136
})
113
137
138
+ sshConfigFile , coderConfigFile := sshConfigFileNames (t )
139
+
114
140
tcpAddr , valid := listener .Addr ().(* net.TCPAddr )
115
141
require .True (t , valid )
116
142
cmd , root := clitest .New (t , "config-ssh" ,
117
143
"--ssh-option" , "HostName " + tcpAddr .IP .String (),
118
144
"--ssh-option" , "Port " + strconv .Itoa (tcpAddr .Port ),
119
- "--ssh-config-file" , tempFile . Name () ,
120
- "--ssh-coder-config-file" , coderTempFile . Name () ,
145
+ "--ssh-config-file" , sshConfigFile ,
146
+ "--test. ssh-coder-config-file" , coderConfigFile ,
121
147
"--skip-proxy-command" )
122
148
clitest .SetupConfig (t , client , root )
123
149
doneChan := make (chan struct {})
124
150
pty := ptytest .New (t )
125
151
cmd .SetIn (pty .Input ())
126
- cmd .SetOut (pty .Output ())
152
+ cmd .SetOut (io . MultiWriter ( pty .Output (), os . Stderr ))
127
153
go func () {
128
154
defer close (doneChan )
129
155
err := cmd .Execute ()
130
156
assert .NoError (t , err )
131
157
}()
158
+
159
+ matches := []struct {
160
+ match , write string
161
+ }{
162
+ {match : "Continue?" , write : "yes" },
163
+ }
164
+ for _ , m := range matches {
165
+ pty .ExpectMatch (m .match )
166
+ pty .WriteLine (m .write )
167
+ }
168
+
132
169
<- doneChan
133
170
134
- t .Log (tempFile .Name ())
171
+ t .Log (coderConfigFile )
172
+ t .Log (sshConfigFileRead (t , coderConfigFile ))
173
+ home := filepath .Dir (filepath .Dir (sshConfigFile ))
135
174
// #nosec
136
- sshCmd := exec .Command ("ssh" , "-F" , tempFile .Name (), "coder." + workspace .Name , "echo" , "test" )
175
+ sshCmd := exec .Command ("ssh" , "-F" , sshConfigFile , "coder." + workspace .Name , "echo" , "test" )
176
+ // Set HOME because coder config is included from ~/.ssh/coder.
177
+ sshCmd .Env = append (sshCmd .Env , fmt .Sprintf ("HOME=%s" , home ))
137
178
sshCmd .Stderr = os .Stderr
138
179
data , err := sshCmd .Output ()
139
180
require .NoError (t , err )
140
181
require .Equal (t , "test" , strings .TrimSpace (string (data )))
141
182
}
142
183
143
- func sshConfigFileNames (t * testing.T ) (sshConfig string , coderConfig string ) {
144
- t .Helper ()
145
- tmpdir := t .TempDir ()
146
- n1 := filepath .Join (tmpdir , "config" )
147
- n2 := filepath .Join (tmpdir , "coder" )
148
- return n1 , n2
149
- }
150
-
151
- func sshConfigFileCreate (t * testing.T , name string , data io.Reader ) {
152
- t .Helper ()
153
- t .Logf ("Writing %s" , name )
154
- f , err := os .Create (name )
155
- require .NoError (t , err )
156
- n , err := io .Copy (f , data )
157
- t .Logf ("Wrote %d" , n )
158
- require .NoError (t , err )
159
- err = f .Close ()
160
- require .NoError (t , err )
161
- }
162
-
163
- func sshConfigFileRead (t * testing.T , name string ) string {
164
- b , err := os .ReadFile (name )
165
- require .NoError (t , err )
166
- return string (b )
167
- }
168
-
169
184
func TestConfigSSH_FileWriteAndOptionsFlow (t * testing.T ) {
170
185
t .Parallel ()
171
186
0 commit comments