public void GetFiles_UnknownDates_CallsApiCorrectly()
        {
            var supportsPatternSearch = bool.Parse((string)TestContext.DataRow["SupportsPatternSearch"]);

            var fixture = DokanOperationsFixture.Instance;

            var path = fixture.DirectoryName.AsRootedPath();

#if LOGONLY
            fixture.SetupAny();
#else
            fixture.ExpectOpenDirectory(path);
            //Remove all dates
            var files = DokanOperationsFixture.RemoveDatesFromFileInformations(fixture.DirectoryItems);

            if (supportsPatternSearch)
            {
                fixture.ExpectFindFilesWithPattern(path, "*", files);
            }
            else
            {
                fixture.ExpectFindFilesWithPatternToFail(path, "*", DokanResult.NotImplemented);
                fixture.ExpectFindFiles(path, files);
            }
#endif

            var sut = new DirectoryInfo(fixture.DirectoryName.AsDriveBasedPath());

#if LOGONLY
            Assert.IsNotNull(sut.GetFiles(), nameof(sut.GetFiles));
            Console.WriteLine(sut.GetFiles().Length);
#else
            var receivedFiles = sut.GetFiles();

            // As DirectoryInfo does not handle uninitialized DateTime values correctly
            // it has to be provided with DateTime.FromFileTime(0) as default minimum date
            var defaultDate            = DateTime.FromFileTime(0);
            var expectedDateCollection = Enumerable.Repeat(defaultDate, receivedFiles.Length).ToArray();

            CollectionAssert.AreEqual(
                receivedFiles.Select(f => f.Name).ToArray(),
                fixture.DirectoryItems.Where(i => i.Attributes.HasFlag(FileAttributes.Normal)).Select(i => i.FileName).ToArray(),
                nameof(sut.GetFiles));

            CollectionAssert.AreEqual(
                expectedDateCollection,
                receivedFiles.Select(x => x.CreationTime).ToArray(),
                nameof(FileInformation.CreationTime));
            CollectionAssert.AreEqual(
                expectedDateCollection,
                receivedFiles.Select(x => x.LastWriteTime).ToArray(),
                nameof(FileInformation.LastWriteTime));
            CollectionAssert.AreEqual(
                expectedDateCollection,
                receivedFiles.Select(x => x.LastAccessTime).ToArray(),
                nameof(FileInformation.LastAccessTime));

            fixture.Verify();
#endif
        }
Example #2
0
        public void Cleanup()
        {
            var hasUnmatchedInvocations = false;

            DokanOperationsFixture.ClearInstance(out hasUnmatchedInvocations);
            Assert.IsFalse(hasUnmatchedInvocations, "Found Mock invocations without corresponding setups");
        }
Example #3
0
        public void OpenRead_WithVariableSizes_Overlapped_CallsApiCorrectly()
        {
            var bufferSize = int.Parse((string) TestContext.DataRow["BufferSize"]);
            var fileSize = int.Parse((string) TestContext.DataRow["FileSize"]);

            var fixture = DokanOperationsFixture.Instance;

            var path = fixture.FileName.AsRootedPath();
            var testData = DokanOperationsFixture.InitBlockTestData(bufferSize, fileSize);
#if LOGONLY
            fixture.PermitAny();
#else
            fixture.ExpectCreateFile(path, ReadAccess, ReadShare, FileMode.Open, context: testData);
            fixture.ExpectReadFileInChunks(path, testData, bufferSize, context: testData, synchronousIo: false);
#endif

            var outputs = NativeMethods.ReadEx(fixture.FileName.AsDriveBasedPath(), bufferSize, testData.Length);

#if !LOGONLY
            for (var i = 0; i < outputs.Length; ++i)
            {
                Assert.AreEqual(0, outputs[i].Win32Error, $"Unexpected Win32 error in output {i} for BufferSize={bufferSize}, FileSize={fileSize}");
                Assert.AreEqual(NativeMethods.BufferSize(bufferSize, fileSize, i), outputs[i].BytesTransferred, $"Unexpected number of bytes read in output {i} for BufferSize={bufferSize}, FileSize={fileSize}");
                Assert.IsTrue(Enumerable.All(outputs[i].Buffer, b => b == (byte) i + 1), $"Unexpected data in output {i} for BufferSize={bufferSize}, FileSize={fileSize}");
            }

            fixture.Verify();
        }
