public void MSWOPI_S18_TC02_CheckFolderInfo_HostAuthenticationId() { { // Get the folder URL. string folderFullUrl = Common.GetConfigurationPropertyValue("SubFolderUrl", this.Site); // Get the WOPI URL. string wopiTargetFolderUrl = WopiSutManageCodeControlAdapter.GetWOPIRootResourceUrl(folderFullUrl, WOPIRootResourceUrlType.FolderLevel, TokenAndRequestUrlHelper.DefaultUserName, TokenAndRequestUrlHelper.DefaultPassword, TokenAndRequestUrlHelper.DefaultDomain); // Get the common header. WebHeaderCollection commonHeaders = HeadersHelper.GetCommonHeaders(wopiTargetFolderUrl); // Return information about the folder and permissions that the current user has relative to that file. WOPIHttpResponse httpWebResponseForCheckFolderInfo = WopiAdapter.CheckFolderInfo(wopiTargetFolderUrl, commonHeaders, string.Empty); string jsonString = WOPIResponseHelper.ReadHTTPResponseBodyToString(httpWebResponseForCheckFolderInfo); // Convert the json string to object. CheckFolderInfo checkFolderInfo = WOPISerializerHelper.JsonToObject <CheckFolderInfo>(jsonString); // Get the WOPI URL. string wopiTargetFolderUrlOther = WopiSutManageCodeControlAdapter.GetWOPIRootResourceUrl( folderFullUrl, WOPIRootResourceUrlType.FileLevel, Common.GetConfigurationPropertyValue("UserName1", this.Site), Common.GetConfigurationPropertyValue("Password1", this.Site), Common.GetConfigurationPropertyValue("Domain", this.Site)); // Get the common header. WebHeaderCollection commonHeadersOther = HeadersHelper.GetCommonHeaders(wopiTargetFolderUrlOther); // Return information about the folder and permissions that the current user has relative to that file. WOPIHttpResponse httpWebResponseForCheckFolderInfoOther = WopiAdapter.CheckFolderInfo(wopiTargetFolderUrlOther, commonHeadersOther, string.Empty); jsonString = WOPIResponseHelper.ReadHTTPResponseBodyToString(httpWebResponseForCheckFolderInfoOther); // Convert the json string to object. CheckFolderInfo checkFolderInfoOther = WOPISerializerHelper.JsonToObject <CheckFolderInfo>(jsonString); // Verify MS-WOPI requirement: MS-WOPI_R742 this.Site.CaptureRequirementIfAreNotEqual( checkFolderInfo.HostAuthenticationId, checkFolderInfoOther.HostAuthenticationId, 742, @"[In Response Body] HostAuthenticationId: A string that is used by the WOPI server to uniquely for a sample of N (default N=2) identify the users."); // Verify requirement MS-WOPI_R59 bool isR59Satisfied = checkFolderInfo.HostAuthenticationId != checkFolderInfoOther.HostAuthenticationId; if (Convert.ToBoolean(Common.IsRequirementEnabled("MS-WOPI", 59, this.Site))) { // Verify MS-WOPI requirement: MS-WOPI_R59 this.Site.CaptureRequirementIfIsTrue( isR59Satisfied, 59, @"[In Common URI Parameters] Implementation does support the token is scoped to a specific user and set of resources.(Microsoft SharePoint Foundation 2013 and above follow this behavior)"); } } }
/// <summary> /// This method is used to validate CheckFolderInfo response captures. /// </summary> /// <param name="response">A parameter represents the response from server.</param> private void ValidateCheckFolderInfoResponse(WOPIHttpResponse response) { string jsonString = WOPIResponseHelper.ReadHTTPResponseBodyToString(response); CheckFolderInfo checkFolderInfo = WOPISerializerHelper.JsonToObject <CheckFolderInfo>(jsonString); // Add the debug information this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-WOPI_R602"); // Verify MS-WOPI requirement: MS-WOPI_R602 // The object is not null means JSON string can change to object. JSON to object check all require and optional item. this.Site.CaptureRequirementIfIsNotNull( checkFolderInfo, 602, @"[In Response Body] The response body is JSON (as specified in [RFC4627]) with the following parameters: JSON: { ""FolderName"":{""type"":""string"",""optional"":false}, ""BreadcrumbBrandIconUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbBrandName"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbBrandUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbDocName"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbDocUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbFolderName"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbFolderUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""ClientUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""CloseButtonClosesWindow"":{""type"":""bool"",""default"":false,""optional"":true}, ""CloseUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""FileSharingUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostAuthenticationId""{""type"":""string"",""default"":"""",""optional"":true}, ""HostEditUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostEmbeddedEditUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostEmbeddedViewUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostName"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostViewUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""OwnerId"":{""type"":""string"",""optional"":false}, ""PresenceProvider""{""type"":""string"",""default"":"""",""optional"":true}, ""PresenceUserId""{""type"":""string"",""default"":"""",""optional"":true}, ""PrivacyUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""SignoutUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""SupportsSecureStore"":{""type"":""bool"",""default"":false,""optional"":true}, ""TenantId""{""type"":""string"",""default"":"""",""optional"":true}, ""TermsOfUseUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""UserCanWrite"":{""type"":""bool"",""default"":false,""optional"":true}, ""UserFriendlyName"":{""type"":""string"",""default"":"""",""optional"":true}, ""UserId"":{""type"":""string"",""default"":"""",""optional"":true}, ""WebEditingDisabled"":{""type"":""bool"",""default"":false,""optional"":true}, }"); this.ValidateURL(checkFolderInfo.CloseUrl, "CloseUrl"); this.ValidateURL(checkFolderInfo.FileSharingUrl, "FileSharingUrl"); this.ValidateURL(checkFolderInfo.HostEmbeddedEditUrl, "HostEmbeddedEditUrl"); this.ValidateURL(checkFolderInfo.HostEmbeddedViewUrl, "HostEmbeddedViewUrl"); this.ValidateURL(checkFolderInfo.PrivacyUrl, "PrivacyUrl"); this.ValidateURL(checkFolderInfo.SignoutUrl, "SignoutUrl"); }
public void MSWOPI_S18_TC01_CheckFolderInfo() { if (!Common.IsRequirementEnabled("MS-WOPI", 593, this.Site)) { Site.Assume.Inconclusive(@"The implementation does not support the get the folder access_token and WOPISrc. It is determined using SHOULDMAY PTFConfig property named R593Enabled_MS-WOPI."); } // Get the folder URL. string folderFullUrl = Common.GetConfigurationPropertyValue("SubFolderUrl", this.Site); // Get the WOPI URL. string wopiTargetFolderUrl = WopiSutManageCodeControlAdapter.GetWOPIRootResourceUrl(folderFullUrl, WOPIRootResourceUrlType.FolderLevel, TokenAndRequestUrlHelper.DefaultUserName, TokenAndRequestUrlHelper.DefaultPassword, TokenAndRequestUrlHelper.DefaultDomain); // Get the common header. WebHeaderCollection commonHeaders = HeadersHelper.GetCommonHeaders(wopiTargetFolderUrl); // Return information about the folder and permissions that the current user has relative to that file. WOPIHttpResponse httpWebResponseForCheckFolderInfo = WopiAdapter.CheckFolderInfo(wopiTargetFolderUrl, commonHeaders, string.Empty); // Get the json string from the response of CheckFolderInfo. string jsonString = WOPIResponseHelper.ReadHTTPResponseBodyToString(httpWebResponseForCheckFolderInfo); // Convert the json string to object. CheckFolderInfo checkFolderInfo = WOPISerializerHelper.JsonToObject <CheckFolderInfo>(jsonString); // Verify MS-WOPI requirement: MS-WOPI_R597 this.Site.CaptureRequirementIfIsNotNull( checkFolderInfo, 597, @"[In HTTP://server/<...>/wopi*/folders/<id>] Operation ""CheckFolderInfo"" is used for ""Returns information about a folder."); // Verify MS-WOPI requirement: MS-WOPI_R597 this.Site.CaptureRequirementIfIsNotNull( checkFolderInfo, 598, @"[In CheckFolderInfo] Return information about the folder and permissions that the current user has relative to that file."); // The URI in "CheckFolderInfo" WOPI request follow the "HTTP://server/<...>/wopi*/folders/<id>?access_token=<token>" pattern, if the operation execute successfully, capture R599 // Verify MS-WOPI requirement: MS-WOPI_R599 this.Site.CaptureRequirement( 599, @"[In CheckFolderInfo] HTTP Verb: GET URI: HTTP://server/<...>/wopi*/folders/<id>?access_token=<token>"); if (!string.IsNullOrEmpty(checkFolderInfo.UserFriendlyName)) { // Verify MS-WOPI requirement: MS-WOPI_R645 bool isVerifiedR645 = checkFolderInfo.UserFriendlyName.IndexOf(Common.GetConfigurationPropertyValue("UserName", this.Site), StringComparison.OrdinalIgnoreCase) >= 0 || checkFolderInfo.UserFriendlyName.IndexOf(Common.GetConfigurationPropertyValue("UserFriendlyName", this.Site), StringComparison.OrdinalIgnoreCase) >= 0; this.Site.CaptureRequirementIfIsTrue( isVerifiedR645, 645, @"[In Response Body] UserFriendlyName: A string that is the name of the user."); } }
/// <summary> /// This method is used to validate ReadSecureStore response captures. /// </summary> /// <param name="response">A parameter represents the response from server.</param> private void ValidateReadSecureStoreResponse(WOPIHttpResponse response) { string jsonString = WOPIResponseHelper.ReadHTTPResponseBodyToString(response); // If the JSON string can be converted to the ReadSecureStore succeed, that means it match the JSON schema definition. WOPISerializerHelper.JsonToObject <ReadSecureStore>(jsonString); // If the JSON string can converted to object. The process of "JSON to object" check all require and optional item. this.Site.CaptureRequirement( 541, @"[In Response Body] The response body is JSON (as specified in [RFC4627]) with the following parameters: JSON: { ""UserName"":{""type"":""string"",""optional"":false}, ""Password"":{""type"":""string"",""default"":"""",""optional"":false}, ""IsWindowsCredentials"":{""type"":""bool"",""default"":""false"",""optional"":true}, ""IsGroup"":{""type"":""bool"",""default"":""false"",""optional"":true}, }"); }
/// <summary> /// A method is used to generate response of a WOPI discovery request. It indicates the WOPI client supports 3 types file extensions: ".txt", ".zip", ".one" /// </summary> /// <param name="currentTestClientName">A parameter represents the current test client name which is used to construct WOPI client's app name in WOPI discovery response.</param> /// <param name="progId">A parameter represents the id of program which is associated with folder level visit in discovery process. This value must be valid for WOPI server.</param> /// <returns>A return value represents the response of a WOPI discovery request.</returns> public static string GetDiscoveryResponseXmlString(string currentTestClientName, string progId) { DiscoveryProcessHelper.CheckInputParameterNullOrEmpty <string>(currentTestClientName, "currentTestClientName", "GetDiscoveryResponseXmlString"); DiscoveryProcessHelper.CheckInputParameterNullOrEmpty <string>(progId, "progId", "GetDiscoveryResponseXmlString"); wopidiscovery wopiDiscoveryInstance = new wopidiscovery(); // Pass the prog id, so that the WOPI discovery response logic will use the prog id value. progIdValue = progId; // Add http and https net zone into the wopiDiscovery wopiDiscoveryInstance.netzone = GetNetZonesForWopiDiscoveryResponse(currentTestClientName); // ProofKey element wopiDiscoveryInstance.proofkey = new ct_proofkey(); wopiDiscoveryInstance.proofkey.oldvalue = RSACryptoContext.PublicKeyStringOfOld; wopiDiscoveryInstance.proofkey.value = RSACryptoContext.PublicKeyStringOfCurrent; string xmlStringOfResponseDiscovery = WOPISerializerHelper.GetDiscoveryXmlFromDiscoveryObject(wopiDiscoveryInstance); return(xmlStringOfResponseDiscovery); }
/// <summary> /// This method is used to validate EnumerateChildren response captures. /// </summary> /// <param name="response">A parameter represents the response from server.</param> private void ValidateEnumerateChildrenResponse(WOPIHttpResponse response) { // All folder children messages are follow this format. If test suite receive a succeed response, capture this requirement. this.Site.CaptureRequirement( 699, @"[In HTTP://server/<...>/wopi*/folder/<id>/children] The contents of a folder being accessed by WOPI are identified by the following URI: HTTP://server/<...>/wopi*/folder/<id>/children"); // All folder children messages are follow this format. If test suite receive a succeed response, capture this requirement. this.Site.CaptureRequirement( 700, @"[In HTTP://server/<...>/wopi*/folder/<id>/children] The syntax URI parameters are defined by the following ABNF: id = STRING"); string jsonString = WOPIResponseHelper.ReadHTTPResponseBodyToString(response); EnumerateChildren enumerateChildren = WOPISerializerHelper.JsonToObject <EnumerateChildren>(jsonString); // Add the debug information this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-WOPI_R712"); // Verify MS-WOPI requirement: MS-WOPI_R712 // If the value is not null indicating the JSON string has been converted to EnumerateChildren type object successfully. this.Site.CaptureRequirementIfIsNotNull( enumerateChildren, 712, @"[In Response Body] The response body is JSON (as specified in [RFC4627]) with the following parameters: JSON: { ""Children"": [{ ""Name"":""<name>"", ""Url"":""<url>"", ""Version"":""<version>"" }, }"); }
/// <summary> /// This method is used to validate PutRelativeFile response captures. /// </summary> /// <param name="response">A parameter represents the response from server.</param> private void ValidatePutRelativeFileResponse(WOPIHttpResponse response) { string jsonString = WOPIResponseHelper.ReadHTTPResponseBodyToString(response); PutRelativeFile putRelativeFile = WOPISerializerHelper.JsonToObject <PutRelativeFile>(jsonString); // Add the debug information this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-WOPI_R382"); // Verify MS-WOPI requirement: MS-WOPI_R382 // The object is not null means JSON string can change to object. JSON to object check all require and optional item. this.Site.CaptureRequirementIfIsNotNull( putRelativeFile, 382, @"[In Response Body] [Name] The response body is JSON (as specified in [RFC4627]) with the following parameters: JSON: { ""Name"":{""type"":""string"",""optional"":false}, ""Url"":{""type"":""string"",""default"":"""",""optional"":false}, ""HostViewUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostEditUrl"":{""type"":""string"",""default"":"""",""optional"":true}, }"); this.ValidateURL(putRelativeFile.HostViewUrl, "HostViewUrl"); this.ValidateURL(putRelativeFile.HostEditUrl, "HostEditUrl"); }
/// <summary> /// This method is used to validate CheckFileInfo response captures. /// </summary> /// <param name="response">A parameter represents the response from server.</param> private void ValidateCheckFileInfoResponse(WOPIHttpResponse response) { string jsonString = WOPIResponseHelper.ReadHTTPResponseBodyToString(response); CheckFileInfo checkFileInfo = WOPISerializerHelper.JsonToObject <CheckFileInfo>(jsonString); // Add the debug information this.Site.Log.Add(LogEntryKind.Debug, "Verify MS-WOPI_R273"); // Verify MS-WOPI requirement: MS-WOPI_R273 // If the value is not null indicating the JSON string has been converted to CheckFileInfo type object successfully. this.Site.CaptureRequirementIfIsNotNull( checkFileInfo, 273, @"[In Response Body] The response body is JavaScript Object Notation (JSON) (as specified in [RFC4627]) with the following parameters: JSON: { ""AllowExternalMarketplace"":{""type"":""bool"",""default"":false,""optional"":true}, ""BaseFileName"":{""type"":""string"",""optional"":false}, ""BreadcrumbBrandName"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbBrandUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbDocName"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbDocUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbFolderName"":{""type"":""string"",""default"":"""",""optional"":true}, ""BreadcrumbFolderUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""ClientUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""CloseButtonClosesWindow"":{""type"":""bool"",""default"":false,""optional"":true}, ""CloseUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""DisableBrowserCachingOfUserContent"":{""type"":""bool"",""default"":false,""optional"":true}, ""DisablePrint"":{""type"":""bool"",""default"":false,""optional"":true}, ""DisableTranslation"":{""type"":""bool"",""default"":false,""optional"":true}, ""DownloadUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""FileSharingUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""FileUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostAuthenticationId""{""type"":""string"",""default"":"""",""optional"":true}, ""HostEditUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostEmbeddedEditUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostEmbeddedViewUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostName"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostNotes"":{""type"":""string"",""default"":"""",""optional"":true}, ""HostRestUrl""{""type"":""string"",""default"":"""",""optional"":true}, ""HostViewUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""IrmPolicyDescription"":{""type"":""string"",""default"":"""",""optional"":true}, ""IrmPolicyTitle"":{""type"":""string"",""default"":"""",""optional"":true}, ""OwnerId"":{""type"":""string"",""optional"":false}, ""PresenceProvider""{""type"":""string"",""default"":"""",""optional"":true}, ""PresenceUserId""{""type"":""string"",""default"":"""",""optional"":true}, ""PrivacyUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""ProtectInClient"":{""type"":""bool"",""default"":false,""optional"":true}, ""ReadOnly"":{""type"":""bool"",""default"":false,""optional"":true}, ""RestrictedWebViewOnly"":{""type"":""bool"",""default"":false,""optional"":true}, ""SHA256"":{""type"":""string"",""optional"":false}, ""SignoutUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""Size"":{""type"":""int"",""optional"":false}, ""SupportsCoauth"":{""type"":""bool"",""default"":false,""optional"":true}, ""SupportsCobalt"":{""type"":""bool"",""default"":false,""optional"":true}, ""SupportsFolders"":{""type"":""bool"",""default"":false,""optional"":true}, ""SupportsLocks"":{""type"":""bool"",""default"":false,""optional"":true}, ""SupportsScenarioLinks"":{""type"":""bool"",""default"":false,""optional"":true}, ""SupportsSecureStore"":{""type"":""bool"",""default"":false,""optional"":true}, ""SupportsUpdate"":{""type"":""bool"",""default"":false,""optional"":true}, ""TenantId""{""type"":""string"",""default"":"""",""optional"":true}, ""TermsOfUseUrl"":{""type"":""string"",""default"":"""",""optional"":true}, ""TimeZone""{""type"":""string"",""default"":"""",""optional"":true}, ""UserCanAttend"":{""type"":""bool"",""default"":false,""optional"":true}, ""UserCanNotWriteRelative"":{""type"":""bool"",""default"":false,""optional"":true}, ""UserCanPresent"":{""type"":""bool"",""default"":false,""optional"":true}, ""UserCanWrite"":{""type"":""bool"",""default"":false,""optional"":true}, ""UserFriendlyName"":{""type"":""string"",""default"":"""",""optional"":true}, ""UserId"":{""type"":""string"",""default"":"""",""optional"":true}, ""Version"":{""type"":""string"",""optional"":false} ""WebEditingDisabled"":{""type"":""bool"",""default"":false,""optional"":true}, }"); if (WOPISerializerHelper.CheckContainItem(jsonString, "ReadOnly")) { // Check whether "ReadOnly" is in JSON. If JSON string contain this item,it must follow JSON response format. this.Site.CaptureRequirement( 925, @"[In Response Body] ReadOnly is a Boolean value."); } if (WOPISerializerHelper.CheckContainItem(jsonString, "SupportsCoauth")) { // Check whether "SupportsCoauth" is in JSON. If JSON string contain this item,it must follow JSON response format. this.Site.CaptureRequirement( 950, @"[In Response Body] SupportsCoauth is a Boolean value."); } if (WOPISerializerHelper.CheckContainItem(jsonString, "SupportsCobalt")) { // Check whether "SupportsCobalt" is in JSON. If JSON string contain this item,it must follow JSON response format. this.Site.CaptureRequirement( 775, @"[In Response Body] SupportsCobalt is a Boolean value."); } if (WOPISerializerHelper.CheckContainItem(jsonString, "SupportsFolders")) { // Check whether "SupportsFolders" is in JSON. If JSON string contain this item,it must follow JSON response format. this.Site.CaptureRequirement( 777, @"[In Response Body] SupportsFolders is a Boolean value."); } if (WOPISerializerHelper.CheckContainItem(jsonString, "SupportsLocks")) { // Check whether "SupportsLocks" is in JSON. If JSON string contain this item,it must follow JSON response format. this.Site.CaptureRequirement( 779, @"[In Response Body] SupportsLocks is a Boolean value."); } if (WOPISerializerHelper.CheckContainItem(jsonString, "SupportsSecureStore")) { // Check whether "SupportsSecureStore" is in JSON. If JSON string contain this item,it must follow JSON response format. this.Site.CaptureRequirement( 923, @"[In Response Body] SupportsSecureStore is a Boolean value."); } if (WOPISerializerHelper.CheckContainItem(jsonString, "SupportsUpdate")) { // Check whether "SupportsUpdate" is in JSON. If JSON string contain this item,it must follow JSON response format. this.Site.CaptureRequirement( 783, @"[In Response Body] SupportsUpdate is a Boolean value."); } if (WOPISerializerHelper.CheckContainItem(jsonString, "UserCanNotWriteRelative")) { // Check whether "UserCanNotWriteRelative" is in JSON. If JSON string contain this item,it must follow JSON response format. this.Site.CaptureRequirement( 920, @"[In Response Body] UserCanNotWriteRelative is a Boolean value."); } if (WOPISerializerHelper.CheckContainItem(jsonString, "UserCanWrite")) { // Check whether "UserCanWrite" is in JSON. If JSON string contain this item,it must follow JSON response format. this.Site.CaptureRequirement( 928, @"[In Response Body] UserCanWrite is a Boolean value."); } this.ValidateURL(checkFileInfo.CloseUrl, "CloseUrl"); this.ValidateURL(checkFileInfo.DownloadUrl, "DownloadUrl"); this.ValidateURL(checkFileInfo.FileSharingUrl, "FileSharingUrl"); this.ValidateURL(checkFileInfo.HostViewUrl, "HostViewUrl"); }
public void MSWOPI_S20_TC01_EnumerateChildren() { // Get the folder URL. string folderFullUrl = Common.GetConfigurationPropertyValue("SubFolderUrl", this.Site); // Get the WOPI URL. string wopiTargetFolderUrl = WopiSutManageCodeControlAdapter.GetWOPIRootResourceUrl(folderFullUrl, WOPIRootResourceUrlType.FolderLevel, TokenAndRequestUrlHelper.DefaultUserName, TokenAndRequestUrlHelper.DefaultPassword, TokenAndRequestUrlHelper.DefaultDomain); // Get folder content URL. string wopiFolderContentsLevelUrl = TokenAndRequestUrlHelper.GetSubResourceUrl(wopiTargetFolderUrl, WOPISubResourceUrlType.FolderChildrenLevel); // Get the common header. WebHeaderCollection commonHeaders = HeadersHelper.GetCommonHeaders(wopiFolderContentsLevelUrl); // Return the contents of a folder on the WOPI server. WOPIHttpResponse httpWebResponseForEnumerateChildren = WopiAdapter.EnumerateChildren(wopiFolderContentsLevelUrl, commonHeaders); int statusCode = httpWebResponseForEnumerateChildren.StatusCode; // Get the json string from the response of EnumerateChildren. string jsonStringForEnumerateChildren = WOPIResponseHelper.ReadHTTPResponseBodyToString(httpWebResponseForEnumerateChildren); // Convert the json string to object. EnumerateChildren enchildren = WOPISerializerHelper.JsonToObject <EnumerateChildren>(jsonStringForEnumerateChildren); string fileName = enchildren.Children[0].Name; // Verify MS-WOPI requirement: MS-WOPI_R707 this.Site.CaptureRequirementIfAreEqual <int>( 200, statusCode, 707, @"[In EnumerateChildren] Status code ""200"" means ""Success""."); // The status code is 200 mean success.When response is success the URIs are return. this.Site.CaptureRequirement( 703, @"[In HTTP://server/<...>/wopi*/folder/<id>/children] Operation ""EnumerateChildren"" is used for ""Returns a set of URIs that provides access to resources in the folder""."); // The status code is 200 mean success.When response is success the contexts are return. this.Site.CaptureRequirement( 704, @"[In EnumerateChildren] The EnumerateChildren method returns the contents of a folder on the WOPI server."); // The status code is 200 mean success.When response is success the URI follows the format. this.Site.CaptureRequirement( 705, @"[In EnumerateChildren] HTTP Verb: GET URI: HTTP://server/<...>/wopi*/folder/<id>/children?access_token=<token>"); string subFileUrl = Common.GetConfigurationPropertyValue("UrlOfFileOnSubFolder", this.Site); string expectedFileName = TestSuiteHelper.GetFileNameFromFullUrl(subFileUrl); // Verify MS-WOPI requirement: MS-WOPI_R713 bool isEqualToExpectedFileName = expectedFileName.CompareStringValueIgnoreCase(fileName, this.Site); this.Site.CaptureRequirementIfIsTrue( isEqualToExpectedFileName, 713, @"[In Response Body] Name: The name of the child resource."); // Verify MS-WOPI requirement: MS-WOPI_R714 // The EnumerateChildren request message follow this format and use the id and token return by WOPI server. // If the WOPI server can return the response of EnumerateChildren, capture R714 this.Site.CaptureRequirement( 714, @"[In Response Body] Url: The URI of the child resource of the form http://server/<...>/wopi*/files/<id>?access_token=<token> where id is the WOPI server’s unique id of the resource and token is the token that provides access to the resource."); }
public void MSWOPI_S20_TC02_EnumerateChildren_Version() { #region Get the WOPI resource URL for visiting file. // Get the file URL. string fileUrl = Common.GetConfigurationPropertyValue("UrlOfFileOnSubFolder", this.Site); // Get the WOPI URL. string wopiTargetFileUrl = WopiSutManageCodeControlAdapter.GetWOPIRootResourceUrl(fileUrl, WOPIRootResourceUrlType.FileLevel, TokenAndRequestUrlHelper.DefaultUserName, TokenAndRequestUrlHelper.DefaultPassword, TokenAndRequestUrlHelper.DefaultDomain); // Get file content URL. string wopiFileContentsLevelUrl = TokenAndRequestUrlHelper.GetSubResourceUrl(wopiTargetFileUrl, WOPISubResourceUrlType.FileContentsLevel); #endregion #region Get the WOPI resource URL for visiting folder. // Get the folder URL. string folderFullUrl = Common.GetConfigurationPropertyValue("SubFolderUrl", this.Site); // Get the WOPI URL. string wopiTargetFolderUrl = WopiSutManageCodeControlAdapter.GetWOPIRootResourceUrl(folderFullUrl, WOPIRootResourceUrlType.FolderLevel, TokenAndRequestUrlHelper.DefaultUserName, TokenAndRequestUrlHelper.DefaultPassword, TokenAndRequestUrlHelper.DefaultDomain); // Get folder content URL. string wopiFolderContentsLevelUrl = TokenAndRequestUrlHelper.GetSubResourceUrl(wopiTargetFolderUrl, WOPISubResourceUrlType.FolderChildrenLevel); #endregion #region Call EnumerateChildren // Get the common header. WebHeaderCollection commonHeaders = HeadersHelper.GetCommonHeaders(wopiFolderContentsLevelUrl); // Return the contents of a folder on the WOPI server. WOPIHttpResponse httpWebResponseForEnumerateChildren = WopiAdapter.EnumerateChildren(wopiFolderContentsLevelUrl, commonHeaders); // Get the json string from the response of EnumerateChildren. string jsonStringForEnumerateChildren = WOPIResponseHelper.ReadHTTPResponseBodyToString(httpWebResponseForEnumerateChildren); // Convert the json string to object. EnumerateChildren enchildren = WOPISerializerHelper.JsonToObject <EnumerateChildren>(jsonStringForEnumerateChildren); string versionOld = enchildren.Children[0].Version; #endregion #region Call PutFile // Get the common header. commonHeaders = HeadersHelper.GetCommonHeaders(wopiFileContentsLevelUrl); string exceptedUpdateContent = "WOPI PUT file test"; byte[] bodycontents = Encoding.UTF8.GetBytes(exceptedUpdateContent); string identifier = Guid.NewGuid().ToString("N"); // Update a file on the WOPI server. WopiAdapter.PutFile(wopiFileContentsLevelUrl, commonHeaders, null, bodycontents, identifier); #endregion #region Call EnumerateChildren // Get the common header. commonHeaders = HeadersHelper.GetCommonHeaders(wopiFolderContentsLevelUrl); // Return the contents of a folder on the WOPI server. httpWebResponseForEnumerateChildren = WopiAdapter.EnumerateChildren(wopiFolderContentsLevelUrl, commonHeaders); // Get the json string from the response of EnumerateChildren. jsonStringForEnumerateChildren = WOPIResponseHelper.ReadHTTPResponseBodyToString(httpWebResponseForEnumerateChildren); // Convert the json string to object. enchildren = WOPISerializerHelper.JsonToObject <EnumerateChildren>(jsonStringForEnumerateChildren); string versionNew = enchildren.Children[0].Version; #endregion #region Call CheckFileInfo // Get the common header. commonHeaders = HeadersHelper.GetCommonHeaders(wopiTargetFileUrl); // Return information about the file WOPIHttpResponse responseOfCheckFileInfo = WopiAdapter.CheckFileInfo(wopiTargetFileUrl, commonHeaders, null); // Get the json string from the response of CheckFileInfo. string jsonStringForCheckFileInfo = WOPIResponseHelper.ReadHTTPResponseBodyToString(responseOfCheckFileInfo); // Convert the json string to object. CheckFileInfo checkFileInfo = WOPISerializerHelper.JsonToObject <CheckFileInfo>(jsonStringForCheckFileInfo); string versionCheckFileInfo = checkFileInfo.Version; #endregion // Verify MS-WOPI requirement: MS-WOPI_R716 this.Site.CaptureRequirementIfAreNotEqual <string>( versionOld, versionNew, 716, @"[In Response Body] [Version] This value MUST change when the file changes."); // Verify MS-WOPI requirement: MS-WOPI_R934 this.Site.CaptureRequirementIfAreEqual <string>( versionCheckFileInfo, versionNew, 934, @"[In Response Body] [Version] MUST match the value that would be provided by the ""Version"" field in the response to CheckFileInfo (see section 3.3.5.1.1)."); }