Exemple #1
0
        public void Test(
            [ValueSource(nameof(Cases))] TestCase testCase,
            [ValueSource(nameof(BufferSizes))] BufferSize bufferSize,
            [ValueSource(nameof(EnginesCount))] int enginesCount,
            [ValueSource(nameof(MaxThreadsCount))] int maxThreadsCount)
        {
            const string inputPath = "ZZZZZzzzzZzZZzzzZZZzzz",
           groupsPath = "WWwwwWWwwwWWWwwwwwwwww";

            var groupsFileLength = testCase.Lines
                                   .Sum(o => o.Length + Consts.EndLineBytesCount);

            byte[] groupsFileContent = new byte[groupsFileLength];
            var    inputSource       = testCase.Lines
                                       .SelectMany(line => new[] { line.Select(c => (byte)c), Consts.EndLineBytes })
                                       .Aggregate(Enumerable.Concat)
                                       .ToArray();

            var ioServiceMock = new Mock <IIoService>();
            var configMock    = new Mock <IConfig>();

            ioServiceMock
            .Setup(o => o.SizeOfFile(inputPath))
            .Returns(groupsFileLength);

            ioServiceMock
            .Setup(o => o.OpenRead(inputPath, It.IsAny <long>()))
            .Returns((string _, long position) =>
            {
                var inputStream     = new MemoryStream(inputSource);
                var inputReaderMock = new Mock <IFileReader>();
                inputReaderMock
                .SetupGet(o => o.Length)
                .Returns(() => inputStream.Length);

                inputReaderMock
                .SetupGet(o => o.Position)
                .Returns(() => inputStream.Position);

                inputReaderMock
                .SetupSet(o => o.Position = It.IsAny <long>())
                .Callback((long value) => inputStream.Position = value);

                inputReaderMock
                .Setup(o => o.ReadByte())
                .Returns(() => inputStream.ReadByte());

                inputReaderMock
                .Setup(o => o.Read(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>()))
                .Returns((byte[] buff, int offset, int count) =>
                         inputStream.Read(buff, offset, count));

                inputReaderMock
                .Setup(o => o.Dispose())
                .Callback(() => inputStream.Dispose());

                inputReaderMock.Object.Position = position;
                return(inputReaderMock.Object);
            });

            ioServiceMock
            .Setup(o => o.OpenWrite(groupsPath, It.IsAny <long>(), false))
            .Returns((string _, long position, bool __) =>
            {
                var groupsStream = new MemoryStream(groupsFileContent);
                var writerMock   = new Mock <IFileWriter>();

                writerMock
                .SetupGet(o => o.Position)
                .Returns(() => groupsStream.Position);

                writerMock
                .SetupSet(o => o.Position = It.IsAny <long>())
                .Callback((long value) => groupsStream.Position = value);

                writerMock
                .SetupGet(o => o.Length)
                .Returns(() => groupsStream.Length);

                writerMock
                .Setup(o => o.Write(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>()))
                .Callback((byte[] buff, int offset, int count) =>
                          groupsStream.Write(buff, offset, count));

                writerMock
                .Setup(o => o.Dispose())
                .Callback(() => groupsStream.Close());

                return(writerMock.Object);
            });

            var maxLineLength = testCase.Lines
                                .Max(line => line.Length + Consts.EndLineBytesCount);

            int buffSize = new Dictionary <BufferSize, int>
            {
                { BufferSize.Min, maxLineLength + 1 },
                { BufferSize.Small, maxLineLength + 2 },
                { BufferSize.Medium, groupsFileLength + 1 },
                { BufferSize.Large, groupsFileLength * 2 }
            }[bufferSize];

            configMock
            .SetupGet(o => o.PhysicalBufferLength)
            .Returns(buffSize + sizeof(ulong));

            configMock
            .SetupGet(o => o.UsingBufferLength)
            .Returns(buffSize);

            configMock
            .SetupGet(o => o.MaxRunningTasksCount)
            .Returns(maxThreadsCount);

            configMock
            .SetupGet(o => o.GrouperEnginesCount)
            .Returns(enginesCount);

            configMock
            .SetupGet(o => o.InputFilePath)
            .Returns(inputPath);

            configMock
            .SetupGet(o => o.GroupsFilePath)
            .Returns(groupsPath);

            IGroupsInfoMarger groupsSummaryInfoMarger =
                new GroupsInfoMarger();

            ITasksQueue tasksQueue =
                new TasksQueue(configMock.Object);

            IBuffersPool buffersPool =
                new BuffersPool(configMock.Object);

            IInputReaderFactory inputReaderMaker =
                new InputReaderFactory(
                    ioServiceMock.Object,
                    tasksQueue,
                    buffersPool,
                    configMock.Object);

            IGroupsLinesOutputFactory linesWriterFactory =
                new GroupsLinesOutputFactory(
                    ioServiceMock.Object,
                    tasksQueue,
                    buffersPool,
                    configMock.Object);

            IGrouperIOs grouperIOs =
                new GrouperIOs(
                    inputReaderMaker,
                    linesWriterFactory,
                    ioServiceMock.Object,
                    configMock.Object);

            var grouper = new Grouper(
                groupsSummaryInfoMarger,
                grouperIOs,
                tasksQueue,
                configMock.Object);

            var trivialGrouper = new TrivialGrouper();
            var expectedGroups = trivialGrouper
                                 .SplitToGroups(testCase.Lines);

            var groupsInfo   = grouper.SeparateInputToGroups();
            var resultGroups = ExtractGroups(groupsInfo, groupsFileContent);

            Assert.IsTrue(resultGroups.Select(Group.IsValid).All(o => o));
            CollectionAssert.AreEqual(
                expectedGroups,
                resultGroups);
        }
