mirror of https://github.com/pkg/sftp.git
120 lines
3.3 KiB
Go
120 lines
3.3 KiB
Go
package sshfx
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"io"
|
|
"io/fs"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// This string data is copied verbatim from https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-13.txt
|
|
var fxStandardsText = `
|
|
SSH_FX_OK 0
|
|
SSH_FX_EOF 1
|
|
SSH_FX_NO_SUCH_FILE 2
|
|
SSH_FX_PERMISSION_DENIED 3
|
|
SSH_FX_FAILURE 4
|
|
SSH_FX_BAD_MESSAGE 5
|
|
SSH_FX_NO_CONNECTION 6
|
|
SSH_FX_CONNECTION_LOST 7
|
|
SSH_FX_OP_UNSUPPORTED 8
|
|
SSH_FX_INVALID_HANDLE 9
|
|
SSH_FX_NO_SUCH_PATH 10
|
|
SSH_FX_FILE_ALREADY_EXISTS 11
|
|
SSH_FX_WRITE_PROTECT 12
|
|
SSH_FX_NO_MEDIA 13
|
|
SSH_FX_NO_SPACE_ON_FILESYSTEM 14
|
|
SSH_FX_QUOTA_EXCEEDED 15
|
|
SSH_FX_UNKNOWN_PRINCIPAL 16
|
|
SSH_FX_LOCK_CONFLICT 17
|
|
SSH_FX_DIR_NOT_EMPTY 18
|
|
SSH_FX_NOT_A_DIRECTORY 19
|
|
SSH_FX_INVALID_FILENAME 20
|
|
SSH_FX_LINK_LOOP 21
|
|
SSH_FX_CANNOT_DELETE 22
|
|
SSH_FX_INVALID_PARAMETER 23
|
|
SSH_FX_FILE_IS_A_DIRECTORY 24
|
|
SSH_FX_BYTE_RANGE_LOCK_CONFLICT 25
|
|
SSH_FX_BYTE_RANGE_LOCK_REFUSED 26
|
|
SSH_FX_DELETE_PENDING 27
|
|
SSH_FX_FILE_CORRUPT 28
|
|
SSH_FX_OWNER_INVALID 29
|
|
SSH_FX_GROUP_INVALID 30
|
|
SSH_FX_NO_MATCHING_BYTE_RANGE_LOCK 31
|
|
`
|
|
|
|
func TestFxNames(t *testing.T) {
|
|
whitespace := regexp.MustCompile(`[[:space:]]+`)
|
|
|
|
scan := bufio.NewScanner(strings.NewReader(fxStandardsText))
|
|
|
|
for scan.Scan() {
|
|
line := scan.Text()
|
|
if i := strings.Index(line, "//"); i >= 0 {
|
|
line = line[:i]
|
|
}
|
|
|
|
line = strings.TrimSpace(line)
|
|
if line == "" {
|
|
continue
|
|
}
|
|
|
|
fields := whitespace.Split(line, 2)
|
|
if len(fields) < 2 {
|
|
t.Fatalf("unexpected standards text line: %q", line)
|
|
}
|
|
|
|
name, value := fields[0], fields[1]
|
|
n, err := strconv.Atoi(value)
|
|
if err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
fx := Status(n)
|
|
|
|
if got := fx.String(); got != name {
|
|
t.Errorf("fx name mismatch for %d: got %q, but want %q", n, got, name)
|
|
}
|
|
}
|
|
|
|
if err := scan.Err(); err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
}
|
|
|
|
func TestStatusIs(t *testing.T) {
|
|
if !errors.Is(StatusFailure, StatusFailure) {
|
|
t.Error("errors.Is(StatusFailure, StatusFailure) should be true")
|
|
}
|
|
if !errors.Is(StatusFailure, &StatusPacket{StatusCode: StatusFailure}) {
|
|
t.Error("errors.Is(StatusFailure, StatusPacket{StatusFailure}) should be true")
|
|
}
|
|
|
|
if errors.Is(StatusFailure, StatusOK) {
|
|
t.Error("errors.Is(StatusFailure, StatusOK) should not be true")
|
|
}
|
|
if errors.Is(StatusFailure, &StatusPacket{StatusCode: StatusOK}) {
|
|
t.Error("errors.Is(StatusFailure, StatusPacket{StatusOK}) should not be true")
|
|
}
|
|
|
|
/*// This test makes no sense to test, as its behavior is dictated by errors.Is.
|
|
if !errors.Is(StatusOK, nil) {
|
|
t.Error("errors.Is(StatusOK, nil) should be true")
|
|
}
|
|
//*/
|
|
|
|
if !errors.Is(StatusEOF, io.EOF) {
|
|
t.Error("errors.Is(StatusEOF, io.EOF) should be true")
|
|
}
|
|
if !errors.Is(StatusNoSuchFile, fs.ErrNotExist) {
|
|
t.Error("errors.Is(StatusNoSuchFile, fs.ErrNotExist) should be true")
|
|
}
|
|
if !errors.Is(StatusPermissionDenied, fs.ErrPermission) {
|
|
t.Error("errors.Is(StatusPermissionDenied, fs.ErrPermission) should be true")
|
|
}
|
|
}
|