Example #4
0
        public void Delete_WhereRecurseIsTrueAndDirectoryIsNonempty_CallsApiCorrectly()
        {
            var fixture = DokanOperationsFixture.Instance;

            string path        = DokanOperationsFixture.DirectoryName.AsRootedPath(),
                   subFileName = "SubFile.ext",
                   subFilePath = Path.DirectorySeparatorChar + subFileName;

#if LOGONLY
            fixture.SetupAny();
#else
            fixture.SetupCreateFile(path, ReadAttributesAccess, ReadWriteShare, FileMode.Open);
            fixture.SetupGetFileInformation(path, FileAttributes.Directory);
            fixture.SetupOpenDirectory(path);
            fixture.SetupFindFiles(path, DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().Concat(new[] {
                new FileInformation()
                {
                    FileName = subFileName, Attributes = FileAttributes.Normal, Length = 100, CreationTime = DateTime.Today, LastWriteTime = DateTime.Today, LastAccessTime = DateTime.Today
                }
            }).ToArray());
            fixture.SetupCreateFile(path + subFilePath, DeleteAccess, ReadWriteShare, FileMode.Open, deleteOnClose: true);
            fixture.SetupGetFileInformation(path + subFilePath, FileAttributes.Normal);
            fixture.SetupDeleteFile(path + subFilePath);
            fixture.SetupDeleteDirectory(path, true);
#endif

            var sut = new DirectoryInfo(DokanOperationsFixture.DirectoryName.AsDriveBasedPath());

            sut.Delete(true);

#if !LOGONLY
            fixture.VerifyAll();
#endif
        }
Example #5
0
        public void Delete_WhereRecurseIsTrueAndDirectoryIsEmpty_CallsApiCorrectly(bool supportsPatternSearch)
        {
            var fixture = DokanOperationsFixture.Instance;

            var path = fixture.DirectoryName.AsRootedPath();

#if LOGONLY
            fixture.SetupAny();
#else
            fixture.ExpectCreateFile(path, ReadAttributesAccess, ReadWriteShare, FileMode.Open);
            fixture.ExpectGetFileInformation(path, FileAttributes.Directory);
            fixture.ExpectOpenDirectory(path);
            if (supportsPatternSearch)
            {
                fixture.ExpectFindFilesWithPattern(path, "*", DokanOperationsFixture.GetEmptyDirectoryDefaultFiles());
            }
            else
            {
                fixture.ExpectFindFilesWithPatternToFail(path, "*", DokanResult.NotImplemented);
                fixture.ExpectFindFiles(path, DokanOperationsFixture.GetEmptyDirectoryDefaultFiles());
            }
            fixture.ExpectOpenDirectory(path, DeleteFromDirectoryAccess);
            fixture.ExpectDeleteDirectory(path);
#endif

            var sut = new DirectoryInfo(fixture.DirectoryName.AsDriveBasedPath());

            sut.Delete(true);

#if !LOGONLY
            fixture.Verify();
#endif
        }
        public void Delete_WhereRecurseIsTrueAndDirectoryIsNonempty_CallsApiCorrectly()
        {
            var supportsPatternSearch = bool.Parse((string)TestContext.DataRow["SupportsPatternSearch"]);

            var fixture = DokanOperationsFixture.Instance;

            string path        = fixture.DirectoryName.AsRootedPath(),
                   subFileName = "SubFile.ext",
                   subFilePath = Path.DirectorySeparatorChar + subFileName;

#if LOGONLY
            fixture.SetupAny();
#else
            fixture.ExpectCreateFile(path, ReadAttributesAccess, ReadWriteShare, FileMode.Open);
            fixture.ExpectGetFileInformation(path, FileAttributes.Directory);
            fixture.ExpectOpenDirectory(path);
            if (supportsPatternSearch)
            {
                fixture.ExpectFindFilesWithPattern(path, "*", DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().Concat(new[]
                {
                    new FileInformation()
                    {
                        FileName     = subFileName, Attributes = FileAttributes.Normal,
                        Length       = 100,
                        CreationTime = DateTime.Today, LastWriteTime = DateTime.Today, LastAccessTime = DateTime.Today
                    }
                }).ToArray());
            }
            else
            {
                fixture.ExpectFindFilesWithPatternToFail(path, "*", DokanResult.NotImplemented);
                fixture.ExpectFindFiles(path, DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().Concat(new[]
                {
                    new FileInformation()
                    {
                        FileName     = subFileName, Attributes = FileAttributes.Normal,
                        Length       = 100,
                        CreationTime = DateTime.Today, LastWriteTime = DateTime.Today, LastAccessTime = DateTime.Today
                    }
                }).ToArray());
            }
            fixture.ExpectCreateFile(path + subFilePath, DeleteAccess, ReadWriteShare, FileMode.Open, deleteOnClose: true);
            fixture.ExpectGetFileInformation(path + subFilePath, FileAttributes.Normal);
            fixture.ExpectDeleteFile(path + subFilePath);
            fixture.ExpectOpenDirectory(path, DeleteFromDirectoryAccess);
            fixture.ExpectDeleteDirectory(path);
#endif

            var sut = new DirectoryInfo(fixture.DirectoryName.AsDriveBasedPath());

            sut.Delete(true);

#if !LOGONLY
            fixture.Verify();
#endif
        }
