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