32 lines
1.2 KiB
Go
32 lines
1.2 KiB
Go
package controller
|
|
|
|
import "testing"
|
|
|
|
func TestValidateStrictJSONEncoding(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
body []byte
|
|
wantErr bool
|
|
}{
|
|
{"обычный UTF-8", []byte(`{"password":"пароль"}`), false},
|
|
{"настоящий U+FFFD", []byte(`{"password":"abcde�"}`), false},
|
|
{"валидная surrogate pair", []byte(`{"value":"\uD83D\uDE00"}`), false},
|
|
{"экранированный обратный слеш", []byte(`{"value":"\\uD800"}`), false},
|
|
{"байт FF", []byte{'{', '"', 'x', '"', ':', '"', 0xFF, '"', '}'}, true},
|
|
{"оборванный UTF-8", []byte{'{', '"', 'x', '"', ':', '"', 0xC3, '"', '}'}, true},
|
|
{"UTF-8 суррогата", []byte{'{', '"', 'x', '"', ':', '"', 0xED, 0xA0, 0x80, '"', '}'}, true},
|
|
{"непарный старший", []byte(`{"value":"\uD800"}`), true},
|
|
{"старший перед обычным", []byte(`{"value":"\uD800\u0041"}`), true},
|
|
{"непарный младший", []byte(`{"value":"\uDC00"}`), true},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
gotErr := validateStrictJSONEncoding(test.body) != nil
|
|
if gotErr != test.wantErr {
|
|
t.Fatalf("ошибка=%v, ожидалась=%v", gotErr, test.wantErr)
|
|
}
|
|
})
|
|
}
|
|
}
|