public void Start()
		{
			_sharedBuffer = new RingBufferStream();

			_writer = new InternalBigEndianWriter((b,off,c) =>
			{
				_sharedBuffer.Insert(b, off, c);
			});

			_reader = new InternalBigEndianReader(_sharedBuffer);
		}
        public async Task GC_min_allocation_test()
        {
            Console.WriteLine("GC_min_allocation_test Starting...");
//			await Task.Delay(3000);

            Console.WriteLine("Started");

            var  cancelationTokenSource = new CancellationTokenSource();
            var  rbuffer = new RingBufferStream(cancelationTokenSource.Token);
            bool done    = false;

            const int mod            = 37;
            var       producerBuffer = new byte[10];

            var watch = Stopwatch.StartNew();

            // long iterations = 1000000000000000000;
            long iterations = 100000000;

            var producerTask = Task.Run(async() =>
            {
                for (var i = 0L; i < iterations; i += 10L)
                {
                    producerBuffer[0] = (byte)(i % mod);
                    producerBuffer[1] = (byte)((i + 1) % mod);
                    producerBuffer[2] = (byte)((i + 2) % mod);
                    producerBuffer[3] = (byte)((i + 3) % mod);
                    producerBuffer[4] = (byte)((i + 4) % mod);
                    producerBuffer[5] = (byte)((i + 5) % mod);
                    producerBuffer[6] = (byte)((i + 6) % mod);
                    producerBuffer[7] = (byte)((i + 7) % mod);
                    producerBuffer[8] = (byte)((i + 8) % mod);
                    producerBuffer[9] = (byte)((i + 9) % mod);

                    await rbuffer.Insert(producerBuffer, 0, producerBuffer.Length);
                }

                done = true;
            });

            var temp = new byte[199];

            var consumerTask = Task.Run(async() =>
            {
                int totalRead = 0;
                while (true)
                {
//					await Task.Delay(_rnd.Next(10));

                    // Console.WriteLine("will read...");

                    var read   = rbuffer.Read(temp, 0, temp.Length);
                    totalRead += read;

                    if (read == 0)
                    {
                        continue;
                    }

                    // Console.WriteLine("[Dump] read: " + read + " total " + totalRead);// + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]");

                    if (done && rbuffer.Position == rbuffer.Length)
                    {
                        break;
                    }
                }
                Console.WriteLine("Done");
            });

            Task.WaitAll(producerTask, consumerTask);
            watch.Stop();
            // Console.WriteLine("Checking consistency...");

            Console.WriteLine("Completed in " + watch.Elapsed.TotalMilliseconds + "ms");
        }
        public async Task Fast_producer_slow_consumer()
        {
            Console.WriteLine("Fast_producer_slow_consumer");

            var  cancelationTokenSource = new CancellationTokenSource();
            var  rbuffer = new RingBufferStream(cancelationTokenSource.Token);
            bool done    = false;

            const int mod = 37;

            var producerTask = Task.Run(async() =>
            {
                for (int i = 0; i < 1024 * 1000; i += 10)
                {
                    var buffer = new []
                    {
                        (byte)(i % mod),
                        (byte)((i + 1) % mod),
                        (byte)((i + 2) % mod),
                        (byte)((i + 3) % mod),
                        (byte)((i + 4) % mod),
                        (byte)((i + 5) % mod),
                        (byte)((i + 6) % mod),
                        (byte)((i + 7) % mod),
                        (byte)((i + 8) % mod),
                        (byte)((i + 9) % mod),
                    };

                    await rbuffer.Insert(buffer, 0, buffer.Length);
                }

                done = true;
            });

            var consumed = new List <byte>(capacity: 1024 * 1000);

            var consumerTask = Task.Run(async() =>
            {
                int totalRead = 0;
                while (true)
                {
                    await Task.Delay(_rnd.Next(10));

//					Console.WriteLine("will read...");
                    var temp   = new byte[199];
                    var read   = rbuffer.Read(temp, 0, temp.Length);
                    totalRead += read;

                    if (read == 0)
                    {
                        continue;
                    }

                    for (int i = 0; i < read; i++)
                    {
                        consumed.Add(temp[i]);
                    }

                    // Console.WriteLine("[Dump] read: " + read + " total " + totalRead);// + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]");

                    if (done && rbuffer.Position == rbuffer.Length)
                    {
                        break;
                    }
                }
                Console.WriteLine("Done");
            });

            Task.WaitAll(producerTask, consumerTask);

            Console.WriteLine("Checking consistency...");

            for (int i = 0; i < consumed.Count; i++)
            {
                var isValid = consumed[i] == i % mod;
                isValid.Should().BeTrue();
            }

            Console.WriteLine("Completed");
        }
