| File: ObjectModel\UriDataAttachment.cs | Web Access |
| Project: src\vstest\src\Microsoft.TestPlatform.Extensions.TrxLogger\Microsoft.TestPlatform.Extensions.TrxLogger.csproj (Microsoft.VisualStudio.TestPlatform.Extensions.Trx.TestLogger) |
// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; using System.Xml; using Microsoft.TestPlatform.Extensions.TrxLogger.Utility; using Microsoft.TestPlatform.Extensions.TrxLogger.XML; using Microsoft.VisualStudio.TestPlatform.Extensions.TrxLogger; namespace Microsoft.TestPlatform.Extensions.TrxLogger.ObjectModel; /// <summary> /// Class that provides a basic implementation of IUriAttachment, which can be used by plugin /// writers to send any resource accessible by a URI as an attachment. /// </summary> internal class UriDataAttachment : IDataAttachment, IXmlTestStore { private readonly TrxFileHelper _trxFileHelper; /// <summary> /// The name for the attachment /// </summary> /// <summary> /// Initializes the URI data attachment /// </summary> /// <param name="description">Short description for the attachment</param> /// <param name="uri">The URI pointing to the resource</param> /// <param name="trxFileHelper">InternalFileHelper class instance to use in file operations.</param> /// <exception cref="ArgumentException">'name' is null or empty</exception> /// <exception cref="ArgumentNullException">'uri' is null</exception> public UriDataAttachment(string description, Uri uri, TrxFileHelper trxFileHelper) { _trxFileHelper = trxFileHelper; EqtAssert.ParameterNotNull(description, nameof(description)); EqtAssert.ParameterNotNull(uri, nameof(uri)); Description = description; Uri = uri; } #region IDataAttachment Members /// <summary> /// Gets short description for the attachment. /// </summary> public string Description { get; private set; } /// <summary> /// Gets the URI that can be used to obtain the data of this attachment /// </summary> public Uri Uri { get; private set; } #endregion #region IXmlTestStore Members /// <summary> /// Saves the class under the XmlElement. /// </summary> /// <param name="element"> /// The parent xml. /// </param> /// <param name="parameters"> /// The parameter /// </param> public void Save(XmlElement element, XmlTestStoreParameters? parameters) { EqtAssert.ParameterNotNull(element, nameof(element)); XmlPersistence helper = new(); helper.SaveSimpleField(element, ".", Description, null); // The URI is not a true URI, it must always be a local path represented as a URI. Also, the URI can be absolute or // relative. We use OriginalString because: // - ToString gets a string in the form "file://..." for an absolute URI and what was passed in for a relative URI // - AbsoluteUri only works for an absolute URI naturally // - LocalPath only works for an absolute URI // Due to the above assumption, that it is always an absolute or relative local path to a file, it's simplest and // safest to treat the URI as a string and just use OriginalString. helper.SaveSimpleField(element, "@href", Uri.OriginalString, null); } #endregion #region Internal Methods /// <summary> /// Clones the instance and makes the URI in the clone relative using the specified base directory /// </summary> /// <param name="baseDirectory">The base directory to use to make the URI relative</param> /// <returns>A clone of the instance, with the URI made relative</returns> internal UriDataAttachment CloneWithRelativePath(string baseDirectory) { TPDebug.Assert(!baseDirectory.IsNullOrEmpty(), "'baseDirectory' is null or empty"); TPDebug.Assert(baseDirectory == baseDirectory.Trim(), "'baseDirectory' contains whitespace at the ends"); if (Uri.IsAbsoluteUri) { var uriToUse = new Uri(TrxFileHelper.MakePathRelative(Uri.OriginalString, baseDirectory), UriKind.Relative); return new UriDataAttachment(Description, uriToUse, _trxFileHelper); } // The URI in this instance is already how we want it, and since this class is immutable, no need to clone return this; } #endregion }