コード例 #1
0
        public async Task WriteAsync_Cancel_ThrowsOpCancelled()
        {
            byte[] inputBuffer  = Enumerable.Range(1, 10).Select(f => (byte)f).ToArray();
            var    taskBlocker1 = new TaskCompletionSource <object>();
            var    taskBlocker2 = new TaskCompletionSource <object>();
            var    taskBlocker3 = new TaskCompletionSource <object>();
            bool   triggered    = false;
            var    streamMock   = new Mock <Stream>(MockBehavior.Strict);

            streamMock
            .Setup(p => p.WriteAsync(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .Returns(async(byte[] buffer, int offset, int count, CancellationToken token) =>
            {
                taskBlocker1.SetResult(null);
                await taskBlocker3.Task;
                triggered = token.IsCancellationRequested;
                taskBlocker2.SetResult(null);
                token.ThrowIfCancellationRequested();
            });
            CancellationTokenSource ts    = new CancellationTokenSource();
            CancellationToken       token = ts.Token;
            BufferedStreamWriter    s     = new BufferedStreamWriter(streamMock.Object, GetConfig(4));
            Task task = s.WriteAsync(inputBuffer, 0, inputBuffer.Length, token);
            await taskBlocker1.Task;

            ts.Cancel();
            taskBlocker3.SetResult(null);
            await taskBlocker2.Task;

            Assert.IsTrue(triggered);
            Assert.ThrowsAsync <OperationCanceledException>(async() => await task);
        }
コード例 #2
0
        public void Writer_Should_Be_Thread_Safe()
        {
            var fileLength      = 10000000;
            var fileBuffer      = CreateRandomFile(fileLength);
            var destFilePath    = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.dat");
            var blocksCount     = 100;
            var blockSize       = fileLength / blocksCount;
            var parallelOptions = new ParallelOptions
            {
                MaxDegreeOfParallelism = 5
            };

            using (var writer = new BufferedStreamWriter(destFilePath, fileLength))
            {
                Parallel.For(0, blocksCount, index =>
                {
                    var startPos    = index * blockSize;
                    var endPos      = startPos + blockSize;
                    var blockBuffer = GetBlock(fileBuffer, startPos, endPos);

                    writer.WriteFileBlock(blockBuffer, index);
                });
            }

            var originalFileHash = Helpers.ComputeMd5Hash(fileBuffer);
            var destFileHash     = Helpers.ComputeFileMd5Hash(destFilePath);

            //cleanup
            File.Delete(destFilePath);

            Assert.AreEqual(originalFileHash, destFileHash);
        }
コード例 #3
0
 internal DicomStreamWriter(BufferedStreamWriter output, DicomTransferSyntax transferSyntax)
 {
     Output         = output;
     TransferSyntax = transferSyntax;
     DataWriter     = new BinaryDataWriter(output, transferSyntax.ByteOrder);
     VRCoding       = transferSyntax.VRCoding;
 }
コード例 #4
0
        public void Writer_Should_Accurately_Write_Files_When_Blocks_Received_Randomly()
        {
            var fileLength   = 10000000;
            var fileBuffer   = CreateRandomFile(fileLength);
            var destFilePath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.dat");
            var blocksCount  = 100;
            var blockSize    = fileLength / blocksCount;
            var blockIndexes = new int[blocksCount];

            // set the indexes
            blockIndexes.ForEach((item, index) => blockIndexes[index] = index);

            // shuffle the indexes
            blockIndexes.Shuffle();

            using (var writer = new BufferedStreamWriter(destFilePath, fileLength))
            {
                foreach (var index in blockIndexes)
                {
                    var startPos    = index * blockSize;
                    var endPos      = startPos + blockSize;
                    var blockBuffer = GetBlock(fileBuffer, startPos, endPos);

                    writer.WriteFileBlock(blockBuffer, index);
                }
            }

            var originalFileHash = Helpers.ComputeMd5Hash(fileBuffer);
            var destFileHash     = Helpers.ComputeFileMd5Hash(destFilePath);

            //cleanup
            File.Delete(destFilePath);

            Assert.AreEqual(originalFileHash, destFileHash);
        }
コード例 #5
0
        public void Writer_Should_Accurately_Write_Files()
        {
            var fileLength   = 10000000;
            var fileBuffer   = CreateRandomFile(fileLength);
            var destFilePath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.dat");
            var blocksCount  = 100;
            var blockSize    = fileLength / blocksCount;

            using (var writer = new BufferedStreamWriter(destFilePath, fileLength))
            {
                for (var i = 0; i < blocksCount; i++)
                {
                    var startPos    = i * blockSize;
                    var endPos      = startPos + blockSize;
                    var blockBuffer = GetBlock(fileBuffer, startPos, endPos);

                    writer.WriteFileBlock(blockBuffer, i);
                }
            }

            var originalFileHash = Helpers.ComputeMd5Hash(fileBuffer);
            var destFileHash     = Helpers.ComputeFileMd5Hash(destFilePath);

            //cleanup
            File.Delete(destFilePath);

            Assert.AreEqual(originalFileHash, destFileHash);
        }
コード例 #6
0
 private DicomConnection(Socket socket, CancellationToken cancellationToken)
 {
     Socket             = socket;
     SocketInputStream  = new SocketInputStream(socket, cancellationToken);
     SocketOutputStream = new SocketOutputStream(socket, cancellationToken);
     Input  = new BufferedStreamReader(SocketInputStream);
     Output = new BufferedStreamWriter(SocketOutputStream);
 }
コード例 #7
0
        public void CanSeek_ReturnsFalse(bool innerCanSeek)
        {
            var streamMock = new Mock <Stream>();

            BufferedStreamWriter s = new BufferedStreamWriter(streamMock.Object, GetConfig(1));

            Assert.AreEqual(false, s.CanSeek);
        }
コード例 #8
0
        public void CanWrite_ReturnsTrue()
        {
            var streamMock = new Mock <Stream>();

            BufferedStreamWriter s = new BufferedStreamWriter(streamMock.Object, GetConfig(1));

            Assert.AreEqual(true, s.CanWrite);
        }
コード例 #9
0
        public void Position_set_Throws()
        {
            var streamMock = new Mock <Stream>(MockBehavior.Strict);

            BufferedStreamWriter s = new BufferedStreamWriter(streamMock.Object, GetConfig(1));

            Assert.That(() => s.Position = It.IsAny <long>(), Throws.InstanceOf <NotSupportedException>());
        }
コード例 #10
0
        public void Length_get_Throws()
        {
            var streamMock = new Mock <Stream>(MockBehavior.Strict);

            BufferedStreamWriter s = new BufferedStreamWriter(streamMock.Object, GetConfig(1));

            Assert.That(() => s.Length, Throws.InstanceOf <NotSupportedException>());
        }
コード例 #11
0
        public void SetLength_Throws()
        {
            var streamMock = new Mock <Stream>(MockBehavior.Strict);

            BufferedStreamWriter s = new BufferedStreamWriter(streamMock.Object, GetConfig(1));

            Assert.Throws <NotSupportedException>(() => s.SetLength(0L));
            Assert.Throws <NotSupportedException>(() => s.SetLength(1L));
        }
コード例 #12
0
        public void Read_Throws()
        {
            var streamMock = new Mock <Stream>(MockBehavior.Strict);

            BufferedStreamWriter s = new BufferedStreamWriter(streamMock.Object, GetConfig(1));

            Assert.Throws <NotSupportedException>(() => s.Read(null, 0, 0));
            Assert.Throws <NotSupportedException>(() => s.ReadByte());
        }
コード例 #13
0
        public void Seek_Throws(SeekOrigin origin, long seekOffset, bool delayedWriter)
        {
            int length = 10;

            byte[]       finalBuffer = new byte[length];
            MemoryStream memStream   = new MemoryStream(finalBuffer);

            BufferedStreamWriter s = new BufferedStreamWriter(memStream, GetConfig(4));

            Assert.Throws <NotSupportedException>(() => s.Seek(seekOffset, origin));
        }
コード例 #14
0
 protected static void WriteLengthPrefixedData(BinaryDataWriter dataWriter, Action <BinaryDataWriter, long> lengthWriter,
                                               Action <BinaryDataWriter> writeDataAction)
 {
     using (var dataStream = new MemoryStream())
     {
         var dataOutput = new BufferedStreamWriter(dataStream);
         writeDataAction.Invoke(new BinaryDataWriter(dataOutput, ByteOrder.BigEndian));
         dataOutput.Flush(FlushMode.Shallow);
         lengthWriter.Invoke(dataWriter, dataStream.Length);
         dataWriter.Write(dataStream.GetBuffer().AsSpan(0, checked ((int)dataStream.Length)));
     }
 }
コード例 #15
0
 public Stream ComposeChain(Stream s, BufferedStreamWriterConfig sw_cfg)
 {
     if (!(s is MemoryStream))
     {
         itemsToDispose.Add(s);
     }
     if (sw_cfg != null)
     {
         itemsToDispose.Add(s = new BufferedStreamWriter(s, sw_cfg));
     }
     return(s);
 }
コード例 #16
0
        public static async Task New_WriteAsync(string fileName)
        {
            if (File.Exists(fileName))
            {
                File.Delete(fileName);
            }

            byte[] buffer = Enumerable.Range(0, 10).Select(f => (byte)f).ToArray();
            using (var s = File.Create(fileName))
                using (var sr = new BufferedStreamWriter(s))
                    await sr.WriteAsync(buffer);
        }
コード例 #17
0
        public void WriteByte_WriteByteNotCalledOnInnerStream(bool delayedWriter)
        {
            var streamMock = new Mock <Stream>();

            byte[] tmparr = new byte[1];

            BufferedStreamWriter s = new BufferedStreamWriter(streamMock.Object, GetConfig(1, delayedWriter));

            s.WriteByte(1);
            s.WriteByte(1);

            streamMock.Verify(f => f.WriteByte(It.IsAny <byte>()), Times.Never());
        }
コード例 #18
0
        public void Dispose_WriterAborts(bool delayedWriter)
        {
            int shadowBufferSize = 4;
            var config           = GetConfig(shadowBufferSize, delayedWriter);
            var writerMock       = new Mock <IWriter>(MockBehavior.Loose);

            writerMock.Setup(p => p.RequestBuffer())
            .Returns(() => new ShadowBufferData(shadowBufferSize));

            using (BufferedStreamWriter sw = new BufferedStreamWriter(new MemoryStream(), config, writerMock.Object))
                sw.Write(new byte[] { 1, 2 }, 0, 2);

            writerMock.Verify(f => f.Abort(), Times.Once());
        }
コード例 #19
0
        public async Task DisposeAsync_PositionMatchesInnerStreams(int count, int shadowBufferSize, bool delayedWriter)
        {
            var originalBuffer = Enumerable.Range(1, 10).Select(f => (byte)f).ToArray();

            byte[] finalBuffer = new byte[originalBuffer.Length];
            var    stream      = new MemoryStream(finalBuffer);

            await using (BufferedStreamWriter s = new BufferedStreamWriter(stream, GetConfig(shadowBufferSize, delayedWriter)))
            {
                await s.WriteAsync(originalBuffer, 0, count);
            }

            Assert.AreEqual(count, stream.Position);
        }
コード例 #20
0
        public void Dispose_StreamFlushes(bool delayedWriter)
        {
            byte[] inputBuffer = Enumerable.Range(1, 10).Select(f => (byte)f).ToArray();
            var    streamMock  = new Mock <Stream>(MockBehavior.Strict);

            streamMock
            .Setup(p => p.Write(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>()));
            streamMock
            .Setup(p => p.Flush());

            using (BufferedStreamWriter s = new BufferedStreamWriter(streamMock.Object, GetConfig(4, delayedWriter)))
                s.Write(inputBuffer, 0, inputBuffer.Length);

            streamMock.Verify(f => f.Flush(), Times.Once());
        }
コード例 #21
0
        public void WriteByte_CorrectBytesAreSaved(int shadowBufferSize, int totBytes, bool delayedWriter)
        {
            byte[]       inputBuffer = Enumerable.Range(1, totBytes).Select(f => (byte)f).ToArray();
            byte[]       destBuffer  = new byte[totBytes];
            MemoryStream memStream   = new MemoryStream(destBuffer);

            using (BufferedStreamWriter s = new BufferedStreamWriter(memStream, GetConfig(shadowBufferSize, delayedWriter)))
            {
                for (int f = 0; f < totBytes; f++)
                {
                    s.WriteByte(inputBuffer[f]);
                }
            }

            Assert.AreEqual(inputBuffer, destBuffer);
        }
コード例 #22
0
        public async Task FlushAsync_CorrectBytesAreSaved(int shadowBufferSize, int totBytes, int writeBlockLength, bool delayedWriter)
        {
            byte[]               inputBuffer = Enumerable.Range(1, totBytes).Select(f => (byte)f).ToArray();
            byte[]               destBuffer  = new byte[totBytes];
            MemoryStream         destStream  = new MemoryStream(destBuffer);
            BufferedStreamWriter s           = new BufferedStreamWriter(destStream, GetConfig(shadowBufferSize, delayedWriter));

            for (int ix = 0; ix < totBytes; ix += writeBlockLength)
            {
                await s.WriteAsync(inputBuffer, ix, Math.Min(totBytes - ix, writeBlockLength));
            }

            await s.FlushAsync();

            Assert.AreEqual(inputBuffer, destBuffer);
        }
コード例 #23
0
        public async Task DisposeAsync_StreamFlushesAsync()
        {
            byte[] inputBuffer = Enumerable.Range(1, 10).Select(f => (byte)f).ToArray();
            var    streamMock  = new Mock <Stream>(MockBehavior.Strict);

            streamMock
            .Setup(p => p.WriteAsync(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <CancellationToken>()))
            .Returns((byte[] buffer, int offset, int count, CancellationToken token) => Task.CompletedTask);
            streamMock
            .Setup(p => p.FlushAsync(It.IsAny <CancellationToken>()))
            .Returns((CancellationToken token) => Task.CompletedTask);

            await using (BufferedStreamWriter s = new BufferedStreamWriter(streamMock.Object, GetConfig(4)))
                await s.WriteAsync(inputBuffer, 0, inputBuffer.Length, CancellationToken.None);

            streamMock.Verify(f => f.FlushAsync(It.IsAny <CancellationToken>()), Times.Once());
        }
コード例 #24
0
        private static void TestWrite(Stream stream, ByteOrder byteOrder)
        {
            var output     = new BufferedStreamWriter(stream);
            var dataWriter = new BinaryDataWriter(output, byteOrder);

            Trace.Assert(stream.Position == 0);

            dataWriter.Write(TestByte);
            output.Flush(FlushMode.Shallow);

            Trace.Assert(stream.Position == 1);

            dataWriter.Write(TestShort);
            dataWriter.Write(TestUShort);

            Trace.Assert(stream.Position == 1);

            output.Flush(FlushMode.Shallow);

            Trace.Assert(stream.Position == 5);

            dataWriter.Write(TestInt);
            dataWriter.Write(TestUInt);
            dataWriter.Write(TestLong);
            dataWriter.Write(TestULong);
            dataWriter.Write(TestFloat);
            dataWriter.Write(TestDouble);

            Trace.Assert(stream.Position == 5);

            output.Flush(FlushMode.Shallow);

            Trace.Assert(stream.Position == 41);

            TestWriteArray(9 * ushort.MaxValue, TestByte, dataWriter.Write);
            TestWriteArray(8 * ushort.MaxValue, TestShort, dataWriter.Write);
            TestWriteArray(7 * ushort.MaxValue, TestUShort, dataWriter.Write);
            TestWriteArray(6 * ushort.MaxValue, TestInt, dataWriter.Write);
            TestWriteArray(5 * ushort.MaxValue, TestUInt, dataWriter.Write);
            TestWriteArray(4 * ushort.MaxValue, TestLong, dataWriter.Write);
            TestWriteArray(3 * ushort.MaxValue, TestULong, dataWriter.Write);
            TestWriteArray(2 * ushort.MaxValue, TestFloat, dataWriter.Write);
            TestWriteArray(1 * ushort.MaxValue, TestDouble, dataWriter.Write);

            output.Flush(FlushMode.Deep);
        }
コード例 #25
0
        public async Task Dispose_InnerStreamDoesntDisposeAsync(bool canSeek, bool delayedWriter)
        {
            var streamMock = new Mock <Stream>(MockBehavior.Loose);

            streamMock.SetupGet(p => p.CanSeek)
            .Returns(canSeek);
            streamMock.SetupGet(p => p.Position)
            .Returns(0);
            streamMock.SetupGet(p => p.Length)
            .Returns(1);

            using (BufferedStreamWriter s = new BufferedStreamWriter(streamMock.Object, GetConfig(1, delayedWriter)))
            {
                await s.WriteAsync(new byte[] { 1 }, 0, 1);
            }

            streamMock.Verify(f => f.Close(), Times.Never());
        }
コード例 #26
0
        public void RequestBuffer_BufferReleasedAfterWrite(int writeBlockLength, int repCount, bool delayedWriter)
        {
            int  totBytes         = repCount * writeBlockLength;
            int  shadowBufferSize = 4;
            bool isRented         = false;
            var  config           = GetConfig(shadowBufferSize, delayedWriter: delayedWriter);
            var  writerMock       = new Mock <IWriter>(MockBehavior.Loose);

            writerMock.Setup(p => p.RequestBuffer())
            .Returns(() =>
            {
                if (isRented)
                {
                    throw new InvalidOperationException();
                }
                isRented = true;
                return(new ShadowBufferData(shadowBufferSize));
            });
            writerMock.Setup(p => p.ReturnBufferAndWrite(It.IsAny <ShadowBufferData>()))
            .Callback <ShadowBufferData>((sourceBuffer) =>
            {
                if (!isRented)
                {
                    throw new InvalidOperationException();
                }
                isRented = false;
            });
            byte[] tmpBuf     = new byte[writeBlockLength];
            byte[] destBuffer = new byte[totBytes];

            TestDelegate body = delegate()
            {
                using (BufferedStreamWriter sw = new BufferedStreamWriter(new MemoryStream(destBuffer), config, writerMock.Object))
                {
                    for (int ix = 0, f = 0; f < repCount; ix += writeBlockLength, f++)
                    {
                        sw.Write(tmpBuf, 0, writeBlockLength);
                    }
                }
            };

            Assert.DoesNotThrow(body);
        }
コード例 #27
0
        public void SendCommand(byte presentationContextID, ICommand command, Action <Stream> dataSetWriter)
        {
            if (command is IMayHaveDataSet mayHaveDataSet)
            {
                if ((dataSetWriter == null) && mayHaveDataSet.IsDataSetRequired())
                {
                    throw new ArgumentException($"{command} must be followed by a data set");
                }
            }
            else if (dataSetWriter != null)
            {
                throw new ArgumentException($"{command} must not be followed by a data set");
            }

            var commandAttribute = command.GetType().GetCustomAttribute <CommandAttribute>();

            command.CommandField       = commandAttribute.CommandType;
            command.CommandDataSetType = (ushort)((dataSetWriter == null) ? 0x0101 : 0xFEFE);

            if (TraceWriter != null)
            {
                NetUtils.TraceOutput(TraceWriter, $"PC {presentationContextID} sending ", command);
            }

            using (var stream = new PresentationContextOutputStream(this, presentationContextID, FragmentType.Command))
            {
                var output = new BufferedStreamWriter(stream);
                CommandSerialization.WriteTo(output, command);
                output.Flush(FlushMode.Deep);
            }

            if (dataSetWriter != null)
            {
                using (var stream = new PresentationContextOutputStream(this, presentationContextID, FragmentType.DataSet))
                {
                    dataSetWriter.Invoke(stream);
                    stream.Flush();
                }
            }
        }
コード例 #28
0
        /// <summary>Writes a DICOM file header to a stream</summary>
        public static void WriteHeader(BufferedStreamWriter output, DicomFileMetaInformation fileMetaInformation)
        {
            output.WriteZeros(128);
            output.WriteBytes(BeforeFileMetaInformationLength);

            var fileMetaInformationLengthPosition = output.Position;

            output.WriteZeros(4);
            output.WriteBytes(AfterFileMetaInformationLength);

            var metaInformationWriter = DicomStreamWriter.Create(output, DicomUID.TransferSyntax.ExplicitVRLittleEndian);

            FileMetaInformationSerializer.Serialize(metaInformationWriter, fileMetaInformation);

            var endOfFileMetaInformationPosition = output.Position;

            output.Flush(FlushMode.Shallow);

            var fileMetaInformationLength = endOfFileMetaInformationPosition - (fileMetaInformationLengthPosition + 4);

            output.Stream.Seek(fileMetaInformationLengthPosition, SeekOrigin.Begin);
            output.Stream.Write(BitConverter.GetBytes((uint)fileMetaInformationLength));
            output.Stream.Seek(endOfFileMetaInformationPosition, SeekOrigin.Begin);
        }
コード例 #29
0
        /// <summary>Creates a DicomStreamWriter for writing DICOM data elements to a stream using the given transfer syntax</summary>
        public static DicomStreamWriter Create(BufferedStreamWriter output, DicomUID transferSyntaxUID)
        {
            var transferSyntax = new DicomTransferSyntax(transferSyntaxUID);

            return(new DicomStreamWriter(output, transferSyntax));
        }
コード例 #30
0
 async ValueTask IAsyncBinaryWriter.WriteAsync <TArg>(Action <TArg, IBufferWriter <byte> > writer, TArg arg, CancellationToken token)
 {
     using var bufferWriter = new BufferedStreamWriter(buffer);
     writer(arg, bufferWriter);
     await stream.WriteAsync(bufferWriter.WrittenMemory, token).ConfigureAwait(false);
 }