aboutsummaryrefslogtreecommitdiff
path: root/internal/encoding/ssh/filexfer/fxp_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/encoding/ssh/filexfer/fxp_test.go')
-rw-r--r--internal/encoding/ssh/filexfer/fxp_test.go84
1 files changed, 84 insertions, 0 deletions
diff --git a/internal/encoding/ssh/filexfer/fxp_test.go b/internal/encoding/ssh/filexfer/fxp_test.go
new file mode 100644
index 0000000..14e8ff7
--- /dev/null
+++ b/internal/encoding/ssh/filexfer/fxp_test.go
@@ -0,0 +1,84 @@
+package filexfer
+
+import (
+ "bufio"
+ "regexp"
+ "strconv"
+ "strings"
+ "testing"
+)
+
+// This string data is copied verbatim from https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13
+var fxpStandardsText = `
+SSH_FXP_INIT 1
+SSH_FXP_VERSION 2
+SSH_FXP_OPEN 3
+SSH_FXP_CLOSE 4
+SSH_FXP_READ 5
+SSH_FXP_WRITE 6
+SSH_FXP_LSTAT 7
+SSH_FXP_FSTAT 8
+SSH_FXP_SETSTAT 9
+SSH_FXP_FSETSTAT 10
+SSH_FXP_OPENDIR 11
+SSH_FXP_READDIR 12
+SSH_FXP_REMOVE 13
+SSH_FXP_MKDIR 14
+SSH_FXP_RMDIR 15
+SSH_FXP_REALPATH 16
+SSH_FXP_STAT 17
+SSH_FXP_RENAME 18
+SSH_FXP_READLINK 19
+SSH_FXP_SYMLINK 20 // Deprecated in filexfer-13 added from filexfer-02
+SSH_FXP_LINK 21
+SSH_FXP_BLOCK 22
+SSH_FXP_UNBLOCK 23
+
+SSH_FXP_STATUS 101
+SSH_FXP_HANDLE 102
+SSH_FXP_DATA 103
+SSH_FXP_NAME 104
+SSH_FXP_ATTRS 105
+
+SSH_FXP_EXTENDED 200
+SSH_FXP_EXTENDED_REPLY 201
+`
+
+func TestFxpNames(t *testing.T) {
+ whitespace := regexp.MustCompile(`[[:space:]]+`)
+
+ scan := bufio.NewScanner(strings.NewReader(fxpStandardsText))
+
+ 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)
+ }
+
+ fxp := PacketType(n)
+
+ if got := fxp.String(); got != name {
+ t.Errorf("fxp name mismatch for %d: got %q, but want %q", n, got, name)
+ }
+ }
+
+ if err := scan.Err(); err != nil {
+ t.Fatal("unexpected error:", err)
+ }
+}