103 lines
2.8 KiB
Go
103 lines
2.8 KiB
Go
|
package filexfer
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"errors"
|
||
|
"regexp"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
// This string data is copied verbatim from https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13
|
||
|
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) {
|
||
|
status := StatusFailure
|
||
|
|
||
|
if !errors.Is(status, StatusFailure) {
|
||
|
t.Error("errors.Is(StatusFailure, StatusFailure) != true")
|
||
|
}
|
||
|
if !errors.Is(status, &StatusPacket{StatusCode: StatusFailure}) {
|
||
|
t.Error("errors.Is(StatusFailure, StatusPacket{StatusFailure}) != true")
|
||
|
}
|
||
|
if errors.Is(status, StatusOK) {
|
||
|
t.Error("errors.Is(StatusFailure, StatusFailure) == true")
|
||
|
}
|
||
|
if errors.Is(status, &StatusPacket{StatusCode: StatusOK}) {
|
||
|
t.Error("errors.Is(StatusFailure, StatusPacket{StatusFailure}) == true")
|
||
|
}
|
||
|
}
|