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  }