Example #7
0
        public void GetFileSystemInfos_OnRootDirectory_WhereSearchOptionIsAllDirectories_CallsApiCorrectly()
        {
            var fixture = DokanOperationsFixture.Instance;

            var pathsAndItems = new[]
            {
                new {
                    Path  = DokanOperationsFixture.RootName,
                    Items = DokanOperationsFixture.RootDirectoryItems
                },
                new {
                    Path  = DokanOperationsFixture.DirectoryName.AsRootedPath(),
                    Items = DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().Concat(DokanOperationsFixture.DirectoryItems).ToArray()
                },
                new {
                    Path  = Path.Combine(DokanOperationsFixture.DirectoryName, DokanOperationsFixture.SubDirectoryName).AsRootedPath(),
                    Items = DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().Concat(DokanOperationsFixture.SubDirectoryItems).ToArray()
                },
                new {
                    Path  = DokanOperationsFixture.Directory2Name.AsRootedPath(),
                    Items = DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().Concat(DokanOperationsFixture.Directory2Items).ToArray()
                },
                new {
                    Path  = Path.Combine(DokanOperationsFixture.Directory2Name, DokanOperationsFixture.SubDirectory2Name).AsRootedPath(),
                    Items = DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().ToArray()
                }
            };

#if LOGONLY
            fixture.SetupAny();
#else
            foreach (var pathAndItem in pathsAndItems)
            {
                fixture.SetupOpenDirectory(pathAndItem.Path);
                fixture.SetupFindFiles(pathAndItem.Path, pathAndItem.Items);
            }
#endif

            var sut = new DirectoryInfo(DokanOperationsFixture.RootName.AsDriveBasedPath());

#if LOGONLY
            Assert.IsNotNull(sut.GetFileSystemInfos(), nameof(sut.GetFileSystemInfos));
            Console.WriteLine(sut.GetFileSystemInfos().Length);
#else
            CollectionAssert.AreEqual(
                pathsAndItems.Select(p => p.Items.Where(f => !f.FileName.All(c => c == '.')))
                .Aggregate((i1, i2) => i1.Union(i2).ToArray())
                .Select(i => i.FileName).ToArray(),
                sut.GetFileSystemInfos("*", SearchOption.AllDirectories).Select(f => f.Name).ToArray(),
                nameof(sut.GetFileSystemInfos));

            fixture.VerifyAll();
#endif
        }
        public void GetFileSystemInfos_OnRootDirectory_WhereSearchOptionIsAllDirectories_CallsApiCorrectly()
        {
            var supportsPatternSearch = bool.Parse((string)TestContext.DataRow["SupportsPatternSearch"]);

            var fixture = DokanOperationsFixture.Instance;

            var pathsAndItems = new[]
            {
                new { Path = DokanOperationsFixture.RootName, Items = fixture.RootDirectoryItems },
                new { Path = fixture.DirectoryName.AsRootedPath(), Items = DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().Concat(fixture.DirectoryItems).ToArray() },
                new { Path = Path.Combine(fixture.DirectoryName, fixture.SubDirectoryName).AsRootedPath(), Items = DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().Concat(fixture.SubDirectoryItems).ToArray() },
                new { Path = fixture.Directory2Name.AsRootedPath(), Items = DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().Concat(fixture.Directory2Items).ToArray() },
                new { Path = Path.Combine(fixture.Directory2Name, fixture.SubDirectory2Name).AsRootedPath(), Items = DokanOperationsFixture.GetEmptyDirectoryDefaultFiles().ToArray() }
            };

#if LOGONLY
            fixture.SetupAny();
#else
            foreach (var pathAndItem in pathsAndItems)
            {
                fixture.ExpectOpenDirectory(pathAndItem.Path);
                if (supportsPatternSearch)
                {
                    fixture.ExpectFindFilesWithPattern(pathAndItem.Path, "*", pathAndItem.Items);
                }
                else
                {
                    fixture.ExpectFindFilesWithPatternToFail(pathAndItem.Path, "*", DokanResult.NotImplemented);
                    fixture.ExpectFindFiles(pathAndItem.Path, pathAndItem.Items);
                }
            }
#endif

            var sut = new DirectoryInfo(DokanOperationsFixture.RootName.AsDriveBasedPath());

#if LOGONLY
            Assert.IsNotNull(sut.GetFileSystemInfos(), nameof(sut.GetFileSystemInfos));
            Console.WriteLine(sut.GetFileSystemInfos().Length);
#else
            CollectionAssert.AreEqual(
                pathsAndItems.Select(p => p.Items.Where(f => f.FileName.Any(c => c != '.'))).Aggregate((i1, i2) => i1.Union(i2).ToArray()).Select(i => i.FileName).ToArray(),
                sut.GetFileSystemInfos("*", SearchOption.AllDirectories).Select(f => f.Name).ToArray(),
                nameof(sut.GetFileSystemInfos));

            fixture.Verify();
#endif
        }
        public void OpenWrite_WithVariableSizes_Overlapped_CallsApiCorrectly()
        {
            var bufferSize = int.Parse((string)TestContext.DataRow["BufferSize"]);
            var fileSize   = int.Parse((string)TestContext.DataRow["FileSize"]);

            var fixture = DokanOperationsFixture.Instance;

            var path     = fixture.FileName.AsRootedPath();
            var testData = DokanOperationsFixture.InitBlockTestData(bufferSize, fileSize);

#if LOGONLY
            fixture.SetupAny();
#else
            fixture.ExpectCreateFile(path, WriteAccess, WriteShare, FileMode.Open, context: testData);
            fixture.ExpectSetAllocationSize(path, testData.Length);
            fixture.ExpectSetEndOfFile(path, testData.Length);
#if NETWORK_DRIVE
            fixture.SetupWriteFileInChunks(path, testData, bufferSize, context: testData, synchronousIo: false);
#else
            fixture.ExpectWriteFileInChunks(path, testData, bufferSize, context: testData);
#endif
#endif

            var inputs =
                Enumerable.Range(0, NativeMethods.NumberOfChunks(bufferSize, fileSize))
                .Select(
                    i =>
                    new NativeMethods.OverlappedChunk(
                        Enumerable.Repeat((byte)(i + 1),
                                          NativeMethods.BufferSize(bufferSize, testData.Length, i)).ToArray()))
                .ToArray();

            NativeMethods.WriteEx(fixture.FileName.AsDriveBasedPath(), bufferSize, testData.Length, inputs);

#if !LOGONLY
            for (var i = 0; i < inputs.Length; ++i)
            {
                Assert.AreEqual(0, inputs[i].Win32Error,
                                $"Unexpected Win32 error in input {i} for BufferSize={bufferSize}, FileSize={fileSize}");
                Assert.AreEqual(NativeMethods.BufferSize(bufferSize, fileSize, i), inputs[i].BytesTransferred,
                                $"Unexpected number of bytes written in input {i} for BufferSize={bufferSize}, FileSize={fileSize}");
            }

            fixture.Verify();
#endif
        }
