/// <summary> /// This method is used to fetch editor table on the specified file. /// </summary> /// <param name="file">Specify the file URL.</param> /// <returns>Return the editors table on the file if the server support the editor tables, otherwise return null.</returns> protected EditorsTable FetchEditorTable(string file) { if (Common.IsRequirementEnabled("MS-FSSHTTP-FSSHTTPB", 2053, this.Site)) { // Call QueryEditorsTable to get editors table this.InitializeContext(file, this.UserName01, this.Password01, this.Domain); CellSubRequestType cellSubRequestEditorsTable = SharedTestSuiteHelper.CreateCellSubRequestEmbeddedQueryEditorsTable(SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID()); CellStorageResponse cellStorageResponseEditorsTable = this.Adapter.CellStorageRequest(file, new SubRequestType[] { cellSubRequestEditorsTable }); CellSubResponseType subResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(cellStorageResponseEditorsTable, 0, 0, this.Site); FsshttpbResponse queryEditorsTableResponse = SharedTestSuiteHelper.ExtractFsshttpbResponse(subResponse, this.Site); // Get EditorsTable EditorsTable editorsTable = EditorsTableUtils.GetEditorsTableFromResponse(queryEditorsTableResponse, this.Site); if (SharedContext.Current.IsMsFsshttpRequirementsCaptured) { // If can fetch the editors table, then the following requirement can be directly captured. this.Site.CaptureRequirement( "MS-FSSHTTP", 2053, @"[In Appendix B: Product Behavior] Implementation does represent the editors table as a compressed XML fragment. (<42> Section 3.1.4.8: On servers running Office 2013, the editors table is represented as a compressed XML fragment.)"); } return(editorsTable); } return(null); }
/// <summary> /// Parse the FSSHTTPB Bytes. /// </summary> /// <param name="FSSHTTPBbytes">The raw date contains FSSHTTPB message.</param> /// <param name="direction">The direction of the traffic.</param> /// <returns>The object parsed result</returns> public object ParseFSSHTTPBBytes(byte[] FSSHTTPBbytes, TrafficDirection direction) { object objectOut = null; byte[] emptyByte = new byte[0]; if (FSSHTTPBbytes == null || FSSHTTPBbytes.Length == 0) { return(null); } try { if (direction == TrafficDirection.In) { FsshttpbRequest FsshttpbReq = new FsshttpbRequest(); MemoryStream s = new MemoryStream(FSSHTTPBbytes); FsshttpbReq.Parse(s); objectOut = FsshttpbReq; } else { FsshttpbResponse FsshttpbRes = new FsshttpbResponse(); MemoryStream s = new MemoryStream(FSSHTTPBbytes); FsshttpbRes.Parse(s); objectOut = FsshttpbRes; } return(objectOut); } catch (Exception ex) { objectOut = ex.ToString(); return(objectOut); } }
/// <summary> /// Parse the HTTP payload to FSSHTTPB Response message. /// </summary> /// <param name="Responses">Array of Response element that is part of a cell storage service response.</param> /// <param name="bytesFromHTTP">The raw data from HTTP layer.</param> public void TryParseFSSHTTPBResponseMessage(Response[] Responses, byte[] bytesFromHTTP) { if (Responses == null) { return; } byte[][] includeTexts = GetOctetsBinaryForXOP(bytesFromHTTP, false).ToArray(); int index = 0; foreach (Response res in Responses) { // If response is for ONESTORE,set FSSHTTPandWOPIInspector.IsOneStore ture. if (res.Url != null) { if (res.Url.EndsWith(".one") || res.Url.EndsWith(".onetoc2")) { FSSHTTPandWOPIInspector.IsOneStore = true; } else { FSSHTTPandWOPIInspector.IsOneStore = false; } } if (res.SubResponse != null && res.SubResponse.Length > 0) { foreach (SubResponseElementGenericType subres in res.SubResponse) { if (subres.SubResponseData == null) { continue; } if (subres.SubResponseData.Text != null && subres.SubResponseData.Text.Length > 0) { string textValue = subres.SubResponseData.Text[0]; byte[] FSSHTTPBTextBytes = Convert.FromBase64String(textValue); FsshttpbResponse Fsshttpbres = (FsshttpbResponse)ParseFSSHTTPBBytes(FSSHTTPBTextBytes, TrafficDirection.Out); subres.SubResponseData.TextObject = Fsshttpbres; FSSHTTPBBytes.Add(FSSHTTPBTextBytes); } if (subres.SubResponseData.Include != null) { byte[] FSSHTTPBIncludeBytes = includeTexts[index++]; FsshttpbResponse Fsshttpbres = (FsshttpbResponse)ParseFSSHTTPBBytes(FSSHTTPBIncludeBytes, TrafficDirection.Out); subres.SubResponseData.IncludeObject = Fsshttpbres; FSSHTTPBBytes.Add(FSSHTTPBIncludeBytes); } } } } }
/// <summary> /// Parse the structure of revision store file. /// </summary> /// <param name="cellStorageResponse">the CellStorageResponse message received from the server.</param> /// <returns>Returns the revision store file from the server.</returns> private MSOneStorePackage ConvertOneStorePackage(CellStorageResponse cellStorageResponse) { MSOneStorePackage package = null; string subResponseBase64 = cellStorageResponse.ResponseCollection.Response[0].SubResponse[0].SubResponseData.Text[0]; byte[] subResponseBinary = Convert.FromBase64String(subResponseBase64); FsshttpbResponse fsshttpbResponse = FsshttpbResponse.DeserializeResponseFromByteArray(subResponseBinary, 0); if (fsshttpbResponse.DataElementPackage != null && fsshttpbResponse.DataElementPackage.DataElements != null) { MSONESTOREParser onenoteParser = new MSONESTOREParser(); package = onenoteParser.Parse(fsshttpbResponse.DataElementPackage); } return(package); }
/// <summary> /// Parse the HTTP payload to FSSHTTPB Response message. /// </summary> /// <param name="Responses">Array of Response element that is part of a cell storage service response.</param> /// <param name="bytesFromHTTP">The raw data from HTTP layer.</param> public void TryParseFSSHTTPBResponseMessage(Response[] Responses, byte[] bytesFromHTTP) { if (Responses == null) { return; } byte[][] includeTexts = GetOctetsBinaryForXOP(bytesFromHTTP, false).ToArray(); int index = 0; foreach (Response res in Responses) { if (res.SubResponse != null && res.SubResponse.Length > 0) { foreach (SubResponseElementGenericType subres in res.SubResponse) { if (subres.SubResponseData == null) { continue; } if (subres.SubResponseData.Text != null && subres.SubResponseData.Text.Length > 0) { string textValue = subres.SubResponseData.Text[0]; byte[] FSSHTTPBTextBytes = Convert.FromBase64String(textValue); FsshttpbResponse Fsshttpbres = (FsshttpbResponse)ParseFSSHTTPBBytes(FSSHTTPBTextBytes, TrafficDirection.Out); subres.SubResponseData.TextObject = Fsshttpbres; FSSHTTPBBytes.Add(FSSHTTPBTextBytes); } if (subres.SubResponseData.Include != null) { byte[] FSSHTTPBIncludeBytes = includeTexts[index++]; FsshttpbResponse Fsshttpbres = (FsshttpbResponse)ParseFSSHTTPBBytes(FSSHTTPBIncludeBytes, TrafficDirection.Out); subres.SubResponseData.IncludeObject = Fsshttpbres; FSSHTTPBBytes.Add(FSSHTTPBIncludeBytes); } } } } }
public void TestCase_S11_TC01_QueryAccessReadWrite() { // Initialize the service this.InitializeContext(this.DefaultFileUrl, this.UserName01, this.Password01, this.Domain); // Query changes from the protocol server CellSubRequestType queryChange = SharedTestSuiteHelper.CreateCellSubRequestEmbeddedQueryChanges(SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID()); CellStorageResponse queryResponse = Adapter.CellStorageRequest(this.DefaultFileUrl, new SubRequestType[] { queryChange }); CellSubResponseType querySubResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(queryResponse, 0, 0, this.Site); this.Site.Assert.AreEqual(ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(querySubResponse.ErrorCode, this.Site), "The operation QueryChanges should succeed."); FsshttpbResponse fsshttpbResponse = SharedTestSuiteHelper.ExtractFsshttpbResponse(querySubResponse, this.Site); ExGuid storageIndex = fsshttpbResponse.CellSubResponses[0].GetSubResponseData <QueryChangesSubResponseData>().StorageIndexExtendedGUID; // Create a putChanges cellSubRequest FsshttpbCellRequest cellRequest = SharedTestSuiteHelper.CreateFsshttpbCellRequest(); ExGuid storageIndexExGuid; List <DataElement> dataElements = DataElementUtils.BuildDataElements(System.Text.Encoding.Unicode.GetBytes("bad"), out storageIndexExGuid); PutChangesCellSubRequest putChange = new PutChangesCellSubRequest(SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID(), storageIndexExGuid); putChange.ExpectedStorageIndexExtendedGUID = storageIndex; dataElements.AddRange(fsshttpbResponse.DataElementPackage.DataElements); cellRequest.AddSubRequest(putChange, dataElements); CellSubRequestType putChangesSubRequest = SharedTestSuiteHelper.CreateCellSubRequest(SequenceNumberGenerator.GetCurrentToken(), cellRequest.ToBase64()); // Put changes to the protocol server CellStorageResponse response = Adapter.CellStorageRequest(this.DefaultFileUrl, new SubRequestType[] { putChangesSubRequest }); CellSubResponseType cellSubResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(response, 0, 0, this.Site); // Expect the Put changes operation succeeds this.Site.Assert.AreEqual(ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(cellSubResponse.ErrorCode, this.Site), "The PutChanges operation should succeed."); SharedTestSuiteHelper.ExpectMsfsshttpbSubResponseSucceed(SharedTestSuiteHelper.ExtractFsshttpbResponse(cellSubResponse, this.Site), this.Site); // Call QueryAccess. CellSubRequestType cellSubRequest = SharedTestSuiteHelper.CreateCellSubRequestEmbeddedQueryAccess(0); CellStorageResponse cellStorageResponse = this.Adapter.CellStorageRequest(this.DefaultFileUrl, new SubRequestType[] { cellSubRequest }); CellSubResponseType subResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(cellStorageResponse, 0, 0, this.Site); FsshttpbResponse queryAccessResponse = SharedTestSuiteHelper.ExtractFsshttpbResponse(subResponse, this.Site); // Get readAccessResponse and writeAccessResponse Data. HRESULTError dataRead = queryAccessResponse.CellSubResponses[0] .GetSubResponseData <QueryAccessSubResponseData>() .ReadAccessResponse.ReadResponseError .GetErrorData <HRESULTError>(); this.Site.Assert.AreEqual <int>( 0, dataRead.ErrorCode, "Test case cannot continue unless the read HRESULTError code equals 0 when the user have read/write permission."); HRESULTError dataWrite = queryAccessResponse.CellSubResponses[0] .GetSubResponseData <QueryAccessSubResponseData>() .WriteAccessResponse.WriteResponseError .GetErrorData <HRESULTError>(); if (SharedContext.Current.IsMsFsshttpRequirementsCaptured) { // If the error type is HRESULTError, then capture R946. Site.CaptureRequirementIfIsNotNull( dataWrite, "MS-FSSHTTPB", 946, @"[In Query Access] Response Error (variable): If the Put Changes operation will succeed, the response error will have an error type of HRESULT error."); // If the error type is HRESULTError and error code equals 0, then capture R2229. Site.CaptureRequirementIfAreEqual <int>( 0, dataWrite.ErrorCode, "MS-FSSHTTPB", 2229, @"[In Query Access] Response Error (variable): [If the Put Changes operation will succeed, ]the HRESULT error code will be zero."); // If error code equals 0, then capture R2231. Site.CaptureRequirementIfAreEqual <int>( 0, dataWrite.ErrorCode, "MS-FSSHTTPB", 2231, @"[In HRESULT Error] Error Code (4 bytes): Zero means that no error occurred."); } else { Site.Assert.IsNotNull( dataWrite, @"[In Query Access] Response Error (variable): If the Put Changes operation will succeed, the response error will have an error type of HRESULT error."); Site.Assert.AreEqual <int>( 0, dataWrite.ErrorCode, @"[In Query Access] Response Error (variable): [If the Put Changes operation will succeed, ]the HRESULT error code will be zero."); } }
public void TestCase_S11_TC02_QueryAccessRead() { string readOnlyUser = Common.GetConfigurationPropertyValue("ReadOnlyUser", this.Site); string readOnlyUserPassword = Common.GetConfigurationPropertyValue("ReadOnlyUserPwd", this.Site); // Initialize the service this.InitializeContext(this.DefaultFileUrl, readOnlyUser, readOnlyUserPassword, this.Domain); // Query changes from the protocol server CellSubRequestType queryChange = SharedTestSuiteHelper.CreateCellSubRequestEmbeddedQueryChanges(SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID()); CellStorageResponse queryResponse = Adapter.CellStorageRequest(this.DefaultFileUrl, new SubRequestType[] { queryChange }); CellSubResponseType querySubResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(queryResponse, 0, 0, this.Site); FsshttpbResponse fsshttpbResponse = SharedTestSuiteHelper.ExtractFsshttpbResponse(querySubResponse, this.Site); this.Site.Assert.AreEqual( ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(querySubResponse.ErrorCode, this.Site), "The operation QueryChanges should succeed when the user {0} only has ViewOnly permission.", readOnlyUser); this.Site.Assert.IsFalse( fsshttpbResponse.CellSubResponses[0].Status, "The operation QueryChanges should succeed when the user {0} only has ViewOnly permission.", readOnlyUser); // Call QueryAccess CellSubRequestType cellSubRequest = SharedTestSuiteHelper.CreateCellSubRequestEmbeddedQueryAccess(0); CellStorageResponse cellStorageResponse = this.Adapter.CellStorageRequest(this.DefaultFileUrl, new SubRequestType[] { cellSubRequest }); CellSubResponseType subResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(cellStorageResponse, 0, 0, this.Site); FsshttpbResponse queryAccessResponse = SharedTestSuiteHelper.ExtractFsshttpbResponse(subResponse, this.Site); // Get readAccessResponse and writeAccessResponse Data. HRESULTError dataRead = queryAccessResponse.CellSubResponses[0] .GetSubResponseData <QueryAccessSubResponseData>() .ReadAccessResponse.ReadResponseError .GetErrorData <HRESULTError>(); if (SharedContext.Current.IsMsFsshttpRequirementsCaptured) { // If the error type is HRESULTError, then capture R944. Site.CaptureRequirementIfIsNotNull( dataRead, "MS-FSSHTTPB", 944, @"[In Query Access] Response Error (variable): If read operations will succeed, the response error will have an error type of HRESULT error."); // If HResult is 0,MS-FSSHTTPB_R2228 should be covered. Site.CaptureRequirementIfAreEqual <int>( 0, dataRead.ErrorCode, "MS-FSSHTTPB", 2228, @"[In Query Access] Response Error (variable): [If read operations will succeed, ]the HRESULT error code will be zero."); } else { Site.Assert.IsNotNull( dataRead, @"[In Query Access] Response Error (variable): If read operations will succeed, the response error will have an error type of HRESULT error."); Site.Assert.AreEqual <int>( 0, dataRead.ErrorCode, @"[In Query Access] Response Error (variable): [If read operations will succeed, ]the HRESULT error code will be zero."); } HRESULTError dataWrite = queryAccessResponse.CellSubResponses[0] .GetSubResponseData <QueryAccessSubResponseData>() .WriteAccessResponse.WriteResponseError .GetErrorData <HRESULTError>(); this.Site.Assert.AreNotEqual <int>( 0, dataWrite.ErrorCode, "Test case cannot continue unless the write HRESULTError code not equals 0 when the user have read permission."); }
public void TestCase_S14_TC01_AllocateExtendedGuidRange_Success() { // Initialize the service this.InitializeContext(this.DefaultFileUrl, this.UserName01, this.Password01, this.Domain); // Allocate Extended GUID Range Compact64bitInt requestIdCount = new Compact64bitInt(8000); CellSubRequestType allocateRequest = SharedTestSuiteHelper.CreateCellSubRequestEmbeddedAllocateExtendedGuidRange((int)SequenceNumberGenerator.GetCurrentToken(), SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID(), requestIdCount); CellStorageResponse response = this.Adapter.CellStorageRequest(this.DefaultFileUrl, new SubRequestType[] { allocateRequest }); CellSubResponseType cellSubResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(response, 0, 0, this.Site); this.Site.Assert.AreEqual <ErrorCodeType>( ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(cellSubResponse.ErrorCode, this.Site), "Test case cannot continue unless the allocate extended guid range operation on the file {0} succeed.", this.DefaultFileUrl); FsshttpbResponse fsshttpbResponse = SharedTestSuiteHelper.ExtractFsshttpbResponse(cellSubResponse, this.Site); SharedTestSuiteHelper.ExpectMsfsshttpbSubResponseSucceed(fsshttpbResponse, this.Site); // Extract the Allocate ExtendedGuid Range sub-response info this.Site.Assert.IsTrue(fsshttpbResponse.CellSubResponses.Count > 0, "The protocol server should return SubResponse for Allocate ExtendedGuid Range sub-request processing."); this.Site.Assert.IsNotNull(fsshttpbResponse.CellSubResponses[0].GetSubResponseData <AllocateExtendedGuidRangeSubResponseData>(), "The protocol server should return SubResponseData for Allocate ExtendedGuid Range sub-request processing."); AllocateExtendedGuidRangeSubResponseData allocateResponse = fsshttpbResponse.CellSubResponses[0].GetSubResponseData <AllocateExtendedGuidRangeSubResponseData>(); // Assert for elements in Allocate Extended Guid Range sub-response this.Site.Assert.IsNotNull(allocateResponse.AllocateExtendedGUIDRangeResponse, "The protocol server should return Allocate Extended GUID Range Response."); this.Site.Assert.IsNotNull(allocateResponse.GUIDComponent, "The protocol server should allocate ExtendedGuids as requested."); this.Site.Assert.IsNotNull(allocateResponse.IntegerRangeMin, "The protocol server should return an integer Range Min in the sub-response."); this.Site.Assert.IsNotNull(allocateResponse.IntegerRangeMax, "The protocol server should return an integer Range Max in the sub-response."); if (SharedContext.Current.IsMsFsshttpRequirementsCaptured) { // Verify MS-FSSHTTPB requirement: MS-FSSHTTPB_R9005 Site.CaptureRequirement( "MS-FSSHTTPB", 99099, @"[In Appendix B: Product Behavior] The implementation does support this sub-request [Allocate ExtendedGuid Range Sub-Request]( SharePoint Server 2013 and above follow this behavior.)"); } // Allocate Extended GUID Range value less than 1000. requestIdCount = new Compact64bitInt(100); allocateRequest = SharedTestSuiteHelper.CreateCellSubRequestEmbeddedAllocateExtendedGuidRange((int)SequenceNumberGenerator.GetCurrentToken(), SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID(), requestIdCount); response = this.Adapter.CellStorageRequest(this.DefaultFileUrl, new SubRequestType[] { allocateRequest }); cellSubResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(response, 0, 0, this.Site); this.Site.Assert.AreEqual <ErrorCodeType>( ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(cellSubResponse.ErrorCode, this.Site), "Test case cannot continue unless the allocate extended guid range operation on the file {0} succeed.", this.DefaultFileUrl); // Allocate Extended GUID Range value less than 100000. requestIdCount = new Compact64bitInt(150000); allocateRequest = SharedTestSuiteHelper.CreateCellSubRequestEmbeddedAllocateExtendedGuidRange((int)SequenceNumberGenerator.GetCurrentToken(), SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID(), requestIdCount); response = this.Adapter.CellStorageRequest(this.DefaultFileUrl, new SubRequestType[] { allocateRequest }); cellSubResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(response, 0, 0, this.Site); this.Site.Assert.AreEqual <ErrorCodeType>( ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(cellSubResponse.ErrorCode, this.Site), "Test case cannot continue unless the allocate extended guid range operation on the file {0} succeed.", this.DefaultFileUrl); }
public void TestCase_S14_TC02_AllocateExtendedGuidRange_ReservedIgnore() { // Initialize the service this.InitializeContext(this.DefaultFileUrl, this.UserName01, this.Password01, this.Domain); FsshttpbCellRequest fsshttpRequest = SharedTestSuiteHelper.CreateFsshttpbCellRequest(); AllocateExtendedGuidRangeCellSubRequest allocateExtendedGuidRange = new AllocateExtendedGuidRangeCellSubRequest(new Compact64bitInt(8000), SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID()); // Make the reserved value equal to 0. allocateExtendedGuidRange.Reserved = 0; fsshttpRequest.AddSubRequest(allocateExtendedGuidRange, null); CellSubRequestType cellSubRequest = SharedTestSuiteHelper.CreateCellSubRequest((ulong)SequenceNumberGenerator.GetCurrentToken(), fsshttpRequest.ToBase64()); CellStorageResponse response = this.Adapter.CellStorageRequest(this.DefaultFileUrl, new SubRequestType[] { cellSubRequest }); CellSubResponseType cellSubResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(response, 0, 0, this.Site); this.Site.Assert.AreEqual <ErrorCodeType>( ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(cellSubResponse.ErrorCode, this.Site), "Test case cannot continue unless the allocate extended guid range operation on the file {0} succeed.", this.DefaultFileUrl); FsshttpbResponse fsshttpbResponse = SharedTestSuiteHelper.ExtractFsshttpbResponse(cellSubResponse, this.Site); SharedTestSuiteHelper.ExpectMsfsshttpbSubResponseSucceed(fsshttpbResponse, this.Site); FsshttpbCellRequest fsshttpRequestSecond = SharedTestSuiteHelper.CreateFsshttpbCellRequest(); AllocateExtendedGuidRangeCellSubRequest allocateExtendedGuidRangeSecond = new AllocateExtendedGuidRangeCellSubRequest(new Compact64bitInt(8000), SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID()); // Make the reserved value equal to 1. allocateExtendedGuidRangeSecond.Reserved = 1; fsshttpRequestSecond.AddSubRequest(allocateExtendedGuidRangeSecond, null); CellSubRequestType cellSubRequestSecond = SharedTestSuiteHelper.CreateCellSubRequest((ulong)SequenceNumberGenerator.GetCurrentToken(), fsshttpRequestSecond.ToBase64()); CellStorageResponse responseSecond = this.Adapter.CellStorageRequest(this.DefaultFileUrl, new SubRequestType[] { cellSubRequestSecond }); CellSubResponseType cellSubResponseSecond = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(responseSecond, 0, 0, this.Site); this.Site.Assert.AreEqual <ErrorCodeType>( ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(cellSubResponseSecond.ErrorCode, this.Site), "Test case cannot continue unless the allocate extended guid range operation on the file {0} succeed.", this.DefaultFileUrl); FsshttpbResponse fsshttpbResponseSecond = SharedTestSuiteHelper.ExtractFsshttpbResponse(cellSubResponseSecond, this.Site); SharedTestSuiteHelper.ExpectMsfsshttpbSubResponseSucceed(fsshttpbResponseSecond, this.Site); // Compare this two responses roughly, and if these two responses are identical in main part, then capture the requirement MS-FSSHTTPB_R2189 bool isVerifyR2189 = SharedTestSuiteHelper.ComapreSucceedFsshttpAllocateExtendedGuidRangeResposne(fsshttpbResponse, fsshttpbResponseSecond, this.Site); this.Site.Log.Add(TestTools.LogEntryKind.Debug, "Expect the two allocate extended GUID range responses are same, actual {0}", isVerifyR2189); if (SharedContext.Current.IsMsFsshttpRequirementsCaptured) { // Verify MS-FSSHTTPB requirement: MS-FSSHTTPB_R2189 Site.CaptureRequirementIfIsTrue( isVerifyR2189, "MS-FSSHTTPB", 2189, @"[In Allocate Extended GUID Range] A - Reserved (8 bits): Whenever A - Reserved is set to one or zero, the protocol server must return the same response."); } else { Site.Assert.IsTrue( isVerifyR2189, @"[In Allocate Extended GUID Range] A - Reserved (8 bits): Whenever A - Reserved is set to one or zero, the protocol server must return the same response."); } }
public void TestCase_S09_TC05_GetVersions_Success_Results_VersionData() { string documentLibraryName = Common.GetConfigurationPropertyValue("MSFSSHTTPFSSHTTPBLibraryName", this.Site); if (!SutPowerShellAdapter.SwitchMajorVersioning(documentLibraryName, true)) { this.Site.Assert.Fail("Cannot disable the version on the document library {0}", documentLibraryName); } // Prepare a file. string fileUrl = this.PrepareFile(); // Initialize the context this.InitializeContext(fileUrl, this.UserName01, this.Password01, this.Domain); // Check out one file by a specified user name. if (!this.SutPowerShellAdapter.CheckOutFile(fileUrl, this.UserName01, this.Password01, this.Domain)) { this.Site.Assert.Fail("Cannot change the file {0} to check out status using the user name {1} and password {2}", fileUrl, this.UserName01, this.Password01); } this.StatusManager.RecordFileCheckOut(fileUrl, this.UserName01, this.Password01, this.Domain); string checkInComments1 = "New Comment1 for testing purpose on the operation GetVersions."; if (!SutPowerShellAdapter.CheckInFile(fileUrl, this.UserName01, this.Password01, this.Domain, checkInComments1)) { this.Site.Assert.Fail("Cannot change the file {0} to check in status using the user name {1} and password {2}", fileUrl, this.UserName01, this.Password01); } this.StatusManager.CancelRecordCheckOut(fileUrl); // Check out one file by a specified user name again. if (!this.SutPowerShellAdapter.CheckOutFile(fileUrl, this.UserName02, this.Password02, this.Domain)) { this.Site.Assert.Fail("Cannot change the file {0} to check out status using the user name {1} and password {2}", fileUrl, this.UserName02, this.Password02); } this.StatusManager.RecordFileCheckOut(fileUrl, this.UserName02, this.Password02, this.Domain); string checkInComments2 = "New Comment2 for testing purpose on the operation GetVersions."; if (!SutPowerShellAdapter.CheckInFile(fileUrl, this.UserName02, this.Password02, this.Domain, checkInComments2)) { this.Site.Assert.Fail("Cannot change the file {0} to check in status using the user name {1} and password {2}", fileUrl, this.UserName02, this.Password02); } this.StatusManager.CancelRecordCheckOut(fileUrl); // Query changes from the protocol server CellSubRequestType queryChange = SharedTestSuiteHelper.CreateCellSubRequestEmbeddedQueryChanges(SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID()); CellStorageResponse queryResponse = Adapter.CellStorageRequest(fileUrl, new SubRequestType[] { queryChange }); CellSubResponseType querySubResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(queryResponse, 0, 0, this.Site); this.Site.Assert.AreEqual(ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(querySubResponse.ErrorCode, this.Site), "The operation QueryChanges should succeed."); FsshttpbResponse fsshttpbResponse = SharedTestSuiteHelper.ExtractFsshttpbResponse(querySubResponse, this.Site); SharedTestSuiteHelper.ExpectMsfsshttpbSubResponseSucceed(fsshttpbResponse, this.Site); int contentLength = new RootNodeObject.RootNodeObjectBuilder().Build( fsshttpbResponse.DataElementPackage.DataElements, fsshttpbResponse.CellSubResponses[0].GetSubResponseData <QueryChangesSubResponseData>().StorageIndexExtendedGUID).GetContent().Count; // Invoke "GetVersions" sub-request with the test file URL that under a document list which is enable versioning. GetVersionsSubRequestType getVersionsSubRequest = SharedTestSuiteHelper.CreateGetVersionsSubRequest(SequenceNumberGenerator.GetCurrentToken()); CellStorageResponse cellStoreageResponse = Adapter.CellStorageRequest(fileUrl, new SubRequestType[] { getVersionsSubRequest }); GetVersionsSubResponseType getVersionsSubResponse = SharedTestSuiteHelper.ExtractSubResponse <GetVersionsSubResponseType>(cellStoreageResponse, 0, 0, this.Site); this.Site.Assert.IsNotNull(getVersionsSubResponse, "The object 'getVersionsSubResponse' should not be null."); this.Site.Assert.IsNotNull(getVersionsSubResponse.ErrorCode, "The object 'getVersionsSubResponse.ErrorCode' should not be null."); // Make sure the error code value in the response equals "Success" Site.Assert.AreEqual <ErrorCodeType>( ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(getVersionsSubResponse.ErrorCode, this.Site), @"The response of the ""getVersions"" sub-request on the file {0} should succeed.", this.DefaultFileUrl); if (SharedContext.Current.IsMsFsshttpRequirementsCaptured) { // If the result contains 3 versions (1.the original, 2. User01 checked in, 3 User02 checked in), then the MS-FSSHTTP requirement: MS-FSSHTTP_R2307 is verified. Site.CaptureRequirementIfAreEqual <int>( 3, getVersionsSubResponse.GetVersionsResponse.GetVersionsResult.results.result.Length, "MS-FSSHTTP", 2307, @"[In GetVersionsSubResponseType][Results complex type] result: A separate result element MUST exist for each version of the file that the user can access."); // If the result contains 3 versions (1.the original, 2. User01 checked in, 3 User02 checked in), then the MS-FSSHTTP requirement: MS-FSSHTTP_R30841 is verified. Site.CaptureRequirementIfAreEqual <int>( 3, getVersionsSubResponse.GetVersionsResponse.GetVersionsResult.results.result.Length, "MS-FSSHTTP", 30841, @"[In GetVersionsResponse] GetVersionsResult: An XML node that contains the details about all the versions of the specified file that the user can access."); } else { Site.Assert.AreEqual <int>( 3, getVersionsSubResponse.GetVersionsResponse.GetVersionsResult.results.result.Length, @"[In GetVersionsSubResponseType][Results complex type] result: A separate result element MUST exist for each version of the file that the user can access."); } bool isFindVersion = false; bool isNotStartWithAt = false; foreach (VersionData item in getVersionsSubResponse.GetVersionsResponse.GetVersionsResult.results.result) { if (string.Compare(checkInComments2, item.comments, StringComparison.OrdinalIgnoreCase) == 0) { bool isCreatedBy = item.createdBy != null && item.createdBy.IndexOf(this.UserName02, System.StringComparison.OrdinalIgnoreCase) >= 0; this.Site.Log.Add( LogEntryKind.Debug, "For requirement MS-FSSHTTP_R2312, expect the CreatedBy contains the user name {0}, the actual value is {1}", this.UserName02, item.createdBy); if (SharedContext.Current.IsMsFsshttpRequirementsCaptured) { // Verify MS-FSSHTTP requirement: MS-FSSHTTP_R2312 Site.CaptureRequirementIfIsTrue( isCreatedBy, "MS-FSSHTTP", 2312, @"[In GetVersionsSubResponseType][VersionData complex type] createdBy: The creator of the version of the file."); bool isCreatedByName = item.createdByName != null && item.createdByName.IndexOf(this.UserName02, System.StringComparison.OrdinalIgnoreCase) >= 0; this.Site.Log.Add( LogEntryKind.Debug, "For requirement MS-FSSHTTP_R2313, expect the createdByName contains the user name {0}, the actual value is {1}", this.UserName02, item.createdByName); // Verify MS-FSSHTTP requirement: MS-FSSHTTP_R2313 Site.CaptureRequirementIfIsTrue( isCreatedByName, "MS-FSSHTTP", 2313, @"[In GetVersionsSubResponseType][VersionData complex type] createdByName: The display name of the creator of the version of the file."); bool isVersion = item.version != null && item.version.StartsWith("@", StringComparison.OrdinalIgnoreCase); this.Site.Log.Add( LogEntryKind.Debug, "For requirement MS-FSSHTTP_R2309, expect the version start with @, the actual value is {0}", item.version); // Verify MS-FSSHTTP requirement: MS-FSSHTTP_R2309 Site.CaptureRequirementIfIsTrue( isVersion, "MS-FSSHTTP", 2309, @"[In GetVersionsSubResponseType][VersionData complex type] version: The most recent version of the file MUST be preceded with an at sign (@)."); // Using UNICODE, so the actual file size will double the length 5. Site.CaptureRequirementIfAreEqual <ulong>( (ulong)contentLength, item.size, "MS-FSSHTTP", 2314, @"[In GetVersionsSubResponseType][VersionData complex type] size: The size, in bytes, of the version of the file."); // If go through here, then the requirement MS-FSSHTTP_R2315 can be directly captured. Site.CaptureRequirement( "MS-FSSHTTP", 2315, @"[In GetVersionsSubResponseType][VersionData complex type] comments: The comment entered when the version of the file was replaced on the protocol server during check in."); } else { Site.Assert.IsTrue( isCreatedBy, @"[In GetVersionsSubResponseType][VersionData complex type] createdBy: The creator of the version of the file."); Site.Assert.IsNotNull( item.createdRaw, @"[In GetVersionsSubResponseType] Implementation does return this attribute[createdRaw]. [In VersionData] createdRaw: The creation date and time for the version of the file in DateTime format, as specified in [ISO-8601]. (Microsoft SharePoint Foundation 2010 and above follow this behavior.)"); bool isCreatedByName = item.createdByName != null && item.createdByName.IndexOf(this.UserName02, System.StringComparison.OrdinalIgnoreCase) >= 0; Site.Assert.IsTrue( isCreatedByName, @"[In GetVersionsSubResponseType][VersionData complex type] createdByName: The display name of the creator of the version of the file."); bool isVersion = item.version != null && item.version.StartsWith("@", StringComparison.OrdinalIgnoreCase); Site.Assert.IsTrue( isVersion, @"[In GetVersionsSubResponseType][VersionData complex type] version: The most recent version of the file MUST be preceded with an at sign (@)."); Site.Assert.AreEqual <ulong>( (ulong)contentLength, item.size, @"[In GetVersionsSubResponseType][VersionData complex type] size: The size, in bytes, of the version of the file."); } isFindVersion = true; } else { isNotStartWithAt = !item.version.StartsWith("@", StringComparison.OrdinalIgnoreCase); } } if (!isFindVersion) { this.Site.Assert.Fail("Cannot find the Version record for the comment {0}", checkInComments2); } Site.Log.Add( LogEntryKind.Debug, "All the other versions MUST exist without any prefix, and actually they {0} have prefix.", isNotStartWithAt ? "do not" : "do"); if (SharedContext.Current.IsMsFsshttpRequirementsCaptured) { // Verify MS-FSSHTTP requirement: MS-FSSHTTP_R2310 Site.CaptureRequirementIfIsTrue( isNotStartWithAt, "MS-FSSHTTP", 2310, @"[In GetVersionsSubResponseType][VersionData complex type] version: All the other versions MUST exist without any prefix. "); } else { Site.Assert.IsTrue( isNotStartWithAt, @"[In GetVersionsSubResponseType][VersionData complex type] version: All the other versions MUST exist without any prefix. "); } }
public void MSONESTORE_S01_TC01_QueryOneFileContainsFileData() { // Get the resource url that contains the file data. string resourceName = Common.GetConfigurationPropertyValue("OneFileWithFileData", Site); string url = this.GetResourceUrl(resourceName); this.InitializeContext(url, this.UserName, this.Password, this.Domain); // Call QueryChange to get the data that is specified by above step. CellSubRequestType cellSubRequest = this.CreateCellSubRequestEmbeddedQueryChanges(SequenceNumberGenerator.GetCurrentSerialNumber()); CellStorageResponse cellStorageResponse = this.SharedAdapter.CellStorageRequest(url, new SubRequestType[] { cellSubRequest }); MSOneStorePackage package = this.ConvertOneStorePackage(cellStorageResponse); // Call adapter to load same file in local. OneNoteRevisionStoreFile file = this.Adapter.LoadOneNoteFile(resourceName); int objectSpaceCount = file.RootFileNodeList.ObjectSpaceManifestList.Count; List <FileNode> fileData3Refs = new List <FileNode>(); for (int i = 0; i < file.RootFileNodeList.ObjectSpaceManifestList.Count; i++) { ObjectSpaceManifestList objectSpace = file.RootFileNodeList.ObjectSpaceManifestList[i]; for (int j = 0; j < objectSpace.RevisionManifestList[0].ObjectGroupList.Count; j++) { ObjectGroupList objectGroupList = objectSpace.RevisionManifestList[0].ObjectGroupList[j]; fileData3Refs.AddRange(objectGroupList.FileNodeSequence.Where(f => f.FileNodeID == FileNodeIDValues.ObjectDeclarationFileData3RefCountFND).ToArray()); } } #region Capture code for Revisions ExGuid rootObjectId = package.DataRoot[0].ObjectGroupID; RevisionManifestDataElementData rootRevision = package.RevisionManifests[0]; // Verify MS-ONESTORE requirement: MS-ONESTORE_R933 Site.CaptureRequirementIfAreEqual <ExGuid>( rootObjectId, rootRevision.RevisionManifestObjectGroupReferencesList[0].ObjectGroupExtendedGUID, 933, @"[In Revisions] The Object Extended GUID field in the Revision Manifest Data Element structure MUST be equal to the identity of the corresponding root object in the revision in the revision store."); #endregion #region Capture code for Objects List <RevisionStoreObject> objectsWithFileData = new List <RevisionStoreObject>(); foreach (RevisionStoreObjectGroup objGroup in package.DataRoot) { objectsWithFileData.AddRange(objGroup.Objects.Where(o => o.FileDataObject != null).ToArray()); } foreach (RevisionStoreObjectGroup objGroup in package.OtherFileNodeList) { objectsWithFileData.AddRange(objGroup.Objects.Where(o => o.FileDataObject != null).ToArray()); } string subResponseBase64 = cellStorageResponse.ResponseCollection.Response[0].SubResponse[0].SubResponseData.Text[0]; byte[] subResponseBinary = Convert.FromBase64String(subResponseBase64); FsshttpbResponse fsshttpbResponse = FsshttpbResponse.DeserializeResponseFromByteArray(subResponseBinary, 0); DataElement[] objectBlOBElements = fsshttpbResponse.DataElementPackage.DataElements.Where(d => d.DataElementType == DataElementType.ObjectDataBLOBDataElementData).ToArray(); foreach (RevisionStoreObject obj in objectsWithFileData) { Guid fileDataObjectGuid = this.GetFileDataObjectGUID(obj); string extension = this.GetFileDataObjectExtension(obj); bool isFoundBLOB = objectBlOBElements.Where(b => b.DataElementExtendedGUID.Equals(obj.FileDataObject.ObjectDataBLOBReference.BLOBExtendedGUID)).ToArray().Length > 0; // Verify MS-ONESTORE requirement: MS-ONESTORE_R948 Site.CaptureRequirementIfIsTrue( isFoundBLOB && obj.FileDataObject.ObjectDataBLOBDeclaration.ObjectPartitionID.DecodedValue == 2, 948, @"[In Objects] Object Data BLOB Declaration.PartitionID: 2 (File Data) and Object Data BLOB Reference. BLOB Extended GUID: MUST have a reference to an Object Data BLOB Data Element structure, as specified in [MS-FSSHTTPB] section 2.2.1.12.8, used to transmit the data of the file data object."); foreach (FileNode fn in fileData3Refs) { ObjectDeclarationFileData3RefCountFND fnd = fn.fnd as ObjectDeclarationFileData3RefCountFND; if (fnd.FileDataReference.StringData.ToLower().Contains(fileDataObjectGuid.ToString().ToLower())) { // Verify MS-ONESTORE requirement: MS-ONESTORE_R951 Site.CaptureRequirementIfIsTrue( fnd.FileDataReference.StringData.StartsWith("<invfdo>") == false, 951, @"[In Objects] This property MUST be set only if the prefix specified by the ObjectDeclarationFileData3RefCountFND.FileDataReference field (section 2.5.27) [or ObjectDeclarationFileData3LargeRefCountFND.FileDataReference field (section 2.5.28)] is not <invfdo>."); Site.CaptureRequirementIfAreEqual <string>( fnd.Extension.StringData, extension, 958, @"[In Objects] MUST be the value specified by the ObjectDeclarationFileData3RefCountFND.Extension field [or the ObjectDeclarationFileData3LargeRefCountFND.Extension] field."); break; } } } #endregion }
public void TestCase_S15_TC03_Download_UploadPartial() { string fileUrl = Common.GetConfigurationPropertyValue("BigFile", this.Site); string uploadFileUrl = SharedTestSuiteHelper.GenerateNonExistFileUrl(Site); bool partial = false; Knowledge knowledge = null; // Set the limit number of upload tries, this will allow 500000 * 10 bytes size file to be download and complete upload. int limitNumberOfPartialUpload = 10; do { this.InitializeContext(fileUrl, this.UserName01, this.Password01, this.Domain); // Create query changes request with allow fragments flag with the value false. FsshttpbCellRequest cellRequest = SharedTestSuiteHelper.CreateFsshttpbCellRequest(); QueryChangesCellSubRequest queryChange = SharedTestSuiteHelper.BuildFsshttpbQueryChangesSubRequest(SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID(), 0, false, false, true, 0, true, true, 0, null, 500000, null, knowledge); cellRequest.AddSubRequest(queryChange, null); CellSubRequestType cellSubRequest = SharedTestSuiteHelper.CreateCellSubRequest(SequenceNumberGenerator.GetCurrentToken(), cellRequest.ToBase64()); CellStorageResponse cellStorageResponse = this.Adapter.CellStorageRequest(fileUrl, new SubRequestType[] { cellSubRequest }); CellSubResponseType subResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(cellStorageResponse, 0, 0, this.Site); this.Site.Assert.AreEqual <ErrorCodeType>( ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(subResponse.ErrorCode, this.Site), "Test case cannot continue unless the query changes succeed."); FsshttpbResponse queryResponse = SharedTestSuiteHelper.ExtractFsshttpbResponse(subResponse, this.Site); SharedTestSuiteHelper.ExpectMsfsshttpbSubResponseSucceed(queryResponse, this.Site); QueryChangesSubResponseData data = queryResponse.CellSubResponses[0].GetSubResponseData <QueryChangesSubResponseData>(); partial = data.PartialResult; knowledge = data.Knowledge; this.InitializeContext(uploadFileUrl, this.UserName01, this.Password01, this.Domain); cellRequest = SharedTestSuiteHelper.CreateFsshttpbCellRequest(); PutChangesCellSubRequest putChange = new PutChangesCellSubRequest(SequenceNumberGenerator.GetCurrentFSSHTTPBSubRequestID(), null); putChange.Partial = partial ? 1 : 0; putChange.PartialLast = partial ? 0 : 1; putChange.StorageIndexExtendedGUID = partial ? null : data.StorageIndexExtendedGUID; if (partial) { var storageIndex = queryResponse.DataElementPackage.DataElements.FirstOrDefault(e => e.DataElementType == DataElementType.StorageIndexDataElementData); if (storageIndex != null) { queryResponse.DataElementPackage.DataElements.Remove(storageIndex); } } cellRequest.AddSubRequest(putChange, queryResponse.DataElementPackage.DataElements); cellSubRequest = SharedTestSuiteHelper.CreateCellSubRequest(SequenceNumberGenerator.GetCurrentToken(), cellRequest.ToBase64()); cellStorageResponse = this.Adapter.CellStorageRequest(uploadFileUrl, new SubRequestType[] { cellSubRequest }); subResponse = SharedTestSuiteHelper.ExtractSubResponse <CellSubResponseType>(cellStorageResponse, 0, 0, this.Site); this.Site.Assert.AreEqual <ErrorCodeType>( ErrorCodeType.Success, SharedTestSuiteHelper.ConvertToErrorCodeType(subResponse.ErrorCode, this.Site), "Test case cannot continue unless the query changes succeed."); FsshttpbResponse putResponse = SharedTestSuiteHelper.ExtractFsshttpbResponse(subResponse, this.Site); SharedTestSuiteHelper.ExpectMsfsshttpbSubResponseSucceed(putResponse, this.Site); // Decrease the number of upload tries. limitNumberOfPartialUpload--; }while (partial && limitNumberOfPartialUpload > 0); this.StatusManager.RecordFileUpload(uploadFileUrl); }