Beispiel #4
0
        public async Task TestClient()
        {
            var inputStream  = new RingBufferStream(100000, false);
            var outputStream = new RingBufferStream(100000, false);

            // The streams aren't readable until there is data,
            // so add something before constructing the stream readers.
            inputStream.WriteByte(0);
            outputStream.WriteByte(0);

            var inputWriter  = new StreamWriter(inputStream);
            var outputReader = new StreamReader(outputStream);

            var client = new IrcClient(new StreamReader(inputStream),
                                       new StreamWriter(outputStream));

            // Undo the hack
            inputStream.ReadByte();
            outputStream.ReadByte();

            client.EnableCtcpPingVersion()
            .EnablePingHandler()
            .EnableChannelTracker();

            client.RateLimiter = new TokenBucketRateLimiter(20, 30);

            await client.Register("someone", "someone", "someone");

            Assert.Equal("NICK someone", outputReader.ReadLine());
            Assert.Equal("USER someone 8 * :someone", outputReader.ReadLine());

            inputWriter.WriteLine(":example.com 001 someone :Welcome");
            inputWriter.WriteLine(":example.com 002 someone :Host is fake");
            inputWriter.WriteLine(":example.com 003 someone :Created sometime");
            inputWriter.WriteLine(":example.com 004 someone :Nothing useful");
            inputWriter.Flush();

            await client.WaitReply(NumericalReplyCodes.RPL_WELCOME, 1000);

            Assert.Equal("someone", client.ClientId.Nickname);

            inputWriter.WriteLine(":example.com 375 someone :- Hello");
            inputWriter.WriteLine(":example.com 372 someone :- blah blah blah");
            inputWriter.WriteLine(":example.com 376 someone :End MOTD");
            inputWriter.Flush();

            await client.WaitReply(NumericalReplyCodes.RPL_ENDOFMOTD, 1000);

            await client.Join(new[] { "#test" });

            Assert.StartsWith("JOIN #test", outputReader.ReadLine());

            inputWriter.WriteLine(":[email protected] JOIN :#test");
            inputWriter.Flush();

            var message = await client.ReadMessage();

            Assert.Equal("#test", message.TargetLower);

            await client.Privmsg("#test", "hello world!");

            Assert.StartsWith("PRIVMSG #test :hello world!", outputReader.ReadLine());

            inputWriter.WriteLine("@display-name=Fred :[email protected] PRIVMSG #test :hey");
            inputWriter.Flush();
            message = await client.ReadMessage();

            Assert.Equal("Fred", message.Tags["display-name"]);
            Assert.Equal("~fred", message.Prefix.ClientId.User);
            Assert.Equal("PRIVMSG", message.Command);
            Assert.Equal("hey", message.TrailingParameter);

            inputWriter.WriteLine(":example.com PING :abc");
            inputWriter.Flush();
            await client.ProcessOnce();

            Assert.Equal("PONG :abc", outputReader.ReadLine());

            inputWriter.WriteLine(":[email protected] PRIVMSG someone :\u0001VERSION\u0001");
            inputWriter.Flush();
            await client.ProcessOnce();

            Assert.StartsWith("NOTICE drone :\u0001VERSION ", outputReader.ReadLine());

            inputWriter.WriteLine(":[email protected] PRIVMSG someone :\u0001PING abc\u0001");
            inputWriter.Flush();
            await client.ProcessOnce();

            Assert.Equal("NOTICE drone :\u0001PING abc\u0001", outputReader.ReadLine());
        }
		public async Task Fast_producer_slow_consumer()
		{
			Console.WriteLine("Fast_producer_slow_consumer");

			var cancelationTokenSource = new CancellationTokenSource();
			var rbuffer = new RingBufferStream(cancelationTokenSource.Token);
			bool done = false;

			const int mod = 37;

			var producerTask = Task.Run(async () =>
			{
				for (int i = 0; i < 1024*1000; i += 10)
				{
					var buffer = new []
					{
						(byte) (i%mod), 
						(byte) ((i + 1) %mod),
						(byte) ((i + 2) %mod),
						(byte) ((i + 3) %mod),
						(byte) ((i + 4) %mod),
						(byte) ((i + 5) %mod),
						(byte) ((i + 6) %mod),
						(byte) ((i + 7) %mod),
						(byte) ((i + 8) %mod),
						(byte) ((i + 9) %mod),
					};

					await rbuffer.Insert(buffer, 0, buffer.Length);
				}

				done = true;
			});

			var consumed = new List<byte>(capacity: 1024 * 1000);

			var consumerTask = Task.Run(async () =>
			{
				int totalRead = 0;
				while (true)
				{
					await Task.Delay(_rnd.Next(10));

//					Console.WriteLine("will read...");
					var temp = new byte[199];
					var read = rbuffer.Read(temp, 0, temp.Length);
					totalRead += read;

					if (read == 0) continue;

					for (int i = 0; i < read; i++)
					{
						consumed.Add(temp[i]);
					}

					// Console.WriteLine("[Dump] read: " + read + " total " + totalRead);// + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]");

					if (done && rbuffer.Position == rbuffer.Length)
					{
						break;
					}
				}
				Console.WriteLine("Done");
			});

			Task.WaitAll(producerTask, consumerTask);

			Console.WriteLine("Checking consistency...");

			for (int i = 0; i < consumed.Count; i++)
			{
				var isValid = consumed[i] == i % mod;
				isValid.Should().BeTrue();
			}

			Console.WriteLine("Completed");
		}
		public async Task GC_min_allocation_test()
		{
			Console.WriteLine("GC_min_allocation_test Starting...");
//			await Task.Delay(3000);

			Console.WriteLine("Started");

			var cancelationTokenSource = new CancellationTokenSource();
			var rbuffer = new RingBufferStream(cancelationTokenSource.Token);
			bool done = false;

			const int mod = 37;
			var producerBuffer = new byte[10];

			var watch = Stopwatch.StartNew();

			// long iterations = 1000000000000000000;
			long iterations = 100000000;

			var producerTask = Task.Run(async () =>
			{
				for (var i = 0L; i < iterations; i += 10L)
				{
					producerBuffer[0] = (byte) (i % mod);
					producerBuffer[1] = (byte) ((i + 1) % mod);
					producerBuffer[2] = (byte) ((i + 2) % mod);
					producerBuffer[3] = (byte) ((i + 3) % mod);
					producerBuffer[4] = (byte) ((i + 4) % mod);
					producerBuffer[5] = (byte) ((i + 5) % mod);
					producerBuffer[6] = (byte) ((i + 6) % mod);
					producerBuffer[7] = (byte) ((i + 7) % mod);
					producerBuffer[8] = (byte) ((i + 8) % mod);
					producerBuffer[9] = (byte) ((i + 9) % mod);

					await rbuffer.Insert(producerBuffer, 0, producerBuffer.Length);
				}

				done = true;
			});

			var temp = new byte[199];

			var consumerTask = Task.Run(async () =>
			{
				int totalRead = 0;
				while (true)
				{
//					await Task.Delay(_rnd.Next(10));

					// Console.WriteLine("will read...");
					
					var read = rbuffer.Read(temp, 0, temp.Length);
					totalRead += read;

					if (read == 0) continue;

					// Console.WriteLine("[Dump] read: " + read + " total " + totalRead);// + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]");

					if (done && rbuffer.Position == rbuffer.Length)
					{
						break;
					}
				}
				Console.WriteLine("Done");
			});

			Task.WaitAll(producerTask, consumerTask);
			watch.Stop();
			// Console.WriteLine("Checking consistency...");

			Console.WriteLine("Completed in " + watch.Elapsed.TotalMilliseconds + "ms");
		}
		public async Task Variable_size_writes_slow_consumer()
		{
			Console.WriteLine("Variable_size_writes_slow_consumer");

			var cancelationTokenSource = new CancellationTokenSource();
			var rbuffer = new RingBufferStream(cancelationTokenSource.Token);
			bool done = false;

			const int mod = 37;
			const int sizeOfSet = 1024*100;

			var producerTask = Task.Run(async () =>
			{
				int stepAndBufferSize = 0;
				for (int i = 0; i < sizeOfSet; i += stepAndBufferSize)
				{
					var buffer = new[]
					{
						(byte) (i%mod), 
						(byte) ((i + 1) %mod),
						(byte) ((i + 2) %mod),
						(byte) ((i + 3) %mod),
						(byte) ((i + 4) %mod),
						(byte) ((i + 5) %mod),
						(byte) ((i + 6) %mod),
						(byte) ((i + 7) %mod),
						(byte) ((i + 8) %mod),
						(byte) ((i + 9) %mod),
						(byte) ((i + 10) %mod),
						(byte) ((i + 11) %mod),
						(byte) ((i + 12) %mod),
						(byte) ((i + 13) %mod),
						(byte) ((i + 14) %mod),
						(byte) ((i + 15) %mod),
						(byte) ((i + 16) %mod),
						(byte) ((i + 17) %mod),
						(byte) ((i + 18) %mod),
						(byte) ((i + 19) %mod),
						(byte) ((i + 20) %mod),
						(byte) ((i + 21) %mod),
						(byte) ((i + 22) %mod),
						(byte) ((i + 23) %mod),
						(byte) ((i + 24) %mod),
						(byte) ((i + 25) %mod),
						(byte) ((i + 26) %mod),
						(byte) ((i + 27) %mod),
						(byte) ((i + 28) %mod),
						(byte) ((i + 29) %mod),
					};

					stepAndBufferSize = _rnd.Next(buffer.Length);

					await rbuffer.Insert(buffer, 0, stepAndBufferSize);
				}

				done = true;
			});

			var consumed = new List<byte>(capacity: sizeOfSet);

			var consumerTask = Task.Run(async () =>
			{
				int totalRead = 0;
				while (true)
				{
					await Task.Delay(_rnd.Next(10));

					// Console.WriteLine("will read...");
					var temp = new byte[400];

					var readSize = _rnd.Next(temp.Length - 1) + 1;

					var read = rbuffer.Read(temp, 0, readSize);
					totalRead += read;

					if (read == 0) continue;

					for (int i = 0; i < read; i++)
					{
						consumed.Add(temp[i]);
					}

//					Console.WriteLine("[Dump] read: " + read + " total " + totalRead);// + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]");

					if (done && rbuffer.Position == rbuffer.Length)
					{
						break;
					}
				}
				Console.WriteLine("Done");
			});

			Task.WaitAll(producerTask, consumerTask);

			Console.WriteLine("Checking consistency...");

			for (int i = 0; i < consumed.Count; i++)
			{
				var isValid = consumed[i] == i % mod;
				isValid.Should().BeTrue();
			}

			Console.WriteLine("Completed");
		}
		public async Task Insert_1_byte_by_1()
		{
			Console.WriteLine("Insert_1_byte_by_1");

			var cancelationTokenSource = new CancellationTokenSource();
			var rbuffer = new RingBufferStream(cancelationTokenSource.Token);

			int expectedLast = 0;

			for (int i = 0; i < 1024 * 100; i++)
			{
				await rbuffer.Insert(new[] { (byte)(i % 256) }, 0, 1);

				if (i % 99 == 0)
				{
					var temp = new byte[101];
					var read = rbuffer.Read(temp, 0, temp.Length);

					Console.WriteLine("[Dump] read: " + read + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]");

					if (i == 0)
					{
						read.Should().Be(1);
						temp[read - 1].Should().Be((byte)expectedLast);
					}
					else
					{
						read.Should().Be(99);
						temp[read - 1].Should().Be((byte)expectedLast);
					}
					expectedLast += 99;
					expectedLast %= 256;
				}
			}

			{
				var temp = new byte[101];
				var read = rbuffer.Read(temp, 0, temp.Length);
				Console.WriteLine("[Final] read: " + read + " [" + temp.Aggregate("", (s, b) => s + b + ", ") + "]");
			}
		}