xamarin-macios/tests/monotouch-test/Foundation/NSStreamTest.cs

141 строка
3.5 KiB
C#
Исходник Обычный вид История

2016-05-26 16:06:52 +03:00
using System;
using NUnit.Framework;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
#if XAMCORE_2_0
using CoreFoundation;
using Foundation;
#else
using MonoTouch.CoreFoundation;
using MonoTouch.Foundation;
#endif
namespace MonoTouchFixtures.Foundation {
[TestFixture]
public class AA_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");
var 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);
}
#if !__WATCHOS__
2016-05-26 16:06:52 +03:00
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.
2016-05-26 16:06:52 +03:00
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 == 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 (5, write.Write (send));
var result = new byte [5];
Assert.AreEqual (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 ()
{
NSInputStream read;
NSOutputStream write;
int port;
var listener = FindPort (out port);
if (listener == null) {
Assert.Inconclusive ("Not possible to bind a port");
return;
}
var listenThread = new Thread (new ParameterizedThreadStart (DebugListener));
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 (5, write.Write (send));
var result = new byte [5];
Assert.AreEqual (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 ();
}
void DebugListener (object data)
{
var listener = data as TcpListener;
var client = listener.AcceptTcpClient();
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 ();
}
#endif // !__WATCHOS__
2016-05-26 16:06:52 +03:00
}
}