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