Author: alanmc
Date: 2008-02-16 15:38:41 -0500 (Sat, 16 Feb 2008)
New Revision: 95919

Modified:
   trunk/bitsharp/src/MonoTorrent.Tests/MonoTorrent.Tests.csproj
   trunk/bitsharp/src/MonoTorrent.Tests/PieceWriterTests.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/ClientEngine.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/DiskManager.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/FileManager.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/DiskWriter.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/IPieceWriter.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/MemoryWriter.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/PieceData.cs
   trunk/bitsharp/src/SampleClient/TestManualConnection.cs
Log:
Fixed several issues with the new memory buffer stuff. Updated the NUnit tests 
and enabled the memory buffer by default.

Modified: trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/ClientEngine.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/ClientEngine.cs   
2008-02-16 20:34:52 UTC (rev 95918)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/ClientEngine.cs   
2008-02-16 20:38:41 UTC (rev 95919)
@@ -41,7 +41,7 @@
 using MonoTorrent.Common;
 using MonoTorrent.Client.Managers;
 using MonoTorrent.Client.Tracker;
-using MonoTorrent.Client.PieceWriter;
+using MonoTorrent.Client.PieceWriters;
 
 namespace MonoTorrent.Client
 {
@@ -189,8 +189,8 @@
                 throw new ArgumentNullException("listener");
 
             // Wrap a memory buffer around the disk writer
-            IPieceWriter writer = new DiskWriter(engineSettings.MaxOpenFiles);
-            //writer = new MemoryWriter(writer);
+            PieceWriter writer = new DiskWriter(engineSettings.MaxOpenFiles);
+            writer = new MemoryWriter(writer);
 
             this.settings = engineSettings;
 

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/DiskManager.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/DiskManager.cs   
2008-02-16 20:34:52 UTC (rev 95918)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/DiskManager.cs   
2008-02-16 20:38:41 UTC (rev 95919)
@@ -6,7 +6,7 @@
 using System.IO;
 using MonoTorrent.Common;
 using MonoTorrent.Client.Messages.Standard;
-using MonoTorrent.Client.PieceWriter;
+using MonoTorrent.Client.PieceWriters;
 
 namespace MonoTorrent.Client.Managers
 {
@@ -20,7 +20,7 @@
 
         private ConnectionMonitor monitor;
         internal RateLimiter rateLimiter;
-        private IPieceWriter writer;
+               private PieceWriter writer;
 
         #endregion Member Variables
 
@@ -73,7 +73,7 @@
 
         #region Constructors
 
-        internal DiskManager(ClientEngine engine, IPieceWriter writer)
+               internal DiskManager(ClientEngine engine, PieceWriter writer)
         {
             this.bufferedReads = new Queue<BufferedFileRead>();
             this.bufferedWrites = new Queue<PieceData>();
@@ -168,7 +168,7 @@
         private void PerformRead(BufferedFileRead io)
         {
             lock (writer)
-                io.BytesRead = writer.Read(io.Manager, io.Buffer, 
io.BufferOffset, io.PieceStartIndex, io.Count);
+                io.BytesRead = writer.ReadChunk(io.Manager, io.Buffer, 
io.BufferOffset, io.PieceStartIndex, io.Count);
             io.WaitHandle.Set();
         }
 
@@ -176,7 +176,7 @@
         internal int Read(FileManager fileManager, byte[] buffer, int 
bufferOffset, long pieceStartIndex, int bytesToRead)
         {
             lock (writer)
-                return writer.Read(fileManager, buffer, bufferOffset, 
pieceStartIndex, bytesToRead);
+                return writer.ReadChunk(fileManager, buffer, bufferOffset, 
pieceStartIndex, bytesToRead);
         }
 
         /// <summary>

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/FileManager.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/FileManager.cs   
2008-02-16 20:34:52 UTC (rev 95918)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/FileManager.cs   
2008-02-16 20:38:41 UTC (rev 95919)
@@ -208,13 +208,14 @@
                     do
                     {
                         bytesToRead = (PieceLength - totalRead) > 
hashBuffer.Count ? hashBuffer.Count : (PieceLength - totalRead);
+                                               bytesToRead = 
Math.Min(bytesToRead, Piece.BlockSize);
 
-                        if ((pieceStartIndex + bytesToRead) > this.fileSize)
-                            bytesToRead -= (int)((pieceStartIndex + 
bytesToRead) - fileSize);
+                        if ((pieceStartIndex + bytesToRead + totalRead) > 
this.fileSize)
+                                                       bytesToRead = 
(int)(fileSize - (pieceStartIndex + totalRead));
 
                         if (asynchronous)
                         {
-                            BufferedFileRead read = new BufferedFileRead(this, 
hashBuffer.Array, hashBuffer.Offset, pieceStartIndex, bytesToRead);
+                            BufferedFileRead read = new BufferedFileRead(this, 
hashBuffer.Array, hashBuffer.Offset, pieceStartIndex + totalRead, bytesToRead);
                             manager.Engine.DiskManager.QueueRead(read);
                             read.WaitHandle.WaitOne();
                             read.WaitHandle.Close();
@@ -222,12 +223,11 @@
                         }
                         else
                         {
-                            bytesRead = manager.Engine.DiskManager.Read(this, 
hashBuffer.Array, hashBuffer.Offset, pieceStartIndex, bytesToRead);
+                            bytesRead = manager.Engine.DiskManager.Read(this, 
hashBuffer.Array, hashBuffer.Offset, pieceStartIndex + totalRead, bytesToRead);
                         }
                         hasher.TransformBlock(hashBuffer.Array, 
hashBuffer.Offset, bytesRead, hashBuffer.Array, hashBuffer.Offset);
                         totalRead += bytesRead;
-                        pieceStartIndex += bytesToRead;
-                    } while (bytesRead != 0 && totalRead != bytesToRead);
+                    } while (bytesRead != 0 && totalRead != PieceLength);
 
 
                     // Compute the hash of the piece

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/DiskWriter.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/DiskWriter.cs 
2008-02-16 20:34:52 UTC (rev 95918)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/DiskWriter.cs 
2008-02-16 20:38:41 UTC (rev 95919)
@@ -4,9 +4,9 @@
 using MonoTorrent.Common;
 using System.IO;
 
-namespace MonoTorrent.Client.PieceWriter
+namespace MonoTorrent.Client.PieceWriters
 {
-    public class DiskWriter : IPieceWriter
+       public class DiskWriter : PieceWriter
     {
         private FileStreamBuffer streamsBuffer;
 
@@ -20,12 +20,12 @@
             this.streamsBuffer = new FileStreamBuffer(maxOpenFiles);
         }
 
-        public void CloseFileStreams(TorrentManager manager)
+               public override void CloseFileStreams(TorrentManager manager)
         {
             Array.ForEach<TorrentFile>(manager.Torrent.Files, 
delegate(TorrentFile f) { streamsBuffer.CloseStream(f); });
         }
 
-        public void Dispose()
+               public override void Dispose()
         {
             streamsBuffer.Dispose();
         }
@@ -49,7 +49,7 @@
             return streamsBuffer.GetStream(file, filePath, access);
         }
 
-        public int Read(FileManager manager, byte[] buffer, int bufferOffset, 
long offset, int count)
+               public override int Read(FileManager manager, byte[] buffer, 
int bufferOffset, long offset, int count)
         {
             if (buffer == null)
                 throw new ArgumentNullException("buffer");
@@ -88,7 +88,7 @@
             return totalRead;
         }
 
-        public void Write(PieceData data)
+               public override void Write(PieceData data)
         {
             byte[] buffer = data.Buffer.Array;
             long offset = data.WriteOffset;
@@ -144,7 +144,7 @@
             //monitor.BytesReceived((int)totalWritten, TransferType.Data);
         }
 
-        public void Flush(TorrentManager manager)
+               public override void Flush(TorrentManager manager)
         {
             // No buffering done here
         }

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/IPieceWriter.cs
===================================================================
--- 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/IPieceWriter.cs   
    2008-02-16 20:34:52 UTC (rev 95918)
+++ 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/IPieceWriter.cs   
    2008-02-16 20:38:41 UTC (rev 95919)
@@ -3,16 +3,43 @@
 using System.Text;
 using MonoTorrent.Common;
 
-namespace MonoTorrent.Client.PieceWriter
+namespace MonoTorrent.Client.PieceWriters
 {
-    public interface IPieceWriter : IDisposable
-    {
-        int Read(FileManager manager, byte[] buffer, int bufferOffset, long 
offset, int count);
-        
-        void Write(PieceData data);
+       public abstract class PieceWriter
+       {
+               protected PieceWriter()
+               {
 
-        void CloseFileStreams(TorrentManager manager);
+               }
 
-        void Flush(TorrentManager manager);
-    }
-}
+               public int ReadChunk(FileManager manager, byte[] buffer, int 
bufferOffset, long offset, int count)
+               {
+                       int read = 0;
+                       int totalRead = 0;
+
+                       while (totalRead != count)
+                       {
+                               read = Read(manager, buffer, bufferOffset + 
totalRead, offset + totalRead, count - totalRead);
+                               totalRead += read;
+
+                               if (read == 0)
+                                       return totalRead;
+                       }
+
+                       return totalRead;
+               }
+
+               public abstract int Read(FileManager manager, byte[] buffer, 
int bufferOffset, long offset, int count);
+
+               public abstract void Write(PieceData data);
+
+               public abstract void CloseFileStreams(TorrentManager manager);
+
+               public abstract  void Flush(TorrentManager manager);
+
+               public virtual void Dispose()
+               {
+
+               }
+       }
+}
\ No newline at end of file

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/MemoryWriter.cs
===================================================================
--- 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/MemoryWriter.cs   
    2008-02-16 20:34:52 UTC (rev 95918)
+++ 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/MemoryWriter.cs   
    2008-02-16 20:38:41 UTC (rev 95919)
@@ -4,13 +4,13 @@
 using MonoTorrent.Client;
 using MonoTorrent.Common;
 
-namespace MonoTorrent.Client.PieceWriter
+namespace MonoTorrent.Client.PieceWriters
 {
-    public class MemoryWriter : IPieceWriter
+       public class MemoryWriter : PieceWriter
     {
         private int capacity;
         private List<PieceData> memoryBuffer;
-        private IPieceWriter writer;
+        private PieceWriter writer;
 
 
         public int Capacity
@@ -28,13 +28,13 @@
             }
         }
 
-        public MemoryWriter(IPieceWriter writer)
-            : this(writer, 1 * 1024 * 1024)
+               public MemoryWriter(PieceWriter writer)
+            : this(writer, 2 * 1024 * 1024)
         {
 
         }
 
-               public MemoryWriter(IPieceWriter writer, int capacity)
+               public MemoryWriter(PieceWriter writer, int capacity)
         {
             if (writer == null)
                 throw new ArgumentNullException("writer");
@@ -47,38 +47,21 @@
             this.writer = writer;
         }
 
-        public void Dispose()
-        {
+               public override int Read(FileManager manager, byte[] buffer, 
int bufferOffset, long offset, int count)
+               {
+                       memoryBuffer.Sort(delegate(PieceData left, PieceData 
right) { return left.WriteOffset.CompareTo(right.WriteOffset); });
+                       PieceData io = memoryBuffer.Find(delegate(PieceData m) 
{ return ((offset >= m.WriteOffset) && (offset < (m.WriteOffset + m.Count))); 
});
 
-        }
+                       if (io == null)
+                               return writer.Read(manager, buffer, 
bufferOffset, offset, count);
 
+                       int toCopy = Math.Min(count, io.Count + 
(int)(io.WriteOffset - offset));
+                       Buffer.BlockCopy(io.Buffer.Array, io.Buffer.Offset + 
(int)(io.WriteOffset - offset), buffer, bufferOffset, toCopy);
+                       return toCopy;
+               }
 
-        public int Read(FileManager manager, byte[] buffer, int bufferOffset, 
long offset, int count)
+               public override void Write(PieceData data)
         {
-            int origCount = count;
-            while (count != 0)
-            {
-                memoryBuffer.Sort(delegate(PieceData left, PieceData right) { 
return left.WriteOffset.CompareTo(right.WriteOffset); });
-                PieceData io = memoryBuffer.Find(delegate(PieceData m) { 
return ((offset >= m.WriteOffset) && (offset < (m.WriteOffset + m.Count))); });
-                if (io != null)
-                {
-                    int toCopy = Math.Min(count, io.Count + 
(int)(io.WriteOffset - offset));
-                    Buffer.BlockCopy(io.Buffer.Array, io.Buffer.Offset + 
(int)(io.WriteOffset - offset), buffer, bufferOffset + (origCount - count), 
toCopy);
-                    offset += toCopy;
-                    count -= toCopy;
-                }
-                else
-                    break;
-            }
-            if(count == 0)
-                return origCount;
-
-            return writer.Read(manager, buffer, bufferOffset, offset, count) + 
(origCount - count);
-        }
-
-
-        public void Write(PieceData data)
-        {
             Write(data, false);
         }
 
@@ -90,33 +73,27 @@
                 return;
             }
 
