diff --git a/SMBLibrary.Tests/NTFileStore/NTDirectoryFileSystemTests.cs b/SMBLibrary.Tests/NTFileStore/NTDirectoryFileSystemTests.cs new file mode 100644 index 0000000..316fe4b --- /dev/null +++ b/SMBLibrary.Tests/NTFileStore/NTDirectoryFileSystemTests.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMBLibrary; +using SMBLibrary.Win32; + +namespace SMBLibrary.Tests +{ + [TestClass] + public class NTDirectoryFileSystemTests : NTFileStoreTests + { + private static readonly string TestDirectoryPath = @"C:\Tests"; + + static NTDirectoryFileSystemTests() + { + if (!Directory.Exists(TestDirectoryPath)) + { + Directory.CreateDirectory(TestDirectoryPath); + } + } + + public NTDirectoryFileSystemTests() : base(new NTDirectoryFileSystem(TestDirectoryPath)) + { + } + } +} diff --git a/SMBLibrary.Tests/NTFileStore/NTFileStoreTests.cs b/SMBLibrary.Tests/NTFileStore/NTFileStoreTests.cs new file mode 100644 index 0000000..4502a4b --- /dev/null +++ b/SMBLibrary.Tests/NTFileStore/NTFileStoreTests.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SMBLibrary; +using SMBLibrary.Win32; + +namespace SMBLibrary.Tests +{ + [TestClass] + public abstract class NTFileStoreTests + { + private INTFileStore m_fileStore; + private readonly string TestDirName = "Dir"; + + private NTStatus? m_notifyChangeStatus; + + public NTFileStoreTests(INTFileStore fileStore) + { + m_fileStore = fileStore; + + object handle; + FileStatus fileStatus; + NTStatus status = m_fileStore.CreateFile(out handle, out fileStatus, TestDirName, AccessMask.GENERIC_ALL, FileAttributes.Directory, ShareAccess.Read, CreateDisposition.FILE_OPEN_IF, CreateOptions.FILE_DIRECTORY_FILE, null); + Assert.IsTrue(status == NTStatus.STATUS_SUCCESS); + status = m_fileStore.CloseFile(handle); + Assert.IsTrue(status == NTStatus.STATUS_SUCCESS); + } + + [TestMethod] + public void TestCancel() + { + object handle; + FileStatus fileStatus; + m_fileStore.CreateFile(out handle, out fileStatus, TestDirName, AccessMask.GENERIC_ALL, FileAttributes.Directory, ShareAccess.Read, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, null); + + object ioRequest = null; + NTStatus status = m_fileStore.NotifyChange(out ioRequest, handle, NotifyChangeFilter.FileName | NotifyChangeFilter.LastWrite | NotifyChangeFilter.DirName, false, 8192, OnNotifyChangeCompleted, null); + Assert.IsTrue(status == NTStatus.STATUS_PENDING); + + m_fileStore.Cancel(ioRequest); + m_fileStore.CloseFile(handle); + while (m_notifyChangeStatus == null) + { + Thread.Sleep(1); + } + Assert.IsTrue(m_notifyChangeStatus.Value == NTStatus.STATUS_CANCELLED); + } + + private void OnNotifyChangeCompleted(NTStatus status, byte[] buffer, object context) + { + m_notifyChangeStatus = status; + } + + public void TestAll() + { + TestCancel(); + } + } +} diff --git a/SMBLibrary.Tests/Program.cs b/SMBLibrary.Tests/Program.cs index 14fd6f4..b30253f 100644 --- a/SMBLibrary.Tests/Program.cs +++ b/SMBLibrary.Tests/Program.cs @@ -15,6 +15,8 @@ namespace SMBLibrary.Tests new NetBiosTests().TestAll(); new RPCTests().TestAll(); new SMB2SigningTests().TestAll(); + + new NTDirectoryFileSystemTests().TestAll(); } } } diff --git a/SMBLibrary.Tests/SMBLibrary.Tests.csproj b/SMBLibrary.Tests/SMBLibrary.Tests.csproj index c184e26..0a07252 100644 --- a/SMBLibrary.Tests/SMBLibrary.Tests.csproj +++ b/SMBLibrary.Tests/SMBLibrary.Tests.csproj @@ -36,6 +36,8 @@ + +