66 lines
1.8 KiB
Go
66 lines
1.8 KiB
Go
package deployment
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/pkg/sftp"
|
|
)
|
|
|
|
func TestSSHCloseHealthyTransportDoesNotReportSFTPShutdownEOF(t *testing.T) {
|
|
factory, server := safetyFactory(t, requestSFTPHandler(sftp.InMemHandler(), false, false))
|
|
client, err := factory.Connect(t.Context(), server)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { _ = client.Close() })
|
|
if err := client.MkdirAll(t.Context(), "/close-check"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := client.Close(); err != nil {
|
|
t.Fatalf("正常关闭连接不得把本机主动关闭产生的错误当作部署失败:%v", err)
|
|
}
|
|
if err := client.Close(); err != nil {
|
|
t.Fatalf("重复关闭应返回相同的成功结果:%v", err)
|
|
}
|
|
}
|
|
|
|
func TestSSHCloseConcurrentCallsShareResult(t *testing.T) {
|
|
factory, server := safetyFactory(t, requestSFTPHandler(sftp.InMemHandler(), false, false))
|
|
client, err := factory.Connect(t.Context(), server)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { _ = client.Close() })
|
|
var calls sync.WaitGroup
|
|
for range 8 {
|
|
calls.Go(func() {
|
|
if err := client.Close(); err != nil {
|
|
t.Errorf("并发关闭不得制造伪失败:%v", err)
|
|
}
|
|
})
|
|
}
|
|
calls.Wait()
|
|
}
|
|
|
|
func TestSSHClosePreservesPriorTransportFailure(t *testing.T) {
|
|
factory, server := safetyFactory(t, requestSFTPHandler(sftp.InMemHandler(), false, false))
|
|
client, err := factory.Connect(t.Context(), server)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { _ = client.Close() })
|
|
adapter := client.(*sshClientAdapter)
|
|
adapter.disconnected.Store(true)
|
|
if err := adapter.ssh.Close(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
first := client.Close()
|
|
if first == nil {
|
|
t.Fatal("既有传输失败不能被正常关闭分支吞掉")
|
|
}
|
|
if second := client.Close(); second != first {
|
|
t.Fatalf("重复关闭必须保留首次失败:%v / %v", first, second)
|
|
}
|
|
}
|