-
Notifications
You must be signed in to change notification settings - Fork 564
Expand file tree
/
Copy pathNSStreamTest.cs
More file actions
155 lines (139 loc) · 4.16 KB
/
NSStreamTest.cs
File metadata and controls
155 lines (139 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace MonoTouchFixtures.Foundation {
[TestFixture]
[Preserve (AllMembers = true)]
public class NSStreamTest {
[Test]
public void BoundPairTest ()
{
NSInputStream read;
NSOutputStream write;
NSStream.CreateBoundPair (out read, out write, 1024);
read.Open ();
write.Open ();
var send = Encoding.ASCII.GetBytes ("hello, world");
nint n = send.Length;
Assert.AreEqual (n, write.Write (send));
var result = new byte [n + 10];
Assert.AreEqual (n, read.Read (result, (uint) n));
for (int i = 0; i < n; i++)
Assert.AreEqual (send [i], result [i], "Item " + i);
}
TcpListener FindPort (out int port)
{
// This does not work well on watchOS:
// The request to start the tcp listener will fail, but
// at the same time leave a file descriptor (the socket) open
// until the TcpListener is collected by the GC.
// Since we create 3000 TcpListeners here, we end up using
// up all the available file descriptors, causing trouble
// for later tests.
for (port = 3000; port < 6000; port++) {
var listener = new TcpListener (IPAddress.Any, port);
try {
listener.Start ();
return listener;
} catch {
}
}
return null;
}
[Test]
public void ConnectToHost ()
{
NSInputStream read;
NSOutputStream write;
int port;
var listener = FindPort (out port);
if (listener is null) {
Assert.Inconclusive ("Not possible to bind a port");
return;
}
var listenThread = new Thread (new ParameterizedThreadStart (DebugListener));
listenThread.Start (listener);
NSStream.CreatePairWithSocketToHost (new IPEndPoint (IPAddress.Loopback, port), out read, out write);
read.Open ();
write.Open ();
var send = new byte [] { 1, 2, 3, 4, 5 };
Assert.AreEqual ((nint) 5, write.Write (send));
var result = new byte [5];
Assert.AreEqual ((nint) 5, read.Read (result, 5));
for (int i = 0; i < 5; i++)
Assert.AreEqual (send [i] * 10, result [i]);
listenThread.Join ();
listener.Stop ();
read.Close ();
write.Close ();
}
[Test]
public void ConnectToPeer ()
{
int port;
var listener = FindPort (out port);
if (listener is null) {
Assert.Inconclusive ("Not possible to bind a port");
return;
}
Exception ex = null;
var thread = new Thread (() => {
try {
NSInputStream read = null;
NSOutputStream write = null;
var listenThread = new Thread (new ParameterizedThreadStart (DebugListener)) {
IsBackground = true,
};
var listenThreadCompleted = false;
try {
listenThread.Start (listener);
NSStream.CreatePairWithPeerSocketSignature (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp, new IPEndPoint (IPAddress.Loopback, port), out read, out write);
read.Open ();
write.Open ();
var send = new byte [] { 1, 2, 3, 4, 5 };
Assert.AreEqual ((nint) 5, write.Write (send), "Write");
var result = new byte [5];
Assert.AreEqual ((nint) 5, read.Read (result, 5), "Read");
for (int i = 0; i < 5; i++)
Assert.AreEqual (send [i] * 10, result [i], "Item " + i);
listenThreadCompleted = listenThread.Join (TimeSpan.FromSeconds (5));
Assert.That (listenThreadCompleted, Is.True, "Listener thread");
} finally {
listener.Stop ();
read?.Close ();
write?.Close ();
}
} catch (Exception e) {
ex = e;
}
}) {
IsBackground = true,
};
thread.Start ();
Assert.That (thread.Join (TimeSpan.FromSeconds (10)), Is.True, "Background thread completion");
Assert.IsNull (ex, "No exception");
}
void DebugListener (object data)
{
var listener = data as TcpListener;
TcpClient client;
try {
client = listener.AcceptTcpClient ();
} catch (ObjectDisposedException) {
return;
} catch (SocketException) {
return;
} catch (InvalidOperationException) {
return;
}
var stream = client.GetStream ();
byte [] buffer = new byte [512];
if (stream.Read (buffer, 0, 5) == 5) {
stream.Write (new byte [] { 10, 20, 30, 40, 50 }, 0, 5);
stream.Flush ();
}
client.Close ();
}
}
}