/// <summary> /// Creates instance of <see cref="IFileFsClient"/>. /// </summary> /// <param name="fileFsStoragePath">Path to FileFS storage file.</param> /// <param name="options">Options for FileFS client.</param> /// <param name="logger">Logger instance.</param> /// <returns>Instance of <see cref="IFileFsClient"/>.</returns> public static IFileFsClient Create(string fileFsStoragePath, FileFsClientOptions options, ILogger logger) { ITransactionWrapper CreateTransactionWrapper(bool enableTransactions) => enableTransactions ? (ITransactionWrapper) new TransactionWrapper(fileFsStoragePath, logger) : (ITransactionWrapper) new NullTransactionWrapper(); FileFsClientOptionsValidator.Validate(options); var storageStreamProvider = new StorageStreamProvider(fileFsStoragePath, logger); var connection = new StorageConnection(storageStreamProvider, options.ByteBufferSize, logger); var filesystemDescriptorSerializer = new FilesystemDescriptorSerializer(logger); var filesystemDescriptorAccessor = new FilesystemDescriptorAccessor(connection, filesystemDescriptorSerializer, logger); var entryDescriptorSerializer = new EntryDescriptorSerializer(filesystemDescriptorAccessor, logger); var entryDescriptorRepository = new EntryDescriptorRepository(connection, filesystemDescriptorAccessor, entryDescriptorSerializer, logger); var operationLocker = new StorageOperationLocker(); var optimizer = new StorageOptimizer(connection, entryDescriptorRepository, filesystemDescriptorAccessor, operationLocker, logger); var extender = new StorageExtender(connection, filesystemDescriptorAccessor, operationLocker, logger); var allocator = new FileAllocator(connection, filesystemDescriptorAccessor, entryDescriptorRepository, optimizer, extender, operationLocker, logger); var entryRepository = new EntryRepository(filesystemDescriptorAccessor, entryDescriptorRepository, logger); var fileRepository = new FileRepository(connection, allocator, filesystemDescriptorAccessor, entryDescriptorRepository, logger); var directoryRepository = new DirectoryRepository(filesystemDescriptorAccessor, entryDescriptorRepository, logger); var externalFileManager = new ExternalFileManager(logger); var transactionWrapper = CreateTransactionWrapper(options.EnableTransactions); var client = new FileFsClient(fileRepository, directoryRepository, entryRepository, externalFileManager, optimizer, transactionWrapper, operationLocker); return(client); }
/// <summary> /// Creates instance of <see cref="IStorageInitializer"/>. /// </summary> /// <param name="fileFsStoragePath">Path to FileFS storage file.</param> /// <param name="logger">Logger instance.</param> /// <returns>Instance of <see cref="IStorageInitializer"/>.</returns> public static IStorageInitializer Create(string fileFsStoragePath, ILogger logger) { var storageStreamProvider = new StorageStreamProvider(fileFsStoragePath, logger); var connection = new StorageConnection(storageStreamProvider, 4096, logger); var filesystemDescriptorSerializer = new FilesystemDescriptorSerializer(logger); var filesystemDescriptorAccessor = new FilesystemDescriptorAccessor(connection, filesystemDescriptorSerializer, logger); var entryDescriptorSerializer = new EntryDescriptorSerializer(filesystemDescriptorAccessor, logger); var entryDescriptorRepository = new EntryDescriptorRepository(connection, filesystemDescriptorAccessor, entryDescriptorSerializer, logger); var operationLocker = new StorageOperationLocker(); var storageInitializer = new StorageInitializer(connection, operationLocker, filesystemDescriptorAccessor, entryDescriptorRepository, logger); return(storageInitializer); }
public void ToBuffer_ShouldCreatedCorrectBufferWithData(int fileDescriptorLength, string fileName, long createdOn, long updatedOn, int dataOffset, int dataLength, EntryType type) { // Arrange var id = Guid.NewGuid(); var parentId = Guid.NewGuid(); var filesystemDescriptor = new FilesystemDescriptor(0, 0, fileDescriptorLength); var fileDescriptor = new EntryDescriptor(id, parentId, fileName, type, createdOn, updatedOn, dataOffset, dataLength); var logger = new LoggerConfiguration().CreateLogger(); var filesystemDescriptorAccessor = CreateFilesystemDescriptorAccessor(filesystemDescriptor); var serializer = new EntryDescriptorSerializer(filesystemDescriptorAccessor, logger); // Act var buffer = serializer.ToBytes(fileDescriptor); // Assert using var memoryStream = new MemoryStream(buffer); using var reader = new BinaryReader(memoryStream); var writtenIdBytes = reader.ReadGuidBytes(); var writtenId = new Guid(writtenIdBytes); var writtenParentIdBytes = reader.ReadGuidBytes(); var writtenParentId = new Guid(writtenParentIdBytes); var writtenStringLength = reader.ReadInt32(); var writtenEntryNameBytes = reader.ReadBytes(writtenStringLength); var writtenEntryName = Encoding.UTF8.GetString(writtenEntryNameBytes); memoryStream.Seek(filesystemDescriptor.EntryDescriptorLength - writtenStringLength - EntryDescriptor.BytesWithoutFilename, SeekOrigin.Current); var writtenType = (EntryType)reader.ReadByte(); var writtenCreatedOn = reader.ReadInt64(); var writtenUpdatedOn = reader.ReadInt64(); var writtenDataOffset = reader.ReadInt32(); var writtenDataLength = reader.ReadInt32(); Assert.Equal(id, writtenId); Assert.Equal(parentId, writtenParentId); Assert.Equal(fileDescriptorLength, buffer.Length); Assert.Equal(fileName, writtenEntryName); Assert.Equal(type, writtenType); Assert.Equal(createdOn, writtenCreatedOn); Assert.Equal(updatedOn, writtenUpdatedOn); Assert.Equal(dataOffset, writtenDataOffset); Assert.Equal(dataLength, writtenDataLength); }
public void FromBuffer_ShouldCreatedCorrectModelFromBuffer(int fileDescriptorLength, string entryName, long createdOn, long updatedOn, int dataOffset, int dataLength, EntryType type) { // Arrange var filesystemDescriptor = new FilesystemDescriptor(0, 0, fileDescriptorLength); var logger = new LoggerConfiguration().CreateLogger(); var filesystemDescriptorAccessor = CreateFilesystemDescriptorAccessor(filesystemDescriptor); var serializer = new EntryDescriptorSerializer(filesystemDescriptorAccessor, logger); var buffer = new byte[fileDescriptorLength]; var id = Guid.NewGuid(); var parentId = Guid.NewGuid(); using var memoryStream = new MemoryStream(buffer); using var writer = new BinaryWriter(memoryStream); writer.Write(id.ToByteArray()); writer.Write(parentId.ToByteArray()); var entryNameBytes = Encoding.UTF8.GetBytes(entryName); writer.Write(entryName.Length); writer.Write(entryNameBytes); writer.Seek(filesystemDescriptor.EntryDescriptorLength - entryNameBytes.Length - EntryDescriptor.BytesWithoutFilename, SeekOrigin.Current); writer.Write((byte)type); writer.Write(createdOn); writer.Write(updatedOn); writer.Write(dataOffset); writer.Write(dataLength); // Act var entryDescriptor = serializer.FromBytes(buffer); // Assert Assert.Equal(id, entryDescriptor.Id); Assert.Equal(parentId, entryDescriptor.ParentId); Assert.Equal(entryNameBytes.Length, entryDescriptor.NameLength); Assert.Equal(entryNameBytes.Length, entryDescriptor.NameLength); Assert.Equal(entryName, entryDescriptor.Name); Assert.Equal(type, entryDescriptor.Type); Assert.Equal(createdOn, entryDescriptor.CreatedOn); Assert.Equal(updatedOn, entryDescriptor.UpdatedOn); Assert.Equal(dataOffset, entryDescriptor.DataOffset); Assert.Equal(dataLength, entryDescriptor.DataLength); }