public void FileOperationToBreakLeaseRequest(FileOperation operation, OperatorType operatorType, ModelDialectRevision dialect, out LeasingConfig c) { c = leasingConfig; LeasingClientInfo clientInfo = clients[(int)operatorType]; // Avoid to fail because Windows issue if (dialect == ModelDialectRevision.Smb2002) { clientInfo.ClientGuid = Guid.NewGuid(); } if (!clientInfo.IsInitialized) { InitializeClient(clientInfo, dialect); } if (operation == FileOperation.WRITE_DATA) { #region WRITE_DATA uint status = Smb2Status.STATUS_SUCCESS; Packet_Header header; CREATE_Response createResponse; Smb2CreateContextResponse[] serverCreateContexts; if (!clientInfo.IsOpened) { status = clientInfo.Client.Create(1, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, originalClient.File, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE, ShareAccess_Values.FILE_SHARE_READ | ShareAccess_Values.FILE_SHARE_WRITE | ShareAccess_Values.FILE_SHARE_DELETE, originalClient.IsDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE, CreateDisposition_Values.FILE_OPEN_IF, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, clientInfo.CreateContexts == null ? RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE : RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE, clientInfo.CreateContexts, out clientInfo.FileId, out serverCreateContexts, out header, out createResponse); Site.Assert.AreEqual(Smb2Status.STATUS_SUCCESS, status, "Expect that creation succeeds."); } byte[] data = Encoding.ASCII.GetBytes("Write data to break READ caching."); ushort creditCharge = Smb2Utility.CalculateCreditCharge((uint)data.Length, ModelUtility.GetDialectRevision(dialect)); clientInfo.LastOperationMessageId = clientInfo.MessageId; clientInfo.Client.WriteRequest(creditCharge, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, 0, clientInfo.FileId, Channel_Values.CHANNEL_NONE, WRITE_Request_Flags_Values.None, new byte[0], data); clientInfo.MessageId += (ulong)creditCharge; #endregion } else if (operation == FileOperation.SIZE_CHANGED) { #region SIZE_CHANGED uint status = Smb2Status.STATUS_SUCCESS; Packet_Header header; CREATE_Response createResponse; Smb2CreateContextResponse[] serverCreateContexts; if (!clientInfo.IsOpened) { status = clientInfo.Client.Create(1, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, originalClient.File, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE, ShareAccess_Values.FILE_SHARE_READ | ShareAccess_Values.FILE_SHARE_WRITE | ShareAccess_Values.FILE_SHARE_DELETE, originalClient.IsDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE, CreateDisposition_Values.FILE_OPEN, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, clientInfo.CreateContexts == null ? RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE : RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE, clientInfo.CreateContexts, out clientInfo.FileId, out serverCreateContexts, out header, out createResponse); Site.Assert.AreEqual(Smb2Status.STATUS_SUCCESS, status, "Expect that creation succeeds."); } FileEndOfFileInformation changeSizeInfo; changeSizeInfo.EndOfFile = 512; byte[] inputBuffer; inputBuffer = TypeMarshal.ToBytes<FileEndOfFileInformation>(changeSizeInfo); clientInfo.LastOperationMessageId = clientInfo.MessageId; clientInfo.Client.SetInfoRequest( 1, 1, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, SET_INFO_Request_InfoType_Values.SMB2_0_INFO_FILE, (byte)FileInformationClasses.FileEndOfFileInformation, SET_INFO_Request_AdditionalInformation_Values.NONE, clientInfo.FileId, inputBuffer); #endregion } else if (operation == FileOperation.RANGE_LOCK) { #region RANGE_LOCK uint status = Smb2Status.STATUS_SUCCESS; Packet_Header header; CREATE_Response createResponse; Smb2CreateContextResponse[] serverCreateContexts; if (!clientInfo.IsOpened) { status = clientInfo.Client.Create(1, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, originalClient.File, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE, ShareAccess_Values.FILE_SHARE_READ | ShareAccess_Values.FILE_SHARE_WRITE | ShareAccess_Values.FILE_SHARE_DELETE, originalClient.IsDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE, CreateDisposition_Values.FILE_OPEN, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, clientInfo.CreateContexts == null ? RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE : RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE, clientInfo.CreateContexts, out clientInfo.FileId, out serverCreateContexts, out header, out createResponse); Site.Assert.AreEqual(Smb2Status.STATUS_SUCCESS, status, "Expect that creation succeeds."); } clientInfo.Locks = new LOCK_ELEMENT[1]; clientInfo.LockSequence = 0; clientInfo.Locks[0].Offset = 0; clientInfo.Locks[0].Length = (ulong)1 * 1024 / 2; clientInfo.Locks[0].Flags = LOCK_ELEMENT_Flags_Values.LOCKFLAG_SHARED_LOCK; clientInfo.LastOperationMessageId = clientInfo.MessageId; clientInfo.Client.LockRequest( 1, 1, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, clientInfo.LockSequence++, clientInfo.FileId, clientInfo.Locks ); #endregion } else if (operation == FileOperation.OPEN_OVERWRITE) { #region OPEN_OVERWRITE if (clientInfo.IsOpened) { clientInfo.Reset(operatorType == OperatorType.SecondClient); InitializeClient(clientInfo, dialect); } clientInfo.LastOperationMessageId = clientInfo.MessageId; clientInfo.Client.CreateRequest(1, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, originalClient.File, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE, ShareAccess_Values.FILE_SHARE_READ | ShareAccess_Values.FILE_SHARE_WRITE | ShareAccess_Values.FILE_SHARE_DELETE, originalClient.IsDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE, CreateDisposition_Values.FILE_OVERWRITE, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, clientInfo.CreateContexts == null ? RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE : RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE, clientInfo.CreateContexts); #endregion } else if (operation == FileOperation.OPEN_WITHOUT_OVERWRITE) { #region OPEN_WITHOUT_OVERWRITE if (clientInfo.IsOpened) { clientInfo.Reset(operatorType == OperatorType.SecondClient); InitializeClient(clientInfo, dialect); } if (!clientInfo.IsOpened) { clientInfo.LastOperationMessageId = clientInfo.MessageId; clientInfo.Client.CreateRequest(1, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, originalClient.File, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE, ShareAccess_Values.FILE_SHARE_READ | ShareAccess_Values.FILE_SHARE_WRITE | ShareAccess_Values.FILE_SHARE_DELETE, originalClient.IsDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE, CreateDisposition_Values.FILE_OPEN, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, clientInfo.CreateContexts == null ? RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE : RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE, clientInfo.CreateContexts); } #endregion } else if (operation == FileOperation.OPEN_SHARING_VIOLATION) { #region OPEN_SHARING_VIOLATION if (clientInfo.IsOpened) { clientInfo.Reset(operatorType == OperatorType.SecondClient); InitializeClient(clientInfo, dialect); } if (!clientInfo.IsOpened) { clientInfo.LastOperationMessageId = clientInfo.MessageId; clientInfo.Client.CreateRequest(1, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, originalClient.File, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE, ShareAccess_Values.FILE_SHARE_READ, originalClient.IsDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE, CreateDisposition_Values.FILE_OPEN, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, clientInfo.CreateContexts == null ? RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE : RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE, clientInfo.CreateContexts); } #endregion } else if (operation == FileOperation.OPEN_SHARING_VIOLATION_WITH_OVERWRITE) { #region OPEN_SHARING_VIOLATION_WITH_OVERWRITE if (clientInfo.IsOpened) { clientInfo.Reset(operatorType == OperatorType.SecondClient); InitializeClient(clientInfo, dialect); } if (!clientInfo.IsOpened) { clientInfo.LastOperationMessageId = clientInfo.MessageId; clientInfo.Client.CreateRequest(1, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, originalClient.File, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE, ShareAccess_Values.FILE_SHARE_READ, originalClient.IsDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE, CreateDisposition_Values.FILE_OVERWRITE, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, clientInfo.CreateContexts == null ? RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE : RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE, clientInfo.CreateContexts); } #endregion } else if (operation == FileOperation.DELETED) { #region DELETED if (clientInfo.IsOpened) { clientInfo.Reset(operatorType == OperatorType.SecondClient); InitializeClient(clientInfo, dialect); } uint status = Smb2Status.STATUS_SUCCESS; Packet_Header header; CREATE_Response createResponse; Smb2CreateContextResponse[] serverCreateContexts; if (!clientInfo.IsOpened) { clientInfo.Client.Create(1, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, originalClient.File, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE, ShareAccess_Values.FILE_SHARE_READ | ShareAccess_Values.FILE_SHARE_WRITE | ShareAccess_Values.FILE_SHARE_DELETE, (originalClient.IsDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE) | CreateOptions_Values.FILE_DELETE_ON_CLOSE, CreateDisposition_Values.FILE_OPEN, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, clientInfo.CreateContexts == null ? RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE : RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE, clientInfo.CreateContexts, out clientInfo.FileId, out serverCreateContexts, out header, out createResponse); Site.Assert.AreEqual(Smb2Status.STATUS_SUCCESS, status, "Expect that creation succeeds."); } FileDispositionInformation deleteInfo; deleteInfo.DeletePending = 1; byte[] inputBuffer; inputBuffer = TypeMarshal.ToBytes<FileDispositionInformation>(deleteInfo); clientInfo.LastOperationMessageId = clientInfo.MessageId; clientInfo.Client.SetInfoRequest( 1, 1, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, SET_INFO_Request_InfoType_Values.SMB2_0_INFO_FILE, (byte)FileInformationClasses.FileDispositionInformation, SET_INFO_Request_AdditionalInformation_Values.NONE, clientInfo.FileId, inputBuffer); #endregion } else if (operation == FileOperation.RENAMEED) { #region RENAMEED if (clientInfo.IsOpened) { clientInfo.Reset(operatorType == OperatorType.SecondClient); InitializeClient(clientInfo, dialect); } uint status = Smb2Status.STATUS_SUCCESS; Packet_Header header; CREATE_Response createResponse; Smb2CreateContextResponse[] serverCreateContexts; if (!clientInfo.IsOpened) { status = clientInfo.Client.Create(1, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, originalClient.File, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE, ShareAccess_Values.FILE_SHARE_READ | ShareAccess_Values.FILE_SHARE_WRITE | ShareAccess_Values.FILE_SHARE_DELETE, originalClient.IsDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE, CreateDisposition_Values.FILE_OPEN, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, clientInfo.CreateContexts == null ? RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE : RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE, clientInfo.CreateContexts, out clientInfo.FileId, out serverCreateContexts, out header, out createResponse); Site.Assert.AreEqual(Smb2Status.STATUS_SUCCESS, status, "Expect that creation succeeds."); } string newFileName = originalClient.ParentDirectory + "\\" + Guid.NewGuid().ToString(); FileRenameInformation info = new FileRenameInformation(); info.ReplaceIfExists = 1; info.FileName = ConvertStringToByteArray(newFileName); info.FileNameLength = (uint)info.FileName.Length; info.RootDirectory = FileRenameInformation_RootDirectory_Values.V1; info.Reserved = new byte[7]; byte[] inputBuffer; inputBuffer = TypeMarshal.ToBytes<FileRenameInformation>(info); clientInfo.LastOperationMessageId = clientInfo.MessageId; clientInfo.Client.SetInfoRequest( 1, 1, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, SET_INFO_Request_InfoType_Values.SMB2_0_INFO_FILE, (byte)FileInformationClasses.FileRenameInformation, SET_INFO_Request_AdditionalInformation_Values.NONE, clientInfo.FileId, inputBuffer); originalClient.File = newFileName; #endregion } else if (operation == FileOperation.PARENT_DIR_RENAMED) { #region PARENT_DIR_RENAMED if (clientInfo.IsOpened) { clientInfo.Reset(operatorType == OperatorType.SecondClient); InitializeClient(clientInfo, dialect); } uint status = Smb2Status.STATUS_SUCCESS; Packet_Header header; CREATE_Response createResponse; Smb2CreateContextResponse[] serverCreateContexts; if (!clientInfo.IsOpened) { status = clientInfo.Client.Create(1, 64, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, originalClient.ParentDirectory, AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.DELETE, ShareAccess_Values.FILE_SHARE_READ | ShareAccess_Values.FILE_SHARE_WRITE | ShareAccess_Values.FILE_SHARE_DELETE, CreateOptions_Values.FILE_DIRECTORY_FILE, CreateDisposition_Values.FILE_OPEN, File_Attributes.NONE, ImpersonationLevel_Values.Impersonation, SecurityFlags_Values.NONE, RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE, null, out clientInfo.FileId, out serverCreateContexts, out header, out createResponse); Site.Assert.AreEqual(Smb2Status.STATUS_SUCCESS, status, "Expect that creation succeeds."); } string newFileName = "LeasingDir_" + Guid.NewGuid().ToString(); FileRenameInformation info = new FileRenameInformation(); info.ReplaceIfExists = 0; info.FileName = ConvertStringToByteArray(newFileName); info.FileNameLength = (uint)info.FileName.Length; info.RootDirectory = FileRenameInformation_RootDirectory_Values.V1; info.Reserved = new byte[7]; byte[] inputBuffer; inputBuffer = TypeMarshal.ToBytes<FileRenameInformation>(info); clientInfo.LastOperationMessageId = clientInfo.MessageId; clientInfo.Client.SetInfoRequest( 1, 1, clientInfo.Flags, clientInfo.MessageId++, clientInfo.SessionId, clientInfo.TreeId, SET_INFO_Request_InfoType_Values.SMB2_0_INFO_FILE, (byte)FileInformationClasses.FileRenameInformation, SET_INFO_Request_AdditionalInformation_Values.NONE, clientInfo.FileId, inputBuffer); // Does not need to update these two fields File and ParentDirectory in orginal client because the operation will fail. #endregion } lastOperation = new BreakOperation(operation, operatorType); }
public override void Initialize(ITestSite testSite) { base.Initialize(testSite); clients = new List<LeasingClientInfo>(); lastOperation = null; }
public override void Reset() { if (clients != null) { try { foreach (var clientInfo in clients) { clientInfo.Cleanup(); } } finally { clients.Clear(); } } try { originalClient.Cleanup(); if (originalClient.ParentDirectory != null) { sutProtocolController.DeleteDirectory(uncSharePath, originalClient.ParentDirectory); } } catch { } base.Reset(); lastOperation = null; }