Example #10
0
        public void OpenWrite_WithLargeFile_InParallel_PassesContextCorrectly()
        {
            var fixture = DokanOperationsFixture.Instance;

            var path    = fixture.FileName.AsRootedPath();
            var context = new object();

#if LOGONLY
            fixture.SetupAny();
#else
            fixture.ExpectCreateFile(path, WriteAccess, WriteShare, FileMode.OpenOrCreate, FileOptions.None,
                                     context: context);
            fixture.ExpectWriteFileInChunks(path, largeData, FILE_BUFFER_SIZE, context: context);

            fixture.PermitProbeFile(path, largeData);
#endif

            var sut = new FileInfo(fixture.FileName.AsDriveBasedPath());

            using (var stream = sut.OpenWrite())
            {
                var totalWrittenBytes = 0;

                Parallel.For(0, DokanOperationsFixture.NumberOfChunks(FILE_BUFFER_SIZE, largeData.Length), i =>
                {
                    var origin = i * FILE_BUFFER_SIZE;
                    var count  = Math.Min(FILE_BUFFER_SIZE, largeData.Length - origin);
                    lock (stream)
                    {
                        stream.Seek(origin, SeekOrigin.Begin);
                        stream.Write(largeData, origin, count);
                        totalWrittenBytes += count;
                    }
                });
            }

#if !LOGONLY
            fixture.VerifyContextWriteInvocations(path, 6);
#endif
        }