-            if (Used >= (Capacity - data.Count))
+            if (Used > (Capacity - data.Count))
                 FlushSome();
 
             memoryBuffer.Add(data);
         }
-
+               private Random r = new Random(5);
         private void FlushSome()
         {
-            int count = Math.Min(5, memoryBuffer.Count);
-            for (int i = 0; i < count; i++)
-            {
-                Write(memoryBuffer[i], true);
-                ClientEngine.BufferManager.FreeBuffer(ref 
memoryBuffer[i].Buffer);
-            }
-            memoryBuffer.RemoveRange(0, count);
+            int count = Math.Min(1, memoryBuffer.Count);
+                       int index = r.Next(0, memoryBuffer.Count);
+                       Write(memoryBuffer[index], true);
+            memoryBuffer.RemoveAt(index);
         }
 
-
-
-        public void CloseFileStreams(TorrentManager manager)
+               public override void CloseFileStreams(TorrentManager manager)
         {
             Flush(manager);
             writer.CloseFileStreams(manager);
         }
 
-
-        public void Flush(TorrentManager manager)
+               public override void Flush(TorrentManager manager)
         {
             memoryBuffer.ForEach(delegate(PieceData io)
             {

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/PieceData.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/PieceData.cs  
2008-02-16 20:34:52 UTC (rev 95918)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/PieceData.cs  
2008-02-16 20:38:41 UTC (rev 95919)
@@ -64,7 +64,9 @@
             this.id = id;
             this.pieceIndex = pieceIndex;
             this.startOffset = startOffset;
-                       this.fileManager = id.TorrentManager.FileManager;
+            // FIXME: This is a bit of a hack - Merge the two constructors 
properly
+            if (id != null)
+                this.fileManager = id.TorrentManager.FileManager;
         }
 
                public PieceData(ArraySegment<byte> buffer, int pieceIndex, int 
startOffset, int count, FileManager manager)

Modified: trunk/bitsharp/src/MonoTorrent.Tests/MonoTorrent.Tests.csproj
===================================================================
--- trunk/bitsharp/src/MonoTorrent.Tests/MonoTorrent.Tests.csproj       
2008-02-16 20:34:52 UTC (rev 95918)
+++ trunk/bitsharp/src/MonoTorrent.Tests/MonoTorrent.Tests.csproj       
2008-02-16 20:38:41 UTC (rev 95919)
@@ -41,10 +41,11 @@
     <Compile Include="BitFieldTest.cs" />
     <Compile Include="FileManager.cs" />
     <Compile Include="PeerMessagesTest.cs" />
+    <Compile Include="PieceWriterTests.cs" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\MonoTorrent\MonoTorrent.csproj">
-      <Project>{F48B95BE-0C36-48A3-838F-83FB0E4D0936}</Project>
+      <Project>{3F17418C-30C3-42DC-B245-403AB53B4F31}</Project>
       <Name>MonoTorrent</Name>
     </ProjectReference>
     <ProjectReference Include="..\SampleClient\SampleClient.csproj">

Modified: trunk/bitsharp/src/MonoTorrent.Tests/PieceWriterTests.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent.Tests/PieceWriterTests.cs    2008-02-16 
20:34:52 UTC (rev 95918)
+++ trunk/bitsharp/src/MonoTorrent.Tests/PieceWriterTests.cs    2008-02-16 
20:38:41 UTC (rev 95919)
@@ -2,13 +2,13 @@
 using System.Collections.Generic;
 using NUnit.Framework;
 using MonoTorrent.Client;
-using MonoTorrent.Client.PieceWriter;
+using MonoTorrent.Client.PieceWriters;
 using MonoTorrent.Client.Messages.Standard;
 using MonoTorrent.Common;
 
 namespace MonoTorrent.Tests
 {
-       public class NullWriter : IPieceWriter
+       public class NullWriter : PieceWriter
        {
                PieceWriterTests tester;
                public NullWriter(PieceWriterTests tests)
@@ -16,29 +16,30 @@
                        tester = tests;
                }
 
-               public int Read(FileManager manager, byte[] buffer, int 
bufferOffset, long offset, int count)
+               public override int Read(FileManager manager, byte[] buffer, 
int bufferOffset, long offset, int count)
                {
+                       Console.WriteLine("Attempting to read - returning 
zero");
                        return 0;
                }
 
-               public void Write(PieceData data)
+               public override void Write(PieceData data)
                {
+                       Console.WriteLine("Flushed {0}:{1} to disk", 
data.PieceIndex, data.StartOffset / 1000);
                        tester.blocks.Remove(data);
-                       Console.WriteLine("Flushed through to the null");
                        PieceWriterTests.Buffer.FreeBuffer(ref data.Buffer);
                }
 
-               public void CloseFileStreams(TorrentManager manager)
+               public override void CloseFileStreams(TorrentManager manager)
                {
 
                }
 
-               public void Flush(TorrentManager manager)
+               public override void Flush(TorrentManager manager)
                {
 
                }
 
-               public void Dispose()
+               public override void Dispose()
                {
 
                }
@@ -47,6 +48,11 @@
        [TestFixture]
        public class PieceWriterTests
        {
+               public const int PieceCount = 2;
+               public const int BlockCount = 10;
+               public const int BlockSize = 1000;
+               public const int PieceSize = BlockCount * BlockSize;
+
                public static BufferManager Buffer = new BufferManager();
                SampleClient.EngineTestRig rig;
 
@@ -54,103 +60,104 @@
                MemoryWriter level2;
                public List<PieceData> blocks;
 
+               [TestFixtureSetUp]
+               public void GlobalSetup()
+               {
+                       rig = new SampleClient.EngineTestRig("Downloads", 
PieceSize);
+               }
+
+               [TestFixtureTearDown]
+               public void GlobalTearDown()
+               {
+                       rig.Engine.Dispose();
+               }
+
                [SetUp]
                public void Setup()
                {
-                       rig = new SampleClient.EngineTestRig("Downloads", 
10000);
 
                        blocks = new List<PieceData>();
-                       level2 = new MemoryWriter(new NullWriter(this), 50000);
-                       level1 = new MemoryWriter(level2, 50000);
+                       level2 = new MemoryWriter(new NullWriter(this), 
(int)(PieceSize * 1.7));
+                       level1 = new MemoryWriter(level2, (int)(PieceSize * 
0.7));
 
-                       for (int piece = 0; piece < 2; piece++)
-                       {
-                               for (int block = 0; block < 5; block++)
-                               {
-                                       PieceData d = CreateBlock(piece, block);
-                                       blocks.Add(d);
-                                       level1.Write(d);
-                               }
-                       }
+                       for (int piece = 0; piece < PieceCount; piece++)
+                               for (int block = 0; block < BlockCount; block++)
+                                       blocks.Add(CreateBlock(piece, block));
                }
 
                private PieceData CreateBlock(int piece, int block)
                {
                        ArraySegment<byte> b = BufferManager.EmptyBuffer;
-                       Buffer.GetBuffer(ref b, 1000);
+                       Buffer.GetBuffer(ref b, BlockSize);
                        for (int i = 0; i < b.Count; i++)
-                               b.Array[b.Offset + i] = (byte)(piece * 10 + 
block);
-                       return new PieceData(b, piece, block * 1000, 1000, 
rig.Manager.FileManager);
+                               b.Array[b.Offset + i] = (byte)(piece * 
BlockCount + block);
+                       return new PieceData(b, piece, block * BlockSize, 
BlockSize, rig.Manager.FileManager);
                }
 
                [Test]
                public void TestMemoryWrites()
                {
-                       // Generate a load of pieces and flush them through the 
double buffer
-                       for (int piece = 0; piece < 6; piece++)
-                       {
-                               for (int block = 0; block < 10; block++)
-                               {
-                                       PieceData d = CreateBlock(piece, block);
-                                       blocks.Add(d);
-                                       level1.Write(d);
-                               }
-                       }
+                       for (int i = 2; i < 5; i++)
+                               for (int j = 0; j < BlockCount; j++)
+                                       blocks.Add(CreateBlock(i, j));
 
-                       // For the pieces which weren't flushed to the null 
buffer, make sure they weren't overwritten incorrectly
+                       blocks.ForEach(delegate(PieceData d) { level1.Write(d); 
});
+
+                       // For the pieces which weren't flushed to the null 
buffer, make sure they are still accessible
                        for (int i = 0; i < blocks.Count; i++)
                        {
                                ArraySegment<byte> b = blocks[i].Buffer;
                                PieceData data = blocks[i];
                                for (int j = 0; j < b.Count; j++)
-                                       Assert.AreEqual(b.Array[b.Offset + j], 
data.PieceIndex * 10 + data.StartOffset / data.Count, "#1");
+                                       Assert.AreEqual(b.Array[b.Offset + j], 
data.PieceIndex * BlockCount + data.StartOffset / data.Count, "#1");
                        }
                }
 
                [Test]
                public void TestMemoryStandardReads()
                {
-
                        ArraySegment<byte> buffer = BufferManager.EmptyBuffer;
                        Buffer.GetBuffer(ref buffer, 1000);
                        Initialise(buffer);
-                       for (int piece=0; piece < 2; piece++)
+                       foreach (PieceData data in this.blocks.ToArray())
+                               level1.Write(data);
+
+                       for (int piece=0; piece < PieceCount; piece++)
                        {
-                               for(int block = 0; block < 5; block++)
+                               for(int block = 0; block < BlockCount; block++)
                                {
-                                       long readIndex = (long)piece * 
rig.Manager.Torrent.PieceLength + block * 1000;
-                                       level1.Read(rig.Manager.FileManager, 
buffer.Array, buffer.Offset, readIndex, 1000);
+                                       long readIndex = (long)piece * 
rig.Manager.Torrent.PieceLength + block * BlockSize;
+                                       
level1.ReadChunk(rig.Manager.FileManager, buffer.Array, buffer.Offset, 
readIndex, BlockSize);
 
-                                       for (int i = 0; i < 1000; i++)
-                                               
Assert.AreEqual(buffer.Array[buffer.Offset + i], piece * 10 + block, "#1");
+                                       for (int i = 0; i < BlockSize; i++)
+                                               
Assert.AreEqual(buffer.Array[buffer.Offset + i], piece * BlockCount + block, 
"#1");
                                }
                        }
                }
 
-
                [Test]
                public void TestMemoryOffsetReads()
                {
+                       level1.Write(blocks[0]);
+                       level2.Write(blocks[1]);
+                       level1.Write(blocks[2]);
+                       level2.Write(blocks[3]);
+                       level2.Write(blocks[4]);
 
                        ArraySegment<byte> buffer = BufferManager.EmptyBuffer;
-                       Buffer.GetBuffer(ref buffer, 10000);
+                       Buffer.GetBuffer(ref buffer, PieceSize);
                        Initialise(buffer);
-                       int piece = 0;
-                       int block = 0;
 
-                       long readIndex = (long)piece * 
rig.Manager.Torrent.PieceLength + block * 1000;
-                       level1.Read(rig.Manager.FileManager, buffer.Array, 
buffer.Offset, readIndex, 10000);
+                       long piece = 0;
+                       long block = 0;
+                       long readIndex = (long)piece * 
rig.Manager.Torrent.PieceLength + block * BlockSize;
 
-                       for (int i = 0; i < 1000; i++)
-                               Assert.AreEqual(buffer.Array[buffer.Offset + 
i], 0, "#0");
-                       for (int i = 1000; i < 2000; i++)
-                               Assert.AreEqual(buffer.Array[buffer.Offset + 
i], 1, "#1");
-                       for (int i = 2000; i < 3000; i++)
-                               Assert.AreEqual(buffer.Array[buffer.Offset + 
i], 2, "#2");
-                       for (int i = 3000; i < 4000; i++)
-                               Assert.AreEqual(buffer.Array[buffer.Offset + 
i], 3, "#3");
-                       for (int i = 4000; i < 5000; i++)
-                               Assert.AreEqual(buffer.Array[buffer.Offset + 
i], 4, "#4");
+                       level1.ReadChunk(rig.Manager.FileManager, buffer.Array, 
buffer.Offset, readIndex, PieceSize);
+                       for (block = 0; block < 5; block++)
+                       {
+                               for (int i = 0; i < BlockSize; i++)
+                                       Assert.AreEqual(block, 
buffer.Array[buffer.Offset + i + block * BlockSize], "Piece 0. Block " + i);
+                       }
                }
 
                private void Initialise(ArraySegment<byte> buffer)
@@ -162,8 +169,14 @@
                public static void Main(string[] args)
                {
                        PieceWriterTests t = new PieceWriterTests();
+                       t.GlobalSetup();
                        t.Setup();
+                       t.TestMemoryWrites();
+                       t.Setup();
+                       t.TestMemoryStandardReads();
+                       t.Setup();
                        t.TestMemoryOffsetReads();
+                       t.GlobalTearDown();
                }
        }
 }

Modified: trunk/bitsharp/src/SampleClient/TestManualConnection.cs
===================================================================
--- trunk/bitsharp/src/SampleClient/TestManualConnection.cs     2008-02-16 
20:34:52 UTC (rev 95918)
+++ trunk/bitsharp/src/SampleClient/TestManualConnection.cs     2008-02-16 
20:38:41 UTC (rev 95919)
@@ -153,7 +153,7 @@
             torrent = Torrent.Load(CreateTorrent(piecelength));
             manager = new TorrentManager(torrent, savePath, new 
TorrentSettings());
             engine.Register(manager);
-            manager.Start();
+            //manager.Start();
         }
 
         public void AddConnection(IConnection connection)
@@ -193,7 +193,9 @@
         public TestManualConnection()
         {
             rig1 = new EngineTestRig("Downloads1");
+            rig1.Manager.Start();
             rig2 = new EngineTestRig("Downloads2");
+            rig2.Manager.Start();
 
             TcpListener socketListener = new TcpListener(1220);
             socketListener.Start();

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to