| 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") |
| } |
| } |