Example #11
0
        public void OpenRead_WithLargeFile_InParallel_PassesContextCorrectly()
        {
            var fixture = DokanOperationsFixture.Instance;

            var path    = fixture.FileName.AsRootedPath();
            var context = new object();

#if LOGONLY
            fixture.SetupAny();
#else
            fixture.ExpectCreateFile(path, ReadAccess, ReadOnlyShare, FileMode.Open, FileOptions.None, context: context);
            fixture.ExpectReadFileInChunks(path, largeData, FILE_BUFFER_SIZE, context: context);
#endif

            var sut = new FileInfo(fixture.FileName.AsDriveBasedPath());

            using (var stream = sut.OpenRead())
            {
                var target         = new byte[largeData.Length];
                var totalReadBytes = 0;

                Parallel.For(0, DokanOperationsFixture.NumberOfChunks(FILE_BUFFER_SIZE, largeData.Length), i =>
                {
                    var origin = i * FILE_BUFFER_SIZE;
                    var count  = Math.Min(FILE_BUFFER_SIZE, target.Length - origin);
                    lock (stream)
                    {
                        stream.Seek(origin, SeekOrigin.Begin);
                        totalReadBytes += stream.Read(target, origin, count);
                    }
                });
            }

#if !LOGONLY
            fixture.VerifyContextReadInvocations(path, 6);
#endif
        }
Example #12
0
        public void Delete_WhereRecurseIsTrueAndDirectoryIsEmpty_CallsApiCorrectly()
        {
            var fixture = DokanOperationsFixture.Instance;

            string path = DokanOperationsFixture.DirectoryName.AsRootedPath();

#if LOGONLY
            fixture.SetupAny();
#else
            fixture.SetupCreateFile(path, ReadAttributesAccess, ReadWriteShare, FileMode.Open);
            fixture.SetupGetFileInformation(path, FileAttributes.Directory);
            fixture.SetupOpenDirectory(path);
            fixture.SetupFindFiles(path, DokanOperationsFixture.GetEmptyDirectoryDefaultFiles());
            fixture.SetupDeleteDirectory(path, true);
#endif

            var sut = new DirectoryInfo(DokanOperationsFixture.DirectoryName.AsDriveBasedPath());

            sut.Delete(true);

#if !LOGONLY
            fixture.VerifyAll();
#endif
        }
Example #13
0
 public void Initialize()
 {
     DokanOperationsFixture.InitInstance(TestContext.TestName);
 }
Example #14
0
 public static void ClassInitialize(TestContext context)
 {
     testData = DokanOperationsFixture.InitBlockTestData(FILE_BUFFER_SIZE, 5*FILE_BUFFER_SIZE + 65536);
 }
Example #15
0
 public static string AsDriveBasedPath(this string path) => DokanOperationsFixture.DriveBasedPath(path);
Example #16
0
 public static string AsRootedPath(this string path) => DokanOperationsFixture.RootedPath(path);
Example #17
0
 public void Initialize()
 {
     DokanOperationsFixture.InitInstance();
 }
Example #18
0
 public override void Initialize()
 {
     // Clear the buffer pool (so we can validate in Cleanup()) and init test fixture.
     BufferPool.Default.Clear();
     DokanOperationsFixture.InitInstance(TestContext.TestName, unsafeOperations: true);
 }