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