public async Task WriteDisabled_WriteAllBytesAsync_ShouldNotWriteToFile()
        {
            const string relativePath = "file";
            var          path         = Path.Combine(_testDir, relativePath);

            // randomize content
            var content = new byte[512];

            new Random().NextBytes(content);

            // create the provider and disable write
            var provider = new ProtectedAppDataFileProvider(_testDir);

            provider.DisableWrite();

            // call WriteAllBytesAsync and make sure file is not created
            await provider.WriteAllBytesAsync(relativePath, content, default);

            Assert.False(File.Exists(path));

            // create an empty file
            File.Create(path).Dispose();

            // call WriteAllBytesAsync and make sure file nothing is written
            await provider.WriteAllBytesAsync(relativePath, content, default);

            Assert.True(string.IsNullOrEmpty(File.ReadAllText(path)));
        }
        public void WriteDisabled_GetFilesInDirectory_ShouldReturnEmpty(int depth, int fileCount)
        {
            // Get the directory that will contain all the files
            var relativePath = GetDirectoryPathForDepth(depth);
            var containerDir = Path.Combine(_testDir, relativePath);

            Directory.CreateDirectory(containerDir);

            // Get the 'relativeFileNames' list that contains all the relative path of the files
            var relativeFileNames = Enumerable.Range(0, fileCount).Select(i => Path.Combine(relativePath, i.ToString())).ToArray();

            foreach (var relativeFileName in relativeFileNames)
            {
                File.Open(Path.Combine(_testDir, relativeFileName), FileMode.Create).Dispose();
            }

            // Disable writes and call 'GetFilesInDirectory'
            var provider = new ProtectedAppDataFileProvider(_testDir);

            provider.DisableWrite();
            var files = provider.GetFilesInDirectory(relativePath);

            // assert
            Assert.Empty(files);
        }
        public void WriteEnabled_CreateDirectory_ShouldCreateDirectory(string relativePath)
        {
            var provider = new ProtectedAppDataFileProvider(_testDir);

            provider.CreateDirectory(relativePath);

            Assert.True(Directory.Exists(Path.Combine(_testDir, relativePath)));
        }
        public void DisableWrite_ReturnWriteDisabled()
        {
            var provider = new ProtectedAppDataFileProvider(_testDir);

            Assert.True(provider.IsWriteEnabled);

            provider.DisableWrite();
            Assert.False(provider.IsWriteEnabled);
        }
        public void WriteDisabled_CreateDirectory_ShouldNotCreateDirectory()
        {
            const string relativePath = "dir";
            var          provider     = new ProtectedAppDataFileProvider(_testDir);

            provider.DisableWrite();

            provider.CreateDirectory(relativePath);
            Assert.False(Directory.Exists(Path.Combine(_testDir, relativePath)));
        }
        public void WriteEnabled_WriteAllText_ShouldWriteToFile()
        {
            const string relativePath = "file.txt";
            const string content      = "file content";
            var          path         = Path.Combine(_testDir, relativePath);

            var provider = new ProtectedAppDataFileProvider(_testDir);

            provider.WriteAllText(relativePath, content, Encoding.UTF8);

            var readContent = File.ReadAllText(path);

            Assert.Equal(content, readContent);
        }
        public void WriteEnabled_OpenStream_ShouldWriteToFile()
        {
            const string relativePath = "file.txt";
            const string content      = "file content";

            var provider = new ProtectedAppDataFileProvider(_testDir);

            using (var stream = provider.OpenFile(relativePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
            {
                WriteContentToStream(stream, content);
            }

            var readContent = File.ReadAllText(Path.Combine(_testDir, relativePath));

            Assert.Equal(content, readContent);
        }
        public void WriteEnabled_ReadAllText_ShouldReturnText(int depth)
        {
            // setup
            var fileText     = Guid.NewGuid().ToString();
            var containerDir = GetDirectoryPathForDepth(depth);

            Directory.CreateDirectory(Path.Combine(_testDir, containerDir));
            var filePath = Path.Combine(containerDir, "file");

            File.WriteAllText(Path.Combine(_testDir, filePath), fileText);

            // call
            var provider = new ProtectedAppDataFileProvider(_testDir);
            var readText = provider.ReadAllText(filePath);

            // assert
            Assert.Equal(fileText, readText);
        }
        public void DeleteFile_ShouldDeleteOnlyIfWriteEnabled(bool writeEnabled)
        {
            // setup: create the file
            var fileName = "file";

            File.Open(Path.Combine(_testDir, fileName), FileMode.Create).Dispose();

            // call 'DeleteFile'
            var provider = new ProtectedAppDataFileProvider(_testDir);

            if (!writeEnabled)
            {
                provider.DisableWrite();
            }
            provider.DeleteFile(fileName);

            // assert
            Assert.Equal(!writeEnabled, File.Exists(Path.Combine(_testDir, fileName)));
        }
        public void WriteEnabled_ReadAllText_ShouldThrowException(int depth)
        {
            // setup
            var fileText     = Guid.NewGuid().ToString();
            var containerDir = GetDirectoryPathForDepth(depth);

            Directory.CreateDirectory(Path.Combine(_testDir, containerDir));
            var filePath = Path.Combine(containerDir, "file");

            File.WriteAllText(Path.Combine(_testDir, filePath), fileText);

            // call
            var provider = new ProtectedAppDataFileProvider(_testDir);

            provider.DisableWrite();

            // assert
            Assert.Throws <FileNotFoundException>(() => provider.ReadAllText(filePath));
        }
        public void WriteEnabled_FileExists_ShouldReturnFileExistence(int depth, bool fileActuallyExists)
        {
            // Setup
            var containerDir = GetDirectoryPathForDepth(depth);

            Directory.CreateDirectory(Path.Combine(_testDir, containerDir));
            var filePath = Path.Combine(containerDir, "file");

            if (fileActuallyExists)
            {
                File.Open(Path.Combine(_testDir, filePath), FileMode.Create).Dispose();
            }

            // Call
            var provider = new ProtectedAppDataFileProvider(_testDir);

            // Assert
            Assert.Equal(fileActuallyExists, provider.FileExists(filePath));
        }
示例#12
0
        public async Task PersistentQueue_PushAndGet(int batchCount)
        {
            var dataDir  = Path.Combine(AppContext.BaseDirectory, Guid.NewGuid().ToString());
            var queueDir = Path.Combine(dataDir, _queueDirName);

            Directory.CreateDirectory(queueDir);
            var fileProvider = new ProtectedAppDataFileProvider(dataDir);

            try
            {
                var secondary = new FilePersistentQueue <List <int> >(100, queueDir, new IntegerListSerializer(), fileProvider, NullLogger.Instance);

                var q = new AsyncBatchQueue <int>(1000,
                                                  new long[] { batchCount },
                                                  new Func <int, long>[] { s => 1 }, secondary);

                await q.PushSecondaryAsync(Enumerable.Range(0, batchCount + 1).ToList());

                var output  = new List <int>();
                var getTask = q.GetNextBatchAsync(output, 10 * 1000).AsTask();
                Assert.True(getTask.Wait(1000));
                Assert.Equal(batchCount, output.Count);

                if (batchCount == 0)
                {
                    return;
                }

                // second call should return the last item
                output.Clear();
                await q.GetNextBatchAsync(output, 100);

                Assert.Single(output);
            }
            finally
            {
                if (Directory.Exists(dataDir))
                {
                    Directory.Delete(dataDir, true);
                }
            }
        }
示例#13
0
        public async Task PersistentQueue_PullBothQueues()
        {
            var dataDir  = Path.Combine(AppContext.BaseDirectory, Guid.NewGuid().ToString());
            var queueDir = Path.Combine(dataDir, _queueDirName);

            Directory.CreateDirectory(queueDir);
            var fileProvider = new ProtectedAppDataFileProvider(dataDir);

            try
            {
                var secondary = new FilePersistentQueue <List <int> >(10, queueDir, new IntegerListSerializer(), fileProvider, NullLogger.Instance);
                var q         = new AsyncBatchQueue <int>(500,
                                                          new long[] { 500 },
                                                          new Func <int, long>[] { s => 1 }, secondary);

                await q.PushSecondaryAsync(Enumerable.Range(0, 500).ToList());

                for (var i = 500; i < 1000; i++)
                {
                    await q.PushAsync(i);
                }

                // pull 3 times
                var output = new List <int>();
                await q.GetNextBatchAsync(output, 1000);

                await q.GetNextBatchAsync(output, 1000);

                await q.GetNextBatchAsync(output, 1000);

                Assert.Equal(1000, output.Distinct().Count());
            }
            finally
            {
                if (Directory.Exists(dataDir))
                {
                    Directory.Delete(dataDir, true);
                }
            }
        }
        public void WriteDisabled_WriteAllText_ShouldNotWriteToFile()
        {
            const string relativePath = "file.txt";
            const string content      = "file content";
            var          path         = Path.Combine(_testDir, relativePath);

            // create the provider and disable write
            var provider = new ProtectedAppDataFileProvider(_testDir);

            provider.DisableWrite();

            // call WriteAllText and make sure file is not created
            provider.WriteAllText(relativePath, content, Encoding.UTF8);
            Assert.False(File.Exists(path));

            // create an empty file
            File.Create(path).Dispose();

            // call WriteAllText and make sure file nothing is written
            provider.WriteAllText(relativePath, content, Encoding.UTF8);
            Assert.True(string.IsNullOrEmpty(File.ReadAllText(path)));
        }
        public void WriteEnabled_GetFilesInDirectory_ShouldReturnDirectories(int depth, int fileCount)
        {
            // Get the directory that will contain all the files
            var relativePath = GetDirectoryPathForDepth(depth);
            var containerDir = Path.Combine(_testDir, relativePath);

            Directory.CreateDirectory(containerDir);

            // Get the 'relativeFileNames' list that contains all the relative path of the files
            var relativeFileNames = Enumerable.Range(0, fileCount).Select(i => Path.Combine(relativePath, i.ToString())).ToArray();

            foreach (var relativeFileName in relativeFileNames)
            {
                File.Open(Path.Combine(_testDir, relativeFileName), FileMode.Create).Dispose();
            }

            // Call 'GetFilesInDirectory'
            var provider = new ProtectedAppDataFileProvider(_testDir);
            var files    = provider.GetFilesInDirectory(relativePath).OrderBy(f => int.Parse(Path.GetFileName(f))).ToList();

            // Assert that returned list is the same as 'relativeFileNames'
            Assert.Equal(relativeFileNames, files);
        }
        public void WriteDisabledWhileStreamOpen_ShouldNotWrite()
        {
            const string relativePath = "file.txt";
            const string content      = "file content";
            var          path         = Path.Combine(_testDir, relativePath);
            var          provider     = new ProtectedAppDataFileProvider(_testDir);

            // open the file stream
            using var stream = provider.OpenFile(relativePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

            // write something
            WriteContentToStream(stream, content);

            // disable write while the stream is still open
            provider.DisableWrite();

            // write more content
            WriteContentToStream(stream, "more content");

            // assert that the new content is not written
            var readContent = File.ReadAllText(Path.Combine(_testDir, relativePath));

            Assert.Equal(content, readContent);
        }
示例#17
0
        public async Task PersistentQueue_ConcurrentRead(int readerCount, int itemCount)
        {
            var dataDir  = Path.Combine(AppContext.BaseDirectory, Guid.NewGuid().ToString());
            var queueDir = Path.Combine(dataDir, _queueDirName);

            Directory.CreateDirectory(queueDir);
            var fileProvider = new ProtectedAppDataFileProvider(dataDir);

            try
            {
                var secondary = new FilePersistentQueue <List <int> >(100000, queueDir, new IntegerListSerializer(), fileProvider, NullLogger.Instance);
                using var cts       = new CancellationTokenSource();
                using var semaphore = new SemaphoreSlim(0, readerCount);
                var results = new List <int>();
                var q       = new AsyncBatchQueue <int>(10000,
                                                        new long[] { 100 },
                                                        new Func <int, long>[] { s => 1 }, secondary);

                async Task readerTask()
                {
                    var output = new List <int>();

                    await semaphore.WaitAsync();

                    // we're trying to test that the readers will 'eventually' read all the items, so we do several pulls here
                    await q.GetNextBatchAsync(output, 500);

                    await q.GetNextBatchAsync(output, 500);

                    await q.GetNextBatchAsync(output, 500);

                    await Task.Delay(100);

                    lock (results)
                    {
                        results.AddRange(output);
                    }
                };

                var readers = new Task[readerCount];
                for (var i = 0; i < readerCount; i++)
                {
                    readers[i] = readerTask();
                }

                for (var i = 0; i < itemCount; i++)
                {
                    if (i % 2 == 0)
                    {
                        await q.PushAsync(i);
                    }
                    else
                    {
                        await q.PushSecondaryAsync(new List <int> {
                            i
                        });
                    }
                }

                semaphore.Release(readerCount);
                await Task.WhenAll(readers);

                _output.WriteLine(results.Count.ToString());
                _output.WriteLine(q.EstimateSize().ToString());
                _output.WriteLine(q.EstimateSecondaryQueueSize().ToString());
                Assert.Equal(itemCount, results.Distinct().Count());
            }
            finally
            {
                if (Directory.Exists(dataDir))
                {
                    Directory.Delete(dataDir, true);
                }
            }
        }