private void CheckCreateContextResponsesExistence(Smb2CreateContextResponse[] createContextResponse, bool shouldExist, params BaseResponseChecker[] checkers)
        {
            foreach (var checker in checkers)
            {
                bool found = false;
                if (createContextResponse != null)
                {
                    foreach (var response in createContextResponse)
                    {
                        if (response.GetType() == checker.ResponseType)
                        {
                            checker.Check(response);
                            found = true;
                            break;
                        }
                    }
                }
                if (shouldExist && !found)
                {
                    BaseTestSite.Assert.Fail("The expected response {0} does not exist.", checker.ResponseType);
                }

                if (!shouldExist && found)
                {
                    BaseTestSite.Assert.Fail("The response {0} should not exist.", checker.ResponseType);
                }
            }
        }
Beispiel #2
0
        public override void Check(Smb2CreateContextResponse response)
        {
            base.Check(response);
            Smb2CreateDurableHandleResponseV2 durableHandleResponse = response as Smb2CreateDurableHandleResponseV2;

            TestSite.Assert.AreEqual(flag, durableHandleResponse.Flags, "Flag in the response is expected to be {0}. The actual value is {1}.", flag, durableHandleResponse.Flags);
            if (timeout != uint.MaxValue)
            {
                TestSite.Assert.AreEqual(timeout, durableHandleResponse.Timeout, "Timeout in the response is expected to be {0}. The actual value is {1}.", timeout, durableHandleResponse.Timeout);
            }
        }
