1
+ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
2
+ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
+
4
+ using System ;
5
+ using System . Text ;
6
+ using Xunit ;
7
+
8
+ namespace Microsoft . AspNet . WebSockets . Protocol . Test
9
+ {
10
+ public class Utf8ValidationTests
11
+ {
12
+ [ Theory ]
13
+ [ InlineData ( new byte [ ] { } ) ]
14
+ [ InlineData ( new byte [ ] { 0x48 , 0x65 , 0x6C , 0x6C , 0x6F , 0x20 , 0x57 , 0x6F , 0x72 , 0x6C , 0x64 } ) ] // Hello World
15
+ [ InlineData ( new byte [ ] { 0x48 , 0x65 , 0x6C , 0x6C , 0x6F , 0x2D , 0xC2 , 0xB5 , 0x40 , 0xC3 , 0x9F , 0xC3 , 0xB6 , 0xC3 , 0xA4 , 0xC3 , 0xBC , 0xC3 , 0xA0 , 0xC3 , 0xA1 } ) ] // "Hello-µ@ßöäüàá";
16
+ public void ValidateSingleValidSegments_Valid ( byte [ ] data )
17
+ {
18
+ var state = new Utilities . Utf8MessageState ( ) ;
19
+ Assert . True ( Utilities . TryValidateUtf8 ( new ArraySegment < byte > ( data ) , endOfMessage : true , state : state ) ) ;
20
+ }
21
+
22
+ [ Theory ]
23
+ [ InlineData ( new byte [ ] { } , new byte [ ] { } , new byte [ ] { } ) ]
24
+ [ InlineData ( new byte [ ] { 0x48 , 0x65 , 0x6C , 0x6C , 0x6F , 0x20 } , new byte [ ] { } , new byte [ ] { 0x57 , 0x6F , 0x72 , 0x6C , 0x64 } ) ] // Hello ,, World
25
+ [ InlineData ( new byte [ ] { 0x48 , 0x65 , 0x6C , 0x6C , 0x6F , 0x2D , 0xC2 , } , new byte [ ] { 0xB5 , 0x40 , 0xC3 , 0x9F , 0xC3 , 0xB6 , 0xC3 , 0xA4 , } , new byte [ ] { 0xC3 , 0xBC , 0xC3 , 0xA0 , 0xC3 , 0xA1 } ) ] // "Hello-µ@ßöäüàá";
26
+ public void ValidateMultipleValidSegments_Valid ( byte [ ] data1 , byte [ ] data2 , byte [ ] data3 )
27
+ {
28
+ var state = new Utilities . Utf8MessageState ( ) ;
29
+ Assert . True ( Utilities . TryValidateUtf8 ( new ArraySegment < byte > ( data1 ) , endOfMessage : false , state : state ) ) ;
30
+ Assert . True ( Utilities . TryValidateUtf8 ( new ArraySegment < byte > ( data2 ) , endOfMessage : false , state : state ) ) ;
31
+ Assert . True ( Utilities . TryValidateUtf8 ( new ArraySegment < byte > ( data3 ) , endOfMessage : true , state : state ) ) ;
32
+ }
33
+
34
+ [ Theory ]
35
+ [ InlineData ( new byte [ ] { 0xfe } ) ]
36
+ [ InlineData ( new byte [ ] { 0xff } ) ]
37
+ [ InlineData ( new byte [ ] { 0xfe , 0xfe , 0xff , 0xff } ) ]
38
+ // [InlineData(new byte[] { 0xc0, 0xaf })]
39
+ // [InlineData(new byte[] { 0xe0, 0x80, 0xaf })]
40
+ // [InlineData(new byte[] { 0xf4, 0x90, 0x80, 0x80 })]
41
+ // [InlineData(new byte[] { 0xf0, 0x80, 0x80, 0xaf })]
42
+ // [InlineData(new byte[] { 0xf8, 0x80, 0x80, 0x80, 0xaf })]
43
+ // [InlineData(new byte[] { 0xfc, 0x80, 0x80, 0x80, 0x80, 0xaf })]
44
+ // [InlineData(new byte[] { 0xc1, 0xbf })]
45
+ // [InlineData(new byte[] { 0xed, 0xa0, 0x80, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64 })] // 0xEDA080 decodes to 0xD800, which is a reserved high surrogate character.
46
+ public void ValidateSingleInvalidSegment_Invalid ( byte [ ] data )
47
+ {
48
+ var state = new Utilities . Utf8MessageState ( ) ;
49
+ Assert . False ( Utilities . TryValidateUtf8 ( new ArraySegment < byte > ( data ) , endOfMessage : true , state : state ) ) ;
50
+ }
51
+ /*
52
+ [Theory]
53
+ // [InlineData(true, new byte[] { 0xce, 0xba, 0xe1, 0xbd, 0xb9, 0xcf, 0x83, 0xce, 0xbc, 0xce, 0xb5, 0xf4 }, false, new byte[] { 0x90 }, true, new byte[] { })]
54
+ public void ValidateMultipleInvalidSegments_Invalid(bool valid1, byte[] data1, bool valid2, byte[] data2, bool valid3, byte[] data3)
55
+ {
56
+ var state = new Utilities.Utf8MessageState();
57
+ Assert.True(valid1 == Utilities.TryValidateUtf8(new ArraySegment<byte>(data1), endOfMessage: false, state: state), "1st");
58
+ Assert.True(valid2 == Utilities.TryValidateUtf8(new ArraySegment<byte>(data2), endOfMessage: false, state: state), "2nd");
59
+ Assert.True(valid3 == Utilities.TryValidateUtf8(new ArraySegment<byte>(data3), endOfMessage: true, state: state), "3rd");
60
+ }*/
61
+ }
62
+ }
0 commit comments