1
+ using System ;
2
+ using System . Buffers ;
3
+ using System . IO . Pipelines ;
4
+ using System . Threading . Tasks ;
1
5
using Microsoft . VisualStudio . TestTools . UnitTesting ;
2
6
3
7
namespace RSocket . Tests
4
8
{
5
9
[ TestClass ]
6
10
public class ProtocolTests
7
11
{
12
+ Pipe Pipe = new Pipe ( ) ;
13
+ ReadOnlySequence < byte > Encode ( string value ) => new ReadOnlySequence < byte > ( System . Text . Encoding . UTF8 . GetBytes ( value ) ) ;
14
+ string Decode ( ReadOnlySequence < byte > value ) => System . Text . Encoding . UTF8 . GetString ( value . ToArray ( ) ) ;
15
+ void AssertReaderEmpty ( ) => Assert . IsFalse ( Pipe . Reader . TryRead ( out var readresult ) , "Reader not empty!" ) ;
16
+
17
+
8
18
[ TestMethod ]
9
19
public void SimpleInvariantsTest ( )
10
20
{
11
21
Assert . AreEqual ( 0 , RSocketProtocol . Header . DEFAULT_STREAM , "Default Stream should always be zero." ) ;
12
-
13
22
Assert . AreEqual ( 1 , RSocketProtocol . MAJOR_VERSION , nameof ( RSocketProtocol . MAJOR_VERSION ) ) ;
14
23
Assert . AreEqual ( 0 , RSocketProtocol . MINOR_VERSION , nameof ( RSocketProtocol . MINOR_VERSION ) ) ;
15
- }
16
-
17
- [ TestMethod ]
18
- public void StateMachineBasicTest ( )
19
- {
20
- }
21
-
22
-
23
- [ TestMethod ]
24
- public void SetupValidationTest ( )
25
- {
24
+ AssertReaderEmpty ( ) ;
26
25
}
27
26
28
27
[ TestMethod ]
@@ -84,5 +83,79 @@ public void ExtensionValidationTest()
84
83
{
85
84
}
86
85
86
+ [ TestMethod ]
87
+ public void SetupValidationTest ( )
88
+ {
89
+ var message = Write ( new RSocketProtocol . Setup ( 123 , 456 , nameof ( RSocketProtocol . Setup . MetadataMimeType ) , nameof ( RSocketProtocol . Setup . DataMimeType ) ) ) ;
90
+ var actual = ReadSetup ( ) ;
91
+ Assert . AreEqual ( message . MajorVersion , actual . MajorVersion , nameof ( message . MajorVersion ) ) ;
92
+ Assert . AreEqual ( message . MinorVersion , actual . MinorVersion , nameof ( message . MinorVersion ) ) ;
93
+ Assert . AreEqual ( message . KeepAlive , actual . KeepAlive , nameof ( message . KeepAlive ) ) ;
94
+ Assert . AreEqual ( message . Lifetime , actual . Lifetime , nameof ( message . Lifetime ) ) ;
95
+ CollectionAssert . AreEqual ( ( message . ResumeToken ?? new byte [ 0 ] ) , actual . ResumeToken , nameof ( message . ResumeToken ) ) ;
96
+ Assert . AreEqual ( message . MetadataMimeType , actual . MetadataMimeType , nameof ( message . MetadataMimeType ) ) ;
97
+ Assert . AreEqual ( message . DataMimeType , actual . DataMimeType , nameof ( message . DataMimeType ) ) ;
98
+ AssertReaderEmpty ( ) ;
99
+ }
100
+
101
+ [ TestMethod ]
102
+ public void SetupWithDataMetadataTest ( )
103
+ {
104
+ var test = ( metadata : Encode ( "Test Metadata" ) , data : Encode ( "Test Data" ) ) ;
105
+
106
+ Write ( new RSocketProtocol . Setup ( 123 , 456 , nameof ( RSocketProtocol . Setup . MetadataMimeType ) , nameof ( RSocketProtocol . Setup . DataMimeType ) ) ) ;
107
+ var Neither = ReadSetup ( out var metadata , out var data ) ;
108
+ Assert . AreEqual ( string . Empty , Decode ( metadata ) , $ "{ nameof ( Neither ) } { nameof ( metadata ) } mismatch!") ;
109
+ Assert . AreEqual ( string . Empty , Decode ( data ) , $ "{ nameof ( Neither ) } { nameof ( data ) } mismatch") ;
110
+ AssertReaderEmpty ( ) ;
111
+
112
+ Write ( new RSocketProtocol . Setup ( 123 , 456 , nameof ( RSocketProtocol . Setup . MetadataMimeType ) , nameof ( RSocketProtocol . Setup . DataMimeType ) , data : test . data ) , data : test . data ) ;
113
+ var DataOnly = ReadSetup ( out metadata , out data ) ;
114
+ Assert . AreEqual ( string . Empty , Decode ( metadata ) , $ "{ nameof ( DataOnly ) } { nameof ( metadata ) } mismatch!") ;
115
+ Assert . AreEqual ( Decode ( test . data ) , Decode ( data ) , $ "{ nameof ( DataOnly ) } { nameof ( data ) } mismatch") ;
116
+ AssertReaderEmpty ( ) ;
117
+
118
+ Write ( new RSocketProtocol . Setup ( 123 , 456 , nameof ( RSocketProtocol . Setup . MetadataMimeType ) , nameof ( RSocketProtocol . Setup . DataMimeType ) , metadata : test . metadata ) , metadata : test . metadata ) ;
119
+ var MetadataOnly = ReadSetup ( out metadata , out data ) ;
120
+ Assert . AreEqual ( Decode ( test . metadata ) , Decode ( metadata ) , $ "{ nameof ( MetadataOnly ) } { nameof ( metadata ) } mismatch!") ;
121
+ Assert . AreEqual ( string . Empty , Decode ( data ) , $ "{ nameof ( MetadataOnly ) } { nameof ( data ) } mismatch") ;
122
+ AssertReaderEmpty ( ) ;
123
+
124
+ Write ( new RSocketProtocol . Setup ( 123 , 456 , nameof ( RSocketProtocol . Setup . MetadataMimeType ) , nameof ( RSocketProtocol . Setup . DataMimeType ) , metadata : test . metadata , data : test . data ) , metadata : test . metadata , data : test . data ) ;
125
+ var Both = ReadSetup ( out metadata , out data ) ;
126
+ Assert . AreEqual ( Decode ( test . metadata ) , Decode ( metadata ) , $ "{ nameof ( Both ) } { nameof ( metadata ) } mismatch!") ;
127
+ Assert . AreEqual ( Decode ( test . data ) , Decode ( data ) , $ "{ nameof ( Both ) } { nameof ( data ) } mismatch") ;
128
+ AssertReaderEmpty ( ) ;
129
+ }
130
+
131
+
132
+ #region Read/Write Helpers
133
+ RSocketProtocol . Setup ReadSetup ( ) => ReadSetup ( out var metadata , out var data ) ;
134
+ RSocketProtocol . Setup ReadSetup ( out ReadOnlySequence < byte > metadata , out ReadOnlySequence < byte > data ) { var result = new RSocketProtocol . Setup ( Read ( out var reader , RSocketProtocol . Types . Setup ) , ref reader ) ; result . Read ( ref reader , out metadata , out data ) ; Pipe . Reader . AdvanceTo ( reader . Position ) ; return result ; }
135
+
136
+ RSocketProtocol . Header Read ( out SequenceReader < byte > reader , RSocketProtocol . Types type )
137
+ {
138
+ Assert . IsTrue ( Pipe . Reader . TryRead ( out var result ) , "Failed to read Pipe." ) ;
139
+ var ( Length , IsEndOfMessage ) = RSocketProtocol . MessageFramePeek ( result . Buffer ) ;
140
+ reader = new SequenceReader < byte > ( result . Buffer . Slice ( RSocketProtocol . MESSAGEFRAMESIZE , Length ) ) ;
141
+ var header = new RSocketProtocol . Header ( ref reader , Length ) ;
142
+ Assert . AreEqual ( type , header . Type , "Incorrect Message Type" ) ;
143
+ return header ;
144
+ }
145
+
146
+ RSocketProtocol . Setup Write ( RSocketProtocol . Setup message , ReadOnlySequence < byte > data = default , ReadOnlySequence < byte > metadata = default ) { message . WriteFlush ( Pipe . Writer , data : data , metadata : metadata ) . Wait ( ) ; return message ; }
147
+ //void Write(RSocketProtocol.Lease message) => message.WriteFlush(Writer).Wait();
148
+ //void Write(RSocketProtocol.KeepAlive message) => message.WriteFlush(Writer).Wait();
149
+ //void Write(RSocketProtocol.RequestResponse message) => message.WriteFlush(Writer).Wait();
150
+ //void Write(RSocketProtocol.RequestFireAndForget message) => message.WriteFlush(Writer).Wait();
151
+ //void Write(RSocketProtocol.RequestStream message) => message.WriteFlush(Writer).Wait();
152
+ //void Write(RSocketProtocol.RequestChannel message) => message.WriteFlush(Writer).Wait();
153
+ //void Write(RSocketProtocol.RequestN message) => message.WriteFlush(Writer).Wait();
154
+ //void Write(RSocketProtocol.Cancel message) => message.WriteFlush(Writer).Wait();
155
+ void Write ( RSocketProtocol . Payload message ) => message . WriteFlush ( Pipe . Writer ) . Wait ( ) ;
156
+ //void Write(RSocketProtocol.Error message) => message.WriteFlush(Writer).Wait();
157
+ //void Write(RSocketProtocol.MetadataPush message) => message.WriteFlush(Writer).Wait();
158
+ //void Write(RSocketProtocol.Extension message) => message.WriteFlush(Writer).Wait();
159
+ #endregion
87
160
}
88
- }
161
+ }
0 commit comments