Beispiel #3
0
        public override void Check(Smb2CreateContextResponse response)
        {
            base.Check(response);
            Smb2CreateResponseLease leaseResponse = response as Smb2CreateResponseLease;

            TestSite.Assert.AreEqual(leaseKey, leaseResponse.LeaseKey, "LeaseKey in the response is expected to be {0}. The actual value is {1}.", leaseKey, leaseResponse.LeaseKey);
            TestSite.Assert.AreEqual(leaseState, leaseResponse.LeaseState, "LeaseState in the response is expected to be {0}. The actual value is {1}.", leaseState, leaseResponse.LeaseState);
            TestSite.Assert.AreEqual(leaseFlag, leaseResponse.LeaseFlags, "LeaseFlag in the response is expected to be {0}. The actual value is {1}.", leaseFlag, leaseResponse.LeaseFlags);
            TestSite.CaptureRequirementIfAreEqual <ulong>(0, leaseResponse.LeaseDuration,
                                                          RequirementCategory.MUST_BE_ZERO.Id,
                                                          RequirementCategory.MUST_BE_ZERO.Description);
        }
        private bool CheckOpenDeviceContext(Smb2CreateContextResponse[] servercreatecontexts, RSVD_PROTOCOL_VERSION expectVersion)
        {
            if (servercreatecontexts == null)
            {
                if (expectVersion == RSVD_PROTOCOL_VERSION.RSVD_PROTOCOL_VERSION_1)
                {
                    // <10> Section 3.2.5.1:  Windows Server 2012 R2 without [MSKB-3025091] doesn't return SVHDX_OPEN_DEVICE_CONTEXT_RESPONSE.
                    // So if the open device context returns success, but without SVHDX_OPEN_DEVICE_CONTEXT_RESPONSE, the SUT may still support RSVD version 1.
                    return true;
                }
                else
                {
                    return false;
                }
            }

            foreach (var context in servercreatecontexts)
            {
                Type type = context.GetType();
                if (type.Name == "Smb2CreateSvhdxOpenDeviceContextResponse")
                {
                    Smb2CreateSvhdxOpenDeviceContextResponse openDeviceContext = context as Smb2CreateSvhdxOpenDeviceContextResponse;
                    if ((openDeviceContext != null) && (openDeviceContext.Version == (uint)expectVersion))
                    {
                        return true;
                    }

                }

                if (type.Name == "Smb2CreateSvhdxOpenDeviceContextResponseV2")
                {
                    Smb2CreateSvhdxOpenDeviceContextResponseV2 openDeviceContext = context as Smb2CreateSvhdxOpenDeviceContextResponseV2;
                    if ((openDeviceContext != null) && (openDeviceContext.Version == (uint)expectVersion))
                    {
                        return true;
                    }
                }
            }

            return false;
        }
 /// <summary>
 /// Create operation for PrepareOpen operation
 /// </summary>
 private void PrepareOpenCreate(
     Smb2FunctionalClient client,
     uint treeIdBeforeDisconnection,
     string fileName,
     out FILEID fileIdBeforDisconnection,
     out Smb2CreateContextResponse[] serverCreateContexts,
     RequestedOplockLevel_Values requestedOplocklevel,
     Smb2CreateContextRequest[] prepareContext)
 {
     client.Create(
         treeIdBeforeDisconnection,
         fileName,
         CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
         out fileIdBeforDisconnection,
         out serverCreateContexts,
         requestedOplocklevel,
         prepareContext,
         shareAccess: ShareAccess_Values.NONE,
         checker: (HASH_HEADER, response) =>
         {
         });
 }
        /// <summary>
        /// Create a file with create context
        /// </summary>
        /// <param name="fileName">Name of the file</param>
        /// <param name="desiredAccess">The desired access</param>
        /// <param name="shareAccess">Sharing mode for the open</param>
        /// <param name="impersonationLevel">The impersonation level</param>
        /// <param name="fileAttribute">The file attribute, this field is only valid when create file.</param>
        /// <param name="createDisposition">Defines the action the server MUST take if the file that is specified in the name field already exists</param>
        /// <param name="createOption">Specifies the options to be applied when creating or opening the file</param>
        /// <param name="contextRequest">Create contexts to be sent in the create request</param>
        /// <param name="status">Status of the response packet</param>
        /// <param name="serverCreateContexts">Create contexts to be received in the create response</param>
        /// <param name="contextResponse">Create response payload to be received in the create response</param>
        public void Create(
            string fileName,
            FsFileDesiredAccess desiredAccess,
            ShareAccess_Values shareAccess,
            FsImpersonationLevel impersonationLevel,
            FsFileAttribute fileAttribute,
            FsCreateDisposition createDisposition,
            FsCreateOption createOption,
            Smb2CreateContextRequest[] contextRequest,
            out uint status,
            out Smb2CreateContextResponse[] serverCreateContexts,
            out CREATE_Response createResponse)
        {
            if (createOption.HasFlag(FsCreateOption.FILE_DIRECTORY_FILE))
            {
                throw new ArgumentException("createOption can not contain FILE_DIRECTORY_FILE when creating file.");
            }

            Packet_Header header;

            status = client.Create(
                        1,
                        1,
                        headerFlags,
                        messageId++,
                        sessionId,
                        treeId,
                        fileName,
                        (AccessMask)desiredAccess,
                        shareAccess,
                        (CreateOptions_Values)createOption,
                        (CreateDisposition_Values)createDisposition,
                        (File_Attributes)fileAttribute,
                        (ImpersonationLevel_Values)impersonationLevel,
                        SecurityFlags_Values.NONE,
                        RequestedOplockLevel_Values.OPLOCK_LEVEL_NONE,
                        contextRequest,
                        out fileId,
                        out serverCreateContexts,
                        out header,
                        out createResponse);
        }
        /// <summary>
        /// Check server response. Return the abstracted context type of response.
        /// </summary>
        private void CheckResponseContexts(
            Smb2CreateContextResponse[] serverCreateContexts,
            out DurableHandleResponseContext durableHandleResponseContext,
            out LeaseResponseContext leaseResponseContext)
        {
            durableHandleResponseContext = DurableHandleResponseContext.NONE;
            leaseResponseContext = LeaseResponseContext.NONE;

            if (serverCreateContexts != null)
            {
                foreach (Smb2CreateContextResponse response in serverCreateContexts)
                {
                    if (response is Smb2CreateDurableHandleResponse)
                    {
                        durableHandleResponseContext = DurableHandleResponseContext.SMB2_CREATE_DURABLE_HANDLE_RESPONSE;
                    }
                    else if (response is Smb2CreateDurableHandleResponseV2)
                    {
                        durableHandleResponseContext = DurableHandleResponseContext.SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2;
                        if ((response as Smb2CreateDurableHandleResponseV2).Flags.HasFlag(CREATE_DURABLE_HANDLE_RESPONSE_V2_Flags.DHANDLE_FLAG_PERSISTENT))
                            durableHandleResponseContext = DurableHandleResponseContext.SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2_WITH_PERSISTENT;
                    }
                    else if (response is Smb2CreateResponseLease)
                    {
                        leaseResponseContext = LeaseResponseContext.SMB2_CREATE_RESPONSE_LEASE;
                    }
                    else if (response is Smb2CreateResponseLeaseV2)
                    {
                        leaseResponseContext = LeaseResponseContext.SMB2_CREATE_RESPONSE_LEASE_V2;
                    }
                }
            }
        }
 /// <summary>
 /// Create operation for Open operation
 /// </summary>
 private uint OpenCreate(
     Smb2FunctionalClient client,
     uint treeIdAfterDisconnection,
     string fileName,
     out FILEID fileIdAfterDisconnection,
     out Smb2CreateContextResponse[] serverCreateContexts,
     RequestedOplockLevel_Values requestedOplocklevel,
     Smb2CreateContextRequest[] openContext)
 {
     return client.Create(
         treeIdAfterDisconnection,
         fileName,
         CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
         out fileIdAfterDisconnection,
         out serverCreateContexts,
         requestedOplocklevel,
         openContext,
         shareAccess: ShareAccess_Values.NONE,
         checker: (header, response) =>
         {
         });
 }
        private bool CheckDurableCreateContextResponse(Smb2CreateContextResponse[] createContextResponses)
        {
            // check whether Persistent Handle is created successfully
            foreach (Smb2CreateContextResponse contextResponse in createContextResponses)
            {
                Smb2CreateDurableHandleResponseV2 durableHandleResponse = contextResponse as Smb2CreateDurableHandleResponseV2;
                if (durableHandleResponse != null)
                {
                    BaseTestSite.Assert.IsTrue(
                        durableHandleResponse.Flags.HasFlag(CREATE_DURABLE_HANDLE_RESPONSE_V2_Flags.DHANDLE_FLAG_PERSISTENT),
                        "Flags in Smb2CreateDurableHandleResponseV2 should be Persistent flag");
                    return true;
                }
            }

            return false;
        }
        private void CheckOpenDeviceContext(Smb2CreateContextResponse[] servercreatecontexts)
        {
            // <9> Section 3.2.5.1:  Windows Server 2012 R2 without [MSKB-3025091] doesn't return SVHDX_OPEN_DEVICE_CONTEXT_RESPONSE.
            if (TestConfig.Platform == Platform.WindowsServer2012R2)
                return;

            foreach (var context in servercreatecontexts)
            {
                Type type = context.GetType();
                if (type.Name == "Smb2CreateSvhdxOpenDeviceContext")
                {
                    Smb2CreateSvhdxOpenDeviceContextResponse openDeviceContext = context as Smb2CreateSvhdxOpenDeviceContextResponse;
                    VerifyFieldInResponse("ServerVersion", TestConfig.ServerServiceVersion, openDeviceContext.Version);
                }

                if (type.Name == "Smb2CreateSvhdxOpenDeviceContextResponseV2")
                {
                    Smb2CreateSvhdxOpenDeviceContextResponseV2 openDeviceContext = context as Smb2CreateSvhdxOpenDeviceContextResponseV2;

                    VerifyFieldInResponse("ServerVersion", TestConfig.ServerServiceVersion, openDeviceContext.Version);
                    VerifyFieldInResponse("SectorSize", TestConfig.PhysicalSectorSize, openDeviceContext.PhysicalSectorSize);
                    VerifyFieldInResponse("VirtualSize", TestConfig.VirtualSize, openDeviceContext.VirtualSize);
                }
            }
        }
        public void SendRequestContext(Smb2CreateContextRequest client1RequestLease, Smb2CreateContextRequest client2RequestLease, out Smb2CreateContextResponse client1ResponseLease,
                                       out Smb2CreateContextResponse client2ResponseLease, bool isBothClientDirectory = false, bool isClient1ParentDirectory = false, bool expectServerBreakNotification = false)
        {
            string client1FileName;
            string client2FileName;

            GenerateFileNames(isBothClientDirectory, isClient1ParentDirectory, out client1FileName, out client2FileName);

            #region Add Event Handler

            client1.Smb2Client.LeaseBreakNotificationReceived += new Action <Packet_Header, LEASE_BREAK_Notification_Packet>(OnLeaseBreakNotificationReceived);
            clientToAckLeaseBreak = client1;

            #endregion

            #region Client1 (LeaseOpen) Open a File with Lease RWH or Directory with RH

            BaseTestSite.Log.Add(LogEntryKind.TestStep,
                                 "Start the first client to create a file by sending the following requests: 1. NEGOTIATE; 2. SESSION_SETUP; 3. TREE_CONNECT; 4. CREATE (with LeaseV2 context)");
            SetupClientConnection(client1, out client1TreeId);
            Smb2CreateContextResponse[] createContextResponse;
            client1.Create(client1TreeId, client1FileName, isBothClientDirectory || isClient1ParentDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE,
                           out client1FileId, out createContextResponse, RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE,
                           new Smb2CreateContextRequest[]
            {
                client1RequestLease
            },
                           checker: (Packet_Header header, CREATE_Response response) =>
            {
                if (response.OplockLevel != OplockLevel_Values.OPLOCK_LEVEL_LEASE)
                {
                    BaseTestSite.Assume.Inconclusive("Server OPLOCK Level is: {0}, expected: {1} indicating support for leasing.", response.OplockLevel, OplockLevel_Values.OPLOCK_LEVEL_LEASE);
                }
            }
                           );

            #endregion

            // Get response lease for Client1 (LeaseOpen)
            client1ResponseLease = (createContextResponse != null) ? createContextResponse.First() : new Smb2CreateResponseLease();


            #region Start a second client (OperationOpen) to request lease by using the same lease key with the first client
            BaseTestSite.Log.Add(LogEntryKind.TestStep, "Start a second client to create the same file with the first client by sending the following requests: 1. NEGOTIATE; 2. SESSION_SETUP; 3. TREE_CONNECT; 4. CREATE");
            SetupClientConnection(client2, out client2TreeId);
            client2.Create(client2TreeId, client2FileName, isBothClientDirectory ? CreateOptions_Values.FILE_DIRECTORY_FILE : CreateOptions_Values.FILE_NON_DIRECTORY_FILE, out client2FileId, out createContextResponse, RequestedOplockLevel_Values.OPLOCK_LEVEL_LEASE,
                           new Smb2CreateContextRequest[]
            {
                client2RequestLease
            },
                           checker: (Packet_Header header, CREATE_Response response) =>
            {
                if (response.OplockLevel != OplockLevel_Values.OPLOCK_LEVEL_LEASE)
                {
                    BaseTestSite.Assume.Inconclusive("Server OPLOCK Level is: {0}, expected: {1} indicating support for leasing.", response.OplockLevel, OplockLevel_Values.OPLOCK_LEVEL_LEASE);
                }
            }
                           );

            #endregion

            // Check whether server will send out lease break notification or not
            CheckBreakNotification(expectServerBreakNotification);

            // Get response lease for Client2 (OperationOpen)
            client2ResponseLease = createContextResponse.First();
        }
        private ReplayModelDurableHandle ConvertHandle(Smb2CreateContextResponse[] serverCreateContexts)
        {
            ReplayModelDurableHandle responseHandle = ReplayModelDurableHandle.NormalHandle;
            if (serverCreateContexts != null)
            {
                foreach (var context in serverCreateContexts)
                {
                    if (context is Smb2CreateDurableHandleResponse)
                    {
                        responseHandle = ReplayModelDurableHandle.DurableHandleV1;
                        break;
                    }
                    else if (context is Smb2CreateDurableHandleResponseV2)
                    {
                        Smb2CreateDurableHandleResponseV2 handleV2 = context as Smb2CreateDurableHandleResponseV2;
                        if (handleV2.Flags == CREATE_DURABLE_HANDLE_RESPONSE_V2_Flags.DHANDLE_FLAG_PERSISTENT)
                        {
                            responseHandle = ReplayModelDurableHandle.DurableHandleV2Persistent;
                        }
                        else
                        {
                            responseHandle = ReplayModelDurableHandle.DurableHandleV2;
                        }
                        break;
                    }
                }
            }

            return responseHandle;
        }
 public override void Check(Smb2CreateContextResponse response)
 {
     base.Check(response);
     Smb2CreateResponseLeaseV2 leaseResponse = response as Smb2CreateResponseLeaseV2;
     TestSite.Assert.AreEqual(leaseKey, leaseResponse.LeaseKey, "LeaseKey in the response is expected to be {0}. The actual value is {1}.", leaseKey, leaseResponse.LeaseKey);
     TestSite.Assert.AreEqual(leaseState, leaseResponse.LeaseState, "LeaseState in the response is expected to be {0}. The actual value is {1}.", leaseState, leaseResponse.LeaseState);
     TestSite.Assert.AreEqual(leaseFlag, leaseResponse.Flags, "LeaseFlag in the response is expected to be {0}. The actual value is {1}.", leaseFlag, leaseResponse.Flags);
     if (parentLeaseKey != default(Guid))
     {
         TestSite.Assert.AreEqual(parentLeaseKey, leaseResponse.ParentLeaseKey,
             "ParentLeaseKey in the response is expected to be {0}. The actual value is {1}.",
             parentLeaseKey, leaseResponse.ParentLeaseKey);
     }
     TestSite.CaptureRequirementIfAreEqual<ulong>(0, leaseResponse.LeaseDuration,
         RequirementCategory.MUST_BE_ZERO.Id,
         RequirementCategory.MUST_BE_ZERO.Description);
 }
        private void CheckOpenDeviceContext(Smb2CreateContextResponse[] servercreatecontexts)
        {
            foreach (var context in servercreatecontexts)
            {
                Type type = context.GetType();
                if (type.Name == "Smb2CreateSvhdxOpenDeviceContext")
                {
                    Smb2CreateSvhdxOpenDeviceContextResponse openDeviceContext = context as Smb2CreateSvhdxOpenDeviceContextResponse;
                    VerifyFieldInResponse("ServerVersion", TestConfig.ServerServiceVersion, openDeviceContext.Version);
                }

                if (type.Name == "Smb2CreateSvhdxOpenDeviceContextResponseV2")
                {
                    Smb2CreateSvhdxOpenDeviceContextResponseV2 openDeviceContext = context as Smb2CreateSvhdxOpenDeviceContextResponseV2;

                    VerifyFieldInResponse("ServerVersion", TestConfig.ServerServiceVersion, openDeviceContext.Version);
                    VerifyFieldInResponse("SectorSize", TestConfig.PhysicalSectorSize, openDeviceContext.PhysicalSectorSize);
                    VerifyFieldInResponse("VirtualSize", TestConfig.VirtualSize, openDeviceContext.VirtualSize);
                }
            }
        }
 protected void CheckCreateContextResponsesNotExist(Smb2CreateContextResponse[] createContextResponse, params BaseResponseChecker[] checkers)
 {
     CheckCreateContextResponsesExistence(createContextResponse, false, checkers);
 }
        private static bool ContainDurableHandleResponse(Smb2CreateContextResponse[] createContextResponses)
        {
            if (createContextResponses != null)
            {
                foreach (Smb2CreateContextResponse createContextResponse in createContextResponses)
                {
                    Smb2CreateDurableHandleResponse durableHandleResponse = createContextResponse as Smb2CreateDurableHandleResponse;
                    if (durableHandleResponse != null)
                    {
                        return true;
                    }
                }
            }

            return false;
        }
 public virtual void Check(Smb2CreateContextResponse response)
 {
     TestSite.Assume.AreEqual(ResponseType, response.GetType(),
         "The response type should be {0}. The actual value is {1}.", ResponseType, response.GetType());
 }
Beispiel #18
0
 public virtual void Check(Smb2CreateContextResponse response)
 {
     TestSite.Assume.AreEqual(ResponseType, response.GetType(),
                              "The response type should be {0}. The actual value is {1}.", ResponseType, response.GetType());
 }
 public override void Check(Smb2CreateContextResponse response)
 {
     base.Check(response);
     Smb2CreateDurableHandleResponseV2 durableHandleResponse = response as Smb2CreateDurableHandleResponseV2;
     TestSite.Assert.AreEqual(flag, durableHandleResponse.Flags, "Flag in the response is expected to be {0}. The actual value is {1}.", flag, durableHandleResponse.Flags);
     if (timeout != uint.MaxValue)
     {
         TestSite.Assert.AreEqual(timeout, durableHandleResponse.Timeout, "Timeout in the response is expected to be {0}. The actual value is {1}.", timeout, durableHandleResponse.Timeout);
     }
 }