github.com/bshelton229/agent@v3.5.4+incompatible/bootstrap/ssh_test.go (about)

     1  package bootstrap
     2  
     3  import (
     4  	"path/filepath"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/buildkite/agent/bootstrap/shell"
     9  	"github.com/buildkite/bintest"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func init() {
    14  	sshKeyscanRetryInterval = time.Millisecond
    15  }
    16  
    17  func TestFindingSSHTools(t *testing.T) {
    18  	t.Parallel()
    19  
    20  	sh, err := shell.New()
    21  	if err != nil {
    22  		t.Fatal(err)
    23  	}
    24  
    25  	sh.Logger = shell.TestingLogger{t}
    26  
    27  	_, err = findPathToSSHTools(sh)
    28  	if err != nil {
    29  		t.Fatal(err)
    30  	}
    31  }
    32  
    33  func TestSSHKeyscanReturnsOutput(t *testing.T) {
    34  	t.Parallel()
    35  
    36  	sh := newTestShell(t)
    37  
    38  	keyScan, err := bintest.NewMock("ssh-keyscan")
    39  	if err != nil {
    40  		t.Fatal(err)
    41  	}
    42  	defer keyScan.CheckAndClose(t)
    43  
    44  	sh.Env.Set("PATH", filepath.Dir(keyScan.Path))
    45  
    46  	keyScan.
    47  		Expect("github.com").
    48  		AndWriteToStdout("github.com ssh-rsa xxx=").
    49  		AndExitWith(0)
    50  
    51  	keyScanOutput, err := sshKeyScan(sh, "github.com")
    52  
    53  	assert.Equal(t, keyScanOutput, "github.com ssh-rsa xxx=")
    54  	assert.NoError(t, err)
    55  }
    56  
    57  func TestSSHKeyscanWithHostAndPortReturnsOutput(t *testing.T) {
    58  	t.Parallel()
    59  
    60  	sh := newTestShell(t)
    61  
    62  	keyScan, err := bintest.NewMock("ssh-keyscan")
    63  	if err != nil {
    64  		t.Fatal(err)
    65  	}
    66  	defer keyScan.CheckAndClose(t)
    67  
    68  	sh.Env.Set("PATH", filepath.Dir(keyScan.Path))
    69  
    70  	keyScan.
    71  		Expect("-p", "123", "github.com").
    72  		AndWriteToStdout("github.com ssh-rsa xxx=").
    73  		AndExitWith(0)
    74  
    75  	keyScanOutput, err := sshKeyScan(sh, "github.com:123")
    76  
    77  	assert.Equal(t, keyScanOutput, "github.com ssh-rsa xxx=")
    78  	assert.NoError(t, err)
    79  }
    80  
    81  func TestSSHKeyscanRetriesOnExit1(t *testing.T) {
    82  	t.Parallel()
    83  
    84  	sh := newTestShell(t)
    85  
    86  	keyScan, err := bintest.NewMock("ssh-keyscan")
    87  	if err != nil {
    88  		t.Fatal(err)
    89  	}
    90  	defer keyScan.CheckAndClose(t)
    91  
    92  	sh.Env.Set("PATH", filepath.Dir(keyScan.Path))
    93  
    94  	keyScan.
    95  		Expect("github.com").
    96  		AndWriteToStderr("it failed").
    97  		Exactly(3).
    98  		AndExitWith(1)
    99  
   100  	keyScanOutput, err := sshKeyScan(sh, "github.com")
   101  
   102  	assert.Equal(t, keyScanOutput, "")
   103  	assert.EqualError(t, err, "`ssh-keyscan \"github.com\"` failed")
   104  }
   105  
   106  func TestSSHKeyscanRetriesOnBlankOutputAndExit0(t *testing.T) {
   107  	t.Parallel()
   108  
   109  	sh := newTestShell(t)
   110  
   111  	keyScan, err := bintest.NewMock("ssh-keyscan")
   112  	if err != nil {
   113  		t.Fatal(err)
   114  	}
   115  	defer keyScan.CheckAndClose(t)
   116  
   117  	sh.Env.Set("PATH", filepath.Dir(keyScan.Path))
   118  
   119  	keyScan.
   120  		Expect("github.com").
   121  		AndWriteToStdout("").
   122  		Exactly(3).
   123  		AndExitWith(0)
   124  
   125  	keyScanOutput, err := sshKeyScan(sh, "github.com")
   126  
   127  	assert.Equal(t, keyScanOutput, "")
   128  	assert.EqualError(t, err, "`ssh-keyscan \"github.com\"` returned nothing")
   129  }