Exemple #2
0
 static RedisClient()
 {
     _buffersPool       = new BuffersPool(IoBufferSize, OutputBuffersCount);
     _inputBuffersPool  = new BuffersPool(IoBufferSize, InputBuffersCount);
     _redisPipelinePool = new ObjectsPool <IRedisChannel>();
 }
Exemple #3
0
        public static void Sort(string input, string output)
        {
            IConfig config =
                new Config(
                    input,
                    output);

            IGroupsInfoMarger groupsInfoMarger =
                new GroupsInfoMarger();

            IBuffersPool buffersPool =
                new BuffersPool(
                    config);

            IIoService ioService =
                new IoService(
                    buffersPool);

            ITasksQueue tasksQueue =
                new TasksQueue(
                    config);

            IInputReaderFactory inputReaderFactory =
                new InputReaderFactory(
                    ioService,
                    tasksQueue,
                    buffersPool,
                    config);

            IGroupsLinesOutputFactory groupsLinessOutputFactory =
                new GroupsLinesOutputFactory(
                    ioService,
                    tasksQueue,
                    buffersPool,
                    config);

            IGrouperIOs grouperIOs =
                new GrouperIOs(
                    inputReaderFactory,
                    groupsLinessOutputFactory,
                    ioService,
                    config);

            IGrouper grouper =
                new Grouper(
                    groupsInfoMarger,
                    grouperIOs,
                    tasksQueue,
                    config);

            IGroupsLoaderFactory groupsLoaderFactory =
                new GroupsLoaderFactory(
                    buffersPool,
                    ioService,
                    config);

            ISortingSegmentsSupplier sortingSegmentsSupplier =
                new SortingSegmentsSupplier(
                    config);

            ILinesIndexesExtractor linesIndexesExtractor =
                new LinesIndexesExtractor(
                    config);

            IGroupSorter groupSorter =
                new GroupSorter(
                    sortingSegmentsSupplier,
                    linesIndexesExtractor);

            ISortedGroupWriterFactory sortedGroupWriterFactory =
                new SortedGroupWriterFactory(
                    ioService,
                    config);

            ISorter sorter =
                new Sorter(
                    ioService,
                    grouper,
                    groupsLoaderFactory,
                    groupSorter,
                    sortedGroupWriterFactory,
                    config);

            sorter.Sort();
        }