github.com/phobos182/packer@v0.2.3-0.20130819023704-c84d2aeffc68/communicator/ssh/communicator_test.go (about) 1 package ssh 2 3 import ( 4 "bytes" 5 "code.google.com/p/go.crypto/ssh" 6 "github.com/mitchellh/packer/packer" 7 "net" 8 "testing" 9 ) 10 11 // private key for mock server 12 const testServerPrivateKey = `-----BEGIN RSA PRIVATE KEY----- 13 MIIEpAIBAAKCAQEA19lGVsTqIT5iiNYRgnoY1CwkbETW5cq+Rzk5v/kTlf31XpSU 14 70HVWkbTERECjaYdXM2gGcbb+sxpq6GtXf1M3kVomycqhxwhPv4Cr6Xp4WT/jkFx 15 9z+FFzpeodGJWjOH6L2H5uX1Cvr9EDdQp9t9/J32/qBFntY8GwoUI/y/1MSTmMiF 16 tupdMODN064vd3gyMKTwrlQ8tZM6aYuyOPsutLlUY7M5x5FwMDYvnPDSeyT/Iw0z 17 s3B+NCyqeeMd2T7YzQFnRATj0M7rM5LoSs7DVqVriOEABssFyLj31PboaoLhOKgc 18 qoM9khkNzr7FHVvi+DhYM2jD0DwvqZLN6NmnLwIDAQABAoIBAQCGVj+kuSFOV1lT 19 +IclQYA6bM6uY5mroqcSBNegVxCNhWU03BxlW//BE9tA/+kq53vWylMeN9mpGZea 20 riEMIh25KFGWXqXlOOioH8bkMsqA8S7sBmc7jljyv+0toQ9vCCtJ+sueNPhxQQxH 21 D2YvUjfzBQ04I9+wn30BByDJ1QA/FoPsunxIOUCcRBE/7jxuLYcpR+JvEF68yYIh 22 atXRld4W4in7T65YDR8jK1Uj9XAcNeDYNpT/M6oFLx1aPIlkG86aCWRO19S1jLPT 23 b1ZAKHHxPMCVkSYW0RqvIgLXQOR62D0Zne6/2wtzJkk5UCjkSQ2z7ZzJpMkWgDgN 24 ifCULFPBAoGBAPoMZ5q1w+zB+knXUD33n1J+niN6TZHJulpf2w5zsW+m2K6Zn62M 25 MXndXlVAHtk6p02q9kxHdgov34Uo8VpuNjbS1+abGFTI8NZgFo+bsDxJdItemwC4 26 KJ7L1iz39hRN/ZylMRLz5uTYRGddCkeIHhiG2h7zohH/MaYzUacXEEy3AoGBANz8 27 e/msleB+iXC0cXKwds26N4hyMdAFE5qAqJXvV3S2W8JZnmU+sS7vPAWMYPlERPk1 28 D8Q2eXqdPIkAWBhrx4RxD7rNc5qFNcQWEhCIxC9fccluH1y5g2M+4jpMX2CT8Uv+ 29 3z+NoJ5uDTXZTnLCfoZzgZ4nCZVZ+6iU5U1+YXFJAoGBANLPpIV920n/nJmmquMj 30 orI1R/QXR9Cy56cMC65agezlGOfTYxk5Cfl5Ve+/2IJCfgzwJyjWUsFx7RviEeGw 31 64o7JoUom1HX+5xxdHPsyZ96OoTJ5RqtKKoApnhRMamau0fWydH1yeOEJd+TRHhc 32 XStGfhz8QNa1dVFvENczja1vAoGABGWhsd4VPVpHMc7lUvrf4kgKQtTC2PjA4xoc 33 QJ96hf/642sVE76jl+N6tkGMzGjnVm4P2j+bOy1VvwQavKGoXqJBRd5Apppv727g 34 /SM7hBXKFc/zH80xKBBgP/i1DR7kdjakCoeu4ngeGywvu2jTS6mQsqzkK+yWbUxJ 35 I7mYBsECgYB/KNXlTEpXtz/kwWCHFSYA8U74l7zZbVD8ul0e56JDK+lLcJ0tJffk 36 gqnBycHj6AhEycjda75cs+0zybZvN4x65KZHOGW/O/7OAWEcZP5TPb3zf9ned3Hl 37 NsZoFj52ponUM6+99A2CmezFCN16c4mbA//luWF+k3VVqR6BpkrhKw== 38 -----END RSA PRIVATE KEY-----` 39 40 // password implements the ClientPassword interface 41 type password string 42 43 func (p password) Password(user string) (string, error) { 44 return string(p), nil 45 } 46 47 var serverConfig = &ssh.ServerConfig{ 48 PasswordCallback: func(c *ssh.ServerConn, user, pass string) bool { 49 return user == "user" && pass == "pass" 50 }, 51 } 52 53 func init() { 54 // Set the private key of the server, required to accept connections 55 if err := serverConfig.SetRSAPrivateKey([]byte(testServerPrivateKey)); err != nil { 56 panic("unable to set private key: " + err.Error()) 57 } 58 } 59 60 func newMockLineServer(t *testing.T) string { 61 l, err := ssh.Listen("tcp", "127.0.0.1:0", serverConfig) 62 if err != nil { 63 t.Fatalf("unable to newMockAuthServer: %s", err) 64 } 65 go func() { 66 defer l.Close() 67 c, err := l.Accept() 68 if err != nil { 69 t.Errorf("Unable to accept incoming connection: %v", err) 70 return 71 } 72 73 if err := c.Handshake(); err != nil { 74 // not Errorf because this is expected to 75 // fail for some tests. 76 t.Logf("Handshaking error: %v", err) 77 return 78 } 79 80 t.Log("Accepted SSH connection") 81 defer c.Close() 82 83 channel, err := c.Accept() 84 if err != nil { 85 t.Errorf("Unable to accept a channel: %s", err) 86 return 87 } 88 89 // Just go in a loop now accepting things... we need to 90 // do this to handle packets for SSH. 91 go func() { 92 c.Accept() 93 }() 94 95 channel.Accept() 96 t.Log("Accepted channel") 97 defer channel.Close() 98 }() 99 return l.Addr().String() 100 } 101 102 func TestCommIsCommunicator(t *testing.T) { 103 var raw interface{} 104 raw = &comm{} 105 if _, ok := raw.(packer.Communicator); !ok { 106 t.Fatalf("comm must be a communicator") 107 } 108 } 109 110 func TestNew_Invalid(t *testing.T) { 111 clientConfig := &ssh.ClientConfig{ 112 User: "user", 113 Auth: []ssh.ClientAuth{ 114 ssh.ClientAuthPassword(password("i-am-invalid")), 115 }, 116 } 117 118 conn := func() (net.Conn, error) { 119 conn, err := net.Dial("tcp", newMockLineServer(t)) 120 if err != nil { 121 t.Fatalf("unable to dial to remote side: %s", err) 122 } 123 return conn, err 124 } 125 126 config := &Config{ 127 Connection: conn, 128 SSHConfig: clientConfig, 129 } 130 131 _, err := New(config) 132 if err == nil { 133 t.Fatal("should have had an error connecting") 134 } 135 } 136 137 func TestStart(t *testing.T) { 138 clientConfig := &ssh.ClientConfig{ 139 User: "user", 140 Auth: []ssh.ClientAuth{ 141 ssh.ClientAuthPassword(password("pass")), 142 }, 143 } 144 145 conn := func() (net.Conn, error) { 146 conn, err := net.Dial("tcp", newMockLineServer(t)) 147 if err != nil { 148 t.Fatalf("unable to dial to remote side: %s", err) 149 } 150 return conn, err 151 } 152 153 config := &Config{ 154 Connection: conn, 155 SSHConfig: clientConfig, 156 } 157 158 client, err := New(config) 159 if err != nil { 160 t.Fatalf("error connecting to SSH: %s", err) 161 } 162 163 var cmd packer.RemoteCmd 164 stdout := new(bytes.Buffer) 165 cmd.Command = "echo foo" 166 cmd.Stdout = stdout 167 168 client.Start(&cmd) 169 }