diff options
| author | 2023-04-28 01:36:44 +0800 | |
|---|---|---|
| committer | 2023-04-28 01:36:44 +0800 | |
| commit | dd84b9d64fb98746a230cd24233ff50a562c39c9 (patch) | |
| tree | b583261ef00b3afe72ec4d6dacb31e57779a6faf /cli/internal/encoding/gitoutput/validators_test.go | |
| parent | 0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff) | |
| download | HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip | |
Diffstat (limited to 'cli/internal/encoding/gitoutput/validators_test.go')
| -rw-r--r-- | cli/internal/encoding/gitoutput/validators_test.go | 514 |
1 files changed, 514 insertions, 0 deletions
diff --git a/cli/internal/encoding/gitoutput/validators_test.go b/cli/internal/encoding/gitoutput/validators_test.go new file mode 100644 index 0000000..29e1274 --- /dev/null +++ b/cli/internal/encoding/gitoutput/validators_test.go @@ -0,0 +1,514 @@ +package gitoutput + +import ( + "testing" +) + +func Test_checkValid(t *testing.T) { + type args struct { + fieldType Field + value []byte + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "ObjectMode", + args: args{ + fieldType: ObjectMode, + value: []byte("100644"), + }, + wantErr: false, + }, + { + name: "ObjectType", + args: args{ + fieldType: ObjectType, + value: []byte("blob"), + }, + wantErr: false, + }, + { + name: "ObjectName", + args: args{ + fieldType: ObjectName, + value: []byte("8992ebf37df05fc5ff64c0f811a3259adff10d70"), + }, + wantErr: false, + }, + { + name: "ObjectStage", + args: args{ + fieldType: ObjectStage, + value: []byte("0"), + }, + wantErr: false, + }, + { + name: "StatusX", + args: args{ + fieldType: StatusX, + value: []byte("!"), + }, + wantErr: false, + }, + { + name: "StatusY", + args: args{ + fieldType: StatusY, + value: []byte("?"), + }, + wantErr: false, + }, + { + name: "Path", + args: args{ + fieldType: Path, + value: []byte("/hello/world"), + }, + wantErr: false, + }, + { + name: "Unknown", + args: args{ + fieldType: Field(12), + value: []byte("unused"), + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := checkValid(tt.args.fieldType, tt.args.value); (err != nil) != tt.wantErr { + t.Errorf("checkValid() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_checkObjectMode(t *testing.T) { + type args struct { + value []byte + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Simple", + args: args{ + value: []byte("100644"), + }, + wantErr: false, + }, + { + name: "All sevens", + args: args{ + value: []byte("777777"), + }, + wantErr: false, + }, + { + name: "All zeroes", + args: args{ + value: []byte("000000"), + }, + wantErr: false, + }, + { + name: "Non-octal chars", + args: args{ + value: []byte("sixsix"), + }, + wantErr: true, + }, + { + name: "nul", + args: args{ + value: []byte("\000\000\000\000\000\000"), + }, + wantErr: true, + }, + { + name: "too long", + args: args{ + value: []byte("1234567"), + }, + wantErr: true, + }, + { + name: "off by plus one", + args: args{ + value: []byte("888888"), + }, + wantErr: true, + }, + { + name: "off by minus one", + args: args{ + value: []byte("//////"), + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := checkObjectMode(tt.args.value); (err != nil) != tt.wantErr { + t.Errorf("checkObjectMode() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_checkObjectType(t *testing.T) { + type args struct { + value []byte + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Finds blob", + args: args{ + value: []byte("blob"), + }, + wantErr: false, + }, + { + name: "Finds tree", + args: args{ + value: []byte("tree"), + }, + wantErr: false, + }, + { + name: "Finds commit", + args: args{ + value: []byte("commit"), + }, + wantErr: false, + }, + { + name: "nonsense input", + args: args{ + value: []byte("input"), + }, + wantErr: true, + }, + { + name: "Knows too much about the implementation details (all 3)", + args: args{ + value: []byte("blob tree commit"), + }, + wantErr: true, + }, + { + name: "Knows too much about the implementation details (first two)", + args: args{ + value: []byte("blob tree"), + }, + wantErr: true, + }, + { + name: "Knows too much about the implementation details (last two)", + args: args{ + value: []byte("tree commit"), + }, + wantErr: true, + }, + { + name: "Knows too much about the implementation details (arbitrary substring)", + args: args{ + value: []byte("tree c"), + }, + wantErr: true, + }, + { + name: "Knows too much about the implementation details (space)", + args: args{ + value: []byte(" "), + }, + wantErr: true, + }, + { + name: "Knows too much about the implementation details (empty string)", + args: args{ + value: []byte(""), + }, + wantErr: true, + }, + { + name: "Knows too much about the implementation details (leading space)", + args: args{ + value: []byte(" tree"), + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := checkObjectType(tt.args.value); (err != nil) != tt.wantErr { + t.Errorf("checkObjectType() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestCheckObjectName(t *testing.T) { + type args struct { + value []byte + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Simple", + args: args{ + value: []byte("8992ebf37df05fc5ff64c0f811a3259adff10d70"), + }, + wantErr: false, + }, + { + name: "Too short", + args: args{ + value: []byte("8992ebf37df05fc5ff64"), + }, + wantErr: true, + }, + { + name: "Too long", + args: args{ + value: []byte("8992ebf37df05fc5ff64c0f811a3259adff10d708992ebf37df05fc5ff64c0f811a3259adff10d70"), + }, + wantErr: true, + }, + { + name: "Not hex", + args: args{ + value: []byte("z992ebf37df05fc5ff64c0f811a3259adff10d70"), + }, + wantErr: true, + }, + { + name: "Not lowercase", + args: args{ + value: []byte("8992EBF37DF05FC5FF64C0F811A3259ADFF10D70"), + }, + wantErr: true, + }, + { + name: "Off by plus one in the ASCII table (a-f).", + args: args{ + value: []byte("gggggggggggggggggggggggggggggggggggggggg"), + }, + wantErr: true, + }, + { + name: "Off by minus one in the ASCII table (a-f).", + args: args{ + value: []byte("````````````````````````````````````````"), + }, + wantErr: true, + }, + { + name: "Off by minus one in the ASCII table (0-9).", + args: args{ + value: []byte("////////////////////////////////////////"), + }, + wantErr: true, + }, + { + name: "Off by plus one in the ASCII table (0-9).", + args: args{ + value: []byte("::::::::::::::::::::::::::::::::::::::::"), + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := CheckObjectName(tt.args.value); (err != nil) != tt.wantErr { + t.Errorf("CheckObjectName() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_checkObjectStage(t *testing.T) { + type args struct { + value []byte + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "0", + args: args{ + value: []byte("0"), + }, + wantErr: false, + }, + { + name: "1", + args: args{ + value: []byte("1"), + }, + wantErr: false, + }, + { + name: "2", + args: args{ + value: []byte("2"), + }, + wantErr: false, + }, + { + name: "3", + args: args{ + value: []byte("3"), + }, + wantErr: false, + }, + { + name: "/", + args: args{ + value: []byte("/"), + }, + wantErr: true, + }, + { + name: "4", + args: args{ + value: []byte("4"), + }, + wantErr: true, + }, + { + name: "00", + args: args{ + value: []byte("00"), + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := checkObjectStage(tt.args.value); (err != nil) != tt.wantErr { + t.Errorf("checkObjectStage() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_checkStatus(t *testing.T) { + type args struct { + value []byte + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Simple", + args: args{ + value: []byte("D"), + }, + wantErr: false, + }, + { + name: "Space", + args: args{ + value: []byte(" "), + }, + wantErr: false, + }, + { + name: "Empty", + args: args{ + value: []byte(""), + }, + wantErr: true, + }, + { + name: "Too long", + args: args{ + value: []byte("?!"), + }, + wantErr: true, + }, + { + name: "nul", + args: args{ + value: []byte("\000"), + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := checkStatusX(tt.args.value); (err != nil) != tt.wantErr { + t.Errorf("checkStatusX() error = %v, wantErr %v", err, tt.wantErr) + } + if err := checkStatusY(tt.args.value); (err != nil) != tt.wantErr { + t.Errorf("checkStatusY() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_checkPath(t *testing.T) { + type args struct { + value []byte + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Simple", + args: args{ + value: []byte("./"), + }, + wantErr: false, + }, + { + name: "newline", + args: args{ + value: []byte("has\nnewline"), + }, + wantErr: false, + }, + { + name: "Empty", + args: args{ + value: []byte(""), + }, + wantErr: true, + }, + { + name: "newline", + args: args{ + value: []byte("\n"), + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := checkPath(tt.args.value); (err != nil) != tt.wantErr { + t.Errorf("checkPath() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} |
