This commit is contained in:
ziyezizy7 2015-08-07 09:49:14 +08:00
Родитель 70aa7828bb
Коммит 813ce7e8a3
217 изменённых файлов: 48520 добавлений и 2 удалений

31
CONTRIBUTING.md Normal file
Просмотреть файл

@ -0,0 +1,31 @@
# Contributing to Protocol Test Framework
There are many ways to contribute to PTF.
* Report bugs and help verify fixes when they are checked in.
* Submit updates and improvements to the [documentation](https://github.com/Microsoft/ProtocolTestFramework/docs).
* Contribute bug fixes.
* Add new features. But firstly you should log an issue to notify the team before you spend a lot of time on it.
## CLA
Contributors must sign a [Contribution License Agreement (CLA)](https://cla.microsoft.com/) before any pull requests will be considered.
This is a one time job. Once you have signed a CLA for any project sponsored by Microsoft, you are good to go for all the repos sponsored by Microsoft.
## Coding Style
The basic rule is following the coding style of the existing code.
## Test
Every time you make changes to PTF, you should run the [unit test cases](https://github.com/Microsoft/ProtocolTestFramework/src/test) to avoid regression.
If you add new features other than minor changes or bug fixing, you should add the relative test cases.
To build test project:
```
cd ProtocoTestFramework\src\test
buildtest.cmd
```
To run all the test cases:
```
runtest.cmd
```

8
LICENSE.txt Normal file
Просмотреть файл

@ -0,0 +1,8 @@
Protocol Test Framework
Copyright (c) Microsoft Corporation
All rights reserved.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Просмотреть файл

@ -1,2 +1,47 @@
# ProtocolTestFramework
The Protocol Test Framework (PTF) is designed to support Microsoft Protocol Test Suites for both Windows and Office Protocol Interoperability testing.
# Protocol Test Framework
The Protocol Test Framework (PTF) is designed to support Microsoft Protocol Test Suites for both Windows and Office Protocol Interoperability testing.
It implements the fundamentals to support Protocol Test Suite, including logging, checker, configuration and etc.
## Prerequisites
PTF is based on Windows platform.
You should install the following list of software in order to build PTF from source code.
* .Net framework 4.0 or higher
* Wix toolset v3.7 or higher
* Visual Studio or Visual Studio test agent, version 2012 or higher
## Build
After you clone a copy of this repo, change to the ProtocolTestFramework directory:
```
cd ProtocolTestFramework
```
Change to src directory and run build.cmd
```
cd src
build.cmd [formodel]
```
After the build succeeds, ProtocolTestFrameworkInstaller.msi should be generated in the folder ProtocolTestFramework\src\Bin\deploy\installer\.
If you need to develop a protocol test suite using Model Based Testing tool [Spec Explorer](https://visualstudiogallery.msdn.microsoft.com/271d0904-f178-4ce9-956b-d9bfa4902745/),
you should install **Spec Explorer** first and then build PTF with the option **formodel**.
## Examples
You can find samples of how to develop a protocol test suite using PTF [here](https://github.com/Microsoft/ProtocolTestFramework/samples).
## Documentation
* [User Guide](https://github.com/Microsoft/ProtocolTestFramework/docs/) describes the features of PTF, and how to use them to develop a new protocol test suite.
## Contribute
You can find contributing guide [here](https://github.com/Microsoft/ProtocolTestFramework/CONTRIBUTING.md).
## License
PTF is under the [MIT license](https://github.com/Microsoft/ProtocolTestFramework/LICENSE.txt).

Двоичные данные
docs/PTFUserGuide.docx Normal file

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="Local Test Run" id="736D2D79-53CA-4075-B37C-3E17651A9F7C" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<Description>This is a default test run configuration for a local test run.</Description>
<Deployment>
<DeploymentItem filename="ServerLocalTestRun.testrunconfig" />
<DeploymentItem filename="XXXX_Adapter\XXXX_SUTControlAdapter\" />
<DeploymentItem filename="XXXX_TestSuite\XXXX_TestSuite.deployment.ptfconfig" />
<DeploymentItem filename="XXXX_TestSuite\XXXX_TestSuite.ptfconfig" />
</Deployment>
<Execution hostProcessPlatform="MSIL">
<TestTypeSpecific>
<UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b">
<AssemblyResolution>
<TestDirectory useLoadContext="true" />
</AssemblyResolution>
</UnitTestRunConfig>
<WebTestRunConfiguration testTypeId="4e7599fa-5ecb-43e9-a887-cd63cf72d207">
<Browser name="Internet Explorer 7.0">
<Headers>
<Header name="User-Agent" value="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" />
<Header name="Accept" value="*/*" />
<Header name="Accept-Language" value="{{$IEAcceptLanguage}}" />
<Header name="Accept-Encoding" value="GZIP" />
</Headers>
</Browser>
</WebTestRunConfiguration>
</TestTypeSpecific>
<AgentRule name="LocalMachineDefaultRole">
</AgentRule>
</Execution>
</TestSettings>

Просмотреть файл

@ -0,0 +1,28 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using Microsoft.Protocols.TestTools;
namespace Microsoft.Protocols.TestSuites.XXXX.Adapter
{
/// <summary>
/// Defines the interface of the XXXX protocol adapter
/// </summary>
public interface IXXXX_Adapter: IAdapter
{
/// <summary>
/// Sends a request to SUT
/// </summary>
/// <param name="SUTIPAddress">Indicats IP address of SUT</param>
/// <returns>Indicates if the request is sent succesfully</returns>
bool SendRequest(string SUTIPAddress);
/// <summary>
/// Waits for a resonse from SUT
/// </summary>
/// <param name="status">Indicates the status in the response</param>
/// <param name="timeout">Indicates the timeout in seconds when waiting for the response</param>
/// <returns>Indicates if the response is received successfully</returns>
bool WaitForResponse(out int status, int timeout);
}
}

Просмотреть файл

@ -0,0 +1,17 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using Microsoft.Protocols.TestTools;
namespace Microsoft.Protocols.TestSuites.XXXX.Adapter
{
/// <summary>
/// Defines the SUT control adapter
/// It's used to control the SUT
/// </summary>
public interface IXXXX_SUTControlAdapter: IAdapter
{
[MethodHelp("Reset SUT to initial state. Return true for success, false for failure")]
bool ResetSUT();
}
}

Просмотреть файл

@ -0,0 +1,56 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.Protocols.TestTools;
using Microsoft.Protocols.TestTools.ExtendedLogging;
namespace Microsoft.Protocols.TestSuites.XXXX.Adapter
{
/// <summary>
/// Implements the XXXX protocol adapter
/// </summary>
public class XXXX_Adapter : ManagedAdapterBase, IXXXX_Adapter
{
/// <summary>
/// Resets all the states of the adapter
/// </summary>
public override void Reset()
{
}
/// <summary>
/// Sends a request to SUT
/// </summary>
/// <param name="SUTIPAddress">Indicats IP address of SUT</param>
/// <returns>Indicates if the request is sent succesfully</returns>
public bool SendRequest(string SUTIPAddress)
{
// Add code here to construct a requst message and then send it to SUT
// Dump request message to ETW provider: Protocol-Test-Suite
// Then the message data could be captured using an ETW capture tool.
// It's useful when the message is encrypted.
ExtendedLogger.DumpMessage("XXXX: Request", System.Text.Encoding.Default.GetBytes("Here is the binary of the request"));
return true;
}
/// <summary>
/// Waits for a resonse from SUT
/// </summary>
/// <param name="status">Indicates the status in the response</param>
/// <param name="timeout">Indicates the timeout in seconds when waiting for the response</param>
/// <returns>Indicates if the response is received successfully</returns>
public bool WaitForResponse(out int status, int timeout)
{
// Add code here to receive data from SUT, and parse the data to a message structure
status = 0;
// Dump response message to ETW provider: Protocol-Test-Suite
// Then the message data could be captured using an ETW capture tool.
// It's useful when the message is encrypted.
ExtendedLogger.DumpMessage("XXXX: Response", System.Text.Encoding.Default.GetBytes("Here is the binary of the response"));
return true;
}
}
}

Просмотреть файл

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{EE588106-E147-45A2-A16F-732547DB0060}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Microsoft.Protocols.TestSuites.XXXX.Adapter</RootNamespace>
<AssemblyName>XXXX_Adapter</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Protocols.TestTools" />
<Reference Include="Microsoft.Protocols.TestTools.ExtendedLogging" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="IXXXX_Adapter.cs" />
<Compile Include="IXXXX_SUTControlAdapter.cs" />
<Compile Include="XXXX_Adapter.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="XXXX_SUTControlAdapter\ResetSUT.ps1" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Просмотреть файл

@ -0,0 +1,10 @@
#############################################################################
# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
#############################################################################
######################################
# Add your own script here to reset SUT to initial state
######################################
return $TRUE

Просмотреть файл

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XXXX_TestSuite", "XXXX_TestSuite\XXXX_TestSuite.csproj", "{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XXXX_Adapter", "XXXX_Adapter\XXXX_Adapter.csproj", "{EE588106-E147-45A2-A16F-732547DB0060}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9F92954A-E424-4D9C-B1A4-5B4CA736F29A}"
ProjectSection(SolutionItems) = preProject
ServerLocalTestRun.testrunconfig = ServerLocalTestRun.testrunconfig
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}.Release|Any CPU.Build.0 = Release|Any CPU
{EE588106-E147-45A2-A16F-732547DB0060}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EE588106-E147-45A2-A16F-732547DB0060}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE588106-E147-45A2-A16F-732547DB0060}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE588106-E147-45A2-A16F-732547DB0060}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Просмотреть файл

@ -0,0 +1,149 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.Protocols.TestTools;
using Microsoft.Protocols.TestSuites.XXXX.Adapter;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Microsoft.Protocols.TestSuites.XXXX.TestSuite.Scenario1
{
/// <summary>
/// Summary description for the test cases of this scenario
/// </summary>
[TestClass]
public class XXXX_Scenario1 : TestClassBase
{
#region Variables
// Put here fields representing adapters
static IXXXX_SUTControlAdapter SUTAdapter = null;
static IXXXX_Adapter protocolAdapter = null;
// Other static and instance properties
// ...
#endregion
#region Test Suite Initialization and Cleanup
/// <summary>
/// Use ClassInitialize to run code before running the first test in the class
/// </summary>
[ClassInitialize()]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext);
try
{
SUTAdapter = TestClassBase.BaseTestSite.GetAdapter<IXXXX_SUTControlAdapter>();
protocolAdapter = TestClassBase.BaseTestSite.GetAdapter<IXXXX_Adapter>();
}
catch (Exception ex)
{
TestClassBase.BaseTestSite.Assume.Inconclusive("ClassInitialize: Unexpected Exception - " + ex.Message);
}
}
/// <summary>
/// Use ClassCleanup to run code after all tests in a class have run
/// </summary>
[ClassCleanup()]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
#endregion
#region Test Case Initialization and Cleanup
/// <summary>
/// TestInitialize will be run before every case's execution
/// </summary>
protected override void TestInitialize()
{
try
{
// Do some common initialization for every case.
Site.Assume.AreEqual(true, SUTAdapter.ResetSUT(), "Reset SUT to initial states");
}
catch (Exception ex)
{
Site.Assume.Inconclusive("TestInitialize: Unexpected Exception - " + ex.Message);
}
}
/// <summary>
/// TestCleanup will be run after every case's execution
/// </summary>
protected override void TestCleanup()
{
try
{
// Do some common cleanup for every case.
protocolAdapter.Reset();
}
catch (Exception ex)
{
Site.Log.Add(LogEntryKind.Warning, "TestCleanup: Unexpected Exception:", ex);
}
}
#endregion
#region Test cases
[TestMethod] // Indicates it's a test case
[TestCategory("BVT")] // It's used to categorize the test cases
[Description("The case is designed to test if the SUT could be connected")] // Describe what the test case is testing
public void BVT_ConnectToSUT()
{
#region Case specific setup
try
{
// Any test case specific setup logics
}
catch (Exception ex)
{
Site.Assume.Inconclusive("Unexpected Exception raised in one of custom test case setup steps: {0}", ex);
}
#endregion
#region STEP1 Send a request to SUT
Site.Log.Add(LogEntryKind.TestStep, "Step 1: Send a request to SUT");
bool ret = protocolAdapter.SendRequest(Site.Properties.Get("SUTIPAddress"));
Site.Assert.IsTrue(ret, "Send request should succeed.");
#endregion
#region STEP2 Waiting for a response from SUT
int status = 0;
Site.Log.Add(LogEntryKind.TestStep, "Step 2: Wait for a response from SUT");
int timeout = int.Parse(Site.Properties.Get("SUTResponseTimeout"));
ret = protocolAdapter.WaitForResponse(out status, timeout);
Site.Assert.IsTrue(ret, "SUT response should be received in {0} seconds", timeout);
#endregion
#region Verify the status of the response
// Status or other fields in the response can be checked here
Site.Assert.AreEqual(0, status, "SUT should return success status in the response");
#endregion
#region Case specific cleanup
try
{
// Any test case specific clean up logics
}
catch (Exception ex)
{
Site.Log.Add(LogEntryKind.Warning, "Unexpected Exception raised in one of custom test case cleanup steps: {0}", ex);
}
#endregion
}
#endregion
}
}

Просмотреть файл

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{3AE5AA9B-2A5B-442F-AF5C-B0450126590D}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Microsoft.Protocols.TestSuites.XXXX.TestSuite</RootNamespace>
<AssemblyName>XXXX_TestSuite</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Protocols.TestTools" />
<Reference Include="Microsoft.Protocols.TestTools.VSTS" />
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="XXXX_Scenario1.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="XXXX_TestSuite.deployment.ptfconfig" />
<Content Include="XXXX_TestSuite.ptfconfig">
<SubType>Designer</SubType>
</Content>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\XXXX_Adapter\XXXX_Adapter.csproj">
<Project>{ee588106-e147-45a2-a16f-732547db0060}</Project>
<Name>XXXX_Adapter</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Просмотреть файл

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8" ?>
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
<Properties>
<!--Automatic Network Capturing-->
<!--This feature is only available on Windows 8.1 or Windows Server 2012 R2.
Protocol Test Framework provides a simple way to capture network traffic case-by-case automatically.
Network traffic is captured using netsh.exe and logman.exe. The messages are save as ETL files.
-->
<Group name="PTF">
<Group name="NetworkCapture">
<Property name="Enabled" value="false">
<Choice>true,false</Choice>
<Description>
If it is true, enable the auto-capture feature.
</Description>
</Property>
<Property name="CaptureFileFolder" value="C:\XXXX_CaptureFileDirectory">
<Description>
The path to put the capture files. Old files will be overwritten.
</Description>
</Property>
<Property name="StopRunningOnError" value="false">
<Choice>true,false</Choice>
<Description>
If it is true, fail the test case when error happens in running network capture commands. Otherwise, ignore the error.
</Description>
</Property>
</Group>
</Group>
<!-- Properties related to test environment -->
<Property name="SUTResponseTimeout" value="10">
<Description>
Timeout when waiting for the responses from SUT, in seconds
</Description>
</Property>
<Property name="SUTIPAddress" value="10.10.10.10">
<Description>
The IP address of SUT
</Description>
</Property>
</Properties>
</TestSite>

Просмотреть файл

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8" ?>
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
<Properties>
<!-- Test suite properties which value not changed when running in different test environments -->
<Property name="TD-VERSION" value="#.#.#"/>
</Properties>
<Adapters>
<!-- Type of IXXXX_Adapter is managed, it allows users to use managed code to implement the interface methods. -->
<Adapter xsi:type="managed" name="IXXXX_Adapter" adaptertype="Microsoft.Protocols.TestSuites.XXXX.Adapter.XXXX_Adapter"/>
<!-- The type of IXXXX_SUTControlAdapter could be either powershell or interactive. -->
<!-- If its type is powershell, the scripts will be called automatically when executing test cases. -->
<Adapter xsi:type="powershell" name="IXXXX_SUTControlAdapter" scriptdir=".\" />
<!-- If its type is interactive, then the user should do it manually following the help text. -->
<!--<Adapter xsi:type="interactive" name="IXXXX_SUTControlAdapter"/>-->
</Adapters>
<TestLog defaultprofile="Verbose">
<Sinks>
<!-- File location should be relative path -->
<Console id="Console" />
</Sinks>
<Profiles>
<Profile name="Verbose" extends="Error">
<!-- Show on Console -->
<Rule kind="TestStep" sink="Console" delete="false"/>
<Rule kind="Checkpoint" sink="Console" delete="false"/>
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
<Rule kind="CheckFailed" sink="Console" delete="false"/>
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
<Rule kind="Comment" sink="Console" delete="false"/>
<Rule kind="Warning" sink="Console" delete="false"/>
<Rule kind="Debug" sink="Console" delete="false"/>
<Rule kind="TestFailed" sink="Console" delete="false"/>
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
<Rule kind="TestPassed" sink="Console" delete="false"/>
<!-- Show for ETW -->
<!--The Event Tracing for Window (ETW) logging sink can log test suite logs to an ETW provider.
A user can capture these ETW logs using captures tools, such as the Microsoft Message Analyzer.
Details see PTFUserGuide.-->
<Rule kind="TestStep" sink="Etw" delete="false"/>
<Rule kind="Checkpoint" sink="Etw" delete="false"/>
<Rule kind="CheckSucceeded" sink="Etw" delete="false"/>
<Rule kind="CheckFailed" sink="Etw" delete="false"/>
<Rule kind="CheckInconclusive" sink="Etw" delete="false"/>
<Rule kind="Comment" sink="Etw" delete="false"/>
<Rule kind="Warning" sink="Etw" delete="false"/>
<Rule kind="Debug" sink="Etw" delete="false"/>
<Rule kind="TestFailed" sink="Etw" delete="false"/>
<Rule kind="TestInconclusive" sink="Etw" delete="false"/>
<Rule kind="TestPassed" sink="Etw" delete="false"/>
</Profile>
</Profiles>
</TestLog>
</TestSite>

Просмотреть файл

@ -0,0 +1,8 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Reflection;
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Protocol Test Framework")]
[assembly: AssemblyVersion("1.0.0.0")]

Двоичные данные
src/TestKey.snk Normal file

Двоичный файл не отображается.

43
src/build.cmd Normal file
Просмотреть файл

@ -0,0 +1,43 @@
:: Copyright (c) Microsoft. All rights reserved.
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
@echo off
if not defined buildtool (
for /f %%i in ('dir /b /ad /on "%windir%\Microsoft.NET\Framework\v4*"') do (@if exist "%windir%\Microsoft.NET\Framework\%%i\msbuild".exe set buildtool=%windir%\Microsoft.NET\Framework\%%i\msbuild.exe)
)
if not defined buildtool (
echo No msbuild.exe was found, install .Net Framework version 4.0 or higher
goto :eof
)
if not defined WIX (
echo WiX Toolset version 3.7 or higher should be installed
goto :eof
)
:: Check if visual studio or test agent is installed, since HtmlTestLogger depends on that.
if not defined vspath (
if defined VS110COMNTOOLS (
set vspath="%VS110COMNTOOLS%"
) else if defined VS120COMNTOOLS (
set vspath="%VS120COMNTOOLS%"
) else if defined VS140COMNTOOLS (
set vspath="%VS140COMNTOOLS%"
) else (
echo Visual Studio or Visual Studio test agent should be installed, version 2012 or higher
goto :eof
)
)
if not defined ptfsnk (
set ptfsnk=..\TestKey.snk
)
%buildtool% ptf.sln /t:clean
if /i "%~1"=="formodel" (
%buildtool% deploy\Installer\ProtocolTestFrameworkInstaller.wixproj /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=%ptfsnk% /p:FORMODEL="1" /t:Clean;Rebuild
) else (
%buildtool% deploy\Installer\ProtocolTestFrameworkInstaller.wixproj /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=%ptfsnk% /t:Clean;Rebuild
)

Просмотреть файл

@ -0,0 +1,521 @@
{\rtf1\adeflang1025\ansi\ansicpg1252\uc2\adeff40\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}
{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}
{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt ????????\'a8\'ac????};}
{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math{\*\falt Calisto MT};}{\f40\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?l?r ??u!??I};}
{\f44\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@\'cb\'ce\'cc\'e5;}{\f45\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Trebuchet MS{\*\falt Univers};}
{\f46\fbidi \fmodern\fcharset128\fprq1{\*\panose 00000000000000000000}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}
{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt ????????\'a8\'ac????};}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}
{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}
{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt ????????\'a8\'ac????};}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f49\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}{\f50\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}
{\f52\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}{\f53\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}
{\f54\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}{\f55\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}
{\f56\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}{\f57\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}{\f69\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}
{\f70\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};}{\f72\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f73\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}
{\f74\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};}{\f75\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f76\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}
{\f77\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};}{\f161\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f159\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}
{\f160\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}{\f162\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f163\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}
{\f166\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}{\f181\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}{\f389\fbidi \froman\fcharset238\fprq2 Cambria Math CE{\*\falt Calisto MT};}
{\f390\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr{\*\falt Calisto MT};}{\f392\fbidi \froman\fcharset161\fprq2 Cambria Math Greek{\*\falt Calisto MT};}{\f393\fbidi \froman\fcharset162\fprq2 Cambria Math Tur{\*\falt Calisto MT};}
{\f396\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic{\*\falt Calisto MT};}{\f397\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese){\*\falt Calisto MT};}{\f449\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?l?r ??u!??I};}
{\f450\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?l?r ??u!??I};}{\f452\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?l?r ??u!??I};}{\f453\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?l?r ??u!??I};}
{\f454\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?l?r ??u!??I};}{\f455\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?l?r ??u!??I};}{\f456\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?l?r ??u!??I};}
{\f457\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?l?r ??u!??I};}{\f458\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?l?r ??u!??I};}{\f491\fbidi \fnil\fcharset0\fprq2 @\'cb\'ce\'cc\'e5 Western;}
{\f499\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Univers};}{\f500\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Univers};}{\f502\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Univers};}
{\f503\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Univers};}{\f506\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Univers};}{\f511\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western;}
{\f509\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE;}{\f510\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f512\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f513\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur;}
{\f516\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}
{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}
{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}
{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}
{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}
{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}
{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}
{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}
{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}
{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}
{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}
{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}
{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}
{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}
{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????????\'a8\'ac????};}
{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}
{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}
{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}
{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;
\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;
\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext1 \slink15 \sqformat heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0
\b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar
\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext3 \slink17 \sqformat heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar
\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext5 \slink19 \sqformat heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar
\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext7 \slink21 \sqformat heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar
\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext9 \slink23 \sqformat heading 9;}{\*\cs10 \additive \sunhideused \spriority1 Default Paragraph Font;}{\*
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe2052\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp2052 \snext11 \ssemihidden \sunhideused Normal Table;}{\*
\cs15 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19 \sbasedon10 \slink1 \slocked Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19 \sbasedon10 \slink2 \slocked Heading 2 Char;}{\*\cs17 \additive
\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink3 \slocked Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink4 \slocked Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af40\afs19
\ltrch\fcs0 \f40\fs19 \sbasedon10 \slink5 \slocked Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink6 \slocked Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19
\sbasedon10 \slink7 \slocked Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink8 \slocked Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink9 \slocked
Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext24 Body 1;}{\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1
\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body 3;}{
\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext27 Body 4;}{\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1
\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 Body 6;}{
\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext30 Body 7;}{\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1
\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 Bullet 1;}{
\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 Bullet 2;}{\s35\ql \fi-357\li714\ri0\sb120\sa120\widctlpar\jclisttab\tx717\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin714\itap0
\rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext35 \slink87 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar
\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 Bullet 4;}{
\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0
\rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar
\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 Bullet 7;}{
\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0
\rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon32 \snext41 Bullet 9;}{
\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext0 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0
\b\fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
\ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20
\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 Preamble Border;}{
\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext46 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar
\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext0 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0
\b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \slink107 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar
\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext50
Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1
\af40\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 Body 2 Underline;}{
\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon26 \snext53 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink54 \slocked \ssemihidden
Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \ai\af40\afs19\alang1025 \ltrch\fcs0
\i\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 2 Char;}{\*
\cs58 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 3 Char;}{\*\cs59 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 4 Char;}{\*\cs60
\additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0
\rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 Preamble Border Above;}{
\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext62 \slink63 \ssemihidden footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20 \sbasedon10 \slink62 \slocked \ssemihidden Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super
\sbasedon10 \ssemihidden footnote reference;}{\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext65 \slink66 \ssemihidden endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20 \sbasedon10 \slink65 \slocked \ssemihidden
Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025
\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20
\sbasedon10 \slink68 \slocked \ssemihidden Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Char;}{
\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon0 \snext72 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 Hyperlink,Char Char7;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
\af40\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16
\sbasedon10 \slink74 \slocked \ssemihidden Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af45 \ltrch\fcs0 \b\f45\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 Heading 2 Char1;}{\*\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10
page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025
\ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink109 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025
\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext81 \slink82 header;}{\*\cs82 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink81 \slocked
Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext83 \slink84 footer;}{\*\cs84 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink83 \slocked Footer Char;}{
\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033
\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20 \sbasedon69 \slink85 \slocked \ssemihidden Comment Subject Char;}{\*\cs87 \additive \rtlch\fcs1 \af40\afs19
\ltrch\fcs0 \f40\fs19 \sbasedon10 \slink35 \slocked Bullet 3 Char1;}{\s88\ql \fi-357\li714\ri0\sb120\sa120\widctlpar\jclisttab\tx717\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin714\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\langnp1033\langfenp1033 \sbasedon10 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs20\alang1025 \ltrch\fcs0
\fs18\lang1033\langfe1033\loch\f45\hich\af45\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af40\afs24\alang1025 \ltrch\fcs0 \b\f45\fs24\lang1033\langfe1033\langnp1033\langfenp1033
\sbasedon10 \spriority0 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar
\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext93 \spriority0
Heading French Warranty;}{\*\cs94 \additive \f40\lang1033\langfe0\langnp1033\langfenp0 \slocked Body 3 Char Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car Car;}{\*\cs95 \additive
\f2\cf15\lang1024\langfe1024\noproof tw4winExternal;}{\*\cs96 \additive \v\f2\fs24\cf12\sub tw4winMark;}{\*\cs97 \additive \b\f40 Preamble Char;}{\*\cs98 \additive \f2\fs40\cf4 tw4winError;}{\*\cs99 \additive \cf2 tw4winTerm;}{\*\cs100 \additive
\f2\cf11\lang1024\langfe1024\noproof tw4winPopup;}{\*\cs101 \additive \f2\cf10\lang1024\langfe1024\noproof tw4winJump;}{\*\cs102 \additive \f2\cf6\lang1024\langfe1024\noproof tw4winInternal;}{\*\cs103 \additive \f2\cf13\lang1024\langfe1024\noproof
DO_NOT_TRANSLATE;}{\s104\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext104 \slink105 Body Text 2;}{\*\cs105 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19 \sbasedon10 \slink104 \slocked Body Text 2 Char;}{
\s106\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon49 \snext106 \slink108 Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt;}{\*\cs107 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19
\sbasedon10 \slink49 \slocked Heading 3 Bold Char;}{\*\cs108 \additive \rtlch\fcs1 \ab0\af40\afs19 \ltrch\fcs0 \b0\f40\fs19 \sbasedon107 \slink106 \slocked Style Heading 3 Bold + (Asian) Times New Roman 9.5 pt Char;}{\*\cs109 \additive \rtlch\fcs1
\ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19 \sbasedon10 \slink79 \slocked Body 0 Bold Char;}{\s110\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs20\alang1025 \ltrch\fcs0
\b\fs20\lang1026\langfe2052\super\loch\f40\hich\af40\dbch\af11\cgrid\langnp1026\langfenp2052 \sbasedon0 \snext110 \slink111 LIMPA_T4WINEXTERNAL;}{\*\cs111 \additive \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0
\b\f40\fs20\lang1026\langfe2052\super\langnp1026\langfenp2052 \sbasedon10 \slink110 \slocked LIMPA_T4WINEXTERNAL Char;}{\s112\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext112 \sunhideused \styrsid9850802 Normal (Web);}}{\*\listtable{\list\listtemplateid1821544400\listhybrid{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0
{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\leveltemplateid692200086\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320
\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040
}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}
{\list\listtemplateid-1793664660{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360
\jclisttab\tx360\lin360 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720
\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }
{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4
\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}
{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720
\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}
\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462}{\list\listtemplateid1948578256{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers
\'01;}\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}
\rtlch\fcs1 \ab\ai0\af0\afs20 \ltrch\fcs0 \b\i0\fs20\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers
\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid630479929}{\list\listtemplateid67698717{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}
\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0
\fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160
\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel
\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\jclisttab\tx3240\lin3240 }{\listname ;}\listid700712945}{\list\listtemplateid-53848358{\listlevel\levelnfc0
\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4
\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2
\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3
\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }
{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \s5\fi-357\li1792
\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \s6
\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0
\s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0
\s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0
\s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}
\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}
\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}
\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}
\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid800729109}{\list\listtemplateid-296591990\listhybrid{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0
\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23
\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480
\jclisttab\tx6480\lin6480 }{\listname ;}\listid810947713}{\list\listtemplateid1567531878{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1
\ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers
\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid826823576}{\list\listtemplateid2088029282{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af45\afs20 \ltrch\fcs0 \b\i0\f45\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\strike0\f45\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel
\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel
\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel
\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel
\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af45\afs20 \ltrch\fcs0 \b0\i0\f45\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname
;}\listid974869818}{\list\listtemplateid-924022824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0
\fi-360\li1797\lin1797 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li2517\lin2517 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0
{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li6117\lin6117 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6837\lin6837 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li7557\lin7557 }{\listname ;}\listid1210149136}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s39\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0
\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}
\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}
{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0
\fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812
\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\cf17\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0
\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}
\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}
{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li714
\jclisttab\tx717\lin714 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1077\jclisttab\tx1077\lin1077 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li1797\jclisttab\tx1797\lin1797 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2517\jclisttab\tx2517\lin2517 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3237\jclisttab\tx3237\lin3237 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li3957\jclisttab\tx3957\lin3957 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li4677\jclisttab\tx4677\lin4677 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5397\jclisttab\tx5397\lin5397 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}
\f10\fbias0 \fi-360\li6117\jclisttab\tx6117\lin6117 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}
\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040
\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271}
{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149
\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel
\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}
\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid1637229796\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li4320
\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040
}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23
\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}
{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative
\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
\leveltemplateid67698715\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703
\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}
\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01{\uc1\u-3929 ?};}{\levelnumbers;}\f10\fbias0
\fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1}{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}
{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713
\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10}{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}
{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271
\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19}{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}
{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271
\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28}{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}
{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid700712945\listoverridecount0\ls33}{\listoverride\listid826823576\listoverridecount0\ls34}{\listoverride\listid630479929
\listoverridecount0\ls35}{\listoverride\listid800729109\listoverridecount0\ls36}{\listoverride\listid974869818\listoverridecount0\ls37}{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel
\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat
\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls38}{\listoverride\listid1210149136\listoverridecount0\ls39}{\listoverride\listid752163927\listoverridecount9{\lfolevel\listoverridestartat
\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel
\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls40}{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat
\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel
\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls41}{\listoverride\listid752163927\listoverridecount0\ls42}{\listoverride\listid1567649130\listoverridecount0\ls43}{\listoverride\listid1567649130\listoverridecount0\ls44}
{\listoverride\listid752163927\listoverridecount0\ls45}{\listoverride\listid1567649130\listoverridecount0\ls46}{\listoverride\listid1567649130\listoverridecount0\ls47}{\listoverride\listid477573462\listoverridecount9{\lfolevel}{\lfolevel}{\lfolevel}
{\lfolevel}{\lfolevel}{\lfolevel}{\lfolevel}{\lfolevel}{\lfolevel}\ls48}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}
{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid618632\rsid2562953\rsid3022381\rsid4159317\rsid4729382\rsid5208738\rsid5526630\rsid6780114\rsid7681067\rsid7740058\rsid8593201\rsid9850802\rsid10094665\rsid11228413
\rsid11864370\rsid12452641\rsid13267563\rsid13391369\rsid13633672\rsid13637886\rsid13716023\rsid13983006\rsid14164635\rsid14951131\rsid16397495}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440
\mintLim0\mnaryLim1}{\info{\creatim\yr2014\mo2\dy25\hr13\min40}{\revtim\yr2015\mo7\dy16\hr16\min4}{\version1}{\edmins0}{\nofpages1}{\nofwords166}{\nofchars952}{\nofcharsws1116}{\vern57439}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/200
3/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect
\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen
\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1
\jexpand\viewkind1\viewscale150\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel
\wrppunct\asianbrkrule\rsidroot14164635\newtblstyruls\nogrowautofit\remdttm\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal
\nouicompat \fet0{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025
\ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3022381 \chftnsep
\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3022381 \chftnsepc
\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3022381 \chftnsep
\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3022381 \chftnsepc
\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl3
\pndec\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta \hich )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang
{\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang
{\pntxtb \hich (}{\pntxta \hich )}}\pard\plain \ltrpar\s112\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9850802 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0
\fs24\lang1033\langfe2052\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802\charrsid13391369 \hich\af40\dbch\af31505\loch\f40 Protocol Test Framework}{\rtlch\fcs1 \af0 \ltrch\fcs0
\insrsid9850802
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40 Copyright (c) Microsoft Corporation}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40 All rights reserved.\~}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40 MIT License}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
\hich\af40\dbch\af31505\loch\f40 \hich\af40\dbch\af31505\loch\f40 merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:}{
\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40 The above copyright notice and this permission notice shall be included in al\hich\af40\dbch\af31505\loch\f40 l copies or substantial portions of the Software.
}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
\par }{\rtlch\fcs1 \af40\afs18 \ltrch\fcs0 \f40\fs18\insrsid9850802 \hich\af40\dbch\af31505\loch\f40
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN N\hich\af40\dbch\af31505\loch\f40
O EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}
{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9850802
\par }\pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9850802 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0
\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid10094665\charrsid9850802
\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f
7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87
615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad
79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b
5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab
999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9
699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586
8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6
0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f
9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be
15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979
3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d
32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a
f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86
e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb
44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a
6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c
3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256
5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276
b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8
c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e
51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95
b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff
6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6
9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239
b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449
59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8
2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468
656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4
350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624
52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141
73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000
0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000
000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019
0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000
000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027
00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000}
{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdlocked0 heading 2;
\lsdqformat1 \lsdlocked0 heading 3;\lsdqformat1 \lsdlocked0 heading 4;\lsdqformat1 \lsdlocked0 heading 5;\lsdqformat1 \lsdlocked0 heading 6;\lsdqformat1 \lsdlocked0 heading 7;\lsdqformat1 \lsdlocked0 heading 8;\lsdqformat1 \lsdlocked0 heading 9;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;
\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid;
\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;
\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;
\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;
\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;
\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;
\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;
\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;
\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;
\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4;
\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4;
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1;
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1;
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2;
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2;
\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3;
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4;
\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4;
\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5;
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5;
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6;
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6;
\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark;
\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1;
\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1;
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2;
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3;
\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3;
\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4;
\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4;
\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5;
\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5;
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6;
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000
4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000
d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000f07f
ebfb9dbfd001feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000105000000000000}}

Просмотреть файл

@ -0,0 +1,216 @@
<?xml version="1.0" encoding="UTF-8"?>
<?define BLDVER=1.0.0.0?>
<?define EXTERNAL_DIR=..\..\external\?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
<Product Id="*"
Name="Microsoft Protocol Test Framework"
Language="1033"
Version="$(var.BLDVER)"
Manufacturer="Microsoft Corporation"
UpgradeCode="3ED15020-EFB8-40D8-BCC0-818A0628D54D">
<!-- Set InstallerVersion to 300 or greater to merge VC90Redist -->
<Package Id="*"
InstallScope="perMachine"
InstallPrivileges="elevated"
Description="Microsoft Protocol Test Framework"
Comments="Microsoft Protocol Test Framework v$(var.BLDVER)"
Manufacturer="Microsoft Corporation"
InstallerVersion="300"
Compressed="yes" />
<Media Id="1" Cabinet="ProtocolTestFramework.cab" EmbedCab="yes" />
<!-- Upgrade info -->
<Upgrade Id="3ED15020-EFB8-40D8-BCC0-818A0628D54D">
<UpgradeVersion Property="OLDER_VERSION_BEING_UPGRADED"
IncludeMaximum="no"
Maximum="$(var.BLDVER)"
OnlyDetect="no"
RemoveFeatures="ALL" />
<UpgradeVersion Property="NEWER_VERSION_DETECTED"
IncludeMinimum="no"
Minimum="$(var.BLDVER)"
OnlyDetect="yes" />
</Upgrade>
<!-- Conditions for product installation -->
<PropertyRef Id="NETFRAMEWORK40FULL"/>
<Condition Message="This application requires .NET Framework 4.0. Please install the .NET Framework then run this installer again.">
Installed OR NETFRAMEWORK40FULL
</Condition>
<Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
NOT NEWER_VERSION_DETECTED OR Installed
</Condition>
<Property Id="VS2012_ROOTPATH">
<RegistrySearch Id='VS2012_ROOTPATH' Type='raw'
Root='HKLM' Key='SOFTWARE\Microsoft\VisualStudio\SxS\VS7' Name='11.0' />
</Property>
<Property Id="VS2013_ROOTPATH">
<RegistrySearch Id='VS2013_ROOTPATH' Type='raw'
Root='HKLM' Key='SOFTWARE\Microsoft\VisualStudio\SxS\VS7' Name='12.0' />
</Property>
<!-- Directory Structure -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="VS2012_ROOTPATH">
<Directory Id="VS2012_Common7" Name="Common7">
<Directory Id="VS2012_IDE" Name="IDE">
<Directory Id="VS2012_CommonExtensions" Name="CommonExtensions">
<Directory Id="VS2012_Microsoft" Name="Microsoft">
<Directory Id="VS2012_TestWindow" Name="TestWindow">
<Directory Id="VS2012_HtmlTestLogger_InstallLocation" Name="Extensions"/>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
<Directory Id="VS2013_ROOTPATH">
<Directory Id="VS2013_Common7" Name="Common7">
<Directory Id="VS2013_IDE" Name="IDE">
<Directory Id="VS2013_CommonExtensions" Name="CommonExtensions">
<Directory Id="VS2013_Microsoft" Name="Microsoft">
<Directory Id="VS2013_TestWindow" Name="TestWindow">
<Directory Id="VS2013_HtmlTestLogger_InstallLocation" Name="Extensions"/>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder" >
<Directory Id="ApplicationProgramsMenuFolder" Name="Protocol Test Framework" />
</Directory>
<Directory Id="ProgramFilesFolder">
<Directory Id="ROOT_DIR" Name="Protocol Test Framework">
<Directory Id="DOCS_DIR" Name="docs" />
<Directory Id="Bin_DIR" Name="bin">
</Directory>
<Directory Id="PTF_GAC_VS10" Name="GAC_VS10" />
</Directory>
</Directory>
</Directory>
<!-- Application Shortcut -->
<DirectoryRef Id="ApplicationProgramsMenuFolder">
<Component Id="ApplicationShortcut" Guid="{FCDDAE66-9D7A-47F2-8D97-427A3C90A18F}">
<!-- Step installer Uninstall Microsoft Protocol Test Framework -->
<Shortcut Id="UninstallProduct"
Name="Uninstall Microsoft Protocol Test Framework"
Description="Uninstall Microsoft Protocol Test Framework"
Target="[System64Folder]msiexec.exe"
Arguments="/x [ProductCode]"/>
<RemoveFolder Id="ROOT_DIR" On="uninstall"/>
<RegistryValue Root="HKCU"
Key="Software\Microsoft\ProtocolTestFramework"
Name="installed"
Type="integer"
Value="1"
KeyPath="yes"/>
</Component>
</DirectoryRef>
<!-- Microsoft Protocol Test Framework End User License Agreement -->
<WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
<!-- Candidate Features -->
<Feature Id="Feature_All"
Title="Microsoft Protocol Test Framework"
Description="Microsoft Protocol Test Framework"
Level="1"
Display="expand"
ConfigurableDirectory="ROOT_DIR">
<ComponentRef Id="ApplicationShortcut"/>
<!-- Protocol Test Framework -->
<Feature Id="Feature_ProtocolTestFramework"
Title="Protocol Test Framework"
Description="Protocol Test Framework"
Level="1" >
<FeatureRef Id="PTF_All" />
</Feature>
</Feature>
<!-- Default sequence -->
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize"/>
</InstallExecuteSequence>
<!-- Custom sequence -->
<InstallExecuteSequence>
<!--
Wix grammar reference:
"!" means "Installed state of the feature".
"&" means "Action state of the feature".
INSTALLSTATE_UNKNOWN(-1) - No action to be taken on the feature or component.
INSTALLSTATE_ABSENT(2) - Feature or component is not present.
INSTALLSTATE_LOCAL(3) - Feature or component on the local computer.
MSDN: http://msdn.microsoft.com/en-us/library/aa368012(VS.85).aspx
-->
</InstallExecuteSequence>
<!-- Progress Texts for UI -->
<UIRef Id="WixUI_ErrorProgressText" />
<UI Id="WixUI_FeatureTree">
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<Property Id="WixUI_Mode" Value="FeatureTree" />
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FatalError" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />
<DialogRef Id="PrepareDlg" />
<DialogRef Id="ProgressDlg" />
<DialogRef Id="ResumeDlg" />
<DialogRef Id="UserExit" />
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
<Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="PrivacyDlg">LicenseAccepted = "1"</Publish>
<Publish Dialog="PrivacyDlg" Control="Cancel" Event="EndDialog" Value="Return">1</Publish>
<Publish Dialog="PrivacyDlg" Control="Next" Event="NewDialog" Value="CustomizeDlg">1</Publish>
<Publish Dialog="PrivacyDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
<Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="1">Installed</Publish>
<Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="PrivacyDlg" Order="2">NOT Installed</Publish>
<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1">NOT Installed </Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="2">WixUI_InstallMode = "Change"</Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="3"><![CDATA[Installed AND (WixUI_InstallMode <> "Change")]]></Publish>
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="CustomizeDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
</UI>
<!-- Properties for "Add or Reomve Program Entries" -->
<Property Id="ARPCOMMENTS">Microsoft Protocol Test Framework</Property>
<Property Id="ARPCONTACT">Microsoft Winterop Engineering Team</Property>
</Product>
</Wix>

Просмотреть файл

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<UI>
<Dialog Id="PrivacyDlg" Width="370" Height="270" Title="Install the [ProductName]" TrackDiskSpace="yes">
<Control Id="Back" Type="PushButton" X="128" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)"/>
<Control Id="Next" Type="PushButton" X="194" Y="243" Width="100" Height="17" Default="yes" Text="Install the Software" />
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
<Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
</Control>
<Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="WixUI_Bmp_Banner" />
<Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
<Control Id="Title" Type="Text" X="15" Y="6" Width="210" Height="15" Transparent="yes" NoPrefix="yes" Text="Install the [ProductName]" />
<Control Id="PrivacyStatement" Type="Hyperlink" X="15" Y="50" Width="305" Height="150">
<Text><![CDATA[This software will collect and store personal information from users computers, including user names and passwords. For more information, see the <a href="http://www.microsoft.com/privacystatement/en-us/core/default.aspx">Privacy Statement</a>.]]>
</Text>
</Control>
</Dialog>
</UI>
</Fragment>
</Wix>

Просмотреть файл

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
<String Id="WelcomeDlgDescription">The Setup Wizard will install [ProductName] (version [ProductVersion]) on your computer. Click Next to continue or Cancel to exit the Setup Wizard.</String>
<String Id="MaintenanceWelcomeDlgDescription">The Setup Wizard allows you to change the way [ProductName] (version [ProductVersion]) features are installed on your computer or to remove it from your computer. Click Next to continue or Cancel to exit the Setup Wizard.</String>
</WixLocalization>

Просмотреть файл

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
<!-- A stub to make build happy -->
</Wix>

Просмотреть файл

@ -0,0 +1,125 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>3.0</ProductVersion>
<ProjectGuid>{79e77309-615d-4e6e-b0aa-5e9656c5a25d}</ProjectGuid>
<SchemaVersion>2.0</SchemaVersion>
<OutputName>ProtocolTestFramework</OutputName>
<OutputType>Package</OutputType>
<DefineSolutionProperties>False</DefineSolutionProperties>
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
<WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>Debug</DefineConstants>
<SuppressSpecificWarnings>1055</SuppressSpecificWarnings>
<SuppressIces>ICE03;ICE80;ICE82;ICE83;ICE30</SuppressIces>
<!--Ignore error LGHT0204: ICE30: The same target file by two different components on an LFN system which breaks component reference counting-->
<WixVariables>
</WixVariables>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<SuppressSpecificWarnings>1055</SuppressSpecificWarnings>
<SuppressIces>ICE03;ICE80;ICE82;ICE83;ICE30</SuppressIces>
<!--Ignore error LGHT0204: ICE30: The same target file by two different components on an LFN system which breaks component reference counting-->
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(WixTargetsPath)" />
<ItemGroup>
<Compile Include="ProtocolTestFrameworkSDK.wxs" />
<Compile Include="PTFProduct.wxs" />
<Compile Include="PrivacyDlg.wxs" />
<Compile Include="ProtocolTestFramework.wxs" />
</ItemGroup>
<ItemGroup>
<WixExtension Include="WixVSExtension">
<HintPath>$(WIX)\bin\WixVSExtension.dll</HintPath>
<Name>WixVSExtension</Name>
</WixExtension>
<WixExtension Include="WixUtilExtension">
<HintPath>$(WIX)\bin\WixUtilExtension.dll</HintPath>
<Name>WixUtilExtension</Name>
</WixExtension>
<WixExtension Include="WixNetFxExtension">
<HintPath>$(WIX)\bin\WixNetFxExtension.dll</HintPath>
<Name>WixNetFxExtension</Name>
</WixExtension>
<WixExtension Include="WixUIExtension">
<HintPath>$(WIX)\bin\WixUIExtension.dll</HintPath>
<Name>WixUIExtension</Name>
</WixExtension>
</ItemGroup>
<ItemGroup>
<Content Include="License.rtf" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="ProtocolTestFramework.wxl" />
<ProjectReference Include="..\..\testtools\TestTools.csproj">
<Name>testtools</Name>
<Project>{1CA2B935-3224-40F1-84BC-47FA1A9B242E}</Project>
<Private>True</Private>
<DoNotHarvest>True</DoNotHarvest>
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
</ProjectReference>
<ProjectReference Include="..\..\testtools.extension\TestTools.Extension.csproj">
<Name>TestTools.Extension</Name>
<Project>{E41414B3-95F3-430F-823B-55B82F0BA198}</Project>
<Private>True</Private>
<DoNotHarvest>True</DoNotHarvest>
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
</ProjectReference>
<ProjectReference Include="..\..\testtools.messages.runtime\TestTools.Messages.Runtime.csproj">
<Name>TestTools.Messages.Runtime</Name>
<Project>{5D50C8BD-F26A-4A45-9D4A-025163B894BD}</Project>
<Private>True</Private>
<DoNotHarvest>True</DoNotHarvest>
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
</ProjectReference>
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
<Name>TestTools.VSTS</Name>
<Project>{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}</Project>
<Private>True</Private>
<DoNotHarvest>True</DoNotHarvest>
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
</ProjectReference>
<ProjectReference Include="..\..\TestTools.ExtendedLogging\TestTools.ExtendedLogging.csproj">
<Name>TestTools.ExtendedLogging</Name>
<Project>{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}</Project>
<Private>True</Private>
<DoNotHarvest>True</DoNotHarvest>
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
</ProjectReference>
<ProjectReference Include="..\..\reportingtool\ReportingTool.csproj">
<Name>ReportingTool</Name>
<Project>{FABD7966-6611-4556-92CB-B13D7425AE82}</Project>
<Private>True</Private>
<DoNotHarvest>True</DoNotHarvest>
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
</ProjectReference>
<ProjectReference Include="..\..\HtmlTestLogger\HtmlTestLogger.csproj">
<Name>HtmlTestLogger</Name>
<Project>{8A100541-699B-4011-B184-01B70D534B5E}</Project>
<Private>True</Private>
<DoNotHarvest>True</DoNotHarvest>
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
<RefTargetDir>INSTALLLOCATION</RefTargetDir>
</ProjectReference>
</ItemGroup>
<Target Name="AfterBuild">
<Copy SourceFiles="$(TargetDir)en-us\$(TargetFileName).msi" DestinationFolder="..\..\Bin\deploy\Installer\" />
</Target>
</Project>

Просмотреть файл

@ -0,0 +1,312 @@
<?xml version="1.0" encoding="UTF-8"?>
<?define SRCDIR=..\..\Bin\ptf?>
<?define PTF_SRC_ROOT=..\..\?>
<?define BLDVER=1.0.0.0?>
<?define SRCDIR_VS10=$(var.SRCDIR)\vs10?>
<?if $(var.Platform) = "x86"?>
<?define BUILDTARGET=i386?>
<?else?>
<?define BUILDTARGET=amd64?>
<?endif?>
<?ifdef Debug?>
<?define BUILDTYPE=debug?>
<?else?>
<?define BUILDTYPE=release?>
<?endif?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Fragment Id="PTF">
<!-- WixVSExtension properties for visual studio directories -->
<PropertyRef Id="VS2010_ROOT_FOLDER" />
<PropertyRef Id="VS2010_SCHEMAS_DIR" />
<PropertyRef Id="VS2012_ROOT_FOLDER" />
<PropertyRef Id="VS2012_SCHEMAS_DIR" />
<!-- Program Menu -->
<DirectoryRef Id="ProgramMenuFolder">
<Directory Id="PTF_ProgramsMenuFolder" Name="Protocol Test Framework" />
</DirectoryRef>
<DirectoryRef Id="TARGETDIR">
<!-- visual studio schemas -->
<Directory Id="VS2010_SCHEMAS_DIR" />
</DirectoryRef>
<DirectoryRef Id="TARGETDIR">
<!-- visual studio schemas -->
<Directory Id="VS2012_SCHEMAS_DIR" />
</DirectoryRef>
<Property Id="VS2012">
<RegistrySearch Id='VS2012' Type='raw'
Root='HKLM' Key='SOFTWARE\Microsoft\VisualStudio\SxS\VS7' Name='11.0' />
</Property>
<Property Id="VS2013">
<RegistrySearch Id='VS2013' Type='raw'
Root='HKLM' Key='SOFTWARE\Microsoft\VisualStudio\SxS\VS7' Name='12.0' />
</Property>
<!-- If Visual Studio is not installed, then do not install HtmlLogger. -->
<DirectoryRef Id ="VS2012_HtmlTestLogger_InstallLocation">
<Component Id="VS2012_HtmlTestLogger.dll" Guid="817DF6E7-6169-4A10-AF67-A064CDBB38E5" Feature="PTF_All">
<Condition>VS2012</Condition>
<File Id="VS2012_HtmlTestLogger.dll"
Source="$(var.SRCDIR)\HtmlTestLogger\Microsoft.Protocols.TestTools.HtmlTestLogger.dll" />
</Component>
<Component Id="VS2012_HtmlTestLogger.pdb" Guid="D2869602-1C51-48D5-A81C-91B0332F00C7" Feature="PTF_All">
<Condition>VS2012</Condition>
<File Id="VS2012_HtmlTestLogger.pdb"
Source="$(var.SRCDIR)\HtmlTestLogger\Microsoft.Protocols.TestTools.HtmlTestLogger.pdb" />
</Component>
</DirectoryRef>
<DirectoryRef Id ="VS2013_HtmlTestLogger_InstallLocation">
<Component Id="VS2013_HtmlTestLogger.dll" Guid="710273DA-D320-4D95-A7E2-849EDD9A9C4C" Feature="PTF_All">
<Condition>VS2013</Condition>
<File Id="VS2013_HtmlTestLogger.dll"
Source="$(var.SRCDIR)\HtmlTestLogger\Microsoft.Protocols.TestTools.HtmlTestLogger.dll" />
</Component>
<Component Id="VS2013_HtmlTestLogger.pdb" Guid="A2A350D9-F1CA-4033-9801-31E2A0120364" Feature="PTF_All">
<Condition>VS2013</Condition>
<File Id="VS2013_HtmlTestLogger.pdb"
Source="$(var.SRCDIR)\HtmlTestLogger\Microsoft.Protocols.TestTools.HtmlTestLogger.pdb" />
</Component>
</DirectoryRef>
<!-- PTF Bin -->
<DirectoryRef Id="Bin_DIR">
<!-- Registry infromation -->
<Component Id="PTF_REG" Guid="1775CE86-4A52-42FC-AEC6-EEE8D38E6EC5" Feature="PTF_All">
<RegistryKey Id="PTF_REG_INSTALLDIR"
ForceCreateOnInstall="yes"
Root="HKLM"
Key="SOFTWARE\Microsoft\ProtocolTestFramework">
<RegistryValue Value="[Bin_DIR]" Type="string" Name="InstallDir"/>
<RegistryValue Value="$(var.BLDVER)" Type="string" Name="PTFVersion"/>
</RegistryKey>
<Environment Id="PTF_ENV_PATH"
Name="PATH"
Action="set"
System="yes"
Part="last"
Value="[Bin_DIR]" />
</Component>
<!-- Registry information for VS2010 reference (.Net 4.0) -->
<Component Id="PTF_REG_DOTNET_FX4" Guid="314F4564-5F1D-4298-80C5-D936D6FA4A61" Feature="PTF_All">
<RegistryKey Id="PTF_REG_FOR_VS_REFERENCE_NET_40"
ForceCreateOnInstall="yes"
Root="HKLM"
Key="SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\ProtocolTestFramework">
<RegistryValue Value="[Bin_DIR]" Type="string"/>
</RegistryKey>
</Component>
<!-- ReportingTool -->
<Component Id="ReportingTool.exe" Guid="746DF2EC-8430-4D31-95A3-DAF1FA9C993D" Feature="PTF_All">
<File Id="ReportingTool.exe"
Source="$(var.SRCDIR)\reportingtool\ReportingTool.exe" />
</Component>
<Component Id="ReportingTool.pdb" Guid="89F72D63-E3D8-4980-86D1-CC35E499E7B3" Feature="PTF_All">
<File Id="ReportingTool.pdb"
Source="$(var.SRCDIR)\reportingtool\ReportingTool.pdb" />
</Component>
<!-- Config -->
<Component Id="site.ptfconfig" Guid="B4416400-8541-4E96-A62C-5AECBDF14045" Feature="PTF_All">
<File Id="site.ptfconfig"
Source="$(var.PTF_SRC_ROOT)\testtools\config\site.ptfconfig" />
</Component>
<Component Id="TestConfig.xsd" Guid="3F2E7994-7EA4-4843-B07A-5A6BA421360D" Feature="PTF_All">
<File Id="TestConfig.xsd"
Source="$(var.PTF_SRC_ROOT)\testtools\config\TestConfig.xsd" />
</Component>
<!-- ETW Manifest -->
<Component Id="TestSuiteProvider.man" Guid="0D1C33F2-F997-44AF-BCE0-77782A187CD8" Feature="PTF_All">
<File Id="TestSuiteProvider.man" Source="$(var.PTF_SRC_ROOT)\TestTools.ExtendedLogging\TestSuiteProvider.man" >
<util:EventManifest MessageFile="[#Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10]" ResourceFile="[#Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10]"></util:EventManifest>
</File>
</Component>
</DirectoryRef>
<DirectoryRef Id="Bin_DIR">
<!-- Microsoft.Protocols.TestTools -->
<Component Id="Microsoft.Protocols.TestTools.dll_VS10" Guid="3F75FE1F-9951-4666-BF77-C4BF46E49692" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.dll_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.dll" />
</Component>
<Component Id="Microsoft.Protocols.TestTools.pdb_VS10" Guid="9141B891-0F7C-4E8E-B0D5-1B97204B9AD0" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.pdb_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.pdb" />
</Component>
<Component Id="Microsoft.Protocols.TestTools.xml_VS10" Guid="39BBC2DC-A820-493F-A3DB-B5A1362C2ADE" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.xml_VS10"
Source="$(var.SRCDIR_VS10)\xmldocs\Microsoft.Protocols.TestTools.xml" />
</Component>
<!-- Microsoft.Protocols.TestTools.Extension -->
<Component Id="Microsoft.Protocols.TestTools.Extension.dll_VS10" Guid="47A67D84-7CE2-4923-ABCA-7914D9B3547C" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.Extension.dll_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Extension.dll" />
</Component>
<Component Id="Microsoft.Protocols.TestTools.Extension.pdb_VS10" Guid="358DAD50-C664-4FF0-818C-8D3DA67F3220" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.Extension.pdb_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Extension.pdb" />
</Component>
<Component Id="Microsoft.Protocols.TestTools.Extension.xml_VS10" Guid="AF1700CF-4848-478E-A34B-6B05CE3F11C7" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.Extension.xml_VS10"
Source="$(var.SRCDIR_VS10)\xmldocs\Microsoft.Protocols.TestTools.Extension.xml" />
</Component>
<!-- Microsoft.Protocols.TestTools.Messages.Runtime -->
<Component Id="Microsoft.Protocols.TestTools.Messages.Runtime.dll_VS10" Guid="2692D1E3-C990-4835-B475-58F6F96CDC3C" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.Messages.Runtime.dll_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Messages.Runtime.dll" />
</Component>
<Component Id="Microsoft.Protocols.TestTools.Messages.Runtime.pdb_VS10" Guid="23BE7343-4826-4C81-81B0-A6C457DE0D3C" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.Messages.Runtime.pdb_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Messages.Runtime.pdb" />
</Component>
<Component Id="Microsoft.Protocols.TestTools.Messages.Runtime.xml_VS10" Guid="EDF11E41-442B-4903-BD01-0A97CDD0B5F5" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.Messages.Runtime.xml_VS10"
Source="$(var.SRCDIR_VS10)\xmldocs\Microsoft.Protocols.TestTools.Messages.Runtime.xml" />
</Component>
<!-- Microsoft.Protocols.TestTools.VSTS -->
<Component Id="Microsoft.Protocols.TestTools.VSTS.dll_VS10" Guid="30FD728A-C75C-463C-8C1C-EDBA807451DE" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.VSTS.dll_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.VSTS.dll" />
</Component>
<Component Id="Microsoft.Protocols.TestTools.VSTS.pdb_VS10" Guid="EFE4FDC7-9BA9-46BA-AC55-C3D842CEFBFF" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.VSTS.pdb_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.VSTS.pdb" />
</Component>
<Component Id="Microsoft.Protocols.TestTools.VSTS.xml_VS10" Guid="D16B9E89-6340-4453-B9DA-9EBEF538DAD6" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.VSTS.xml_VS10"
Source="$(var.SRCDIR_VS10)\xmldocs\Microsoft.Protocols.TestTools.VSTS.xml" />
</Component>
<!-- Microsoft.Protocols.TestTools.ExtendedLogging -->
<Component Id="Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10" Guid="7385F618-DCC8-4341-9ACF-4BE715B86F78" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.ExtendedLogging.dll" />
</Component>
<Component Id="Microsoft.Protocols.TestTools.ExtendedLogging.pdb_VS10" Guid="3099B4A4-2940-40AF-B800-B516C792A4D5" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.ExtendedLogging.pdb_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.ExtendedLogging.pdb" />
</Component>
<Component Id="Microsoft.Protocols.TestTools.ExtendedLogging.xml_VS10" Guid="7BF280B0-C7A9-4D42-AFE5-FE4511A9DA34" Feature="PTF_All">
<File Id="Microsoft.Protocols.TestTools.ExtendedLogging.xml_VS10"
Source="$(var.SRCDIR_VS10)\xmldocs\Microsoft.Protocols.TestTools.ExtendedLogging.xml" />
</Component>
</DirectoryRef>
<!-- PTF GAC -->
<DirectoryRef Id="PTF_GAC_VS10">
<Component Id="GAC_Microsoft.Protocols.TestTools.dll_VS10" Guid="656C7CF2-4781-4855-B45E-5C8251FFF2D3" Feature="PTF_All">
<File Id="GAC_Microsoft.Protocols.TestTools.dll_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.dll"
KeyPath="yes"
Assembly=".net" />
</Component>
<Component Id="GAC_Microsoft.Protocols.TestTools.VSTS.dll_VS10" Guid="5D870B35-8003-494C-87E2-F95B15D88B0E" Feature="PTF_All">
<File Id="GAC_Microsoft.Protocols.TestTools.VSTS.dll_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.VSTS.dll"
KeyPath="yes"
Assembly=".net" />
</Component>
<Component Id="GAC_Microsoft.Protocols.TestTools.Extension.dll_VS10" Guid="C58B0F42-4CCD-46A4-892B-D367938D70EC" Feature="PTF_All">
<File Id="GAC_Microsoft.Protocols.TestTools.Extension.dll_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Extension.dll"
KeyPath="yes"
Assembly=".net" />
</Component>
<Component Id="GAC_Microsoft.Protocols.TestTools.Messages.Runtime.dll_VS10" Guid="1DC260A1-0907-4367-BFA0-6A7A5C255D7E" Feature="PTF_All">
<File Id="GAC_Microsoft.Protocols.TestTools.Messages.Runtime.dll_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.Messages.Runtime.dll"
KeyPath="yes"
Assembly=".net" />
</Component>
<Component Id="GAC_Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10" Guid="538D5842-F65A-47BA-818F-71F8C611D019" Feature="PTF_All">
<File Id="GAC_Microsoft.Protocols.TestTools.ExtendedLogging.dll_VS10"
Source="$(var.SRCDIR_VS10)\Microsoft.Protocols.TestTools.ExtendedLogging.dll"
KeyPath="yes"
Assembly=".net" />
</Component>
</DirectoryRef>
<!-- PTF Docs -->
<DirectoryRef Id="DOCS_DIR">
<!-- PTF User Guide -->
<Component Id="PTF_User_Guide" Guid="B3F7E4AF-8751-4FEC-83C0-239918499DA3" Feature="PTF_All">
<File Id="PTFUserGuide.docx" Source="$(var.PTF_SRC_ROOT)..\docs\PTFUserGuide.docx" />
</Component>
</DirectoryRef>
<!-- PTF License -->
<DirectoryRef Id="ROOT_DIR">
<!-- PTF License -->
<Component Id="PTF_LICENSE" Guid="9AB77E77-A595-4CF0-935F-2F967886FC9B" Feature="PTF_All">
<File Id="LICENSE.txt" Source="$(var.PTF_SRC_ROOT)\LICENSE.txt" />
</Component>
</DirectoryRef>
<!-- PTF Shortcut -->
<DirectoryRef Id="PTF_ProgramsMenuFolder">
<!-- for PTF User Guide -->
<Component Id="PTF_User_Guide_Shortcut" Guid="E360B475-A8F0-4FA6-96A1-A410DA9BAF73" Feature="PTF_All">
<Shortcut Id="PTF_User_Guide_Shortcut"
Name="PTF User Guide"
Target="[DOCS_DIR]PTFUserGuide.docx" />
<RemoveFolder Id="PTF_User_Guide_Shortcut" On="uninstall" />
<RegistryValue Id="PTF_User_Guide_Shortcut"
Root="HKCU"
Key="Software\Microsoft\ProtocolTestFramework"
Name="userguide_installed"
Type="integer"
Value="1"
KeyPath="yes"/>
</Component>
</DirectoryRef>
<!-- ptf testconfig schema for VS 2010 -->
<DirectoryRef Id="VS2010_SCHEMAS_DIR">
<Component Id="VS2010_TestConfig.xsd" Guid="F372BD7E-2D83-49A6-9473-9421FCB8ABEF" Feature="PTF_All">
<File Id="VS2010_TestConfig.xsd" Vital="yes"
Source="$(var.PTF_SRC_ROOT)\testtools\config\TestConfig.xsd" />
<Condition>VS2010_ROOT_FOLDER</Condition>
</Component>
</DirectoryRef>
<!-- ptf testconfig schema for VS 2012 -->
<DirectoryRef Id="VS2012_SCHEMAS_DIR">
<Component Id="VS2012_TestConfig.xsd" Guid="{008B5502-CB06-4F42-9D52-B4600094C61F}" Feature="PTF_All">
<File Id="VS2012_TestConfig.xsd" Vital="yes"
Source="$(var.PTF_SRC_ROOT)\testtools\config\TestConfig.xsd" />
<Condition>VS2012_ROOT_FOLDER</Condition>
</Component>
</DirectoryRef>
<Feature Id="PTF_All"
Title="Protocol Test Framework"
Description="Protocol Test Framework"
Level="1"
Display="hidden" />
</Fragment>
</Wix>

Просмотреть файл

@ -0,0 +1,197 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Microsoft.Protocols.TestTools
{
/// <summary>
/// Represents all data type used in TxtToJSON.cs
/// </summary>
public class DataType
{
/// <summary>
/// Represents summary for all test cases
/// </summary>
public class TestCasesSummary
{
/// <summary>
/// Test cases information
/// </summary>
public List<TestCase> TestCases;
/// <summary>
/// Test cases categories
/// </summary>
public List<string> TestCasesCategories;
/// <summary>
/// Test cases classes
/// </summary>
public List<string> TestCasesClasses;
}
/// <summary>
/// Represents a test case
/// </summary>
public class TestCase
{
/// <summary>
/// The name of the test case
/// </summary>
public string Name;
/// <summary>
/// The result of test case
/// </summary>
public string Result;
/// <summary>
/// The test class of the test case
/// </summary>
public string ClassType;
/// <summary>
/// The categories of the test case
/// </summary>
public List<string> Category;
}
/// <summary>
/// Represents a detailed StandardOut log
/// </summary>
public class StandardOutDetail
{
/// <summary>
/// The type of the StandardOut log
/// </summary>
public string Type;
/// <summary>
/// The content of the StandardOut log
/// </summary>
public string Content;
}
/// <summary>
/// Represents detailed test case information
/// </summary>
public class TestCaseDetail
{
/// <summary>
/// The name of the test case
/// </summary>
public string Name;
/// <summary>
/// The start time of the test case
/// </summary>
public string StartTime;
/// <summary>
/// The end time of the test case
/// </summary>
public string EndTime;
/// <summary>
/// The result of the test case
/// </summary>
public string Result;
/// <summary>
/// The ErrorStackTrace log of the test case
/// </summary>
public List<string> ErrorStackTrace;
/// <summary>
/// The ErrorMessage log of the test case
/// </summary>
public List<string> ErrorMessage;
/// <summary>
/// The StandardOut log of the test case
/// </summary>
public List<StandardOutDetail> StandardOut;
/// <summary>
/// The Types in StandardOut log
/// </summary>
public List<string> StandardOutTypes;
/// <summary>
/// The path of the capture file if any
/// </summary>
public string CapturePath;
/// <summary>
/// Set default value
/// </summary>
/// <param name="name">Test case name</param>
/// <param name="startTime">The start time to run test case</param>
/// <param name="endTime">The end time to run test case</param>
/// <param name="result">The result to run the test case</param>
public TestCaseDetail(string name, string startTime, string endTime, string result)
{
this.Name = name;
this.StartTime = startTime;
this.EndTime = endTime;
this.Result = result;
this.ErrorStackTrace = new List<string>();
this.ErrorMessage = new List<string>();
this.StandardOut = new List<StandardOutDetail>();
this.StandardOutTypes = new List<string>();
this.CapturePath = null;
}
}
/// <summary>
/// Represents the summary for all test cases
/// </summary>
public class RunSummary
{
/// <summary>
/// The number of total test cases
/// </summary>
public long TotalCount;
/// <summary>
/// The number of passed test cases
/// </summary>
public long PassedCount;
/// <summary>
/// The number of failed test cases
/// </summary>
public long FailedCount;
/// <summary>
/// The number of inconclusive test cases
/// </summary>
public long InconclusiveCount;
/// <summary>
/// The pass rate of this run
/// </summary>
public float PassRate;
/// <summary>
/// The start time of this run
/// </summary>
public string StartTime;
/// <summary>
/// The end time to of this run
/// </summary>
public string EndTime;
/// <summary>
/// The duration of this run
/// </summary>
public string Duration;
}
}
}

Просмотреть файл

@ -0,0 +1,244 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging;
namespace Microsoft.Protocols.TestTools
{
[ExtensionUri("logger://HtmlTestLogger")]
[FriendlyName("Html")]
public class HtmlTestLogger : ITestLogger
{
private string reportFolderPath; //The path to the report folder
private string txtResultFolderPath; //The path to the result folder which stores all the txt files
private string htmlResultFolderPath; //The path to the result folder which stores all the html files
private string jsFolderPath; //The path to the result folder which stores all the js files
private string captureFolderPath; //The path to the result folder which stores all the capture files
private DateTimeOffset testRunStartTime = DateTimeOffset.MaxValue.ToLocalTime(); //The start time of the test run
private DateTimeOffset testRunEndTime = DateTimeOffset.MinValue.ToLocalTime(); //The end time of the test run
private TxtToJSON txtToJSON = new TxtToJSON();
private const string scriptNode = "<script language=\"javascript\" type=\"text/javascript\">";
private const string jsFileName_Functions = "functions.js";
private const string jsFileName_Jquery = "jquery-1.11.0.min.js";
private const string indexHtmlName = "index.html";
private const string rootFolderName = "HtmlTestResults";
private const string txtResultFolderName = "Txt";
private const string htmlResultFolderName = "Html";
private const string jsFolderName = "js";
private const string captureFolderName = "Captures";
/// <summary>
/// Initializes the Test Logger.
/// </summary>
/// <param name="events">Events which can be registered for.</param>
/// <param name="testRunDirectory">Test Run Directory</param>
public void Initialize(TestLoggerEvents events, string testRunDirectory)
{
// Register for the events.
events.TestRunMessage += TestMessageHandler;
events.TestResult += TestResultHandler;
events.TestRunComplete += TestRunCompleteHandler;
CreateReportFolder();
}
#region Implement three events
/// <summary>
/// Called when a test message is received.
/// </summary>
private void TestMessageHandler(object sender, TestRunMessageEventArgs e)
{
switch (e.Level)
{
case TestMessageLevel.Informational:
break;
case TestMessageLevel.Warning:
break;
case TestMessageLevel.Error:
break;
default:
break;
}
}
/// <summary>
/// Called when a test result is received.
/// </summary>
private void TestResultHandler(object sender, TestResultEventArgs e)
{
if (e.Result.Outcome.ToString() == "NotFound")
{
return;
}
string caseName = !string.IsNullOrEmpty(e.Result.DisplayName) ? e.Result.DisplayName : e.Result.TestCase.FullyQualifiedName;
int dot = caseName.LastIndexOf('.');
if (-1 != dot)
caseName = caseName.Substring(dot + 1);
string txtFileName = Path.Combine(txtResultFolderPath, e.Result.StartTime.ToLocalTime().ToString("yyyy-MM-dd-HH-mm-ss") + "_"
+ (e.Result.Outcome == TestOutcome.Skipped ? "Inconclusive" : e.Result.Outcome.ToString()) + "_" + caseName + ".txt");
StringBuilder sb = new StringBuilder();
if (DateTimeOffset.Compare(testRunStartTime, e.Result.StartTime.ToLocalTime()) > 0)
testRunStartTime = e.Result.StartTime.ToLocalTime();
if (DateTimeOffset.Compare(testRunEndTime, e.Result.EndTime.ToLocalTime()) < 0)
testRunEndTime = e.Result.EndTime.ToLocalTime();
try
{
sb.AppendLine(caseName);
sb.AppendLine("Start Time: " + e.Result.StartTime.ToLocalTime().ToString("MM/dd/yyyy HH:mm:ss"));
sb.AppendLine("End Time: " + e.Result.EndTime.ToLocalTime().ToString("MM/dd/yyyy HH:mm:ss"));
sb.AppendLine("Result: " + (e.Result.Outcome == TestOutcome.Skipped ? "Inconclusive" : e.Result.Outcome.ToString()));
sb.AppendLine(e.Result.TestCase.Source);
if (!String.IsNullOrEmpty(e.Result.ErrorStackTrace))
{
sb.AppendLine("===========ErrorStackTrace===========");
sb.AppendLine(e.Result.ErrorStackTrace);
}
if (!String.IsNullOrEmpty(e.Result.ErrorMessage))
{
sb.AppendLine("===========ErrorMessage==============");
sb.AppendLine(e.Result.ErrorMessage);
}
foreach (TestResultMessage m in e.Result.Messages)
{
if (m.Category == TestResultMessage.StandardOutCategory && !String.IsNullOrEmpty(m.Text))
{
sb.AppendLine("===========StandardOut===============");
sb.AppendLine(m.Text);
}
}
}
catch (Exception ex)
{
sb.AppendLine("Exception: " + ex.Message);
}
finally
{
// Generate txt log file
File.WriteAllText(txtFileName, sb.ToString());
// Generate html log file
string htmlFileName = Path.Combine(htmlResultFolderPath, caseName + ".html");
File.WriteAllText(htmlFileName, ConstructCaseHtml(txtFileName, caseName));
}
}
/// <summary>
/// Called when a test run is completed.
/// </summary>
private void TestRunCompleteHandler(object sender, TestRunCompleteEventArgs e)
{
// Insert the necessary info used in index.html and copy it to report folder.
File.WriteAllText(Path.Combine(reportFolderPath, indexHtmlName), ConstructIndexHtml(e));
}
#endregion
/// <summary>
/// Creates the report folders
/// </summary>
private void CreateReportFolder()
{
reportFolderPath = Path.Combine(
Path.Combine(Directory.GetCurrentDirectory(), rootFolderName),
DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"));
Directory.CreateDirectory(reportFolderPath);
txtResultFolderPath = Path.Combine(reportFolderPath, txtResultFolderName);
Directory.CreateDirectory(txtResultFolderPath);
htmlResultFolderPath = Path.Combine(reportFolderPath, htmlResultFolderName);
Directory.CreateDirectory(htmlResultFolderPath);
jsFolderPath = Path.Combine(reportFolderPath, jsFolderName);
Directory.CreateDirectory(jsFolderPath);
captureFolderPath = Path.Combine(reportFolderPath, captureFolderName);
Directory.CreateDirectory(captureFolderPath);
// Copy the two .js files to report folder, the two files don't need to be changed.
File.WriteAllText(Path.Combine(jsFolderPath, jsFileName_Functions), Properties.Resources.functions);
}
/// <summary>
/// Constructs detailObj used in each [caseName].html
/// </summary>
private string ConstructDetailObj(string txtFileName)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine();
sb.Append("var detailObj=");
sb.Append(txtToJSON.ConstructCaseDetail(txtFileName, captureFolderPath));
sb.AppendLine(";");
return sb.ToString();
}
/// <summary>
/// Constructs listObj and summaryObj used in functions.js
/// </summary>
private string ConstructListAndSummaryObj(TestRunCompleteEventArgs e)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine();
sb.AppendLine("var listObj = " + txtToJSON.TestCasesString(txtResultFolderPath, captureFolderPath) + ";");
sb.Append("var summaryObj = "
+ txtToJSON.SummaryTable(e.TestRunStatistics.ExecutedTests,
e.TestRunStatistics[TestOutcome.Passed],
e.TestRunStatistics[TestOutcome.Failed],
testRunStartTime,
testRunEndTime) + ";");
// Clean the temp file
File.Delete(txtToJSON.CaseCategoryFile);
return sb.ToString();
}
/// <summary>
/// Inserts the corresponding script to the template html and generates the [testcase].html
/// </summary>
private string ConstructCaseHtml(string txtFileName, string caseName)
{
// Insert script to the template html (testcase.html)
StringBuilder sb = new StringBuilder();
sb.Append(ConstructDetailObj(txtFileName));
sb.AppendLine("var titleObj = document.getElementById(\"right_sidebar_case_title\");");
sb.Append(string.Format("CreateText(titleObj, \"{0}\");", caseName));
return InsertScriptToTemplate(Properties.Resources.testcase, sb.ToString());
}
/// <summary>
/// Inserts the corresponding script to the template html and generates the index.html
/// </summary>
private string ConstructIndexHtml(TestRunCompleteEventArgs e)
{
return InsertScriptToTemplate(Properties.Resources.index, ConstructListAndSummaryObj(e));
}
/// <summary>
/// Inserts scripts to the template html files and returns the updated content
/// </summary>
private string InsertScriptToTemplate(string templateHtml, string scriptToInsert)
{
int posInsert = templateHtml.IndexOf(scriptNode);
return templateHtml.Insert(posInsert + scriptNode.Length, scriptToInsert);
}
}
}

Просмотреть файл

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{8A100541-699B-4011-B184-01B70D534B5E}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Microsoft</RootNamespace>
<AssemblyName>Microsoft.Protocols.TestTools.HtmlTestLogger</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.TestPlatform.ObjectModel">
<HintPath Condition="Exists('$(VS110COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll')">$(VS110COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll</HintPath>
<HintPath Condition="Exists('$(VS120COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll')">$(VS120COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll</HintPath>
<HintPath Condition="Exists('$(VS140COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll')">$(VS140COMNTOOLS)\..\IDE\CommonExtensions\Microsoft\TestWindow\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\SharedAssemblyInfo.cs">
<Link>SharedAssemblyInfo.cs</Link>
</Compile>
<Compile Include="DataType.cs" />
<Compile Include="HtmlTestLogger.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="TxtToJSON.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Content Include="Resources\testcase.html" />
<Content Include="Resources\functions.js" />
<Content Include="Resources\index.html" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<Copy SourceFiles="$(TargetDir)$(TargetFileName)" DestinationFolder="..\Bin\ptf\HtmlTestLogger\" />
<Copy SourceFiles="$(TargetDir)$(TargetName).pdb" DestinationFolder="..\Bin\ptf\HtmlTestLogger\" />
</Target>
</Project>

131
src/htmltestlogger/Properties/Resources.Designer.cs сгенерированный Normal file
Просмотреть файл

@ -0,0 +1,131 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.34014
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Microsoft.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to var filter = &quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAAAXCAYAAAAiGpAkAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAADjSURBVGhD7doxCoQwEAXQiYm5lhbiXsLDeBf7tJZeSGzcTjHLhCwry8KmnvkPJHEsPx9RYvb9GQlUqvIKCpl1XeOyLHRdVx6BZMYY6rqO6tqTmaYpDsOQH4EGIQTq+wdV3vs8Ai3O80wr3vmKIXzFEL5iCF8xhC9A27bpE+5+8ewfhC/AOI559/Fr9g3hC8Atb5om31Hao/mK3Jte0nqG8IV4t7+09QzhC8KNL209Q/iCcONLW88QvmIIXzGErxjCV6ziX4Ggy3EcaTXbtsV5nsk5lwYgm7U2HeOy1hFO76pF9AK1pjdhWLkJdwAAAABJRU5ErkJggg==&quot;;
///var spread = &quot;data:image [rest of string was truncated]&quot;;.
/// </summary>
internal static string functions {
get {
return ResourceManager.GetString("functions", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;!DOCTYPE html&gt;
///&lt;html&gt;
///&lt;head&gt;
///
///&lt;style type=&quot;text/css&quot;&gt;
///div#header {background-color:#99bbbb;}
///div#left_sidebar {width:29%;float:left;overflow:auto;}
///div#back_to_summary {width:68%;float:left;overflow:auto;}
///div#right_sidebar_summary {width:68%;float:left;overflow:auto;margin-left:-2px}
///div#right_sidebar_case {width:68%;float:left;overflow:auto;margin-left:-2px}
///div#footer {background-color:#99bbbb;clear:both;text-align:center;}
///h1 {margin-bottom:0;}
///h2 {margin-bottom:0;font-size:18px;}
///ul {marg [rest of string was truncated]&quot;;.
/// </summary>
internal static string index {
get {
return ResourceManager.GetString("index", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;!DOCTYPE html&gt;
///
///&lt;html&gt;
///&lt;head&gt;
/// &lt;meta charset=&quot;utf-8&quot; /&gt;
/// &lt;title&gt;&lt;/title&gt;
/// &lt;style type=&quot;text/css&quot;&gt;
///h1 {margin-bottom:0;}
///ul {margin:0;}
///
///body{
/// font-family:Arial,Verdana,Sans-serif;
/// background-color: rgb(243,243,244);
///}
///h1.title{
/// color: #1382CE;
/// font-family:Arial,Verdana,Sans-serif;
/// font-weight: bolder;
///}
///
///div.frame {
/// color:white;
/// border-style: groove;
/// font-weight: bold;
/// font-size: 110%;
/// filter: alpha(opacity=30);
/// border:none;
/// [rest of string was truncated]&quot;;.
/// </summary>
internal static string testcase {
get {
return ResourceManager.GetString("testcase", resourceCulture);
}
}
}
}

Просмотреть файл

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="functions" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\functions.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value>
</data>
<data name="index" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\index.html;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="testcase" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\testcase.html;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,638 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
var filter = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAAAXCAYAAAAiGpAkAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAADjSURBVGhD7doxCoQwEAXQiYm5lhbiXsLDeBf7tJZeSGzcTjHLhCwry8KmnvkPJHEsPx9RYvb9GQlUqvIKCpl1XeOyLHRdVx6BZMYY6rqO6tqTmaYpDsOQH4EGIQTq+wdV3vs8Ai3O80wr3vmKIXzFEL5iCF8xhC9A27bpE+5+8ewfhC/AOI559/Fr9g3hC8Atb5om31Hao/mK3Jte0nqG8IV4t7+09QzhC8KNL209Q/iCcONLW88QvmIIXzGErxjCV6ziX4Ggy3EcaTXbtsV5nsk5lwYgm7U2HeOy1hFO76pF9AK1pjdhWLkJdwAAAABJRU5ErkJggg==";
var spread = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAIAAABv85FHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAfSURBVBhXY1iKG4Dk/mMDlMuFogIUOUxAoRx2sHQpAKV9xlhCkKRRAAAAAElFTkSuQmCC";
var fold = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAIAAABv85FHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAtSURBVBhXY1iKG4DkHmED6HKhoaFQFrFyQFFkgCIHARBRCCBFDhlA5bCDpUsBCAewyPpzLswAAAAASUVORK5CYII=";
var Inconclusive = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAYCAMAAAG3jG2VAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAG5UExURQAAAOviOPPmGPHjEe7fIvTnEO/fKvLlMfHiAO7hC+vXJ+nNAOvfLPPmQOXZBvXsS+rOAPLjHPPrWPPsPevhLPDdAPHkNfbvSezQAPLqQO3tT+XYX+fKAO3RAO3tV/XmGezdJfLYAOfbJu7SAPTvLfDUAO/kL/HVAPbtOO7jMvDhK+7uM/buGfPvdezgKfDhMuXfeeDGB+vUAOXfaOvlOfHoO+vlP/LqOubgaO7fGOzdGPXwSvTvMenPBPXwUuziKunPAPTuuPHjIubfPuzaC+/YAObUAPDvfvPrNf7xNevSAPHqNe7rZvTqOe7gJf///+zsP+jMAfPzN+jMBOvaEO3dAO3UAOjOAPLmIO/nR/fwVPDwefXvQ/TyeurPAObdQu/nT+nfL+3fMe7hNti/AO/hE/TuO+zRAPHYAPXtJebbIujfS+fLAOvXBOveKOnMAO7TAPPyzvjujO/lIPbuROrfHubbX+nSBPfvR+jopPLgGvTrIuvVAObZUPXjDO3jKfTuI/XjFvPZAevaDO7mOff3avPubu7mQebLAu/ZAOrRAObVAOraGPLqOenlbuHGCOrXAPDjGuvYALOow70AAACTdFJOUwDj/4H//zD//94N/8T//xv//0LrNMETyP8/HSj4/x3/Nv///5H/MP87eSMP/0G+Iyj4/7IoiSh6sr1x9Zay9TaM/8H/zP////ET/8T/Mf//HLIXss3///jOIEVFh4z//yAwOT346ev//4f///g0xP////+EyP//siD///f////lx/+szB8kLh+y/4z/ce3/+Ln/ubwTSvMAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEISURBVBhXYwADRSCuhDADGLi5gVQriC3qzwkkTaTNQBw4aEgDEsoFYgyTuLknMLQYGLRDxGEgqjoawpBkKuLQBTGSJkr4S4QmA1l5MjIpMjI8IEECQEoOymAQL4EyhOQbYyEsb3beCDBDQ9C5r8ocxNJL786SCAEy2Fi4S7O5/dQYGETCc/oNZWRygYImBtLSBqjeIAUkxDRlRkLZEMCvYldnbdMG5YFAkKlHhqq6jpMvlM/A4Mnc2+nj7+4qXFwBFdHWTA2T5fOPl01ntUwEi3BZ1dfExbkVKsXFGTH2cIGE7F288vO5ax3LuLm5BZoVQEJaXYGB5cHGFsbBth0dDvogIcKAgQEADMkwnizPP+8AAAAASUVORK5CYII=";
var Passed = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAMAAAHJpQ2UAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHLUExURQAAAKzVrD+ePzaaNu327SOSIzKZMjCXMDOZM5HIkSyWLDWaNff7953OnT6ePpTKlDGXMT+fP6TRpDOaMz+fPzScNHa6djecN0GgQSSRJKfWpzGbMbjbuDKZMiWSJTOZM/D38DKYMi6WLjOYM5TJlDScNEGfQTCYMCqUKjKYMjWhNTSWNDGZMTWaNXq8ejKYMjWaNdfr1zKZMjKZMjKYMjSZNE2mTS2WLTeXNzKYMjGYMer06jSdNDOaMzOZM/T59CqVKjSWNDKZMjOZMzKZMlupWzGZMTSaNP///zOZM0aiRtHo0TGVMdrs2jKYMqzVrDCRMH6+fkKgQjKaMn+/f5fHl0CgQFupWzSWNDKZMjadNiSSJO/375bFliWTJTKYMjKZMvj7+DCXMDebN5zNnDOZM5fOlzKYMi+YL8vlyzOaMzCZMDOaM3i7eHC4cKfTp0KgQp7OnpPJkzKYMkOhQyaSJrHYsSeTJzCXMDOZMzebNyiUKDKZMjGYMZnMmTKaMimVKTqcOpfLlzKZMjKaMiqWKjOZMzOaM6nTqUShRDKYMiybLHO5czSbNEWiRTaXNkOgQ6vVqzKaMjKYMuLw4rTZtDKYMiqUKkGiQUQZxeYAAACZdFJOUwAlfKr//7D5+P////8V/4S0ff93/yf//4T/Jin/tf+p/7EW+f8sff8Y+hMi/yv/Ga3/ebrctf8nJbav/yKB5P//J7f/+CqK//+z//8p//z/Ff9/f/8l4CcsvCr//xb/I4P/+in/+SV///+x/9/////gJSbj4P////8oLv/k/yiv/////4n/4P////sX////KuH/rK///93/hPqyR5EAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFBSURBVBhXYwADBxcGBlMIU9kaSMgCcUu7Az+Q6kqUUwaJg0G7ewMDQ9R0sXJzBmnJGGcLBgZBTyOwTEKkcWQQmCWt6excah/IXghkRymnGE7Rc3ZxBElIiFc3uDung5g4Qb+ssbGAFJiZbNferhM3oQjEZmt3du5RaGUGsS3do6NZ9Nwng9kNHh0spe31ILaVO6dHrnOvPIjNGJbNqtM7zQbEZigy8PScFA9mYgB91SoQiOiG8sHAx63GTxME/NpmpEHFGDRsi9uBrnCu6GvybeIqYOKFCOs6pYJE1UUmeshwN7tkhUOEoyyVuULy87z8PaY21ra71IMDAKy6tjPTg8ejjE/duZ1DURQirKSWo5NhJuSt4lXh3O5sIqwFEWZgCOUvSVLm4OBQ1pwWrA0VA4PYOlfp5OT+ygAoHytgYAAAQF5KkPS9yX0AAAAASUVORK5CYII=";
var Failed = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAUCAMAAAHJpQ2UAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADzUExURQAAAOtFNetFNu1GNOlENeYVA+9PP+lCNOo9MepBNOYUAektG+YVAfBGOOcpF+YWAew9L+gqGOg+MfKLgec0I+YUAOYdCuURAPJKPudGOOc/L/739uURAPWpoucTAOg8MeUWAve0rvBBMus+MPi+uew+MfKHff////nIw/ORiOtBMucjEeckEuYdCulCNO5CN+UXBOUUAOYVAeUYBeUWA+QQAOUUAOksGuYeC/3u7eQQAPGAdec2Jf749+USAOpIPuUUAeUTAOcmFOs1JOQPAPi/uukoFutDNeYRAPnJxOopF+QUAOcoFeUbCOckEeszIegTACouQoAAAABOdFJOUwD//x2ZjyCkPrqT/7ok/7M2/zn/w///ySk2IP////8u+v8zNf8p/////zP/yu6zLvjJm/H09v/////z/8T//zGV+P//////nv////rL8cFJdy4AAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEWSURBVBhXdY/XcsIwEEWX3gwGg3EAU4wNSw9V9GaKDaH9/9dEks3kIcmZ0erslbQzAk6dAPQcVQq0iHTlprZFtwxqL5ZzxnKM1g1mdQDvA1sAkrjjJ+GIIAy5wcqDpoGlKnNFbeJ6Ruh1gO3oLNtXP9P/GQpCJOyoFbPl6TjHtFpCw0TPirlOsgWsbxTHZ2tsqtxbL9Qe6M0wB//Vls+jLXfYiWJPcvQX8fInpRx3WwcpNKl8USqT0M+7fPR+uDQSqppoXA73aN6N9Q5pLxE1DXHZJh3+UxYPCDmm5ojz1JGQwTtO3oiZRiwWEdMmuSXd2BfoPk+GqaqmcXp2Az43pmOsRX9P6S+s9wiHYO2DUgu67Z8AfAMkISUJElTKAgAAAABJRU5ErkJggg==";
var selectedCaseDiv = 0; // The variable is used to save the object of the selected case in the left side.
var filterDisplayed = false; // The boolean is used to indicate if the "Log filter" is displayed or not.
// Used by Main.html
// Set height of iframe, the bottoms of left_sidebar and iframe are in the same line
function SetIFrameHeight(frame)
{
if (frame)
{
frame.height = document.getElementById("left_sidebar").clientHeight - document.getElementById("summary").clientHeight;
}
}
// Generate case list in left_sidebar
function CreateCaseList()
{
var caseListOjb = document.getElementById("list");
caseListOjb.style.marginLeft = "15px";
var len = listObj['TestCases'].length;
for (var i = 0; i < len; i++)
caseListOjb.appendChild(CreateOneCase(i));
// Set height of left side.
document.getElementById("left_sidebar").style.height = (window.screen.height - 150) + 'px';
}
// Generate one case for case list in left_sidebar
function CreateOneCase(id)
{
var casediv = document.createElement("div");
var caseTextDiv = document.createElement("div");
var casetext = document.createElement("a");
var result = listObj['TestCases'][id]['Result'];
var backgroundImg;
switch (result) {
case "Failed":
backgroundImg = Failed;
break;
case "Passed":
backgroundImg = Passed;
break;
case "Inconclusive":
backgroundImg = Inconclusive;
break;
case "NotFound":
backgroundImg = NotFound;
break;
}
var index = document.getElementById("list").children.length;
casediv.onclick = function () { ClickChange(this, listObj['TestCases'][id]['Name']); }
var casename = listObj['TestCases'][id]['Name'];
CreateText(casetext, casename);
// Set the img as background, then the text (case name) will not drop to next line if it's too long.
caseTextDiv.style.background = "url(" + backgroundImg + ") no-repeat left";
caseTextDiv.appendChild(casetext);
casetext.style.paddingLeft = '20px';
caseTextDiv.style.padding = "6px 0px 3px 5px";
casediv.appendChild(caseTextDiv);
return casediv;
}
function ClickChange(caseDiv, casename)
{
// Change src dynamically
document.getElementById("testcase").src = 'Html\\' + casename + '.html';
document.getElementById('back_to_summary').style.display = '';
document.getElementById('summary').style.display = '';
document.getElementById('right_sidebar_case').style.display = '';
document.getElementById("right_sidebar_summary").style.display = 'none';
// Hightlight the selected case
caseDiv.className = 'highLight';
// Recover the old selected case
if (selectedCaseDiv)
{
selectedCaseDiv.className = 'normal';
}
selectedCaseDiv = caseDiv;
}
// Group test cases
// Change style depends on group in left_sidebar
function ChangeSelect(value)
{
var showlist = document.getElementById("list");
var keyword = document.getElementById("keyword").value;
var html = "";
var len = listObj['TestCases'].length;
showlist.innerHTML = "";
if (value == 1)
{
for (var i = 0; i < len; i++)
{
if (listObj['TestCases'][i]['Name'].toLowerCase().indexOf(keyword.toLowerCase()) != -1)
showlist.appendChild(CreateOneCase(i));
}
}
if (value == 2)
{
var failedNum = 0;
var inconclusiveNum = 0;
var passedNum = 0;
var fhtml = document.createElement("div");
var ihtml = document.createElement("div");
var phtml = document.createElement("div");
var nhtml = document.createElement("div");
fhtml.id = "f";
ihtml.id = "i";
phtml.id = "p";
for (var i = 0; i < len; i++)
{
if (listObj['TestCases'][i]['Result'] == "Failed"
&& listObj['TestCases'][i]['Name'].toLowerCase().indexOf(keyword.toLowerCase()) != -1)
{
failedNum = failedNum + 1;
fhtml.appendChild(CreateOneCase(i));
}
if (listObj['TestCases'][i]['Result'] == "Inconclusive"
&& listObj['TestCases'][i]['Name'].toLowerCase().indexOf(keyword.toLowerCase()) != -1)
{
inconclusiveNum = inconclusiveNum + 1;
ihtml.appendChild(CreateOneCase(i));
}
if (listObj['TestCases'][i]['Result'] == "Passed"
&& listObj['TestCases'][i]['Name'].toLowerCase().indexOf(keyword.toLowerCase()) != -1)
{
passedNum = passedNum + 1;
phtml.appendChild(CreateOneCase(i));
}
}
if (failedNum != 0) {
var fframe = document.createElement("div");
var fimg = document.createElement("img");
fframe.className = "frame";
fimg.onclick = function () { ChangeStyle("f") };
fimg.className = "small";
fimg.src = fold;
fimg.id = "imgf";
fframe.appendChild(fimg);
showlist.appendChild(fframe);
fframe.appendChild(document.createTextNode("Failed (" + failedNum + ")"));
showlist.appendChild(fhtml);
showlist.appendChild(document.createElement("br"));
fhtml.style.display = 'none';
}
if (inconclusiveNum != 0) {
var iframe = document.createElement("div");
var iimg = document.createElement("img");
iframe.className = "frame";
iimg.onclick = function () { ChangeStyle("i") };
iimg.className = "small";
iimg.src = fold;
iimg.id = "imgi";
iframe.appendChild(iimg);
showlist.appendChild(iframe);
iframe.appendChild(document.createTextNode("Inconlusive (" + inconclusiveNum + ")"));
showlist.appendChild(ihtml);
showlist.appendChild(document.createElement("br"));
ihtml.style.display = 'none';
}
if (passedNum != 0) {
var pframe = document.createElement("div");
var pimg = document.createElement("img");
pframe.className = "frame";
pimg.className = "small";
pimg.src = fold;
pimg.id = "imgp";
pimg.onclick = function () { ChangeStyle("p") };
pframe.appendChild(pimg);
pframe.appendChild(document.createTextNode("Passed (" + passedNum + ")"));
showlist.appendChild(pframe);
showlist.appendChild(phtml);
phtml.style.display = 'none';
}
}
if (value == 3 || value == 4)
{
GroupBySelect(value, len, keyword, showlist);
}
}
// for group by class and category
function GroupBySelect(value, len, keyword, showlist)
{
var name;
if (value == 3) name = "TestCasesCategories";
if (value == 4) name = "TestCasesClasses";
var ctglen = listObj[name].length;
var ctgs = new Array();
var ctgfrms = new Array();
for (var i = 0; i < ctglen; i++)
{
ctgfrms[i] = document.createElement("div");
ctgfrms[i].className = "frame";
var ctgimg = document.createElement("img");
ctgimg.className = "small";
ctgimg.src = fold;
ctgimg.id = "img" + i;
ctgimg.onclick = function () { ChangeStyle(this.id.substring(3)) };
ctgfrms[i].appendChild(ctgimg);
ctgfrms[i].appendChild(document.createTextNode(listObj[name][i]));
ctgs[i] = document.createElement("div");
ctgs[i].id = i;
}
if (value == 3) name = "Category";
if (value == 4) name = "ClassType";
for (var i = 0; i < len; i++)
{
if (listObj['TestCases'][i]['Name'].toLowerCase().indexOf(keyword.toLowerCase()) == -1)
{
continue;
}
if (value == 3)
{
for (var j = 0; j < listObj['TestCases'][i][name].length; j++)
{
var id = FindIndexofCategory(listObj['TestCases'][i][name][j]);
ctgs[id].appendChild(CreateOneCase(i));
}
}
if (value == 4)
{
var id = FindIndexofClass(listObj['TestCases'][i][name]);
ctgs[id].appendChild(CreateOneCase(i));
}
}
for (var i = 0; i < ctglen; i++)
{
showlist.appendChild(ctgfrms[i]);
showlist.appendChild(ctgs[i]);
showlist.appendChild(document.createElement("br"));
ctgs[i].style.display = 'none';
}
}
// Find index of ctg in listObj['testCasesCategories']
function FindIndexofCategory(category)
{
for (var i = 0; i < listObj['TestCasesCategories'].length; i++)
{
if (category == listObj['TestCasesCategories'][i])
{
return i;
}
}
return (-1);
}
// Filter by keyword,get "enter" by code id,value is the keyword
function KeyShow(code, value)
{
if (code == 13)
{
var g = document.getElementById("groupbyid");
var id = g.options[g.selectedIndex].value;
ChangeSelect(id);
}
}
// Call keyword filter by press button "Go"
function KeywordGo()
{
var g = document.getElementById("keyword").value;
KeyShow(13, g);
}
// Find index of cls in listObj['testCasesClassses']
function FindIndexofClass(cls)
{
for (var i = 0; i < listObj['TestCasesClasses'].length; i++)
{
if (cls == listObj['TestCasesClasses'][i])
{
return i;
}
}
return (-1);
}
// Show summary of the test run
function ShowSummary()
{
var tbody = document.getElementById("tableid");
var newrow = tbody.insertRow(-1);
CreateText(newrow.insertCell(0), summaryObj.TotalCount);
CreateText(newrow.insertCell(1), summaryObj.PassedCount);
CreateText(newrow.insertCell(2), summaryObj.FailedCount);
CreateText(newrow.insertCell(3), summaryObj.InconclusiveCount);
CreateText(newrow.insertCell(4), summaryObj.PassRate + "%");
var pt = document.getElementById("time");
pt.innerHTML = "Start Time:&nbsp" + summaryObj.StartTime + "<br />End Time:&nbsp&nbsp" + summaryObj.EndTime
+ "<br />Duration:&nbsp&nbsp&nbsp" + summaryObj.Duration;
pt.style.fontFamily = "Tahoma";
}
// Used by [casename].html
function MulselShow()
{
var typesdiv = document.getElementById("mulsel");
typesdiv.innerHTML = "";
if (filterDisplayed) {
typesdiv.style.display = 'none';
filterDisplayed = false;
return;
}
else {
typesdiv.style.display = '';
filterDisplayed = true;
}
var title = GetText(document.getElementById("right_sidebar_case_title"));
var html = '';
var sltAlllab = document.createElement("label");
var sltAllinput = document.createElement("input");
sltAllinput.type = "checkbox";
sltAllinput.value = "(Select All)";
sltAllinput.onclick = function () { SelectALL(this.checked); }
CreateText(sltAlllab, "(Select All)");
typesdiv.appendChild(sltAllinput);
typesdiv.appendChild(sltAlllab);
sltAllinput.checked = true;
typesdiv.appendChild(document.createElement("br"));
var confirmdiv = document.createElement("div");
var confirminput = document.createElement("input");
len = detailObj['StandardOutTypes'].length;
for (var j = 0; j < len; j++)
{
var typelab = document.createElement("label");
var typeinput = document.createElement("input");
typeinput.name = "box";
typeinput.type = "checkbox"
typeinput.value = detailObj['StandardOutTypes'][j];
CreateText(typelab, detailObj['StandardOutTypes'][j]);
typesdiv.appendChild(typeinput);
typesdiv.appendChild(typelab);
typesdiv.appendChild(document.createElement("br"));
typeinput.checked = true;
}
confirmdiv.align = "right";
confirminput.type = "button"
confirminput.style.width = "auto";
confirminput.style.height = "18px";
confirminput.value = "OK";
confirminput.style.fontSize = '12px';
confirminput.onclick = function () { FilterLog(this); }
confirmdiv.appendChild(confirminput);
typesdiv.appendChild(confirmdiv);
}
// back to summary
function ClickSummary(obj)
{
obj.style.display = 'none';
document.getElementById("right_sidebar_case").style.display = 'none';
document.getElementById("right_sidebar_summary").style.display = '';
}
// Select ALL in log filter
function SelectALL(checked)
{
var mulsel = document.getElementById('mulsel');
for (var i = 1; i < mulsel.children.length; i++)
{
if (mulsel.children[i].type == "checkbox")
mulsel.children[i].checked = checked;
}
}
// Get text content compatible with browser
function GetText(elem)
{
if (elem.textContent && typeof (elem.textContent) != "undefined")
return elem.textContent;
else
return elem.innerText;
}
// show detail in right_sidebar_case
function ShowDetail(caseDetail, logTypes)
{
var html = '';
var len = 0;
var title = GetText(document.getElementById("right_sidebar_case_title"));
switch (caseDetail)
{
case "time":
var caseTime = document.getElementById("casetime");
caseTime.innerHTML = "";
var pStartTime = document.createElement("p");
var pEndTime = document.createElement("p");
var pResult = document.createElement("p");
pStartTime.innerHTML = detailObj['StartTime'];
pEndTime.innerHTML = detailObj['EndTime'];
pResult.innerHTML = detailObj['Result'];
caseTime.appendChild(pStartTime);
caseTime.appendChild(pEndTime);
caseTime.appendChild(pResult);
var pCapture = document.createElement("u");
pCapture.style.color = "#1382CE"; //highlight capture file link
pCapture.onclick = function ()
{
if (detailObj['CapturePath'] == null)
{
alert("Sorry for no capture.");
}
else
{
if (navigator.userAgent.indexOf(".NET") > 0)
{
var activeObj = new ActiveXObject('WScript.shell');
try
{
activeObj.run(detailObj['CapturePath'], 1);
}
catch (err)
{
alert("Please install Microsoft Message Analyzer firstly to open this capture.\r\n"
+ "The capture file can be found at \"" + detailObj['CapturePath'] + "\".");
}
}
else
{
alert("Incompatibility Problem! \r\nPlease use IE to open this index.html");
}
}
}
if (detailObj['CapturePath'] != null)
{
caseTime.appendChild(document.createTextNode("Capture: "));
caseTime.appendChild(pCapture);
CreateText(pCapture, title + '.etl');
}
caseTime.style.fontFamily = "Tahoma";
break;
case "StandardOut":
var html = '';
len = detailObj[caseDetail].length;
for (var j = 0; j < len; j++)
{
if (logTypes == '0' || (logTypes != '0' && logTypes.indexOf(detailObj[caseDetail][j]['Type']) != -1))
{
if (detailObj[caseDetail][j]['Type'].toLowerCase().indexOf('succee') != -1
|| detailObj[caseDetail][j]['Type'].toLowerCase().indexOf('passed') != -1)
html += "<p style=\"background-color:rgb(0,255,0)\">" + detailObj[caseDetail][j]['Content'];
else if (detailObj[caseDetail][j]['Type'] == 'TestStep')
html += "<p style=\"background-color:rgb(0,255,255)\">" + detailObj[caseDetail][j]['Content'];
else if (detailObj[caseDetail][j]['Type'].toLowerCase().indexOf('failed') != -1)
html += "<p style=\"background-color:red;color:white\">" + detailObj[caseDetail][j]['Content'];
else html += "<p>" + detailObj[caseDetail][j]['Content'];
}
}
html += html == "" ? "" : "</p>";
len = detailObj['StandardOutTypes'].length;
document.getElementById("tout").style.display = len == 0 ? 'none' : '';
document.getElementById("out").style.display = len == 0 ? 'none' : '';
document.getElementById("standardout").innerHTML = html;
break;
case "ErrorStackTrace":
var html = '';
len = detailObj[caseDetail].length;
for (var j = 0; j < len; j++)
html += "<p>" + detailObj[caseDetail][j];
html += html == "" ? "" : "</p>";
document.getElementById("ttrace").style.display = html == "" ? 'none' : '';
document.getElementById("AfterErrorStackTrace").style.display = html == "" ? 'none' : '';
document.getElementById("trace").innerHTML = html;
break;
case "ErrorMessage":
var html = '';
len = detailObj[caseDetail].length;
for (var j = 0; j < len; j++)
html += "<p>" + detailObj[caseDetail][j];
html += html == "" ? "" : "</p>";
document.getElementById("tmsg").style.display = html == "" ? 'none' : '';
document.getElementById("AfterErrorMessage").style.display = html == "" ? 'none' : '';
document.getElementById("msg").innerHTML = html;
break;
default:
break;
}
}
// Change fold/spread image
function ChangeStyle(id)
{
var showdiv = document.getElementById(id);
var showimg = document.getElementById("img" + id);
if (showdiv.style.display == '')
{
showdiv.style.display = 'none';
showimg.src = fold;
}
else
{
showdiv.style.display = '';
showimg.src = spread;
}
}
// Set one frame in right_sidebar_case
function SetOneFrame(value)
{
var frame = document.createElement("div");
var img = document.createElement("img");
switch (value)
{
case "ErrorStackTrace":
frame.id = "ttrace";
img.id = "imgtrace";
img.onclick = function () { ChangeStyle('trace') };
break;
case "ErrorMessage":
frame.id = "tmsg";
img.id = "imgmsg";
img.onclick = function () { ChangeStyle('msg') };
break;
case "StandardOut":
frame.id = "tout";
img.id = "imgout";
img.onclick = function () { ChangeStyle('out') };
break;
}
frame.className = "frame";
img.className = "small";
img.src = spread;
frame.appendChild(img);
frame.appendChild(document.createTextNode(value));
return frame;
}
// Set frames in right_sidebar_case
function SetFrames()
{
var log = document.getElementById("log");
log.appendChild(SetOneFrame("ErrorStackTrace"));
log.appendChild(SetContentDiv("ErrorStackTrace"));
var newLineAfterErrorStackTrace = document.createElement("br");
newLineAfterErrorStackTrace.id = "AfterErrorStackTrace";
log.appendChild(newLineAfterErrorStackTrace);
log.appendChild(SetOneFrame("ErrorMessage"));
log.appendChild(SetContentDiv("ErrorMessage"));
var newLineAfterErrorMessage = document.createElement("br");
newLineAfterErrorMessage.id = "AfterErrorMessage";
log.appendChild(newLineAfterErrorMessage);
log.appendChild(SetOneFrame("StandardOut"));
log.appendChild(SetContentDiv("StandardOut"));
}
// Set frame content div in right_sidebar_case
function SetContentDiv(value)
{
var contentObj = document.createElement("div");
switch (value)
{
case "ErrorStackTrace":
contentObj.id = "trace";
contentObj.className = "sub";
break;
case "ErrorMessage":
contentObj.id = "msg";
contentObj.className = "sub";
break;
case "StandardOut":
contentObj.id = "out";
var filterObj = document.createElement("div");
filterObj.className = "filterframe";
filterObj.appendChild(document.createTextNode('Log Filter '));
var img = document.createElement("img");
img.src = filter;
img.height = 20;
img.style.verticalAlign = "text-bottom";
img.onclick = function () { MulselShow() };
filterObj.appendChild(img);
var filterConentObj = document.createElement("div");
filterConentObj.id = "mulsel";
filterConentObj.className = "filter";
filterConentObj.style.display = 'none';
var outcontentObj = document.createElement("div");
outcontentObj.id = "standardout";
outcontentObj.className = "sub";
contentObj.appendChild(document.createElement("p"));
contentObj.appendChild(filterObj);
contentObj.appendChild(filterConentObj);
contentObj.appendChild(outcontentObj);
break;
}
return contentObj;
}
// Set text content compatible with browser
function CreateText(elem, textContent)
{
elem.appendChild(document.createTextNode(textContent));
}
// Get user's choice about log filer
function FilterLog(obj)
{
document.getElementById("mulsel").style.display = 'none';
if (obj.value == 'OK')
{
var mulsel = document.getElementById('mulsel');
var logTypes = '';
for (var i = 0; i < mulsel.children.length; i++)
{
if (mulsel.children[i].type == "checkbox" && mulsel.children[i].checked == true)
logTypes += mulsel.children[i].value + ',';
}
}
ShowDetail('StandardOut', logTypes);
}

Просмотреть файл

@ -0,0 +1,177 @@
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
div#left_sidebar {width:29%;float:left;overflow:auto;overflow:scroll;overflow-x:hidden}
div#back_to_summary {width:68%;float:left;overflow:auto;}
div#right_sidebar_summary {width:68%;float:left;overflow:auto;margin-left:-2px}
div#right_sidebar_case {width:68%;float:left;overflow:auto;margin-left:-2px}
h1 {margin-bottom:0;}
ul {margin:0;}
li {list-style:none;}
body{
font-family:Arial,Verdana,Sans-serif;
background-color: rgb(243,243,244);
}
h1.title{
color: #1382CE;
font-family:Arial,Verdana,Sans-serif;
font-weight: bolder;
}
h1.caselist {
color: #1382CE;
font-weight: bolder;
font-family:Arial,Verdana,Sans-serif;
}
div.frame {
color:white;
border-style: groove;
font-weight: bold;
font-size: 110%;
filter: alpha(opacity=30);
border:none;
padding:5px 5px 5px 5px;
background-color:#1382CE;
}
div {
font-size: 90%;
}
div.sub {
margin-left:20px;
}
a.hyper {
font-size: 80%;
font-family:Arial,Verdana,Sans-serif;
font-weight:normal;
color: #1382CE;
background-color: #E2E2E2;
padding: 5px 0px 5px 10px;
display: block;
-webkit-margin-before: 0.67em;
-webkit-margin-start: 0px;
-webkit-margin-end: 0px;
}
a {
font-size: 90%;
font-family:Arial,Verdana,Sans-serif;
}
th {
background-color:#E7E7E8;
font-family:Arial,Verdana,Sans-serif;
text-decoration: none;
font-weight: normal;
padding: 3px 6px 3px 6px;
}
td {
vertical-align: inherit;
border-color: inherit;
background-color:rgb(247,247,248);
}
table {
text-align: center;
font-weight:700;
font-size: 10pt;
border-spacing: 2px;
border-color: gray;
border-spacing: 0 0;
border-collapse: collapse;
}
img.small{
vertical-align:1px;
margin-right:6px;
}
img.result{
vertical-align:middle;
}
.normal{
color:black;
background-color:rgb(243,243,244);
}
.highLight{
color:white;
background-color:rgb(91,155,213)
}
</style>
</head>
<body>
<!-- left side, show case list -->
<div id="left_sidebar" style="padding-right:10px;border-right:2px solid">
<br/>
<h1 align="center"class="caselist">Case List</h1>
<h5>&nbsp&nbsp&nbsp&nbsp Group By
<select onchange="ChangeSelect(this.value)" id="groupbyid" style="width:126px">
<option value="1"selected="selected" >None</option>
<option value="2">Test Result</option>
<option value="3">Category</option>
<option value="4">Class</option>
</select>
<br/>
<p style="line-height:3px"/>
&nbsp&nbsp&nbsp&nbsp Keyword
<input id="keyword" type="text" size=8 onkeyup="KeyShow(event.keyCode,this.value)" style="margin-left:3px"/>
<input id="kwbtn" type="button" style="width:auto; height: 20px" onclick="KeywordGo()" value="Go"/>
</h5>
<hr style="border:1px dashed rgb(128, 128, 128); height:1px"/>
<!--list side -->
<div id="list">
</div>
<script type="text/javascript" src="js\functions.js"></script>
<script language="javascript" type="text/javascript">
// listObj and summaryObj will be inserted above when cases are running.
CreateCaseList();
</script>
</div>
<!-- right side, show summary -->
<div id="right_sidebar_summary" style="padding-left:10px;border-left:2px solid;">
<h1 align="center" class="title">Summary</h1>
<p id="time"align="left"/>
<table id="tableid" width="600" height="60" border="1">
<tr>
<th scope="col">Total</th>
<th scope="col">Passed</th>
<th scope="col">Failed</th>
<th scope="col">Inconclusive</th>
<th scope="col">Pass Rate </th>
</tr>
</table>
<br />
<script language="javascript" type="text/javascript">
ShowSummary();
</script>
</div>
<div id ="back_to_summary" style="padding-left:10px;display:none">
<a class="hyper" onclick="ClickSummary(this)" id="summary" >
<u>Back to Summary</u>
</a>
</div>
<!-- right side, show case detail -->
<div id="right_sidebar_case" style="display:none;padding-left:10px;border-left:2px solid;">
<iframe id ="testcase" width="100%" onload="SetIFrameHeight(this)" frameborder="0"></iframe>
</div>
</body>
</html>

Просмотреть файл

@ -0,0 +1,86 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
h1 {margin-bottom:0;}
ul {margin:0;}
body{
font-family:Arial,Verdana,Sans-serif;
background-color: rgb(243,243,244);
}
h1.title{
color: #1382CE;
font-family:Arial,Verdana,Sans-serif;
font-weight: bold;
font-size:20px;
}
div.frame {
color:white;
border-style: groove;
font-weight: bold;
font-size: 110%;
filter: alpha(opacity=30);
border:none;
padding:5px 5px 5px 5px;
background-color:#1382CE;
}
div.filter {
background-color:White;
border:1px solid;
border-color:grey;
font-size:10px;
position:absolute;left:20px;
margin-left:65px;
padding-right:5px;
padding-bottom:5px;
}
div.filterframe {
font-size:12px;
font-weight: bold;
margin-left:20px;
}
div {
font-size: 90%;
}
div.sub {
margin-left:20px;
}
img.small{
vertical-align:1px;
margin-right:6px;
}
</style>
</head>
<body>
<h1 align="center" class="title" id="right_sidebar_case_title"></h1>
<p align="left" id="casetime" style="font-size:12px"></p>
<div id="log">
</div>
</body>
<script type="text/javascript" src="..\js\functions.js"></script>
<script language="javascript" type="text/javascript">
// detailObj will be inserted above when cases are running
SetFrames();
ShowDetail('time', '0');
ShowDetail('StandardOut', '0');
ShowDetail('ErrorStackTrace', '0');
ShowDetail('ErrorMessage', '0');
</script>
</html>

Просмотреть файл

@ -0,0 +1,426 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Xml;
namespace Microsoft.Protocols.TestTools
{
/// <summary>
/// Translates the data from txt to js as json, adds category to the test cases
/// </summary>
public class TxtToJSON
{
// The path to category.js which stores the map between case name and category
public string CaseCategoryFile = Path.Combine(Directory.GetCurrentDirectory(), "category.js");
// Path list to Binary files of the test cases
private static List<string> dllFiles = new List<string>();
// Stores the map between case name and class
private Dictionary<string, string> caseClass = new Dictionary<string, string>();
// Auxiliary variable to save information as JSON
private JavaScriptSerializer serializer = new JavaScriptSerializer();
private enum LogType
{
None = -1,
ErrorStackTrace = 1,
ErrorMessage = 2,
StandardOut = 3
};
/// <summary>
/// Translates List<DataType.TestCase> to DataType.TestCasesSummary string
/// </summary>
/// <param name="resultFolder">Test result folder, in which log is stored as txt</param>
/// <param name="captureFolder">The path to the capture files need to be placed</param>
/// <returns>Returns detailed test cases information</returns>
public string TestCasesString(string resultFolder, string captureFolder)
{
List<DataType.TestCase> testCaseList = GetTestCaseList(resultFolder, captureFolder);
DataType.TestCasesSummary rs = new DataType.TestCasesSummary()
{
TestCases = testCaseList,
TestCasesCategories = GetTestCaseCategortyList(testCaseList),
TestCasesClasses = GetTestCaseClassList(testCaseList)
};
return (serializer.Serialize(rs));
}
/// <summary>
/// Constructs details of test case.
/// 1. Gets log from the txt file
/// 2. Copies capture to the log folder, and saves the path.
/// </summary>
/// <param name="txtfile">The path to the log txt file which contains the detail log</param>
/// <returns>Returns the log information</returns>
public string ConstructCaseDetail(string txtfile, string captureFolder)
{
FileStream fs = new FileStream(txtfile, FileMode.Open);
string type = ""; // Help judge whether the line is the end of the file, help distinguish file content
StreamReader sr = new StreamReader(fs);
string line;
string content = "";
string standardOutType = "";
DataType.TestCaseDetail caseDetail = new DataType.TestCaseDetail(sr.ReadLine(), sr.ReadLine(), sr.ReadLine(), sr.ReadLine());
DataType.StandardOutDetail stdDetail;
string dllFile = sr.ReadLine();
if (!dllFiles.Contains(dllFile))
{
dllFiles.Add(dllFile);
}
while ((line = sr.ReadLine()) != null)
{
if (line == "") //Rule out blank line
continue;
if (line.StartsWith("==========="))
{
type = line.Replace("=", "");
continue;
}
LogType eType = (LogType)Enum.Parse(typeof(LogType), type);
switch (eType)
{
case LogType.ErrorStackTrace:
caseDetail.ErrorStackTrace.Add(line);
break;
case LogType.ErrorMessage:
caseDetail.ErrorMessage.Add(line);
break;
case LogType.StandardOut:
int begin = line.IndexOf('[');
int end = line.IndexOf(']');
if (begin != -1 && end != -1)
{
if (standardOutType != "")
{
stdDetail = new DataType.StandardOutDetail()
{
Content = content,
Type = standardOutType
};
caseDetail.StandardOut.Add(stdDetail);
}
if (end > begin && end < line.Length)
{
standardOutType = line.Substring(begin + 1, end - begin - 1);
if (!caseDetail.StandardOutTypes.Contains(standardOutType))
caseDetail.StandardOutTypes.Add(standardOutType);
}
content = line;
}
else
content += line;
break;
default: break;
}
}
stdDetail = new DataType.StandardOutDetail()
{
Content = content,
Type = standardOutType
};
fs.Close();
caseDetail.StandardOut.Add(stdDetail);
caseDetail.CapturePath = CopyCaptureAndReturnPath(caseDetail.Name, captureFolder);
return (serializer.Serialize(caseDetail));
}
/// <summary>
/// Gets the statistical information
/// </summary>
/// <param name="totalCasesNum">The number of total cases</param>
/// <param name="passedNum">The number of passed cases</param>
/// <param name="failedNum">The number of failed cases</param>
/// <param name="testRunStartTime">The start time of the run</param>
/// <param name="testRunEndTime">The end time of the run</param>
/// <returns>Return statistical information about this test</returns>
public string SummaryTable(long totalCasesNum,
long passedNum,
long failedNum,
DateTimeOffset testRunStartTime,
DateTimeOffset testRunEndTime)
{
DataType.RunSummary sry = new DataType.RunSummary()
{
TotalCount = totalCasesNum,
FailedCount = failedNum,
PassedCount = passedNum,
InconclusiveCount = totalCasesNum - passedNum - failedNum,
PassRate = totalCasesNum == 0 ? 0 : (float)passedNum * 100 / totalCasesNum,
StartTime = testRunStartTime.ToLocalTime().ToString("MM/dd/yyyy HH:mm:ss"),
EndTime = testRunEndTime.ToLocalTime().ToString("MM/dd/yyyy HH:mm:ss"),
Duration = testRunEndTime.Subtract(testRunStartTime).ToString(@"hh\:mm\:ss")
};
return (serializer.Serialize(sry));
}
/// <summary>
/// Generates all test cases categories js file
/// </summary>
private void GenerateCaseCategoryFile()
{
Dictionary<string, List<string>> testCases = GetTestCaseCategories();
string sTestCases = serializer.Serialize(testCases);
File.WriteAllText(CaseCategoryFile, sTestCases);
}
/// <summary>
/// Gets test case categories by analyzing the test dll files
/// </summary>
/// <returns>Returns case name(key) and categories(value)</returns>
private Dictionary<string, List<string>> GetTestCaseCategories()
{
Dictionary<string, List<string>> testCases = new Dictionary<string, List<string>>();
DirectoryInfo info = new DirectoryInfo(Directory.GetCurrentDirectory());
bool existBatch = false;
if (info.FullName.EndsWith("Batch"))
existBatch = true;
string fullPath = existBatch ? info.Parent.FullName : info.FullName;
foreach (string dllPath in dllFiles)
{
string dllFile = dllPath;
if (string.IsNullOrEmpty(dllFile))
{
continue;
}
if (dllPath.StartsWith(".."))
{
dllFile = dllPath.Substring(3);
dllFile = Path.Combine(fullPath, dllFile);
}
try
{
Assembly assembly = Assembly.LoadFrom(dllFile);
Type[] types = assembly.GetTypes();
foreach (Type type in types)
{
//search for class, out interfaces and other type
if (!type.IsClass)
{
continue;
}
MethodInfo[] methods = type.GetMethods();
foreach (MethodInfo method in methods)
{
//methods loop, search for methods with TestMethodAttribute
object[] objs = method.GetCustomAttributes(false);
foreach (object obj in objs)
{
//TestMethods
if (obj.GetType().Name != "TestMethodAttribute" || testCases.ContainsKey(method.Name))
{
continue;
}
//GetCategory
List<string> categories = new List<string>();
foreach (object attribute in objs)
{
//record TestCategories
if (attribute.GetType().Name == "TestCategoryAttribute")
{
PropertyInfo property = attribute.GetType().GetProperty("TestCategories");
object category = property.GetValue(attribute, null);
foreach (string str in (System.Collections.ObjectModel.ReadOnlyCollection<string>)category)
{
categories.Add(str);
}
}
}
testCases.Add(method.Name, categories);
caseClass.Add(method.Name, type.Name);
}
}
}
}
catch
{
System.Console.WriteLine("skip {0}", dllFile);
}
}
return testCases;
}
/// <summary>
/// Gets the test case list with basic information
/// </summary>
/// <param name="resultFolder">The path to the result folder</param>
/// <param name="captureFolder">The path to the capture folder</param>
/// <returns>Returns the test case list with basic information</returns>
private List<DataType.TestCase> GetTestCaseList(string resultFolder, string captureFolder)
{
List<DataType.TestCase> testCaseList = new List<DataType.TestCase>();
if (!File.Exists(CaseCategoryFile))
{
GenerateCaseCategoryFile();
}
string sJSON = File.ReadAllText(CaseCategoryFile);
Dictionary<string, List<string>> testCases = serializer.Deserialize<Dictionary<string, List<string>>>(sJSON);
string[] txtfiles = Directory.GetFiles(resultFolder);
foreach (var file in txtfiles)
{
string caseName = Path.GetFileNameWithoutExtension(file);
int i = caseName.IndexOf('_');
caseName = caseName.Substring(i + 1); // out the sort id
i = caseName.IndexOf('_');
string caseStatus = caseName.Substring(0, i);
caseName = caseName.Substring(i + 1);
DataType.TestCase tc = new DataType.TestCase()
{
Name = caseName,
Result = caseStatus,
ClassType = caseClass.ContainsKey(caseName) ? caseClass[caseName] : null,
Category = testCases.ContainsKey(caseName) ? testCases[caseName] : null,
};
testCaseList.Add(tc);
}
return testCaseList;
}
/// <summary>
/// Gets the test case category list
/// </summary>
/// <param name="testCaseList">The test cases</param>
/// <returns>Returns test cases categories</returns>
private List<string> GetTestCaseCategortyList(List<DataType.TestCase> testCaseList)
{
List<string> listCaseCategory = new List<string>();
foreach (DataType.TestCase testCase in testCaseList)
{
listCaseCategory.AddRange(testCase.Category);
}
listCaseCategory = listCaseCategory.Distinct().ToList();
listCaseCategory.Sort();
return listCaseCategory;
}
/// <summary>
/// Gets the test case class list
/// </summary>
/// <param name="testCaseList">The test cases</param>
/// <returns>Returns the test cases class list</returns>
private List<string> GetTestCaseClassList(List<DataType.TestCase> testCaseList)
{
List<string> listCaseClass = new List<string>();
foreach (DataType.TestCase testCase in testCaseList)
{
listCaseClass.Add(testCase.ClassType);
}
listCaseClass = listCaseClass.Distinct().ToList();
listCaseClass.Sort();
return listCaseClass;
}
/// <summary>
/// Gets the path to the capture file folder from .ptfconfig file
/// </summary>
/// <returns>Returns a list of capture file path when the NetworkCapture is enabled. Returns null when the NetworkCapture is not enabled.</returns>
private List<string> GetCaptureFilesPath()
{
List<string> captureFolders = new List<string>();
DirectoryInfo info = new DirectoryInfo(Directory.GetCurrentDirectory());
bool existBatch = false;
if (info.FullName.EndsWith("Batch"))
existBatch = true;
string fullPath = existBatch ? info.Parent.FullName : info.FullName;
string cfgFolder = Path.Combine(fullPath, "bin");
string[] ptfconfigFiles = Directory.GetFiles(cfgFolder, "*.ptfconfig", SearchOption.TopDirectoryOnly);
try
{
foreach (string configFile in ptfconfigFiles)
{
XmlDocument configXml = new XmlDocument();
configXml.Load(configFile);
XmlNodeList groupNodes = configXml.GetElementsByTagName("Group");
if (groupNodes == null || groupNodes.Count <= 0) { continue; }
bool isNetworkCaptureEnabled = false;
string captureFileFolder = null;
foreach (XmlNode gNode in groupNodes)
{
if (gNode.Attributes["name"].Value == "NetworkCapture")
{
foreach (XmlNode pNode in gNode.ChildNodes)
{
if (pNode.Attributes["name"].Value == "Enabled")
{
isNetworkCaptureEnabled = bool.Parse(pNode.Attributes["value"].Value);
}
if (pNode.Attributes["name"].Value == "CaptureFileFolder")
{
captureFileFolder = pNode.Attributes["value"].Value;
}
}
break;
}
}
if (!isNetworkCaptureEnabled) { continue; }
if (!string.IsNullOrEmpty(captureFileFolder))
{
captureFolders.Add(captureFileFolder);
}
}
}
catch
{
return captureFolders;
}
return captureFolders;
}
/// <summary>
/// Copies a specified capture file to the log folder and returns the destination path.
/// </summary>
/// <param name="caseName">The specified case name</param>
/// <param name="captureFolder">The path of the destination capture folder</param>
/// <returns>Returns the destination path of the specified case name</returns>
private string CopyCaptureAndReturnPath(string caseName, string captureFolder)
{
List<string> srcCaptureFolders = GetCaptureFilesPath();
foreach (string srcCapturePath in srcCaptureFolders)
{
if (string.IsNullOrEmpty(srcCapturePath) || !Directory.Exists(srcCapturePath))
{
continue;
}
string[] files = Directory.GetFiles(srcCapturePath, string.Format("*{0}.etl", caseName));
foreach (var file in files)
{
string captureName = Path.GetFileNameWithoutExtension(file); // Get file name
captureName = captureName.Substring(captureName.IndexOf('#') + 1);
if (String.Compare(captureName, caseName, true) != 0)
continue;
string desCapturePath = Path.Combine(captureFolder, Path.GetFileName(file));
if (File.Exists(desCapturePath))
{
File.Delete(desCapturePath);
}
File.Copy(file, desCapturePath);
return desCapturePath;
}
}
return null;
}
}
}

61
src/ptf.sln Normal file
Просмотреть файл

@ -0,0 +1,61 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReportingTool", "reportingtool\ReportingTool.csproj", "{FABD7966-6611-4556-92CB-B13D7425AE82}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools", "testtools\TestTools.csproj", "{1CA2B935-3224-40F1-84BC-47FA1A9B242E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.VSTS", "testtools.vsts\TestTools.VSTS.csproj", "{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.Extension", "TestTools.Extension\TestTools.Extension.csproj", "{E41414B3-95F3-430F-823B-55B82F0BA198}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.Messages.Runtime", "testtools.messages.runtime\TestTools.Messages.Runtime.csproj", "{5D50C8BD-F26A-4A45-9D4A-025163B894BD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.ExtendedLogging", "TestTools.ExtendedLogging\TestTools.ExtendedLogging.csproj", "{EEB7AC20-C23F-447A-A2E7-E92519592DB0}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{63D7F908-6684-4FCB-9FF3-4A0A02CBFD1E}"
ProjectSection(SolutionItems) = preProject
SharedAssemblyInfo.cs = SharedAssemblyInfo.cs
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlTestLogger", "htmltestlogger\HtmlTestLogger.csproj", "{8A100541-699B-4011-B184-01B70D534B5E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{FABD7966-6611-4556-92CB-B13D7425AE82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FABD7966-6611-4556-92CB-B13D7425AE82}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FABD7966-6611-4556-92CB-B13D7425AE82}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FABD7966-6611-4556-92CB-B13D7425AE82}.Release|Any CPU.Build.0 = Release|Any CPU
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Release|Any CPU.Build.0 = Release|Any CPU
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Release|Any CPU.Build.0 = Release|Any CPU
{E41414B3-95F3-430F-823B-55B82F0BA198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E41414B3-95F3-430F-823B-55B82F0BA198}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E41414B3-95F3-430F-823B-55B82F0BA198}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E41414B3-95F3-430F-823B-55B82F0BA198}.Release|Any CPU.Build.0 = Release|Any CPU
{5D50C8BD-F26A-4A45-9D4A-025163B894BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5D50C8BD-F26A-4A45-9D4A-025163B894BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5D50C8BD-F26A-4A45-9D4A-025163B894BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5D50C8BD-F26A-4A45-9D4A-025163B894BD}.Release|Any CPU.Build.0 = Release|Any CPU
{EEB7AC20-C23F-447A-A2E7-E92519592DB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EEB7AC20-C23F-447A-A2E7-E92519592DB0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EEB7AC20-C23F-447A-A2E7-E92519592DB0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EEB7AC20-C23F-447A-A2E7-E92519592DB0}.Release|Any CPU.Build.0 = Release|Any CPU
{8A100541-699B-4011-B184-01B70D534B5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A100541-699B-4011-B184-01B70D534B5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A100541-699B-4011-B184-01B70D534B5E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A100541-699B-4011-B184-01B70D534B5E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Просмотреть файл

@ -0,0 +1,208 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Text;
namespace Microsoft.Protocols.ReportingTool
{
internal enum DerivedType
{
Unknown = 0,
Inferred,
Partial,
Cases
}
internal enum CoveredStatus
{
Unverified = 0,
Partial,
Verified
}
/// <summary>
/// A structure represent the current derived requirement.
/// use this structure to build a graph of derived requirements.
/// </summary>
internal struct DerivedRequirement
{
private string id;
private List<string> originalReqs;
private Dictionary<string, DerivedType> derivedReqs;
private CoveredStatus status;
private string timeStamp;
/// <summary>
/// The constructor.
/// </summary>
/// <param name="id">The requirement ID.</param>
/// <param name="status">The requirement covered status.</param>
public DerivedRequirement(string id, CoveredStatus status)
{
this.id = id;
this.status = status;
this.timeStamp = string.Empty;
originalReqs = new List<string>();
derivedReqs = new Dictionary<string, DerivedType>();
}
/// <summary>
/// Add parent requirement.
/// </summary>
/// <param name="reqID">The requirement ID.</param>
public void AddOriginalRequirement(string reqID)
{
if (!originalReqs.Contains(reqID))
{
originalReqs.Add(reqID);
}
else
{
if (ReportingLog.Log != null)
{
ReportingLog.Log.TraceWarning(
string.Format("Found duplicate original requirement {0} in requirement {1}.", reqID, id));
}
}
}
/// <summary>
/// Remove the relationship of the requirements
/// </summary>
/// <param name="reqId">The target requirment ID</param>
public void RemoveOriginalRequirement(string reqId)
{
if (originalReqs.Contains(reqId))
{
originalReqs.Remove(reqId);
}
}
/// <summary>
/// Add child requirement.
/// </summary>
/// <param name="reqID">The requirement ID.</param>
/// <param name="type">The derived requirement type.</param>
public void AddDerivedRequirement(string reqID, DerivedType type)
{
//self loop
if (reqID == this.id)
{
throw new InvalidOperationException("Found loop in the derived requirements: " + reqID + " is derived from itself.");
}
if (!derivedReqs.ContainsKey(reqID))
{
derivedReqs.Add(reqID, type);
}
else
{
if (ReportingLog.Log != null)
{
ReportingLog.Log.TraceWarning(
string.Format("Found duplicate derived requirement {0} in requirement {1}.", reqID, id));
}
derivedReqs[reqID] = type;
}
}
/// <summary>
/// remove relationship of the requirements
/// </summary>
/// <param name="reqID">The target requirement ID</param>
public void RemoveDerivedRequirement(string reqID)
{
if (derivedReqs.ContainsKey(reqID))
{
derivedReqs.Remove(reqID);
}
}
/// <summary>
/// Gets the ID of current derived requirement.
/// </summary>
public string ReqID
{
get
{
return id;
}
}
/// <summary>
/// Gets or Sets the covered status of current derived requirement.
/// </summary>
public CoveredStatus CoveredStatus
{
get
{
return status;
}
set
{
status = value;
}
}
/// <summary>
/// Gets the parent requirements.
/// </summary>
public List<string> OriginalReqs
{
get
{
return originalReqs;
}
}
/// <summary>
/// Gets all the direct or undirect derived requirements.
/// </summary>
public Dictionary<string, DerivedType> DerivedReqs
{
get
{
return derivedReqs;
}
}
/// <summary>
/// Gets the count of case type requirements derived from the current requirement.
/// </summary>
public uint CaseCount
{
get
{
uint count = 0;
foreach (KeyValuePair<string, DerivedType> kvp in derivedReqs)
{
if (kvp.Value == DerivedType.Cases)
{
count++;
}
}
return count;
}
}
/// <summary>
/// Gets or sets the time stamp string for the current requirement.
/// </summary>
public string TimeStamp
{
get
{
if (string.IsNullOrEmpty(timeStamp))
{
return null;
}
return timeStamp;
}
set
{
timeStamp = value;
}
}
}
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,670 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Schema;
using System.Text.RegularExpressions;
namespace Microsoft.Protocols.ReportingTool
{
internal class ReportingParameters
{
private StringCollection xmlLogs;
private StringCollection requirementTables;
private string rsPrefix;
private bool inScopeOverrided;
private bool outScopeOverrided;
public ReportingParameters()
{
}
public StringCollection XmlLogs
{
get
{
if (xmlLogs == null)
{
xmlLogs = new StringCollection();
}
return xmlLogs;
}
}
public StringCollection RequirementTables
{
get
{
if (requirementTables == null)
{
requirementTables = new StringCollection();
}
return requirementTables;
}
}
private string outputFile;
public String OutputFile
{
set
{
if (String.IsNullOrEmpty(outputFile))
{
outputFile = value;
if (!value.EndsWith(".html") && !value.EndsWith(".htm"))
{
outputFile += ".html";
}
}
else
{
throw new InvalidOperationException("[ERROR] Duplicate output filename parameter specified.");
}
}
get
{
if (String.IsNullOrEmpty(outputFile))
{
// default reporting filename
return String.Format("report{0}.html",
DateTime.Now.ToString("yyyyMMddhhmmss"));
}
else
{
return outputFile;
}
}
}
/// <summary>
/// A string prefix from the TD name, the format is "prefix_R".
/// </summary>
public string RSPrefix
{
get
{
return rsPrefix;
}
set
{
if (!string.IsNullOrEmpty(value))
{
rsPrefix = value;
if (rsPrefix.Contains(" "))
{
throw new InvalidOperationException(
"Prefix cannot contain spaces.");
}
//remove end "_"
Regex regex = new Regex(@"_+\b");
rsPrefix = regex.Replace(rsPrefix, "");
if (!rsPrefix.EndsWith("_R"))
{
rsPrefix += "_R";
}
}
else
{
rsPrefix = null;
}
}
}
/// <summary>
/// Check if all required arguments are meet.
/// There must at least one reabable test log file and at least one reabable requirement table file.
/// Check if files specified by parameters are available to read.
/// Check if output file has already exists, if it is writable.
/// </summary>
public void Validate(bool scopeMode)
{
bool logflag = XmlLogs.Count > 0;
bool tableflag = RequirementTables.Count > 0;
if (!logflag)
{
throw new InvalidOperationException("[ERROR] Test log file name is not specified.");
}
if (!tableflag)
{
throw new InvalidOperationException("[ERROR] Requirement Specification file name is not specified.");
}
StringCollection invalidfiles = ValidateExistence();
// warning user the invalid files.
if (invalidfiles.Count > 0)
{
StringBuilder sb = new StringBuilder();
foreach (string filename in invalidfiles)
{
sb.AppendLine(filename);
}
throw new InvalidOperationException(
String.Format("[ERROR] Unable to find the files: {0}", sb.ToString()));
}
ParseScopeRules(scopeMode);
// check req table files against internal schema
using (TextReader tr = new StringReader(Resource.requirementTable))
{
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, XmlReader.Create(tr, new XmlReaderSettings() { XmlResolver = null }));
foreach (string filename in RequirementTables)
{
// Create XML settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessIdentityConstraints;
settings.Schemas = schemaSet;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
settings.XmlResolver = null;
validateResult = true;
using (XmlReader reader = XmlReader.Create(filename, settings))
{
//Read and validate the XML data.
while (reader.Read()) { }
}
if (!validateResult)
{
// Validation failed return false;
throw new InvalidOperationException(
String.Format("[ERROR] Error occured while validating requirement table file {0}.\r\nTechnical details:\r\n{1}", filename, validateErrorMessages));
}
}
}
// check output file
if (File.Exists(OutputFile))
{
FileStream fs = null;
try
{
fs = File.OpenWrite(OutputFile);
}
catch (Exception e)
{
throw new InvalidOperationException(
String.Format("[ERROR] Unable to open file {0} for reporting result output. Details:\r\n{1}",
OutputFile, e.Message));
}
finally
{
if (fs != null)
{
fs.Close();
}
}
}
}
private StringCollection ValidateExistence()
{
StringCollection validfiles = new StringCollection();
StringCollection invalidfiles = new StringCollection();
// remove all invalid log files
foreach (string filename in XmlLogs)
{
if (File.Exists(filename))
{
FileInfo fi = new FileInfo(filename);
validfiles.Add(fi.FullName.ToLower());
}
else
{
invalidfiles.Add(filename);
}
}
xmlLogs.Clear();
foreach (string filename in validfiles)
{
if (!xmlLogs.Contains(filename))
{
xmlLogs.Add(filename);
}
}
validfiles.Clear();
// remove all invalid req table files
foreach (string filename in RequirementTables)
{
if (File.Exists(filename))
{
FileInfo fi = new FileInfo(filename);
validfiles.Add(fi.FullName.ToLower());
}
else
{
invalidfiles.Add(filename);
}
}
requirementTables.Clear();
foreach (string filename in validfiles)
{
if (!requirementTables.Contains(filename))
{
requirementTables.Add(filename);
}
}
return invalidfiles;
}
public static string inScopeRule = "inScopeRule";
public static string outScopeRule = "outScopeRule";
Dictionary<string, List<string>> scopeRules = new Dictionary<string, List<string>>();
/// <summary>
/// Gets the in/out scope rules for the scope value.
/// </summary>
public Dictionary<string, List<string>> ScopeRules
{
get
{
return scopeRules;
}
}
private void ParseScopeRules(bool isScopeMode)
{
if (isScopeMode)
{
// error handling for in/out scope parameters.
if (!inScopeOverrided && !outScopeOverrided)
{
throw new InvalidOperationException("Please explicitly specify in/out scope parameters.");
}
else if (inScopeOverrided && !outScopeOverrided)
{
throw new InvalidOperationException("Please explicitly specify out-of-scope parameter.");
}
else if (!inScopeOverrided && outScopeOverrided)
{
throw new InvalidOperationException("Please explicitly specify in-scope parameter.");
}
}
string[] inscopes = this.inScopeString.Split('+');
foreach (string inscope in inscopes)
{
if (!scopeRules.ContainsKey(inScopeRule))
{
scopeRules[inScopeRule] = new List<string>();
if (string.Compare(inscope, noneValue, true) != 0)
{
scopeRules[inScopeRule].Add(inscope.ToLower());
}
else
{
if (inscopes.Length > 1)
{
throw new InvalidOperationException(
"None keyword is not allowed as the in scope value. If no value specified to in-scope, please use 'None' only.");
}
break;
}
}
else
{
if (!scopeRules[inScopeRule].Contains(inscope.ToLower()))
{
if (string.Compare(inscope, noneValue, true) != 0)
{
scopeRules[inScopeRule].Add(inscope.ToLower());
}
else
{
throw new InvalidOperationException(
"None keyword is not allowed as the in scope value. If no value specified to in-scope, please use 'None' only.");
}
}
}
}
string[] outscopes = this.outScopeString.Split('+');
foreach (string outscope in outscopes)
{
if (!scopeRules.ContainsKey(outScopeRule))
{
scopeRules[outScopeRule] = new List<string>();
if (string.Compare(outscope, noneValue, true) != 0)
{
scopeRules[outScopeRule].Add(outscope.ToLower());
}
else
{
if (outscopes.Length > 1)
{
throw new InvalidOperationException(
"None keyword is not allowed as the in-scope value. If no value specified to in scope, please use 'None' only.");
}
break;
}
}
else
{
if (!scopeRules[outScopeRule].Contains(outscope.ToLower()))
{
if (string.Compare(outscope, noneValue, true) != 0)
{
scopeRules[outScopeRule].Add(outscope.ToLower());
}
else
{
throw new InvalidOperationException(
"None keyword is not allowed as the out-of-scope value. If no value specified to out scope, please use 'None' only.");
}
}
}
}
}
private static bool validateResult;
private static string validateErrorMessages;
static private void ValidationCallBack(object sender, ValidationEventArgs args)
{
// Validation failed. Treat warning as failure
validateResult = false;
validateErrorMessages = args.Message;
}
private bool prefix;
public bool Prefix
{
get { return prefix; }
set
{
prefix = value;
if (prefix)
{
log = false;
table = false;
output = false;
inScope = false;
outScope = false;
deltaScope = false;
}
}
}
private bool log;
public bool Log
{
get { return log; }
set
{
log = value;
if (log)
{
prefix = false;
table = false;
output = false;
inScope = false;
outScope = false;
deltaScope = false;
}
}
}
private bool table;
public bool Table
{
get { return table; }
set
{
table = value;
if (table)
{
prefix = false;
log = false;
output = false;
inScope = false;
outScope = false;
deltaScope = false;
}
}
}
private bool output;
public bool Output
{
get { return output; }
set
{
output = value;
if (output)
{
prefix = false;
table = false;
log = false;
inScope = false;
outScope = false;
deltaScope = false;
}
}
}
//reporting tool will not replace the old report file by default
//user can set /r or /replace switch to replace the old report file
private bool replace;
public bool Replace
{
get { return replace; }
set
{
replace = value;
if (replace)
{
prefix = false;
table = false;
log = false;
output = false;
inScope = false;
outScope = false;
deltaScope = false;
}
}
}
private bool inScope;
public bool InScope
{
get { return inScope; }
set
{
inScope = value;
if (inScope)
{
prefix = false;
table = false;
log = false;
output = false;
outScope = false;
deltaScope = false;
}
}
}
private bool outScope;
public bool OutScope
{
get { return outScope; }
set
{
outScope = value;
if (outScope)
{
prefix = false;
table = false;
log = false;
output = false;
inScope = false;
deltaScope = false;
}
}
}
//the scope parameter should match the format like XXX[+XXX]*, spaces are not allowed.
Regex regex = new Regex("^\\w+(\\+\\w+)*$", RegexOptions.Compiled);
readonly string noneValue = "none";
//default value of inscope is Server+Both
private string inScopeString = "Server+Both";
public string InScopeString
{
get
{
return inScopeString;
}
set
{
if (regex.IsMatch(value) || string.Compare(noneValue, value, true) == 0)
{
inScopeString = value;
inScopeOverrided = true;
}
else
{
throw new InvalidOperationException(
String.Format("Invalid inscope string fomat \"{0}\", please use the correct format e.g. Server+Both. "
+ "Don't allow spaces in the inscope argument string.", value));
}
}
}
//default value of outscope is client
private string outScopeString = "client";
public string OutScopeString
{
get
{
return outScopeString;
}
set
{
if (regex.IsMatch(value) || string.Compare(noneValue, value, true) == 0)
{
outScopeString = value;
outScopeOverrided = true;
}
else
{
throw new InvalidOperationException(
String.Format("Invalid outscope string fomat \"{0}\", please use the correct format e.g. Server+Both. "
+ "Don't allow spaces in the out-of-scope argument string.", value));
}
}
}
/// <summary>
/// Gets whether inscope parameter is explicitly specified.
/// </summary>
public bool InScopeOverrided
{
get { return inScopeOverrided; }
}
/// <summary>
/// Gets whether outscope parameter is explicitly specified.
/// </summary>
public bool OutScopeOverided
{
get { return outScopeOverrided; }
}
//specify the current parameter is delta scope value.
private bool deltaScope;
public bool DeltaScope
{
get { return deltaScope; }
set
{
deltaScope = value;
if (deltaScope)
{
prefix = false;
table = false;
log = false;
output = false;
inScope = false;
outScope = false;
}
}
}
private string deltaScopeString;
public string DeltaScopeString
{
get { return deltaScopeString; }
set
{
if (regex.IsMatch(value))
{
deltaScopeString = value;
}
else
{
throw new InvalidOperationException(
String.Format("Invalid delta string fomat \"{0}\", please use the correct format e.g. Changed+New. "
+ "Don't allow spaces in the delta scope argument string.", value));
}
}
}
private List<string> deltaScopeValues = new List<string>();
public List<string> DeltaScopeValues
{
get
{
if (deltaScopeValues.Count == 0)
{
GetDeltaScopeValues();
}
return deltaScopeValues;
}
}
private void GetDeltaScopeValues()
{
if (string.IsNullOrEmpty(deltaScopeString))
{
return;
}
string[] deltaScopes = deltaScopeString.Split(new char[] { '+' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string delta in deltaScopes)
{
if (!string.IsNullOrEmpty(delta.Trim()))
{
switch(delta.Trim().ToLower())
{
case "new":
deltaScopeValues.Add("new");
break;
case "changed":
deltaScopeValues.Add("changed");
break;
case "unchanged":
deltaScopeValues.Add("unchanged");
deltaScopeValues.Add("editorial");
deltaScopeValues.Add("sectionmoved");
break;
default:
throw new InvalidOperationException(
string.Format("Unsupported delta scope value {0}", delta));
}
}
}
}
}
}

Просмотреть файл

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{FABD7966-6611-4556-92CB-B13D7425AE82}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>Microsoft.Protocols.ReportingTool</RootNamespace>
<AssemblyName>ReportingTool</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Web" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\SharedAssemblyInfo.cs">
<Link>SharedAssemblyInfo.cs</Link>
</Compile>
<Compile Include="DerivedRequirement.cs" />
<Compile Include="ReportingParameters.cs" />
<Compile Include="Reporting.cs" />
<Compile Include="requirementTable.cs">
<DependentUpon>requirementTable.xsd</DependentUpon>
<SubType>Component</SubType>
</Compile>
<Compile Include="Resource.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resource.resx</DependentUpon>
</Compile>
<Compile Include="SerializableRequirements.cs">
</Compile>
<Compile Include="TableAnalyzer.cs" />
<Compile Include="TestLog.cs">
<SubType>Component</SubType>
<DependentUpon>TestLog.xsd</DependentUpon>
</Compile>
<Compile Include="XmlLogAnalyzer.cs" />
</ItemGroup>
<ItemGroup>
<Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
</ItemGroup>
<ItemGroup>
<Content Include="..\testtools\Logging\TestLog.xsd">
<Link>TestLog.xsd</Link>
<SubType>
</SubType>
</Content>
<Content Include="requirementTable.xsd">
<SubType>
</SubType>
</Content>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resource.resx">
<SubType>Designer</SubType>
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resource.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
<Visible>False</Visible>
<ProductName>.NET Framework 2.0 %28x86%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
<Visible>False</Visible>
<ProductName>.NET Framework 3.0 %28x86%29</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<Copy SourceFiles="$(TargetDir)$(TargetFileName)" DestinationFolder="..\Bin\ptf\reportingtool\" />
<Copy SourceFiles="$(TargetDir)$(TargetName).pdb" DestinationFolder="..\Bin\ptf\reportingtool\" />
</Target>
</Project>

305
src/reportingtool/Resource.Designer.cs сгенерированный Normal file
Просмотреть файл

@ -0,0 +1,305 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.239
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Microsoft.Protocols.ReportingTool {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resource {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resource() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Protocols.ReportingTool.Resource", typeof(Resource).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to &lt;table cellpadding=&quot;2&quot; cellspacing=&quot;2&quot;&gt;
/// &lt;caption&gt;&lt;h3&gt;Requirements Excluded From Failed Cases&lt;/h3&gt;&lt;/caption&gt;
/// &lt;col /&gt;
/// &lt;thead&gt;
/// &lt;tr&gt;
/// &lt;td style=&quot;width: 12%;&quot; class=&quot;TableCellHighlighted&quot;&gt;
/// Req ID
/// &lt;/td&gt;
/// &lt;td class=&quot;TableCellHighlighted&quot;&gt;
/// Description
/// &lt;/td&gt;
/// &lt;td style=&quot;width: 10%;&quot; class=&quot;TableCellHighlighted&quot;&gt;
/// TestCase
/// &lt;/td&gt;
/// &lt;td style=&quot;width: 10%;&quot; class=&quot;TableCellHighlighted [rest of string was truncated]&quot;;.
/// </summary>
internal static string ExcludReqTable {
get {
return ResourceManager.GetString("ExcludReqTable", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;table cellpadding=&quot;2&quot; cellspacing=&quot;2&quot;&gt;
/// &lt;caption&gt;&lt;h3&gt;$GLOBALTABLETITLE$&lt;br/&gt;
/// &lt;font color=&quot;#FF0000&quot;&gt;$ErrorMessage$&lt;/font&gt;&lt;/h3&gt;
/// &lt;h4&gt;$GLOBALTABLEDISCRIPTION$&lt;/h4&gt;&lt;/caption&gt;
/// &lt;col /&gt;
/// &lt;thead&gt;&lt;tr&gt;&lt;th colspan=&quot;2&quot;&gt;Requirement Type&lt;/th&gt;&lt;th colspan=&quot;5&quot;&gt;Count/Percent&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
/// &lt;col /&gt;
/// &lt;tbody&gt;
/// &lt;tr&gt;
/// &lt;td colspan=&quot;7&quot;&gt;
/// &lt;h3&gt;
/// Checked Requirements: %totalChecked%
/// &lt;/h3&gt;
/// &lt;/td&gt;
/// &lt;/tr&gt;
/// &lt;tr&gt;
/// [rest of string was truncated]&quot;;.
/// </summary>
internal static string GlobalTable {
get {
return ResourceManager.GetString("GlobalTable", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} -
/// A utility which generates reports from PTF test logs and requirement table files.
///
///{0} /log:&lt;xml log&gt; /table:&lt;requirements table&gt;[/out:report.html] [/replace] [/inscope:values] [/outofscope:values] [/prefix:MS-XXXX] [/verbose]
///{0} /log:&lt;xml log&gt;[&lt;xml log&gt;....] /table:&lt;requirements table&gt;[&lt;requirements table&gt;...] [/out:report.html] [/replace] [/inscope:values] [/outofscope:values] [/prefix:MS-XXXX] [/verbose]
///
/// - OPTIONS -
///
////help
/// Prints this help message. Short form is &apos;/?&apos;.
///
////out [rest of string was truncated]&quot;;.
/// </summary>
internal static string HelpText {
get {
return ResourceManager.GetString("HelpText", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to $GLOBALSTAT$
/// &lt;br/&gt;
/// $GLOBALRSINCONSISTENCY$
/// &lt;br/&gt;
/// $GLOBALINCONSISTENCY$
/// &lt;br/&gt;
/// $EXCLUDEDREQUIREMENTS$
/// &lt;/body&gt;
/// &lt;/html&gt;.
/// </summary>
internal static string HtmlTemplateFooter {
get {
return ResourceManager.GetString("HtmlTemplateFooter", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
///&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt;
///&lt;head&gt;
/// &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
/// &lt;title&gt;Reporting&lt;/title&gt;
/// &lt;style type=&quot;text/css&quot;&gt;
/// table
/// {
/// width: 100%;
/// background-color: #f8f8f8;
/// border: 1px solid #505050;
/// border-collapse: collapse;
/// }
/// tbody tr td
/// {
/// border: 1px so [rest of string was truncated]&quot;;.
/// </summary>
internal static string HtmlTemplateHeader {
get {
return ResourceManager.GetString("HtmlTemplateHeader", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;br /&gt;The following data might not be accurate due to inconsistencies found in the requirements, please see &lt;a href=&apos;#jump-rsinconsistencyerrors&apos;&gt;Requirement Inconsistencies&lt;/a&gt; for details..
/// </summary>
internal static string InconsistencyErrorMessage {
get {
return ResourceManager.GetString("InconsistencyErrorMessage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;table cellpadding=&quot;2&quot; cellspacing=&quot;2&quot;&gt;
/// &lt;col/&gt;
/// &lt;thead&gt;
/// &lt;tr&gt;
/// &lt;td align=&quot;center&quot; class=&quot;TableCellHighlighted&quot; colspan=&quot;5&quot;&gt;
/// &lt;h4&gt;Requirement Verification Inconsistencies&lt;/h4&gt;
/// &lt;/td&gt;
/// &lt;/tr&gt;
/// &lt;tr&gt;
/// &lt;th colspan=&quot;3&quot;&gt;Inconsistency type&lt;/th&gt;
/// &lt;th colspan=&quot;2&quot;&gt;Count&lt;/th&gt;
/// &lt;/tr&gt;
/// &lt;/thead&gt;
/// &lt;col/&gt;
/// &lt;tbody&gt;
/// &lt;tr&gt;
/// &lt;td colspan=&quot;3&quot;&gt;
/// $InconsistentErrors$
/// &lt;/td&gt;
/// [rest of string was truncated]&quot;;.
/// </summary>
internal static string InconsistencyTable {
get {
return ResourceManager.GetString("InconsistencyTable", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;table&gt;
/// &lt;caption&gt;&lt;h3&gt;Report For Log $FILENAME$&lt;/h3&gt;&lt;/caption&gt;
/// &lt;tr&gt;
/// &lt;td&gt;
/// Target Protocol: $PROTOCOL$&lt;/td&gt;
/// &lt;td&gt;
/// Log File: $FILENAME$
/// &lt;/td&gt;
/// &lt;/tr&gt;
/// &lt;tr&gt;
/// &lt;td align=&quot;center&quot; class=&quot;TableCellHighlighted&quot; colspan=&quot;2&quot;&gt;
/// PTFConfigProperties
/// &lt;/td&gt;
/// &lt;/tr&gt;
/// $CONFIG$
/// &lt;tr&gt;
/// &lt;td align=&quot;center&quot; class=&quot;TableCellHighlighted&quot; colspan=&quot;2&quot;&gt; /// [rest of string was truncated]&quot;;.
/// </summary>
internal static string LogTable {
get {
return ResourceManager.GetString("LogTable", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;table&gt;
/// &lt;tr&gt;
/// &lt;td align=&quot;center&quot; class=&quot;TableCellHighlighted&quot; colspan=&quot;2&quot;&gt;
/// Requirement Coverage
/// &lt;/td&gt;
/// &lt;/tr&gt;
/// &lt;tr&gt;
/// &lt;td&gt;Total requirements&lt;/td&gt;
/// &lt;td&gt;$Total$&lt;/td&gt;
/// &lt;/tr&gt;
/// &lt;tr&gt;
/// &lt;td&gt;Normative, in-scope and testable requirements&lt;/td&gt;
/// &lt;td&gt;$Verifiable$&lt;/td&gt;
/// &lt;/tr&gt;
/// &lt;tr&gt;
/// &lt;td&gt;Verified requirements&lt;/td&gt;
/// &lt;td&gt;$Verified$
/// &lt;/td&gt;
/// &lt;/tr&gt;
/// [rest of string was truncated]&quot;;.
/// </summary>
internal static string ReqTable {
get {
return ResourceManager.GetString("ReqTable", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
///&lt;xs:schema targetNamespace=&quot;http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable&quot;
/// xmlns:xs=&quot;http://www.w3.org/2001/XMLSchema&quot;
/// xmlns:rt=&quot;http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable&quot;
/// elementFormDefault=&quot;qualified&quot; attributeFormDefault=&quot;unqualified&quot;&gt;
///
/// &lt;xs:simpleType name=&quot;isExtension_type&quot;&gt;
/// &lt;xs:restriction base=&quot;xs:string&quot;&gt;
/// &lt;!-- Non-extension or Extension --&gt;
/// [rest of string was truncated]&quot;;.
/// </summary>
internal static string requirementTable {
get {
return ResourceManager.GetString("requirementTable", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to
/// &lt;table cellpadding=&quot;2&quot; cellspacing=&quot;2&quot;&gt;
/// &lt;col /&gt;
/// &lt;thead&gt;
/// &lt;tr&gt;
/// &lt;td align=&quot;center&quot; class=&quot;TableCellHighlighted&quot; colspan=&quot;3&quot;&gt;
/// &lt;h4&gt;Requirement Inconsistencies&lt;/h4&gt;
/// &lt;/td&gt;
/// &lt;/tr&gt;
/// &lt;/thead&gt;
/// &lt;col /&gt;
/// &lt;tbody&gt;
/// &lt;tr&gt;
/// &lt;td colspan=&quot;2&quot; style=&quot;width: 87%;&quot;&gt;
/// $RSERRORS$
/// &lt;/td&gt;
/// &lt;td colspan=&quot;1&quot; style=&quot;width: 13%;&quot; title=&quot;click to see detail [rest of string was truncated]&quot;;.
/// </summary>
internal static string RSInconsistencyTable {
get {
return ResourceManager.GetString("RSInconsistencyTable", resourceCulture);
}
}
}
}

Просмотреть файл

@ -0,0 +1,645 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="GlobalTable" xml:space="preserve">
<value>&lt;table cellpadding="2" cellspacing="2"&gt;
&lt;caption&gt;&lt;h3&gt;$GLOBALTABLETITLE$&lt;br/&gt;
&lt;font color="#FF0000"&gt;$ErrorMessage$&lt;/font&gt;&lt;/h3&gt;
&lt;h4&gt;$GLOBALTABLEDISCRIPTION$&lt;/h4&gt;&lt;/caption&gt;
&lt;col /&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th colspan="2"&gt;Requirement Type&lt;/th&gt;&lt;th colspan="5"&gt;Count/Percent&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;col /&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="7"&gt;
&lt;h3&gt;
Checked Requirements: %totalChecked%
&lt;/h3&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="7" align="center"&gt;
Coverage of normative, in-scope requirements
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="4"&gt;
Checkable requirements
&lt;/td&gt;
&lt;td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Hide);ToggleAll('DerivedPartialVerify', this.offsetParent, Hide);ToggleAll('DerivedUnverified', this.offsetParent, Hide);ToggleAll('FinalVerified', this.offsetParent, Show);ToggleAll('FinalPartialVerify', this.offsetParent, Show);ToggleAll('FinalUnverified', this.offsetParent, Show);"&gt;
&lt;a href="#jump-detail"&gt;
$finalToVerified$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="4"&gt;
Completely checked requirements
&lt;/td&gt;
&lt;td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Hide);ToggleAll('DerivedPartialVerify', this.offsetParent, Hide);ToggleAll('DerivedUnverified', this.offsetParent, Hide);ToggleAll('FinalVerified', this.offsetParent, Show);ToggleAll('FinalPartialVerify', this.offsetParent, Hide);ToggleAll('FinalUnverified', this.offsetParent, Hide);"&gt;
&lt;a href="#jump-detail"&gt;
$finalVerified$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="4"&gt;
Partially checked requirements
&lt;/td&gt;
&lt;td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Hide);ToggleAll('DerivedPartialVerify', this.offsetParent, Hide);ToggleAll('DerivedUnverified', this.offsetParent, Hide);ToggleAll('FinalVerified', this.offsetParent, Hide);ToggleAll('FinalPartialVerify', this.offsetParent, Show);ToggleAll('FinalUnverified', this.offsetParent, Hide);"&gt;
&lt;a href="#jump-detail"&gt;
$finalPVerified$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="4"&gt;
Unchecked requirements
&lt;/td&gt;
&lt;td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Hide);ToggleAll('DerivedPartialVerify', this.offsetParent, Hide);ToggleAll('DerivedUnverified', this.offsetParent, Hide);ToggleAll('FinalVerified', this.offsetParent, Hide);ToggleAll('FinalPartialVerify', this.offsetParent, Hide);ToggleAll('FinalUnverified', this.offsetParent, Show);"&gt;
&lt;a href="#jump-detail"&gt;
$finalUVerified$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="7" align="center"&gt;
Coverage of derived requirements
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr &gt;
&lt;td colspan="4"&gt;
Derived requirements
&lt;/td&gt;
&lt;td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Show);ToggleAll('DerivedPartialVerify', this.offsetParent, Show);ToggleAll('DerivedUnverified', this.offsetParent, Show);ToggleAll('FinalVerified', this.offsetParent, Hide);ToggleAll('FinalPartialVerify', this.offsetParent, Hide);ToggleAll('FinalUnverified', this.offsetParent, Hide);"&gt;
&lt;a href="#jump-detail"&gt;
$derivedTotal$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr &gt;
&lt;td colspan="4"&gt;
Checked derived requirements
&lt;/td&gt;
&lt;td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Show);ToggleAll('DerivedPartialVerify', this.offsetParent, Show);ToggleAll('DerivedUnverified', this.offsetParent, Hide);ToggleAll('FinalVerified', this.offsetParent, Hide);ToggleAll('FinalPartialVerify', this.offsetParent, Hide);ToggleAll('FinalUnverified', this.offsetParent, Hide);"&gt;
&lt;a href="#jump-detail"&gt;
$derivedVerified$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr &gt;
&lt;td colspan="4"&gt;
Unchecked derived requirements
&lt;/td&gt;
&lt;td title="click to see details" colspan="3" onclick="ToggleAll('DerivedVerified', this.offsetParent, Hide);ToggleAll('DerivedPartialVerify', this.offsetParent, Hide);ToggleAll('DerivedUnverified', this.offsetParent, Show);ToggleAll('FinalVerified', this.offsetParent, Hide);ToggleAll('FinalPartialVerify', this.offsetParent, Hide);ToggleAll('FinalUnverified', this.offsetParent, Hide);"&gt;
&lt;a href="#jump-detail"&gt;
$derivedUnverified$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center" class="TableCellHighlighted" colspan="7"&gt;
&lt;a name="jump-detail"&gt;Details:&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="width: 12%;"&gt;
Req ID
&lt;/td&gt;
&lt;td&gt;
Description
&lt;/td&gt;
&lt;td&gt;
Doc Sect
&lt;/td&gt;
&lt;td&gt;
Scope
&lt;/td&gt;
&lt;td style="width: 10%;"&gt;
Status
&lt;/td&gt;
&lt;td style="width: 13%;"&gt;
Time Stamp
&lt;/td&gt;
&lt;td style="width: 10%;"&gt;
Log Files
&lt;/td&gt;
&lt;/tr&gt;
$DETAIL$
&lt;/tbody&gt;
&lt;/table&gt;&lt;br /&gt;</value>
</data>
<data name="HelpText" xml:space="preserve">
<value>{0} -
A utility which generates reports from PTF test logs and requirement table files.
{0} /log:&lt;xml log&gt; /table:&lt;requirements table&gt;[/out:report.html] [/replace] [/inscope:values] [/outofscope:values] [/prefix:MS-XXXX] [/verbose]
{0} /log:&lt;xml log&gt;[&lt;xml log&gt;....] /table:&lt;requirements table&gt;[&lt;requirements table&gt;...] [/out:report.html] [/replace] [/inscope:values] [/outofscope:values] [/prefix:MS-XXXX] [/verbose]
- OPTIONS -
/help
Prints this help message. Short form is '/?'.
/out:&lt;report.html&gt;
Specifies the report filename. Short form is '/o:'.
/log:&lt;xml log&gt;
Specifies the test log filename. Short form is '/l:'.
/table:&lt;requirement table&gt;
Specifies the requirement table filename. Short form is '/t:'.
/replace
Specifies the new output report file which will replace the old one.
Short form is '/r'. Optional.
/inscope:&lt;scope value&gt;
Specifies the in scope values which will be used to create in-scope rules.
This parameter must be used binding with '/outofscope' parameter.
Short form is '/ins:'. Optional, default values are 'Server+Both'.
/outofscope:&lt;scope values&gt;
Specifies the out scope values which will be used to create out-of-scope rules.
This parameter must be used binding with '/inscope' parameter.
Short form is '/oos:'. Optional, default values are 'Client'.
/delta:&lt;delta type of test report&gt;
Specifies the delta type of requirement coverage report, it can be a combination of the following options.
-New: all newly added(delta property is empty) requirements are calculated in the report.
-Changed: all changed requirements are calculated in the report.
-Unchanged: all requirements whose delta property are unchanged, section moved or editorial are calculated in the report.
Short form is '/d'. Optional.
/prefix:&lt;the prefix to build requirement id&gt;
Specifies the prefix which is used to generate requirement id, like MS-XXXX_R.
Short form is "/p:".
/verbose
Trigger the verbose mode. The verbose mode will dump the inconsistency table for requirement capturing.
Short form is "/v". Optional, ReportingTool will not dump that messages by default.
- ARGUMENTS -
&lt;xml log&gt; Filename of PTF test log in XML format.
&lt;requirement table&gt; Filename of requirement table, XML format document of protocols.
&lt;scope values&gt; String values of in-scope or out-of-scope.
The arguments should be based on the following syntax:
&lt;scope values&gt;::=&lt;word&gt;[&lt;separator&gt;&lt;scope values&gt;]
&lt;separator&gt;::="+"
&lt;word&gt;:: =string of numbers and letters (no special characters and spaces)
Multiple file arguments of the same type may be provided.</value>
</data>
<data name="HtmlTemplateFooter" xml:space="preserve">
<value>$GLOBALSTAT$
&lt;br/&gt;
$GLOBALRSINCONSISTENCY$
&lt;br/&gt;
$GLOBALINCONSISTENCY$
&lt;br/&gt;
$EXCLUDEDREQUIREMENTS$
&lt;/body&gt;
&lt;/html&gt;</value>
</data>
<data name="HtmlTemplateHeader" xml:space="preserve">
<value>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" &gt;
&lt;head&gt;
&lt;meta http-equiv="content-type" content="text/html; charset=UTF-8" /&gt;
&lt;title&gt;Reporting&lt;/title&gt;
&lt;style type="text/css"&gt;
table
{
width: 100%;
background-color: #f8f8f8;
border: 1px solid #505050;
border-collapse: collapse;
}
tbody tr td
{
border: 1px solid #505050;
}
.TableCellHighlighted
{
font-size: 1.1em;
background-color: #e0e0e0;
border: 1px solid #909090;
}
.Unverified
{
background-color: silver;
display: none;
}
.Verified
{
background-color: green;
display: none;
}
.NotToVerify
{
background-color: yellow;
display: none;
}
.DerivedUnverified
{
background-color: silver;
display: none;
}
.DerivedVerified
{
background-color: green;
display: none;
}
.DerivedPartialVerify
{
background-color: yellow;
display: none;
}
.FinalUnverified
{
background-color: silver;
display: none;
}
.FinalVerified
{
background-color: green;
display: none;
}
.FinalPartialVerify
{
background-color: yellow;
display: none;
}
.InconsistencyWarning
{
background-color: yellow;
display: none;
}
.InconsistencyError
{
background-color: red;
display: none;
}
.RSInconsistencyError
{
background-color: red;
display: none;
}
.RSInconsistencyWarning
{
background-color: yellow;
display: none;
}
.RSExcluded
{
background-color: red;
}
&lt;/style&gt;
&lt;script type="text/javascript"&gt;
function ToggleAll(className, parent, func)
{
var children = (parent !=null ? parent : document.body).getElementsByTagName('*');
var pattern = new RegExp("(^|\\s)" + className + "(\\s|$)");
for (var i = 0, length = children.length; i &lt; length; i++)
{
var child = children[i];
var elementClassName = child.className;
if (elementClassName.length == 0)
continue;
if (elementClassName == className || elementClassName.match(pattern))
func(child);
}
}
function Toggle(item)
{
var visible = (item.style.display != "none");
if (visible)
item.style.display = "none";
else
item.style.display = "table-row";
}
function Show(item)
{
item.style.display = "table-row";
}
function Hide(item)
{
item.style.display = "none";
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;noscript&gt;Please enable Javascript to view the details&lt;/noscript&gt;
</value>
</data>
<data name="RSInconsistencyTable" xml:space="preserve">
<value>
&lt;table cellpadding="2" cellspacing="2"&gt;
&lt;col /&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td align="center" class="TableCellHighlighted" colspan="3"&gt;
&lt;h4&gt;Requirement Inconsistencies&lt;/h4&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;col /&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="2" style="width: 87%;"&gt;
$RSERRORS$
&lt;/td&gt;
&lt;td colspan="1" style="width: 13%;" title="click to see details" onclick="ToggleAll('RSInconsistencyError', this.offsetParent, Show);"&gt;
&lt;a href="#jump-rsinconsistencyerrors"&gt;
$RSInconsistentErrorsCount$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="2" style="width: 87%;"&gt;
$RSWARNINGS$
&lt;/td&gt;
&lt;td colspan="1" style="width: 13%;" title="click to see details" onclick="ToggleAll('RSInconsistencyWarning', this.offsetParent, Show);"&gt;
&lt;a href="#jump-rsinconsistencywarnings"&gt;
$RSInconsistentWarningsCount$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
$RSINCONSISTENCYERRORS$
$RSINCONSISTENCYWARNINGS$
&lt;/tbody&gt;
&lt;/table&gt;
</value>
</data>
<data name="InconsistencyTable" xml:space="preserve">
<value>&lt;table cellpadding="2" cellspacing="2"&gt;
&lt;col/&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td align="center" class="TableCellHighlighted" colspan="7"&gt;
&lt;h4&gt;Requirement Verification Inconsistencies&lt;/h4&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th colspan="3"&gt;Inconsistency type&lt;/th&gt;
&lt;th colspan="4"&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;col/&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="3"&gt;
$InconsistentErrors$
&lt;/td&gt;
&lt;td colspan="4" title="click to see details" onclick="ToggleAll('InconsistencyError', this.offsetParent, Show);"&gt;
&lt;a href="#jump-inconsistencyerrors"&gt;
$InconsistentErrorsCount$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="3"&gt;
$InconsistentWarnings$
&lt;/td&gt;
&lt;td colspan="4" title="click to see details" onclick="ToggleAll('InconsistencyWarning', this.offsetParent, Show);"&gt;
&lt;a href="#jump-inconsistencywarnings"&gt;
$InconsistentWarningsCount$
&lt;/a &gt;
&lt;/td&gt;
&lt;/tr&gt;
$InconsistentErrorsDETAIL$
$InconsistentWarningsDETAIL$
&lt;/tbody&gt;
&lt;/table&gt;&lt;br /&gt;</value>
</data>
<data name="LogTable" xml:space="preserve">
<value> &lt;table&gt;
&lt;caption&gt;&lt;h3&gt;Report For Log $FILENAME$&lt;/h3&gt;&lt;/caption&gt;
&lt;tr&gt;
&lt;td&gt;
Target Protocol: $PROTOCOL$&lt;/td&gt;
&lt;td&gt;
Log File: $FILENAME$
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center" class="TableCellHighlighted" colspan="2"&gt;
PTFConfigProperties
&lt;/td&gt;
&lt;/tr&gt;
$CONFIG$
&lt;tr&gt;
&lt;td align="center" class="TableCellHighlighted" colspan="2"&gt;
PTFTestResult
&lt;/td&gt;
&lt;/tr&gt;
$TESTRESULT$
&lt;tr&gt;
&lt;td&gt;
CoveredRequirements
&lt;/td&gt;
&lt;td&gt;
$Verified$
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</value>
</data>
<data name="ReqTable" xml:space="preserve">
<value> &lt;table&gt;
&lt;tr&gt;
&lt;td align="center" class="TableCellHighlighted" colspan="2"&gt;
Requirement Coverage
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total requirements&lt;/td&gt;
&lt;td&gt;$Total$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Normative, in-scope and testable requirements&lt;/td&gt;
&lt;td&gt;$Verifiable$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verified requirements&lt;/td&gt;
&lt;td&gt;$Verified$
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unverified requirements&lt;/td&gt;
&lt;td&gt;$Unverified$
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</value>
</data>
<data name="ExcludReqTable" xml:space="preserve">
<value>&lt;table cellpadding="2" cellspacing="2"&gt;
&lt;caption&gt;&lt;h3&gt;Requirements Excluded From Failed Cases&lt;/h3&gt;&lt;/caption&gt;
&lt;col /&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td style="width: 12%;" class="TableCellHighlighted"&gt;
Req ID
&lt;/td&gt;
&lt;td class="TableCellHighlighted"&gt;
Description
&lt;/td&gt;
&lt;td style="width: 10%;" class="TableCellHighlighted"&gt;
TestCase
&lt;/td&gt;
&lt;td style="width: 10%;" class="TableCellHighlighted"&gt;
TestResult
&lt;/td&gt;
&lt;td style="width: 13%;" class="TableCellHighlighted"&gt;
TimeStamp
&lt;/td&gt;
&lt;td style="width: 10%;" class="TableCellHighlighted"&gt;
Log Files
&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
$ExcReqs$
&lt;/tbody&gt;
&lt;/table&gt;&lt;br /&gt;</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="requirementTable" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>requirementTable.xsd;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="InconsistencyErrorMessage" xml:space="preserve">
<value>&lt;br /&gt;The following data might not be accurate due to inconsistencies found in the requirements, please see &lt;a href='#jump-rsinconsistencyerrors'&gt;Requirement Inconsistencies&lt;/a&gt; for details.</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,704 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Xml.Serialization;
using System.Collections.ObjectModel;
namespace Microsoft.Protocols.ReportingTool
{
/// <summary>
/// RT internal use only to dump the requirements.
/// Collection of requirement which can be serialized.
/// </summary>
[Serializable]
[XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
[XmlRootAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable", IsNullable = false, ElementName = "ReqTable")]
public class RequirementCollection
{
private List<SerializableRequirement> requirements = new List<SerializableRequirement>();
/// <summary>
/// Get all requirement objects.
/// </summary>
[XmlElementAttribute("Requirement")]
public SerializableRequirement[] Requirements
{
get
{
return this.requirements.ToArray();
}
set
{
if (value == null)
{
throw new ArgumentNullException("value");
}
this.requirements.Clear();
AddRequirements(value);
}
}
/// <summary>
/// Add requirements to collection
/// </summary>
/// <param name="items">The requirement to be added</param>
public void AddRequirements(SerializableRequirement[] items)
{
foreach (SerializableRequirement req in items)
{
if (!this.requirements.Contains(req))
{
this.requirements.Add(req);
}
}
}
/// <summary>
/// Sort the order of the requirements in collection.
/// </summary>
public void Sort()
{
this.requirements.Sort();
}
}
/// <summary>
/// RT internal use only to dump the requirements.
/// A serializable object to represent a requirement.
/// </summary>
[SerializableAttribute()]
[XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
public class SerializableRequirement : IComparable<SerializableRequirement>
{
#region Fields
//required
private string req_IDField;
//optional
private string doc_SectField;
private bool doc_SectFieldSpecified;
//required
private string descriptionField;
//optional
private string posField;
private bool posFieldSpecified;
//optional
private string negField;
private bool negFieldSpecified;
//optional
private string derivedField;
private bool derivedFieldSpecified;
//optional
private string scenarioField;
private bool scenarioFieldSpecified;
//optional
private IsExtensionType isExtensionField;
private bool isExtensionFieldSpecified;
//optional
private BehaviorType behaviorField;
private bool behaviorFieldSpecified;
//optional
private ActorType actorField;
private bool actorFieldSpecified;
//optional
private string scopeField;
private bool scopeFieldSpecified;
//optional
private PriorityType priorityField;
private bool priorityFieldSpecified;
//required
private IsNormativeType isNormativeField;
//required
private VerificationType verificationField;
//optional
private string verificationCommentField;
private bool verificationCommentFieldSpecified;
//additional property
private IsCoveredType coveredStatus;
#endregion
#region Properties
/// <remarks/>
public string REQ_ID
{
get
{
return this.req_IDField;
}
set
{
this.req_IDField = value;
}
}
/// <remarks/>
public string Doc_Sect
{
get
{
return this.doc_SectField;
}
set
{
this.doc_SectField = value;
}
}
[XmlIgnoreAttribute()]
public bool Doc_SectSpecified
{
get
{
return this.doc_SectFieldSpecified;
}
set
{
this.doc_SectFieldSpecified = value;
}
}
/// <remarks/>
public string Description
{
get
{
return this.descriptionField;
}
set
{
this.descriptionField = value;
}
}
/// <remarks/>
public string Pos
{
get
{
return this.posField;
}
set
{
this.posField = value;
}
}
[XmlIgnoreAttribute()]
public bool PosSpecified
{
get
{
return this.posFieldSpecified;
}
set
{
this.posFieldSpecified = value;
}
}
/// <remarks/>
public string Neg
{
get
{
return this.negField;
}
set
{
this.negField = value;
}
}
[XmlIgnoreAttribute()]
public bool NegSpecified
{
get
{
return negFieldSpecified;
}
set
{
this.negFieldSpecified = value;
}
}
/// <remarks/>
public string Derived
{
get
{
return this.derivedField;
}
set
{
this.derivedField = value;
}
}
[XmlIgnoreAttribute()]
public bool DerivedSpecified
{
get
{
return this.derivedFieldSpecified;
}
set
{
this.derivedFieldSpecified = value;
}
}
/// <remarks/>
public string Scenario
{
get
{
return this.scenarioField;
}
set
{
this.scenarioField = value;
}
}
[XmlIgnoreAttribute()]
public bool ScenarioSpecified
{
get
{
return this.scenarioFieldSpecified;
}
set
{
this.scenarioFieldSpecified = value;
}
}
/// <remarks/>
public IsExtensionType IsExtension
{
get
{
return this.isExtensionField;
}
set
{
this.isExtensionField = value;
}
}
/// <remarks/>
[XmlIgnoreAttribute()]
public bool IsExtensionSpecified
{
get
{
return this.isExtensionFieldSpecified;
}
set
{
this.isExtensionFieldSpecified = value;
}
}
/// <remarks/>
public BehaviorType Behavior
{
get
{
return this.behaviorField;
}
set
{
this.behaviorField = value;
}
}
/// <remarks/>
[XmlIgnoreAttribute()]
public bool BehaviorSpecified
{
get
{
return this.behaviorFieldSpecified;
}
set
{
this.behaviorFieldSpecified = value;
}
}
/// <remarks/>
public ActorType Actor
{
get
{
return this.actorField;
}
set
{
this.actorField = value;
}
}
/// <remarks/>
[XmlIgnoreAttribute()]
public bool ActorSpecified
{
get
{
return this.actorFieldSpecified;
}
set
{
this.actorFieldSpecified = value;
}
}
/// <remarks/>
public string Scope
{
get
{
return this.scopeField;
}
set
{
this.scopeField = value;
}
}
[XmlIgnoreAttribute()]
public bool ScopeSpecified
{
get
{
return this.scopeFieldSpecified;
}
set
{
this.scopeFieldSpecified = value;
}
}
/// <remarks/>
public PriorityType Priority
{
get
{
return this.priorityField;
}
set
{
this.priorityField = value;
}
}
/// <remarks/>
[XmlIgnoreAttribute()]
public bool PrioritySpecified
{
get
{
return this.priorityFieldSpecified;
}
set
{
this.priorityFieldSpecified = value;
}
}
/// <remarks/>
public IsNormativeType IsNormative
{
get
{
return this.isNormativeField;
}
set
{
this.isNormativeField = value;
}
}
/// <remarks/>
public VerificationType Verification
{
get
{
return this.verificationField;
}
set
{
this.verificationField = value;
}
}
/// <remarks/>
public string VerificationComment
{
get
{
return this.verificationCommentField;
}
set
{
this.verificationCommentField = value;
}
}
[XmlIgnoreAttribute()]
public bool VerificationCommentSpecified
{
get
{
return this.verificationCommentFieldSpecified;
}
set
{
this.verificationCommentFieldSpecified = value;
}
}
/// <remarks/>
public IsCoveredType CoveredStatus
{
get
{
return this.coveredStatus;
}
set
{
this.coveredStatus = value;
}
}
#endregion
#region IComparable<SerializableRequirement> Members
public int CompareTo(SerializableRequirement other)
{
if (other == null)
{
throw new ArgumentNullException("other");
}
int ret = 0;
//try get the number from Id to compare.
Regex regex = new Regex(@"\d+");
if (regex.IsMatch(this.req_IDField) &&
regex.IsMatch(other.req_IDField))
{
Match thisMatch = regex.Match(this.req_IDField);
Match otherMatch = regex.Match(other.req_IDField);
ulong thisId = ulong.Parse(thisMatch.Value);
ulong otherId = ulong.Parse(otherMatch.Value);
ret = thisId.CompareTo(otherId);
}
//if no number or the same numbers.
if (ret == 0)
{
ret = this.req_IDField.CompareTo(other.req_IDField);
}
return ret;
}
#endregion
}
/// <summary>
/// Extension type
/// </summary>
[SerializableAttribute()]
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
public enum IsExtensionType
{
/// <summary>
/// Non-extension type
/// </summary>
[XmlEnumAttribute("Non-extension")]
Nonextension,
/// <summary>
/// Extension type
/// </summary>
Extension,
}
/// <summary>
/// Behavior type
/// </summary>
[SerializableAttribute()]
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
public enum BehaviorType
{
/// <summary>
/// Protocol behavior
/// </summary>
Protocol,
/// <summary>
/// Windows behavior
/// </summary>
Windows,
/// <summary>
/// Product behavior
/// </summary>
Product,
/// <summary>
/// Microsoft product specific
/// </summary>
Microsoft,
}
/// <summary>
/// Actor Type
/// </summary>
[SerializableAttribute()]
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
public enum ActorType
{
/// <summary>
/// Act as client side
/// </summary>
Client,
/// <summary>
/// Act as server side
/// </summary>
Server,
/// <summary>
/// Act as both client and server sides
/// </summary>
Both,
}
/// <summary>
/// Requirement priority type
/// </summary>
[SerializableAttribute()]
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
public enum PriorityType
{
/// <summary>
/// P0 level requirement
/// </summary>
p0,
/// <summary>
/// P1 level requirement
/// </summary>
p1,
/// <summary>
/// P2 level requirement
/// </summary>
p2,
}
/// <summary>
/// Normative/Informative type
/// </summary>
[SerializableAttribute()]
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
public enum IsNormativeType
{
/// <summary>
/// The normative type
/// </summary>
Normative,
/// <summary>
/// The informative type
/// </summary>
Informative,
}
/// <summary>
/// Requirement verification type
/// </summary>
[SerializableAttribute()]
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
public enum VerificationType
{
/// <summary>
/// Non-testable requirement
/// </summary>
[XmlEnumAttribute("Non-testable")]
Nontestable,
/// <summary>
/// Adapter requirement
/// </summary>
Adapter,
/// <summary>
/// Test Case requirement
/// </summary>
[XmlEnumAttribute("Test Case")]
TestCase,
/// <summary>
/// Unverified requirement
/// </summary>
Unverified,
/// <summary>
/// Deleted requirement
/// </summary>
Deleted,
}
/// <summary>
/// Requirement covered status
/// </summary>
[SerializableAttribute()]
[XmlTypeAttribute(Namespace = "http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable")]
public enum IsCoveredType
{
/// <summary>
/// The requirement is not covered
/// </summary>
[XmlEnumAttribute("Not Covered")]
NotCovered,
/// <summary>
/// The requirement is covered
/// </summary>
Covered,
}
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу

1030
src/reportingtool/TestLog.cs Normal file

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,380 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Data;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.Text.RegularExpressions;
namespace Microsoft.Protocols.ReportingTool
{
internal class XmlLogAnalyzer
{
const string CHECKPOINT = "Checkpoint";
const string COMMENT = "Comment";
const string TESTPASSED = "TestPassed";
const string SETTINGS = "Settings";
const string CHECKPOINTSTATEMENT = "kind <> '" + CHECKPOINT + "'";
const string CONFPROP = "PTFConfigProperties.";
const string TESTRESULT = "PTFTestResult.";
const string COMMENTSTATEMENT = "kind = '" + COMMENT + "'";
const string SETTINGSSTATEMENT = "kind = '" + SETTINGS + "'";
//Test result
private static string[][] testStatusName = new string[7][] {
new string[2] {"TestPassed", "TestsPassed"},
new string[2] {"TestFailed", "TestsFailed"},
new string[2]{"TestInconclusive", "TestsInconclusive" },
new string[2]{"TestError", "TestsError" },
new string[2]{ "TestAborted", "TestsAborted"},
new string[2]{"TestTimeout", "TestsTimeout" },
new string[2] { "TestUnknown", "TestsUnknown"} };
const string TESTOUTCOMESTATEMENT = "kind = '{0}'";
// NOTICE: these two patterns are only used in TSD internally.
static readonly Regex MSPATTERN = new Regex(@"^MS-[A-Za-z0-9]{2,8}_R\d{1,4}$", RegexOptions.Compiled);
static readonly Regex RFCPATTERN = new Regex(@"^RFC\d{2,5}_R\d{1,4}$", RegexOptions.Compiled);
// Use Dictionay as a Set
private Dictionary<string, string> checkpointEntries;
// All key:value pair of PTF configurations.
private Dictionary<string, string> ptfConfigurations;
// All TestResultType:Counter pair of Test Results stored in test log.
private Dictionary<string, string> testResult;
// Protocols covered by the test.
private List<string> protocols;
// All test cases with test outcome, key: test case name, value: test outcome
private Dictionary<string, string> testCases;
// All excluded requirements, key: req_id, value: test case name
private Dictionary<string, string> excludedRequirements;
// Timestamps for all excluded requirements, key: req_id, value: timestamp
private Dictionary<string, string> excludedRequirementsTimestamp;
protected XmlLogAnalyzer()
{
protocols = new List<string>();
}
public XmlLogAnalyzer(string logFilename)
: this()
{
IList<string> filenames = new List<string>();
filenames.Add(logFilename);
Load(filenames);
}
public XmlLogAnalyzer(StringCollection logFilenames)
: this()
{
IList<string> filenames = new List<string>();
foreach (string filename in logFilenames)
{
filenames.Add(filename);
}
Load(filenames);
}
public XmlLogAnalyzer(IList<string> logFilenames)
: this()
{
Load(logFilenames);
}
private void Load(IList<string> logFilenames)
{
string currentFile = string.Empty;
try
{
TestLog logEntry = null;
TestLog tempLogEntry = new TestLog();
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = null;
foreach (string logfile in logFilenames)
{
currentFile = logfile;
//allow log file contain zero entry.
if (logEntry == null)
{
logEntry = new TestLog();
logEntry.ReadXml(XmlReader.Create(logfile, settings));
}
else
{
tempLogEntry.ReadXml(XmlReader.Create(logfile, settings));
logEntry.Merge(tempLogEntry);
tempLogEntry.Clear();
}
}
tempLogEntry.Dispose();
currentFile = string.Empty;
// get all ptf configurations
GetStatsFromLogEntry(logEntry, ref ptfConfigurations, CONFPROP, SETTINGSSTATEMENT);
// get all test results
GetStatsFromLogEntry(logEntry, ref testResult, TESTRESULT, COMMENTSTATEMENT);
//group all test cases by test outcome
GetTestCasesWithOutcome(logEntry);
// remove all entries except Checkpoint kind log entries
DataRow[] rows = logEntry.LogEntry.Select(CHECKPOINTSTATEMENT);
foreach (DataRow row in rows)
{
row.Delete();
}
logEntry.LogEntry.AcceptChanges();
// fill data for checkpoints
FillCheckpointEntries(logEntry.LogEntry);
logEntry.Dispose();
}
catch (Exception e)
{
throw new InvalidOperationException(
String.Format("[ERROR] Unable to get test log data from specified xml log file(s) {0}. Details:\r\n{1}", currentFile, e.Message + e.StackTrace));
}
}
private void GetTestCasesWithOutcome(TestLog logEntry)
{
if (testCases == null)
{
testCases = new Dictionary<string, string>();
}
foreach (string[] valuePair in testStatusName)
{
DataRow[] rows = logEntry.LogEntry.Select(
string.Format(TESTOUTCOMESTATEMENT, valuePair[0]));
if (rows.Length == 0 && testResult.ContainsKey(valuePair[1]))
{
Warning("[Warning] The log entry kind '{0}' should be enabled.", valuePair[0]);
}
else
{
foreach (DataRow row in rows)
{
//get the test case name from the testfailed, testinconclusive, testpassed,
//testerror, testtimeout, testaborted or testunknown log entries.
string testCaseName = (row as TestLog.LogEntryRow).Message.Trim();
testCases[testCaseName] = valuePair[0];
}
}
}
}
/// <summary>
/// Parses key:value string pairs by specified match string from log entries.
/// </summary>
/// <param name="logEntry">The log entry dataset which contains all log entries.</param>
/// <param name="dict">The dictionary which contains the matching key:value pairs.</param>
/// <param name="matchString">The string to match. "matchString : value" is a valid log entry message.</param>
/// <param name="filter">The filter expression to select log messages</param>
private static void GetStatsFromLogEntry(TestLog logEntry, ref Dictionary<string, string> dict, string matchString, string filter)
{
if (dict == null)
{
dict = new Dictionary<string, string>();
}
DataRow[] rows = logEntry.LogEntry.Select(filter);
if (rows.Length == 0)
{
Warning("[Warning] The log entry kind 'Comment' and 'Settings' should be enabled.");
}
foreach (DataRow row in rows)
{
string tmp = (row as TestLog.LogEntryRow).Message;
if (tmp.StartsWith(matchString))
{
tmp = tmp.Remove(0, matchString.Length);
int index = tmp.IndexOf(":");
if (index != -1)
{
string key = tmp.Substring(0, index);
string value = tmp.Substring(index + 1);
if (!dict.ContainsKey(key))
{
dict.Add(key, value);
}
else
{
dict[key] = value;
}
if (key == "TestsExecuted")
{
DateTime stamp = ((TestLog.LogEntryRow)row).timeStamp;
dict.Add("TimeStamp", stamp.ToString());
}
}
}
}
}
/// <summary>
/// Stores all checkpoint log entry messages to <c ref="checkpointEntries"></c>
/// </summary>
/// <param name="dt">The datatable contias all checkpoint log entries</param>
private void FillCheckpointEntries(TestLog.LogEntryDataTable dt)
{
if (checkpointEntries == null)
{
checkpointEntries = new Dictionary<string, string>();
}
if (excludedRequirements == null)
{
excludedRequirements = new Dictionary<string, string>();
}
if (excludedRequirementsTimestamp == null)
{
excludedRequirementsTimestamp = new Dictionary<string, string>();
}
foreach (TestLog.LogEntryRow entry in dt)
{
//excluding captured requirements from failed test cases.
if (!entry.IstestCaseNull() && !string.IsNullOrEmpty(entry.testCase))
{
//requirements covered in failed test case.
if (testCases.ContainsKey(entry.testCase) &&
string.Compare(testCases[entry.testCase], TESTPASSED, true) != 0)
{
if (!excludedRequirements.ContainsKey(entry.Message))
{
excludedRequirements.Add(entry.Message, entry.testCase);
excludedRequirementsTimestamp.Add(
entry.Message, entry.timeStamp.ToString());
}
continue;
}
}
if (!checkpointEntries.ContainsKey(entry.Message))
{
checkpointEntries.Add(entry.Message, entry.timeStamp.ToString());
// parse protocol name from message string
Match ms = MSPATTERN.Match(entry.Message);
Match rfc = RFCPATTERN.Match(entry.Message);
if (ms.Success || rfc.Success)
{
string protocol = entry.Message.Remove(entry.Message.IndexOf('_'));
if (!protocols.Contains(protocol))
{
protocols.Add(protocol);
}
}
else
{
//Remove the schema restriction to the reqirement id
//The protocols will not be parse from message string.
continue;
}
}
}
}
private static void Warning(string format, params object[] args)
{
string message = string.Format(format, args);
if (ReportingLog.Log != null)
{
ReportingLog.Log.TraceWarning(message);
}
else
{
Console.WriteLine(message);
}
}
/// <summary>
/// The dictionary contains test case names and test outcomes.
/// </summary>
public Dictionary<string, string> AllTestCases
{
get
{
return testCases;
}
}
/// <summary>
/// The dictionary contains excluded requirements id and test case the req belong to.
/// </summary>
public Dictionary<string, string> ExcludedRequirements
{
get
{
return excludedRequirements;
}
}
/// <summary>
/// The dictionary contains excluded requirments id and timestamps.
/// </summary>
public Dictionary<string, string> ExcludedRequirementsTimestamp
{
get
{
return excludedRequirementsTimestamp;
}
}
/// <summary>
/// The dictionary contains the covered requirement ids and time stamp of checkpoint.
/// </summary>
public Dictionary<string, string> CoveredRequirements
{
get
{
if (checkpointEntries == null)
{
checkpointEntries = new Dictionary<string, string>();
}
return checkpointEntries;
}
}
/// <summary>
/// The dictionary contains all PTF configuration values.
/// </summary>
public Dictionary<string, string> PTFConfigurations
{
get
{
if (ptfConfigurations == null)
{
ptfConfigurations = new Dictionary<string, string>();
}
return ptfConfigurations;
}
}
/// <summary>
/// The dictionary contains all PTF test result values.
/// </summary>
public Dictionary<string, string> TestResult
{
get
{
if (testResult == null)
{
testResult = new Dictionary<string, string>();
}
return testResult;
}
}
/// <summary>
/// A list of covered protocols
/// </summary>
public List<string> Protocols
{
get
{
return protocols;
}
}
}
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:rt="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:simpleType name="isExtension_type">
<xs:restriction base="xs:string">
<!-- Non-extension or Extension -->
<xs:enumeration value="Non-extension"/>
<xs:enumeration value="Extension"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="behavior_type">
<xs:restriction base="xs:string">
<!-- Protocol or Windows -->
<xs:enumeration value="Protocol"/>
<xs:enumeration value="Windows"/>
<xs:enumeration value="Product"/>
<xs:enumeration value="Microsoft"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="actor_type">
<xs:restriction base="xs:string">
<!-- Client, Server or Both -->
<xs:enumeration value="Client"/>
<xs:enumeration value="Server"/>
<xs:enumeration value="Both"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="scope_type">
<xs:restriction base="xs:string">
<!-- Client, Server or Both -->
<xs:pattern value ="^(\w|_)+$"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="priority_type">
<xs:restriction base="xs:string">
<!-- p0, p1 or p2 -->
<xs:enumeration value="p0"/>
<xs:enumeration value="p1"/>
<xs:enumeration value="p2"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="isNormative_type">
<xs:restriction base="xs:string">
<!-- Normative or Informative -->
<xs:enumeration value="Normative"/>
<xs:enumeration value="Informative"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="verification_type">
<xs:restriction base="xs:string">
<!-- Non-testable, Adapter, Test Case or Unverified -->
<xs:enumeration value="Non-testable"/>
<xs:enumeration value="Adapter"/>
<xs:enumeration value="Test Case"/>
<xs:enumeration value="Unverified"/>
<xs:enumeration value ="Deleted"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name ="delta_type">
<xs:restriction base ="xs:string">
<xs:enumeration value ="Changed"/>
<xs:enumeration value ="Deleted"/>
<xs:enumeration value ="Editorial"/>
<xs:enumeration value ="SectionDeleted"/>
<xs:enumeration value ="SectionMoved"/>
<xs:enumeration value ="Unchanged"/>
</xs:restriction>
</xs:simpleType>
<!-- Root element, attributes of this element should not be changed. -->
<xs:element name="ReqTable">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="Requirement">
<xs:complexType>
<xs:all>
<xs:element name="REQ_ID" type="xs:string"/>
<!-- <REQ_ID>MS-KILE_R1</REQ_ID> -->
<xs:element name="Doc_Sect" type="xs:string" minOccurs ="0" maxOccurs ="1"/>
<!-- <Doc_Sect>3.2.2</Doc_Sect> -->
<xs:element name="Description" type="xs:string"/>
<!-- <Description>Verify Tickets are removed from the cache once they have expired.</Description> optional -->
<xs:element name ="Pos" type ="xs:string" minOccurs ="0" maxOccurs ="1"/>
<!--<Pos>Requirement describing affect of this cause.</Pos>-->
<xs:element name ="Neg" type ="xs:string" minOccurs ="0" maxOccurs ="1"/>
<!--<Neg>Requirement describing affect of this cause not occurring.</Neg> optional-->
<xs:element name ="Derived" type ="xs:string" minOccurs ="0" maxOccurs ="1"/>
<!--<Derived>Requirement(s) this specific requirement is derived as a more specific case from.</Derived> optional-->
<xs:element name="Scenario" type="xs:string" minOccurs ="0" maxOccurs ="1"/>
<!-- <Scenario>S1, S2</Scenario> -->
<xs:element name="IsExtension" type="rt:isExtension_type" minOccurs ="0" maxOccurs ="1"/>
<!-- <IsExtension>Extension</IsExtension> -->
<xs:element name="Behavior" type="rt:behavior_type" minOccurs ="0" maxOccurs ="1"/>
<!-- <Behavior>Protocol</Behavior> -->
<xs:element name="Actor" type="rt:actor_type" maxOccurs ="1" minOccurs ="0"/>
<xs:element name="Scope" type="rt:scope_type" maxOccurs ="1" minOccurs ="0"/>
<!-- <Actor>Client</Actor> or <Scope>Server</Scope> -->
<xs:element name="Priority" type="rt:priority_type" minOccurs ="0" maxOccurs ="1"/>
<!-- <Priority>p1</Priority> -->
<xs:element name="IsNormative" type="rt:isNormative_type"/>
<!-- <IsNormative>TRUE</IsNormative> -->
<xs:element name="Verification" type="rt:verification_type"/>
<!-- <Verification>Adapter</Verification> -->
<xs:element name="VerificationComment" type="xs:string" minOccurs ="0" maxOccurs ="1"/>
<!-- <VerificationComment>Why the requirement is non-verifiable or unverified</VerificationComment> -->
<xs:element name="ReviewComment" type="xs:string" minOccurs ="0" maxOccurs ="1"/>
<xs:element name="InternalId" type="xs:string" minOccurs ="0" maxOccurs ="1"/>
<xs:element name ="TDTextDiff" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name ="Delta" type="rt:delta_type" minOccurs ="0" maxOccurs="1"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="Unique_REQ_ID">
<xs:selector xpath="rt:Requirement"/>
<xs:field xpath="rt:REQ_ID"/>
</xs:unique>
</xs:element>
</xs:schema>

Просмотреть файл

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="Local" id="b3852d91-e8e8-46ef-a881-a0b4142b4961" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<Description>These are default test settings for a local test run.</Description>
<Deployment>
<DeploymentItem filename="..\testtools\config\site.ptfconfig" />
<DeploymentItem filename="..\testtools\config\TestConfig.xsd" />
<DeploymentItem filename="TestLogging\TestLogging.ptfconfig" />
<DeploymentItem filename="TestRequirementCapture\TestRequirementCapture.ptfconfig" />
<DeploymentItem filename="TestProperties\TestProperties.ptfconfig" />
<DeploymentItem filename="TestProperties\TestProperties.deployment.ptfconfig" />
<DeploymentItem filename="TestProperties\Base.ptfconfig" />
<DeploymentItem filename="TestChecker\TestChecker.ptfconfig" />
<DeploymentItem filename="TestAdapter\TestAdapter.ptfconfig" />
<DeploymentItem filename="TestAdapter\Powershell\" />
<DeploymentItem filename="TestAdapter\CommandLine\" />
</Deployment>
<Execution hostProcessPlatform="MSIL">
<TestTypeSpecific>
<UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b">
<AssemblyResolution>
<TestDirectory useLoadContext="true" />
</AssemblyResolution>
</UnitTestRunConfig>
<WebTestRunConfiguration testTypeId="4e7599fa-5ecb-43e9-a887-cd63cf72d207">
<Browser name="Internet Explorer 7.0">
<Headers>
<Header name="User-Agent" value="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" />
<Header name="Accept" value="*/*" />
<Header name="Accept-Language" value="{{$IEAcceptLanguage}}" />
<Header name="Accept-Encoding" value="GZIP" />
</Headers>
</Browser>
</WebTestRunConfiguration>
</TestTypeSpecific>
<AgentRule name="LocalMachineDefaultRole">
</AgentRule>
</Execution>
</TestSettings>

Просмотреть файл

@ -0,0 +1,7 @@
:: Copyright (c) Microsoft. All rights reserved.
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
REM User can get the property value and use it directly in the script via the environment variables with “ptfprop” prefix.
echo PtfAdReturn="%ptfpropFeatureName%""
exit 0

Просмотреть файл

@ -0,0 +1,14 @@
:: Copyright (c) Microsoft. All rights reserved.
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
REM PTF invokes a cmd script using the following parameters:
REM %1% [PtfAdReturn:<type of returnValue>;][<name of outParam1>:<type of outParam1>[;<name of outParam2>:<type of outParam2>]…]
REM %2% [<name of inParam1>:<type of inParam1>[;<name of inParam2>:<type of inParam2]
REM %3% Help text of the method.
REM %4% First input parameter.
REM %5% Second input parameter.
echo PtfAdReturn=%3
exit 0

Просмотреть файл

@ -0,0 +1,12 @@
:: Copyright (c) Microsoft. All rights reserved.
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
REM PTF invokes a cmd script using the following parameters:
REM %1% [PtfAdReturn:<type of returnValue>;][<name of outParam1>:<type of outParam1>[;<name of outParam2>:<type of outParam2>]…]
REM %2% [<name of inParam1>:<type of inParam1>[;<name of inParam2>:<type of inParam2]
REM %3% Help text of the method.
REM %4% First input parameter.
REM %5% Second input parameter.
echo PtfAdReturn=%2
exit 0

Просмотреть файл

@ -0,0 +1,12 @@
:: Copyright (c) Microsoft. All rights reserved.
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
REM PTF invokes a cmd script using the following parameters:
REM %1% [PtfAdReturn:<type of returnValue>;][<name of outParam1>:<type of outParam1>[;<name of outParam2>:<type of outParam2>]…]
REM %2% [<name of inParam1>:<type of inParam1>[;<name of inParam2>:<type of inParam2]
REM %3% Help text of the method.
REM %4% First input parameter.
REM %5% Second input parameter.
echo PtfAdReturn=%4
exit 0

Просмотреть файл

@ -0,0 +1,12 @@
:: Copyright (c) Microsoft. All rights reserved.
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
REM PTF invokes a cmd script using the following parameters:
REM %1% [PtfAdReturn:<type of returnValue>;][<name of outParam1>:<type of outParam1>[;<name of outParam2>:<type of outParam2>]…]
REM %2% [<name of inParam1>:<type of inParam1>[;<name of inParam2>:<type of inParam2]
REM %3% Help text of the method.
REM %4% First input parameter.
REM %5% Second input parameter.
echo PtfAdReturn=%1
exit 0

Просмотреть файл

@ -0,0 +1,7 @@
:: Copyright (c) Microsoft. All rights reserved.
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
REM Pass a failure message back to PTF
echo PtfAdFailureMessage="PtfAdFailureMessage"
exit -1

Просмотреть файл

@ -0,0 +1,7 @@
:: Copyright (c) Microsoft. All rights reserved.
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
REM Command "set ptfprop" can be used in the script to display all properties in the PTFconfig.
set ptfprop
exit 0

Просмотреть файл

@ -0,0 +1,6 @@
#############################################################################
# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
#############################################################################
return $value

Просмотреть файл

@ -0,0 +1,6 @@
#############################################################################
# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
#############################################################################
return $number

Просмотреть файл

@ -0,0 +1,6 @@
#############################################################################
# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
#############################################################################
return $str

Просмотреть файл

@ -0,0 +1,7 @@
#############################################################################
# Copyright (c) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE file in the project root for full license information.
#############################################################################
# Throw an exception
throw $exceptionMessage

Просмотреть файл

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("TestAdapter")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TestAdapter")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("192855d0-6d37-4cc5-9f2e-1e0570a5e2e1")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>
</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Microsoft.Protocols.TestTools.Test.TestAdapter</RootNamespace>
<AssemblyName>TestAdapter</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="TestManagedAdapter.cs" />
<Compile Include="TestInteractiveAdapter.cs" />
<Compile Include="TestPowershellAdapter.cs" />
<Compile Include="TestRpcAdapter.cs" />
<Compile Include="TestScriptAdapter.cs" />
<Compile Include="TestTcpAdapter.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="PowerShell\ThrowException.ps1" />
<Content Include="CommandLine\SetFailureMessage.cmd" />
<Content Include="CommandLine\GetPtfProp.cmd" />
<Content Include="CommandLine\ReturnInputParameterValue.cmd" />
<Content Include="PowerShell\ReturnInt.ps1" />
<Content Include="PowerShell\ReturnString.ps1" />
<Content Include="CommandLine\ReturnHelpText.cmd" />
<Content Include="CommandLine\SetPtfProp.cmd" />
<Content Include="TestAdapter.ptfconfig" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\testtools.extension\TestTools.Extension.csproj">
<Project>{e41414b3-95f3-430f-823b-55b82f0ba198}</Project>
<Name>TestTools.Extension</Name>
</ProjectReference>
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
<Project>{3cb878cb-0cd3-447f-8dd8-8a0c62b7c3af}</Project>
<Name>TestTools.VSTS</Name>
</ProjectReference>
<ProjectReference Include="..\..\testtools\TestTools.csproj">
<Project>{1ca2b935-3224-40f1-84bc-47fa1a9b242e}</Project>
<Name>TestTools</Name>
</ProjectReference>
<ProjectReference Include="..\Utilities\Utilities.csproj">
<Project>{cbe396d2-d8d0-43cd-bdb8-fd8ba46bb3fd}</Project>
<Name>Utilities</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="CommandLine\ReturnInputParameterNameAndType.cmd" />
<Content Include="CommandLine\ReturnTypeOfReturnValue.cmd" />
<Content Include="PowerShell\ReturnBool.ps1" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

Просмотреть файл

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8" ?>
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
<Properties>
<!-- Test suite properties which value not changed when running in different test environments -->
<Property name="FeatureName" value="PTF:Adapter" />
<!-- Properties used in testing Tcp adapter -->
<Property name="MyTcpAdapter.hostname" value="127.0.0.1" />
<Property name="MyTcpAdapter.port" value="8000" />
</Properties>
<Adapters>
<Adapter xsi:type="managed" name="IManagedAdapter" adaptertype="Microsoft.Protocols.TestTools.Test.TestAdapter.ManagedAdapter"/>
<Adapter xsi:type="script" name="IScriptAdapter" scriptdir=".\"/>
<Adapter xsi:type="powershell" name="IPowershellAdapter" scriptdir=".\"/>
<Adapter xsi:type="interactive" name="IInteractiveAdapter"/>
<Adapter xsi:type="rpc" name="IMyRpcAdapter"/>
<Adapter xsi:type="managed" name="IMyTcpAdapter" adaptertype="Microsoft.Protocols.TestTools.Test.TestAdapter.MyTcpAdapter"/>
</Adapters>
<!-- The default profile name. Provide maximum logging. -->
<TestLog defaultprofile="Verbose">
<Profiles>
<!-- Name of the profile. extends indicates the profile will be included.-->
<Profile name="Verbose" extends="Error">
<!-- Show on Console -->
<Rule kind="TestStep" sink="Console" delete="false"/>
<Rule kind="Checkpoint" sink="Console" delete="false"/>
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
<Rule kind="CheckFailed" sink="Console" delete="false"/>
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
<Rule kind="Comment" sink="Console" delete="false"/>
<Rule kind="Warning" sink="Console" delete="false"/>
<Rule kind="Debug" sink="Console" delete="false"/>
<Rule kind="TestFailed" sink="Console" delete="false"/>
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
<Rule kind="TestPassed" sink="Console" delete="false"/>
</Profile>
</Profiles>
</TestLog>
</TestSite>

Просмотреть файл

@ -0,0 +1,86 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.Protocols.TestTools;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Protocols.TestTools.Test.Utilities;
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
{
/// <summary>
/// Interface definition of an interactive adapter.
/// </summary>
public interface IInteractiveAdapter : IAdapter
{
[MethodHelp("Please enter the same value with \"Number\" and then press \"Continue\" button.")]
int ReturnInt(int Number);
[MethodHelp("Please enter the same string with \"String\" (case sensitive) and then press \"Continue\" button.")]
string ReturnString(string String);
[MethodHelp("Please press \"Abort\" button.")]
void Abort();
}
/// <summary>
/// Test cases to test PTF adapter: Interactive adapter
/// </summary>
[TestClass]
public class TestInteractiveAdapter : TestClassBase
{
IInteractiveAdapter interactiveAdapter;
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext, "TestAdapter");
}
[ClassCleanup]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
protected override void TestInitialize()
{
interactiveAdapter = BaseTestSite.GetAdapter<IInteractiveAdapter>();
}
protected override void TestCleanup()
{
interactiveAdapter.Reset();
}
#region Test cases
[TestMethod]
[TestCategory("TestAdapter")]
public void InteractiveAdapterReturnInt()
{
BaseTestSite.Assert.AreEqual(
0,
interactiveAdapter.ReturnInt(0),
"Returned value should be 0");
}
[TestMethod]
[TestCategory("TestAdapter")]
public void InteractiveAdapterReturnString()
{
BaseTestSite.Assert.AreEqual(
"PTF",
interactiveAdapter.ReturnString("PTF"),
"Returned value should be PTF");
}
[TestMethod]
[TestCategory("TestAdapter")]
[PTFExpectedException(typeof(AssertInconclusiveException))]
public void InteractiveAdapterAbort()
{
interactiveAdapter.Abort();
}
#endregion
}
}

Просмотреть файл

@ -0,0 +1,91 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.Protocols.TestTools;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Protocols.TestTools.Test.Utilities;
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
{
/// <summary>
/// Interface definition of a managed adapter
/// </summary>
public interface IManagedAdapter : IAdapter
{
/// <summary>
/// Adds two addends together
/// </summary>
int Sum(int x, int y);
}
public class ManagedAdapter : ManagedAdapterBase, IManagedAdapter
{
public int Sum(int x, int y)
{
return x + y;
}
}
/// <summary>
/// Interface definition of a managed adapter, but no relevant implementation
/// </summary>
public interface IUnimplementedManagedAdapter : IAdapter
{
/// <summary>
/// Adds two addends together
/// </summary>
int Sum(int x, int y);
}
/// <summary>
/// Test cases to test PTF adapter: Managed adapter
/// </summary>
[TestClass]
public class TestManagedAdapter : TestClassBase
{
IManagedAdapter managedAdapter;
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext, "TestAdapter");
}
[ClassCleanup]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
protected override void TestInitialize()
{
managedAdapter = BaseTestSite.GetAdapter<IManagedAdapter>();
}
protected override void TestCleanup()
{
managedAdapter.Reset();
}
#region Test cases
[TestMethod]
[TestCategory("TestAdapter")]
public void ManagerAdapterCallSucceed()
{
BaseTestSite.Assert.AreEqual(
3 + 4,
managedAdapter.Sum(3, 4),
"Managed adapter should return 7");
}
[TestMethod]
[TestCategory("TestAdapter")]
[PTFExpectedException(typeof(InvalidOperationException))]
public void ManagerAdapterUnimplemented()
{
IUnimplementedManagedAdapter undefinedManagedAdapter = BaseTestSite.GetAdapter<IUnimplementedManagedAdapter>();
}
#endregion
}
}

Просмотреть файл

@ -0,0 +1,109 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.Protocols.TestTools;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Protocols.TestTools.Test.Utilities;
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
{
/// <summary>
/// Interface definition of a powershell adapter
/// </summary>
public interface IPowershellAdapter : IAdapter
{
[MethodHelp("Powershell script will throw an exception.")]
void ThrowException(string exceptionMessage);
[MethodHelp("Powershell script will return an integer.")]
int ReturnInt(int number);
[MethodHelp("Powershell script will return a string.")]
string ReturnString(string str);
[MethodHelp("Powershell script will return a boolean.")]
bool ReturnBool(bool value);
[MethodHelp("The relevant Powershell script does not exist")]
void ScriptNotExisted();
}
/// <summary>
/// Test cases to test PTF adapter: Powershell adapter
/// </summary>
[TestClass]
public class TestPowershellAdapter : TestClassBase
{
IPowershellAdapter powershellAdapter;
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext, "TestAdapter");
}
[ClassCleanup]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
protected override void TestInitialize()
{
powershellAdapter = BaseTestSite.GetAdapter<IPowershellAdapter>();
}
protected override void TestCleanup()
{
powershellAdapter.Reset();
}
#region Test cases
[TestMethod]
[TestCategory("TestAdapter")]
[PTFExpectedException(typeof(InvalidOperationException))]
public void PowershellAdapterThrowException()
{
powershellAdapter.ThrowException("exception");
}
[TestMethod]
[TestCategory("TestAdapter")]
public void PowershellAdapterReturnInt()
{
BaseTestSite.Assert.AreEqual(
0,
powershellAdapter.ReturnInt(0),
"Powershell adapter should return 0");
}
[TestMethod]
[TestCategory("TestAdapter")]
public void PowershellAdpaterReturnString()
{
BaseTestSite.Assert.AreEqual(
"PTF",
powershellAdapter.ReturnString("PTF"),
"Powershell adapter should return PTF");
}
[TestMethod]
[TestCategory("TestAdapter")]
public void PowershellAdapterReturnBool()
{
BaseTestSite.Assert.IsTrue(
powershellAdapter.ReturnBool(true),
"Powershell adapter should return true");
}
[TestMethod]
[TestCategory("TestAdapter")]
[PTFExpectedException(typeof(AssertInconclusiveException), "Assume.Fail failed. PowerShell script file (ScriptNotExisted.ps1) can not be found.")]
public void PowershellAdapterScriptNotExisted()
{
powershellAdapter.ScriptNotExisted();
}
#endregion
}
}

Просмотреть файл

@ -0,0 +1,46 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.Protocols.TestTools;
using Microsoft.Protocols.TestTools.Messages;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Protocols.TestTools.Test.Utilities;
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
{
public interface IMyRpcAdapter : IRpcAdapter
{
}
/// <summary>
/// Test cases to test PTF adapter: Rpc adapter
/// </summary>
[TestClass]
public class TestRpcAdapter : TestClassBase
{
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext, "TestAdapter");
}
[ClassCleanup]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
#region Test cases
[TestMethod]
[TestCategory("TestAdapter")]
public void RpcAdapterGetAdapter()
{
IMyRpcAdapter myRpcAdapter = BaseTestSite.GetAdapter<IMyRpcAdapter>();
BaseTestSite.Assert.IsNotNull(myRpcAdapter, "Get rpc adapter should succeed.");
myRpcAdapter.Reset();
}
#endregion
}
}

Просмотреть файл

@ -0,0 +1,147 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.Protocols.TestTools;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Protocols.TestTools.Test.Utilities;
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
{
public interface IScriptAdapter : IAdapter
{
[MethodHelp("The script does not exist.")]
void ScriptNotExisted();
[MethodHelp("Return Help text")]
string ReturnHelpText();
[MethodHelp("Display all properties in the PTFconfig.")]
void SetPtfProp();
[MethodHelp("Return the value of the property \"FeatureName\".")]
string GetPtfProp();
[MethodHelp("Set failure message.")]
void SetFailureMessage();
[MethodHelp("Return the type of the return value.")]
string ReturnTypeOfReturnValue();
[MethodHelp("Return the value of the first input parameter.")]
string ReturnInputParameterValue(string inputParameter);
[MethodHelp("Return the name and the type of the first input parameter.")]
string ReturnInputParameterNameAndType(string inputParameter);
}
/// <summary>
/// Test cases to test PTF adapter: Script adapter
/// </summary>
[TestClass]
public class TestScriptAdapter : TestClassBase
{
IScriptAdapter scriptAdapter;
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext, "TestAdapter");
}
[ClassCleanup]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
protected override void TestInitialize()
{
scriptAdapter = BaseTestSite.GetAdapter<IScriptAdapter>();
}
protected override void TestCleanup()
{
scriptAdapter.Reset();
}
#region Test cases
[TestMethod]
[TestCategory("TestAdapter")]
[PTFExpectedException(typeof(AssertInconclusiveException), "Assume.Fail failed. Script SetFailureMessage.cmd " +
"exited with non-zero code. Error code: -1. Failure message: PtfAdFailureMessage")]
public void ScriptAdapterCheckFailureMessage()
{
scriptAdapter.SetFailureMessage();
}
[TestMethod]
[TestCategory("TestAdapter")]
public void ScriptAdapterReturnTypeOfReturnValue()
{
BaseTestSite.Assert.AreEqual(
"PtfAdReturn:System.String",
scriptAdapter.ReturnTypeOfReturnValue(),
"Script adapter should return [PtfAdReturn:<type of returnValue>]");
}
[TestMethod]
[TestCategory("TestAdapter")]
[PTFExpectedException(typeof(AssertInconclusiveException), "Assume.Fail failed. The invoking script file (ScriptNotExisted.cmd) can not be found.")]
public void ScriptAdapterScriptNotExisted()
{
scriptAdapter.ScriptNotExisted();
}
[TestMethod]
[TestCategory("TestAdapter")]
public void ScriptAdapterReturnInputParameterValue()
{
BaseTestSite.Assert.AreEqual(
"parameter value",
scriptAdapter.ReturnInputParameterValue("parameter value"),
"Script adapter should return the value of the first input parameter");
}
[TestMethod]
[TestCategory("TestAdapter")]
public void ScriptAdapterReturnInputParameterNameAndType()
{
BaseTestSite.Assert.AreEqual(
"inputParameter:System.String",
scriptAdapter.ReturnInputParameterNameAndType("parameter value"),
"Script adapter should return the name and type of the first input parameter");
}
[TestMethod]
[TestCategory("TestAdapter")]
public void ScriptAdapterReturnHelpText()
{
BaseTestSite.Assert.AreEqual(
"Return Help text",
scriptAdapter.ReturnHelpText(),
"Script adapter should return help text");
}
[TestMethod]
[TestCategory("TestAdapter")]
[Description("Command \"set ptfprop\" can be used in the script to display all properties in the PTFconfig. " +
"It could be verified by checking the test case log.")]
public void ScriptAdapterSetPtfProp()
{
scriptAdapter.SetPtfProp();
}
[TestMethod]
[TestCategory("TestAdapter")]
public void ScriptAdapterGetPtfProp()
{
string propName = "FeatureName";
BaseTestSite.Assert.AreEqual(
BaseTestSite.Properties[propName],
scriptAdapter.GetPtfProp(),
"Script adapter should return property value of {0}", propName);
}
#endregion
}
}

Просмотреть файл

@ -0,0 +1,70 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Net;
using System.Net.Sockets;
using Microsoft.Protocols.TestTools;
using Microsoft.Protocols.TestTools.Messages;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Protocols.TestTools.Test.Utilities;
namespace Microsoft.Protocols.TestTools.Test.TestAdapter
{
public interface IMyTcpAdapter: IAdapter
{
}
public class MyTcpAdapter : TcpAdapterBase, IMyTcpAdapter
{
public MyTcpAdapter()
: base("MyTcpAdapter")
{
}
public override void Initialize(ITestSite testSite)
{
base.Initialize(testSite);
// Call TcpAdapterBase.Connect() to verify if it works.
Connect();
}
}
/// <summary>
/// Test cases to test PTF adapter: Rpc adapter
/// </summary>
[TestClass]
public class TestTcpAdapter : TestClassBase
{
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext, "TestAdapter");
}
[ClassCleanup]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
#region Test cases
[TestMethod]
[TestCategory("TestAdapter")]
public void TcpAdapterTryConnect()
{
// Set up a tcp listener, and wait for the tcp connect
TcpListener tcpListener = new
TcpListener(IPAddress.Parse(BaseTestSite.Properties["MyTcpAdapter.hostname"]), Int32.Parse(BaseTestSite.Properties["MyTcpAdapter.port"]));
tcpListener.Start();
IMyTcpAdapter myTcpAdapter = BaseTestSite.GetAdapter<IMyTcpAdapter>();
BaseTestSite.Assert.IsNotNull(myTcpAdapter, "Get tcp adapter should succeed.");
myTcpAdapter.Reset();
tcpListener.Stop();
}
#endregion
}
}

Просмотреть файл

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("TestChecker")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TestChecker")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("5f75baee-2487-4510-ac97-146c0fe23505")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,244 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.Protocols.TestTools;
using Microsoft.Protocols.TestTools.Checking;
using Microsoft.Protocols.TestTools.Test.Utilities;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Microsoft.Protocols.TestTools.Test.TestChecker
{
/// <summary>
/// A class used for testing.
/// </summary>
public class ClassForTest
{
public ClassForTest()
{
}
}
/// <summary>
/// Test cases to test PTF checker: BaseTestSite.Assert
/// </summary>
[TestClass]
public class TestChecker : TestClassBase
{
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext, "TestChecker");
}
[ClassCleanup]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckAreEqualPassed()
{
BaseTestSite.Assert.AreEqual<int>(2, 2, "The two values should be the same.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreEqual failed. Expected: <2 (0x00000002)>, Actual: <3 (0x00000003)>. The two values should be the same.")]
public void CheckAreEqualFailed()
{
BaseTestSite.Assert.AreEqual<int>(2, 3, "The two values should be the same.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckAreNotEqualPassed()
{
BaseTestSite.Assert.AreNotEqual<int>(2, 3, "The two values should be different.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreNotEqual failed. Expected: <2 (0x00000002)>, Actual: <2 (0x00000002)>. The two values should be different.")]
public void CheckAreNotEqualFailed()
{
BaseTestSite.Assert.AreNotEqual<int>(2, 2, "The two values should be different.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckAreSamePassed()
{
ClassForTest object1 = new ClassForTest();
ClassForTest object2 = object1;
BaseTestSite.Assert.AreSame(object1, object2, "The two object references should be the same.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreSame failed. The two object references should be the same.")]
public void CheckAreSameFailed()
{
ClassForTest object1 = new ClassForTest();
ClassForTest object2 = new ClassForTest();
BaseTestSite.Assert.AreSame(object1, object2, "The two object references should be the same.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckAreNotSamePassed()
{
ClassForTest object1 = new ClassForTest();
ClassForTest object2 = new ClassForTest();
BaseTestSite.Assert.AreNotSame(object1, object2, "The two object references should be different.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreNotSame failed. The two object references should be different.")]
public void CheckAreNotSameFailed()
{
ClassForTest object1 = new ClassForTest();
ClassForTest object2 = object1;
BaseTestSite.Assert.AreNotSame(object1, object2, "The two object references should be different.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.Fail failed. This case should raise a failure message.")]
public void CheckAssertFailed()
{
BaseTestSite.Assert.Fail("This case should raise a failure message.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckAssertPassed()
{
BaseTestSite.Assert.Pass("This case should raise a success message.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertInconclusiveException), "Assert.Inconclusive is inconclusive. The case should raise an inconclusive message.")]
public void CheckAssertInconclusive()
{
BaseTestSite.Assert.Inconclusive("The case should raise an inconclusive message.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckIsTruePassed()
{
BaseTestSite.Assert.IsTrue(true, "The value should be true.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsTrue failed. The value should be true.")]
public void CheckIsTrueFailed()
{
BaseTestSite.Assert.IsTrue(false, "The value should be true.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckIsFalsePassed()
{
BaseTestSite.Assert.IsFalse(false, "The value should be false.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsFalse failed. The value should be false.")]
public void CheckIsFalseFailed()
{
BaseTestSite.Assert.IsFalse(true, "The value should be false.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckIsInstanceOfTypePassed()
{
string a = "123";
BaseTestSite.Assert.IsInstanceOfType(a, typeof(System.String), "The object should be an instance of type: System.String.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException),
"Assert.IsInstanceOfType failed. Expected Type: <System.String>, Actual Type: <System.Int32>. The object should be an instance of type: System.String.")]
public void CheckIsInstanceOfTypeFailed()
{
int a = 123;
BaseTestSite.Assert.IsInstanceOfType(a, typeof(System.String), "The object should be an instance of type: System.String.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckIsNotInstanceOfTypePassed()
{
int a = 123;
BaseTestSite.Assert.IsNotInstanceOfType(a, typeof(System.String), "The object should not be an instance of type: System.String.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException),
"Assert.IsNotInstanceOfType failed. Wrong Type: <System.String>, Actual Type: <System.String>. The object should not be an instance of type: System.String.")]
public void CheckIsNotInstanceOfTypeFailed()
{
string a = "123";
BaseTestSite.Assert.IsNotInstanceOfType(a, typeof(System.String), "The object should not be an instance of type: System.String.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckIsNullPassed()
{
BaseTestSite.Assert.IsNull(null, "The object reference should be null.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsNull failed. The object reference should be null.")]
public void CheckIsNullFailed()
{
BaseTestSite.Assert.IsNull("notNull", "The object reference should be null.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckIsNotNullPassed()
{
BaseTestSite.Assert.IsNotNull("notNull", "The object reference should not be null.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException),
"Assert.IsNotNull failed. The object reference should not be null.")]
public void CheckIsNotNullFailed()
{
BaseTestSite.Assert.IsNotNull(null, "The object reference should not be null.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckIsSuccessPassed()
{
BaseTestSite.Assert.IsSuccess(1, "The given error code should be a successful result.");
}
[TestMethod]
[TestCategory("TestChecker")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsSuccess failed. The given error code should be a successful result.")]
public void CheckIsSuccessFailed()
{
BaseTestSite.Assert.IsSuccess(-1, "The given error code should be a successful result.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckUnverified()
{
BaseTestSite.Assert.Unverified("This could not be verified currently.");
}
[TestMethod]
[TestCategory("TestChecker")]
public void CheckErrors()
{
BaseTestSite.Assert.CheckErrors();
}
}
}

Просмотреть файл

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>
</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{483F6AF6-773A-441E-B38C-E3E222692D1C}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Microsoft.Protocols.TestTools.Test.TestChecker</RootNamespace>
<AssemblyName>TestChecker</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="System" />
</ItemGroup>
<ItemGroup>
<Compile Include="TestChecker.cs" />
</ItemGroup>
<ItemGroup>
<None Include="TestChecker.ptfconfig" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
<Project>{3cb878cb-0cd3-447f-8dd8-8a0c62b7c3af}</Project>
<Name>TestTools.VSTS</Name>
</ProjectReference>
<ProjectReference Include="..\..\testtools\TestTools.csproj">
<Project>{1ca2b935-3224-40f1-84bc-47fa1a9b242e}</Project>
<Name>TestTools</Name>
</ProjectReference>
<ProjectReference Include="..\Utilities\Utilities.csproj">
<Project>{cbe396d2-d8d0-43cd-bdb8-fd8ba46bb3fd}</Project>
<Name>Utilities</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

Просмотреть файл

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8" ?>
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
<Properties>
<!-- Test suite properties which value not changed when running in different test environments -->
<Property name="FeatureName" value="PTF:Checker"/>
</Properties>
<TestLog defaultprofile="Verbose">
<Sinks>
<Console id="Console" />
</Sinks>
<Profiles>
<!-- Name of the profile. extends indicates the profile will be included.-->
<Profile name="Verbose" extends="Error">
<!-- Show on Console -->
<Rule kind="TestStep" sink="Console" delete="false"/>
<Rule kind="Checkpoint" sink="Console" delete="false"/>
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
<Rule kind="CheckFailed" sink="Console" delete="false"/>
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
<Rule kind="Comment" sink="Console" delete="false"/>
<Rule kind="Warning" sink="Console" delete="false"/>
<Rule kind="Debug" sink="Console" delete="false"/>
<Rule kind="TestFailed" sink="Console" delete="false"/>
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
<Rule kind="TestPassed" sink="Console" delete="false"/>
</Profile>
</Profiles>
</TestLog>
</TestSite>

Просмотреть файл

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("TestLogging")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TestLogging")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("9bdbcf67-d0f8-479d-a2fb-08a0d29b17a8")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,111 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.IO;
using Microsoft.Protocols.TestTools;
using Microsoft.Protocols.TestTools.Logging;
using Microsoft.Protocols.TestTools.Test.Utilities;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Microsoft.Protocols.TestTools.Test.TestLogging
{
/// <summary>
/// Defines a custom log sink.
/// </summary>
public class MySink : TextSink
{
StreamWriter sw;
public MySink(string name)
: base(name)
{
sw = new StreamWriter(String.Format("..\\..\\[TestLogging_MySinkLog]{0} MySinkLog.txt", DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff")));
}
protected override TextWriter Writer
{
get { return sw; }
}
}
/// <summary>
/// Test cases to test PTF logging
/// The cases do not verify if the generated log is expected. It should be done manually.
/// </summary>
[TestClass]
public class TestLogging : TestClassBase
{
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext, "TestLogging");
}
[ClassCleanup]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
[TestCategory("TestLogging")]
[TestMethod]
public void AddGroupLog()
{
BaseTestSite.Log.Add(LogEntryKind.BeginGroup, "BeginGroup message");
BaseTestSite.Log.Add(LogEntryKind.EndGroup, "EndGroup message");
}
[TestCategory("TestLogging")]
[TestMethod]
public void AddCheckpointLog()
{
BaseTestSite.Log.Add(LogEntryKind.Checkpoint, "Checkpoint message");
}
[TestMethod]
[TestCategory("TestLogging")]
public void AddTestStepLog()
{
BaseTestSite.Log.Add(LogEntryKind.TestStep, "TestStep message");
}
[TestMethod]
[TestCategory("TestLogging")]
public void AddCommentLog()
{
BaseTestSite.Log.Add(LogEntryKind.Comment, "Comment message");
}
[TestMethod]
[TestCategory("TestLogging")]
public void AddWarningLog()
{
BaseTestSite.Log.Add(LogEntryKind.Warning, "Warning message");
}
[TestMethod]
[TestCategory("TestLogging")]
public void AddDebugLog()
{
BaseTestSite.Log.Add(LogEntryKind.Debug, "Debug message");
}
[TestMethod]
[TestCategory("TestLogging")]
public void AddMethodLog()
{
BaseTestSite.Log.Add(LogEntryKind.EnterMethod, "EnterMethod message");
BaseTestSite.Log.Add(LogEntryKind.ExitMethod, "ExitMethod message");
}
[TestMethod]
[TestCategory("TestLogging")]
public void AddAdapterLog()
{
BaseTestSite.Log.Add(LogEntryKind.EnterAdapter, "EnterAdapter message");
BaseTestSite.Log.Add(LogEntryKind.ExitAdapter, "ExitAdapter message");
}
}
}

Просмотреть файл

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>
</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>TestLogging</RootNamespace>
<AssemblyName>TestLogging</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="TestLogging.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="TestLogging.ptfconfig" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
<Project>{3cb878cb-0cd3-447f-8dd8-8a0c62b7c3af}</Project>
<Name>TestTools.VSTS</Name>
</ProjectReference>
<ProjectReference Include="..\..\testtools\TestTools.csproj">
<Project>{1ca2b935-3224-40f1-84bc-47fa1a9b242e}</Project>
<Name>TestTools</Name>
</ProjectReference>
<ProjectReference Include="..\Utilities\Utilities.csproj">
<Project>{cbe396d2-d8d0-43cd-bdb8-fd8ba46bb3fd}</Project>
<Name>Utilities</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

Просмотреть файл

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="utf-8" ?>
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
<Properties>
<!-- Test suite properties which value not changed when running in different test environments -->
<Property name="FeatureName" value="PTF:Logging" />
<!-- Enable automatic network capturing -->
<Group name="PTF">
<Group name="NetworkCapture">
<Property name="Enabled" value="true" />
<Property name="CaptureFileFolder" value="C:\PTFCaptureFileFolder" />
<Property name="StopRunningOnError" value="false" />
</Group>
</Group>
<!-- This feature enables a user to display expected/actual runtime of the test suite on the console. -->
<Property name="ExpectedExecutionTime" value="5000" />
</Properties>
<!-- The default profile name. Provide maximum logging. -->
<TestLog defaultprofile="Verbose">
<Sinks>
<!-- Custom log -->
<Sink id="MySink" type="Microsoft.Protocols.TestTools.Test.TestLogging.MySink" />
<!-- Beacon Log sink-->
<Sink id="Beacon" type="Microsoft.Protocols.TestTools.Logging.BeaconLogSink"/>
<!-- File log sink. Id is name, directory is the dir which log will stored in. file is the name of log. Format can be text or xml-->
<File id="MyLog" directory="..\..\" file="MyLog.txt" format="text"/>
<File id="MyXMLLog" directory="..\..\" file="MyXmlLog.xml" format="xml"/>
<!-- Color console log sink -->
<Console id="RedConsole" />
<Console id="GreenConsole" />
<Console id="YellowConsole" />
<Console id="WhiteConsole" />
</Sinks>
<Profiles>
<!-- Name of the profile. extends indicates the profile will be included.-->
<Profile name="Verbose" extends="Error">
<!-- Show log in Visual studio -->
<Rule kind="TestStep" sink="Console" delete="false"/>
<Rule kind="Checkpoint" sink="Console" delete="false"/>
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
<Rule kind="CheckFailed" sink="Console" delete="false"/>
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
<Rule kind="Comment" sink="Console" delete="false"/>
<Rule kind="Warning" sink="Console" delete="false"/>
<Rule kind="Debug" sink="Console" delete="false"/>
<Rule kind="TestFailed" sink="Console" delete="false"/>
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
<Rule kind="TestPassed" sink="Console" delete="false"/>
<Rule kind="BeginGroup" sink="Console" delete="false"/>
<Rule kind="EndGroup" sink="Console" delete="false"/>
<!-- Command line Console & Color console logging -->
<!-- Console logging lets the user see the log of the test run as it proceeds. The user can terminate a running test case by looking at its progress. -->
<!-- Color Console Logging makes Log message displayed in the Console can be colorized. -->
<Rule kind="TestStep" sink="YellowConsole" delete="false"/>
<Rule kind="Checkpoint" sink="CommandLineConsole" delete="false"/>
<Rule kind="CheckSucceeded" sink="GreenConsole" delete="false"/>
<Rule kind="CheckFailed" sink="RedConsole" delete="false"/>
<Rule kind="CheckInconclusive" sink="CommandLineConsole" delete="false"/>
<Rule kind="Comment" sink="CommandLineConsole" delete="false"/>
<Rule kind="Warning" sink="CommandLineConsole" delete="false"/>
<Rule kind="Debug" sink="CommandLineConsole" delete="false"/>
<Rule kind="TestFailed" sink="RedConsole" delete="false"/>
<Rule kind="TestInconclusive" sink="YellowConsole" delete="false"/>
<Rule kind="TestPassed" sink="GreenConsole" delete="false"/>
<Rule kind="BeginGroup" sink="CommandLineConsole" delete="false"/>
<Rule kind="EndGroup" sink="CommandLineConsole" delete="false"/>
<!-- Etw logging -->
<!-- The Event Tracing for Windows (ETW) logging sink can log test suite logs and test messages to an ETW provider.
A user can capture these ETW logs using captures tools, such as the Microsoft Message Analyzer.-->
<Rule kind="TestStep" sink="Etw" delete="false"/>
<Rule kind="Checkpoint" sink="Etw" delete="false"/>
<Rule kind="CheckSucceeded" sink="Etw" delete="false"/>
<Rule kind="CheckFailed" sink="Etw" delete="false"/>
<Rule kind="CheckInconclusive" sink="Etw" delete="false"/>
<Rule kind="Comment" sink="Etw" delete="false"/>
<Rule kind="Warning" sink="Etw" delete="false"/>
<Rule kind="Debug" sink="Etw" delete="false"/>
<Rule kind="TestFailed" sink="Etw" delete="false"/>
<Rule kind="TestInconclusive" sink="Etw" delete="false"/>
<Rule kind="TestPassed" sink="Etw" delete="false"/>
<Rule kind="BeginGroup" sink="Etw" delete="false"/>
<Rule kind="EndGroup" sink="Etw" delete="false"/>
<!-- Beacon logging -->
<!-- Beacon logging provides a way for PTF users to log necessary log messages as network packets.
A user can define a beacon logging sink in the PTF Config file which is similar with other log sinks, and then the log messages are sent to the UDP broadcast address using port 58727. -->
<Rule kind="TestStep" sink="Beacon" delete="false"/>
<Rule kind="Checkpoint" sink="Beacon" delete="false"/>
<Rule kind="CheckSucceeded" sink="Beacon" delete="false"/>
<Rule kind="CheckFailed" sink="Beacon" delete="false"/>
<Rule kind="CheckInconclusive" sink="Beacon" delete="false"/>
<Rule kind="Comment" sink="Beacon" delete="false"/>
<Rule kind="Warning" sink="Beacon" delete="false"/>
<Rule kind="Debug" sink="Beacon" delete="false"/>
<Rule kind="TestFailed" sink="Beacon" delete="false"/>
<Rule kind="TestInconclusive" sink="Beacon" delete="false"/>
<Rule kind="TestPassed" sink="Beacon" delete="false"/>
<Rule kind="BeginGroup" sink="Beacon" delete="false"/>
<Rule kind="EndGroup" sink="Beacon" delete="false"/>
<!-- Custom logging: MySink -->
<Rule kind="TestStep" sink="MySink" delete="false"/>
<Rule kind="Checkpoint" sink="MySink" delete="false"/>
<Rule kind="CheckSucceeded" sink="MySink" delete="false"/>
<Rule kind="CheckFailed" sink="MySink" delete="false"/>
<Rule kind="CheckInconclusive" sink="MySink" delete="false"/>
<Rule kind="Comment" sink="MySink" delete="false"/>
<Rule kind="Warning" sink="MySink" delete="false"/>
<Rule kind="Debug" sink="MySink" delete="false"/>
<Rule kind="TestFailed" sink="MySink" delete="false"/>
<Rule kind="TestInconclusive" sink="MySink" delete="false"/>
<Rule kind="TestPassed" sink="MySink" delete="false"/>
<Rule kind="BeginGroup" sink="MySink" delete="false"/>
<Rule kind="EndGroup" sink="MySink" delete="false"/>
<!-- File Logging: text -->
<!-- File logging provides a way for PTF users to log necessary messages to files. PTF provides two logging file formats, plain text and XML. -->
<!-- The plain text format is suitable for viewing the log file using text editors. -->
<Rule kind="TestStep" sink="MyLog" delete="false"/>
<Rule kind="Checkpoint" sink="MyLog" delete="false"/>
<Rule kind="CheckSucceeded" sink="MyLog" delete="false"/>
<Rule kind="CheckFailed" sink="MyLog" delete="false"/>
<Rule kind="CheckInconclusive" sink="MyLog" delete="false"/>
<Rule kind="Comment" sink="MyLog" delete="false"/>
<Rule kind="Warning" sink="MyLog" delete="false"/>
<Rule kind="Debug" sink="MyLog" delete="false"/>
<Rule kind="TestFailed" sink="MyLog" delete="false"/>
<Rule kind="TestInconclusive" sink="MyLog" delete="false"/>
<Rule kind="TestPassed" sink="MyLog" delete="false"/>
<Rule kind="BeginGroup" sink="MyLog" delete="false"/>
<Rule kind="EndGroup" sink="MyLog" delete="false"/>
<!-- File Logging: XML -->
<!-- File logging provides a way for PTF users to log necessary messages to files. PTF provides two logging file formats, plain text and XML. -->
<!-- The XML format is for analysing the test log using tools, such as the Reporting Tool. -->
<Rule kind="TestStep" sink="MyXMLLog" delete="false"/>
<Rule kind="Checkpoint" sink="MyXMLLog" delete="false"/>
<Rule kind="CheckSucceeded" sink="MyXMLLog" delete="false"/>
<Rule kind="CheckFailed" sink="MyXMLLog" delete="false"/>
<Rule kind="CheckInconclusive" sink="MyXMLLog" delete="false"/>
<Rule kind="Comment" sink="MyXMLLog" delete="false"/>
<Rule kind="Warning" sink="MyXMLLog" delete="false"/>
<Rule kind="Debug" sink="MyXMLLog" delete="false"/>
<Rule kind="TestFailed" sink="MyXMLLog" delete="false"/>
<Rule kind="TestInconclusive" sink="MyXMLLog" delete="false"/>
<Rule kind="TestPassed" sink="MyXMLLog" delete="false"/>
<Rule kind="BeginGroup" sink="MyXMLLog" delete="false"/>
<Rule kind="EndGroup" sink="MyXMLLog" delete="false"/>
</Profile>
</Profiles>
</TestLog>
</TestSite>

82
src/test/TestPTF.sln Normal file
Просмотреть файл

@ -0,0 +1,82 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A8E3F732-A7B1-4682-AFED-38FAEA818E12}"
ProjectSection(SolutionItems) = preProject
Local.testsettings = Local.testsettings
RunTest.cmd = RunTest.cmd
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestLogging", "TestLogging\TestLogging.csproj", "{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAdapter", "TestAdapter\TestAdapter.csproj", "{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestChecker", "TestChecker\TestChecker.csproj", "{483F6AF6-773A-441E-B38C-E3E222692D1C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestRequirementCapture", "TestRequirementCapture\TestRequirementCapture.csproj", "{5944E70C-7885-4E3C-B28E-E870A358E64E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProperties", "TestProperties\TestProperties.csproj", "{3034A41C-79A3-4D18-8388-FD23F5594CAD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PTF", "PTF", "{288E5E04-8A41-4255-8C3D-FE3516C33DAE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools", "..\testtools\TestTools.csproj", "{1CA2B935-3224-40F1-84BC-47FA1A9B242E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.VSTS", "..\testtools.vsts\TestTools.VSTS.csproj", "{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utilities", "Utilities\Utilities.csproj", "{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools.Extension", "..\testtools.extension\TestTools.Extension.csproj", "{E41414B3-95F3-430F-823B-55B82F0BA198}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{07E873F6-A11C-473B-99E0-B5FA3F50B7C3}.Release|Any CPU.Build.0 = Release|Any CPU
{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CAC893D4-D83A-4574-ABC8-BF7DF25AC71B}.Release|Any CPU.Build.0 = Release|Any CPU
{483F6AF6-773A-441E-B38C-E3E222692D1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{483F6AF6-773A-441E-B38C-E3E222692D1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{483F6AF6-773A-441E-B38C-E3E222692D1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{483F6AF6-773A-441E-B38C-E3E222692D1C}.Release|Any CPU.Build.0 = Release|Any CPU
{5944E70C-7885-4E3C-B28E-E870A358E64E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5944E70C-7885-4E3C-B28E-E870A358E64E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5944E70C-7885-4E3C-B28E-E870A358E64E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5944E70C-7885-4E3C-B28E-E870A358E64E}.Release|Any CPU.Build.0 = Release|Any CPU
{3034A41C-79A3-4D18-8388-FD23F5594CAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3034A41C-79A3-4D18-8388-FD23F5594CAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3034A41C-79A3-4D18-8388-FD23F5594CAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3034A41C-79A3-4D18-8388-FD23F5594CAD}.Release|Any CPU.Build.0 = Release|Any CPU
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1CA2B935-3224-40F1-84BC-47FA1A9B242E}.Release|Any CPU.Build.0 = Release|Any CPU
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF}.Release|Any CPU.Build.0 = Release|Any CPU
{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}.Release|Any CPU.Build.0 = Release|Any CPU
{E41414B3-95F3-430F-823B-55B82F0BA198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E41414B3-95F3-430F-823B-55B82F0BA198}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E41414B3-95F3-430F-823B-55B82F0BA198}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E41414B3-95F3-430F-823B-55B82F0BA198}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{1CA2B935-3224-40F1-84BC-47FA1A9B242E} = {288E5E04-8A41-4255-8C3D-FE3516C33DAE}
{3CB878CB-0CD3-447F-8DD8-8A0C62B7C3AF} = {288E5E04-8A41-4255-8C3D-FE3516C33DAE}
{E41414B3-95F3-430F-823B-55B82F0BA198} = {288E5E04-8A41-4255-8C3D-FE3516C33DAE}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
<Properties>
<Property name="BasePropertyName" value="BasePropertyValue" />
<Property name="DuplicatePropertyName" value="Base" />
</Properties>
</TestSite>

Просмотреть файл

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("TestProperties")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TestProperties")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("49766b6f-fd46-4a62-900b-823ef07e8220")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,108 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.Protocols.TestTools;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Microsoft.Protocols.TestTools.Test.TestProperties
{
/// <summary>
/// Test cases to test reading properties defined in .ptfconfig file
/// </summary>
[TestClass]
public class TestProperties : TestClassBase
{
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext, "TestProperties");
}
[ClassCleanup]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
[TestMethod]
[TestCategory("TestProperties")]
public void ReadNormalProperty()
{
BaseTestSite.Assert.AreEqual(
"NormalPropertyValue",
BaseTestSite.Properties["NormalPropertyName"],
"Value of property \"NormalPropertyName\" should be \"NormalPropertyValue\"");
}
[TestMethod]
[TestCategory("TestProperties")]
public void ReadDuplicateProperty()
{
BaseTestSite.Assert.AreEqual(
"TestProperties",
BaseTestSite.Properties["DuplicatePropertyName"],
"Value of property \"DuplicatePropertyName\" should be \"TestProperties\"");
}
[TestMethod]
[TestCategory("TestProperties")]
public void ReadIncludedProperty()
{
BaseTestSite.Assert.AreEqual(
"BasePropertyValue",
BaseTestSite.Properties["BasePropertyName"],
"Value of property \"BasePropertyName\" should be \"BasePropertyValue\"");
}
[TestMethod]
[TestCategory("TestProperties")]
public void ReadRootGroupProperty()
{
BaseTestSite.Assert.AreEqual(
"RootPropertyValue",
BaseTestSite.Properties["Root.Name"],
"Value of property \"Root.Name\" should be \"RootPropertyValue\"");
}
[TestMethod]
[TestCategory("TestProperties")]
public void ReadLeafGroupProperty()
{
BaseTestSite.Assert.AreEqual(
"LeafPropertyValue",
BaseTestSite.Properties["Root.Leaf.Name"],
"Value of property \"Root.Leaf.Name\" should be \"LeafPropertyValue\"");
}
[TestMethod]
[TestCategory("TestProperties")]
public void ReadEmptyProperty()
{
BaseTestSite.Assert.AreEqual(
"",
BaseTestSite.Properties[""],
"Value of property \"\" should be \"\"");
}
[TestMethod]
[TestCategory("TestProperties")]
public void ReadDeploymentProperty()
{
BaseTestSite.Assert.AreEqual(
"DeploymentPropertyValue",
BaseTestSite.Properties["DeploymentPropertyName"],
"Value of property \"DeploymentPropertyName\" should be \"DeploymentPropertyValue\"");
}
[TestMethod]
[TestCategory("TestProperties")]
public void ReadNonExistedProperty()
{
BaseTestSite.Assert.AreEqual(
null,
BaseTestSite.Properties["NonExistedProperty"],
"Read a non existed property should return null");
}
}
}

Просмотреть файл

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>
</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{3034A41C-79A3-4D18-8388-FD23F5594CAD}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Microsoft.Protocols.TestTools.Test.TestProperties</RootNamespace>
<AssemblyName>TestProperties</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
<Content Include="Base.ptfconfig" />
<Content Include="TestProperties.ptfconfig" />
<Content Include="TestProperties.deployment.ptfconfig" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
<Project>{3cb878cb-0cd3-447f-8dd8-8a0c62b7c3af}</Project>
<Name>TestTools.VSTS</Name>
</ProjectReference>
<ProjectReference Include="..\..\testtools\TestTools.csproj">
<Project>{1ca2b935-3224-40f1-84bc-47fa1a9b242e}</Project>
<Name>TestTools</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Compile Include="TestProperties.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

Просмотреть файл

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
<Properties>
<Property name="DeploymentPropertyName" value="DeploymentPropertyValue" />
</Properties>
</TestSite>

Просмотреть файл

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8" ?>
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
<Include>
<File name="Base.ptfconfig"/>
</Include>
<Properties>
<!-- Properties for testing -->
<Group name="Root">
<Property name="Name" value="RootPropertyValue" />
<Group name="Leaf">
<Property name="Name" value="LeafPropertyValue">
</Property>
</Group>
</Group>
<Property name="NormalPropertyName" value="NormalPropertyValue" />
<Property name="" value="" />
<Property name="DuplicatePropertyName" value="TestProperties" />
<!-- Test suite properties which value not changed when running in different test environments -->
<Property name="FeatureName" value="PTF:Properties" />
</Properties>
<!-- The default profile name. Provide maximum logging. -->
<TestLog defaultprofile="Verbose">
<Profiles>
<!-- Name of the profile. extends indicates the profile will be included.-->
<Profile name="Verbose" extends="Error">
<!-- Show on Console -->
<Rule kind="TestStep" sink="Console" delete="false"/>
<Rule kind="Checkpoint" sink="Console" delete="false"/>
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
<Rule kind="CheckFailed" sink="Console" delete="false"/>
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
<Rule kind="Comment" sink="Console" delete="false"/>
<Rule kind="Warning" sink="Console" delete="false"/>
<Rule kind="Debug" sink="Console" delete="false"/>
<Rule kind="TestFailed" sink="Console" delete="false"/>
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
<Rule kind="TestPassed" sink="Console" delete="false"/>
</Profile>
</Profiles>
</TestLog>
</TestSite>

Просмотреть файл

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("TestRequirementCapture")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TestRequirementCapture")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("3e68134d-4eac-42c2-8ee1-6ca784ac09b6")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:ReqTable xmlns:ns1="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/RequirementTable">
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R1</ns1:REQ_ID>
<ns1:Doc_Sect>1.8</ns1:Doc_Sect>
<ns1:Description>[In Vendor-Extensible Fields]This protocol[MS-LSAT] uses NTSTATUS values as specified in [MS-ERREF] section 2.3.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p2</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R2</ns1:REQ_ID>
<ns1:Doc_Sect>1.8</ns1:Doc_Sect>
<ns1:Description>[In Vendor-Extensible Fields]Vendors are free to choose their own values for this field, provided that the C bit (0x20000000) is set, which indicates that it is a customer code.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p2</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R3</ns1:REQ_ID>
<ns1:Doc_Sect>2.1</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Scenario>S1,S2</ns1:Scenario>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R4</ns1:REQ_ID>
<ns1:Doc_Sect>2.1</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R5</ns1:REQ_ID>
<ns1:Doc_Sect>2.1</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R6</ns1:REQ_ID>
<ns1:Doc_Sect>2.1</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R7</ns1:REQ_ID>
<ns1:Doc_Sect>2.2</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R8</ns1:REQ_ID>
<ns1:Doc_Sect>2.3</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R9</ns1:REQ_ID>
<ns1:Doc_Sect>2.4</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R10</ns1:REQ_ID>
<ns1:Doc_Sect>2.5</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R11</ns1:REQ_ID>
<ns1:Doc_Sect>2.6</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R12</ns1:REQ_ID>
<ns1:Doc_Sect>2.7</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
<ns1:Requirement>
<ns1:REQ_ID>REPORTING_R13</ns1:REQ_ID>
<ns1:Doc_Sect>2.8</ns1:Doc_Sect>
<ns1:Description>TCP/IP&lt;1&gt;.</ns1:Description>
<ns1:Behavior>Protocol</ns1:Behavior>
<ns1:Scope>Both</ns1:Scope>
<ns1:Priority>p0</ns1:Priority>
<ns1:IsNormative>Normative</ns1:IsNormative>
<ns1:Verification>Test Case</ns1:Verification>
</ns1:Requirement>
</ns1:ReqTable>

Просмотреть файл

@ -0,0 +1,269 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.Protocols.TestTools;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Protocols.TestTools.Test.Utilities;
namespace Microsoft.Protocols.TestTools.Test.TestRequirementCapture
{
/// <summary>
/// Test cases to test PTF RequirementCapture
/// </summary>
[TestClass]
public class TestRequirementCapture : TestClassBase
{
[ClassInitialize]
public static void ClassInitialize(TestContext testContext)
{
TestClassBase.Initialize(testContext, "TestRequirementCapture");
BaseTestSite.DefaultProtocolDocShortName = "TestRequirementCapture";
}
[ClassCleanup]
public static void ClassCleanup()
{
TestClassBase.Cleanup();
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementAddRequirement()
{
BaseTestSite.Log.Add(
LogEntryKind.Checkpoint,
RequirementId.Make(BaseTestSite.DefaultProtocolDocShortName, 0, "Add a requirement."));
BaseTestSite.CaptureRequirement(0, "Add a requirement.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementAreEqualPassed()
{
BaseTestSite.CaptureRequirementIfAreEqual(1, 1, 1, "The two values should be equal.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreEqual failed on requirement TestRequirementCapture_R2. " +
"Expected: <1 (0x00000001)>, Actual: <2 (0x00000002)>. The two values should be equal.")]
public void CaptureRequirementAreEqualFailed()
{
BaseTestSite.CaptureRequirementIfAreEqual(1, 2, 2, "The two values should be equal.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementAreSamePassed()
{
BaseTestSite.CaptureRequirementIfAreSame("a", "a", 3, "The two strings should be the same.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreSame failed on requirement TestRequirementCapture_R4. The two strings should be the same.")]
public void CaptureRequirementAreSameFailed()
{
BaseTestSite.CaptureRequirementIfAreSame("a", "b", 4, "The two strings should be the same.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementAreNotSamePassed()
{
BaseTestSite.CaptureRequirementIfAreNotSame("a", "b", 5, "The two strings should not be the same.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.AreNotSame failed on requirement TestRequirementCapture_R6. The two strings should not be the same.")]
public void CaptureRequirementAreNotSameFailed()
{
BaseTestSite.CaptureRequirementIfAreNotSame("a", "a", 6, "The two strings should not be the same.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementIfTruePassed()
{
BaseTestSite.CaptureRequirementIfIsTrue(true, 7, "The value should be true.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsTrue failed on requirement TestRequirementCapture_R8. The value should be true.")]
public void CaptureRequirementIfTrueFailed()
{
BaseTestSite.CaptureRequirementIfIsTrue(false, 8, "The value should be true.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementIfFalsePassed()
{
BaseTestSite.CaptureRequirementIfIsFalse(false, 9, "The value should be false.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsFalse failed on requirement TestRequirementCapture_R10. The value should be false.")]
public void CaptureRequirementIfFalseFailed()
{
BaseTestSite.CaptureRequirementIfIsFalse(true, 10, "The value should be false.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementIsInstanceOfPassed()
{
BaseTestSite.CaptureRequirementIfIsInstanceOfType(
2,
typeof(System.Int32),
11,
"The type of the instance should be System.Int32.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsInstanceOfType failed on requirement TestRequirementCapture_R12. " +
"Expected Type: <System.String>, Actual Type: <System.Int32>. The type of the instance should be System.String.")]
public void CaptureRequirementIsInstanceOfFailed()
{
BaseTestSite.CaptureRequirementIfIsInstanceOfType(
2,
typeof(System.String),
12,
"The type of the instance should be System.String.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementIsNotInstanceOfPassed()
{
BaseTestSite.CaptureRequirementIfIsNotInstanceOfType(
2,
typeof(System.String),
13,
"The type of the instance should not be System.String.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsNotInstanceOfType failed on requirement TestRequirementCapture_R14. " +
"Wrong Type: <System.Int32>, Actual Type: <System.Int32>. The type of the instance should not be System.Int32.")]
public void CaptureRequirementIsNotInstanceOfFailed()
{
BaseTestSite.CaptureRequirementIfIsNotInstanceOfType(
2,
typeof(System.Int32),
14,
"The type of the instance should not be System.Int32.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementIsNotNullPassed()
{
BaseTestSite.CaptureRequirementIfIsNotNull("123", 15, "The value should not be null.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsNotNull failed on requirement TestRequirementCapture_R16. The value should not be null.")]
public void CaptureRequirementIsNotNullFailed()
{
BaseTestSite.CaptureRequirementIfIsNotNull(null, 16, "The value should not be null.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementIsNullPassed()
{
BaseTestSite.CaptureRequirementIfIsNull(null, 17, "The value should be null.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsNull failed on requirement TestRequirementCapture_R18. The value should be null.")]
public void CaptureRequirementIsNullFailed()
{
BaseTestSite.CaptureRequirementIfIsNull("123", 18, "The value should be null.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
public void CaptureRequirementIsSuccessPassed()
{
BaseTestSite.CaptureRequirementIfIsSuccess(1, 19, "The HRESULT value should be success");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[PTFExpectedException(typeof(AssertFailedException), "Assert.IsSuccess failed on requirement TestRequirementCapture_R20. The HRESULT value should be success.")]
public void CaptureRequirementIsSuccessFailed()
{
BaseTestSite.CaptureRequirementIfIsSuccess(-1, 20, "The HRESULT value should be success.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[Description("The test case will not fail because SkipMAYRequirements is set to true in PTFConfig")]
public void CaptureRequirementSkipMayRequirement()
{
BaseTestSite.CaptureRequirementIfIsTrue(false, 21, "The value should be true.", RequirementType.May);
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[Description("The test case will not fail because SkipMUSTRequirements is set to true in PTFConfig")]
public void CaptureRequirementSkipMustRequirement()
{
BaseTestSite.CaptureRequirementIfIsTrue(false, 22, "The value should be true.", RequirementType.Must);
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[Description("The test case will not fail because SkipSHOULDRequirements is set to true in PTFConfig")]
public void CaptureRequirementSkipShouldRequirement()
{
BaseTestSite.CaptureRequirementIfIsTrue(false, 23, "The value should be true.", RequirementType.Should);
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[Description("The test case will not fail because SkipPRODUCTRequirements is set to true in PTFConfig")]
public void CaptureRequirementSkipProductRequirement()
{
BaseTestSite.CaptureRequirementIfIsTrue(false, 24, "The value should be true.", RequirementType.Product);
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[Description("The expected value is reclaimed to 1 in PTFConfig")]
public void CaptureRequirementExpectedValueReclaimed()
{
BaseTestSite.CaptureRequirementIfAreEqual(2, 1, 25, "The two values should be equal.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[Description("The case will not fail because the two requirements are set as ExceptionalRequirements in PTFConfig")]
public void CaptureRequirementSkipExceptionalRequirements()
{
BaseTestSite.CaptureRequirementIfAreEqual(2, 1, 26, "The two values should be equal.");
BaseTestSite.CaptureRequirementIfIsTrue(false, 27, "The value should be true.");
}
[TestMethod]
[TestCategory("TestRequirementCapture")]
[Description("An exception should be thrown if the same requirement id is used more than once but with different description.")]
[PTFExpectedException(typeof(InvalidOperationException))]
public void CaptureRequirementSameRequirementIdDifferentDescription()
{
BaseTestSite.CaptureRequirementIfAreEqual(1, 1, 28, "The two values should be equal.");
BaseTestSite.CaptureRequirementIfIsTrue(true, 28, "The value should be true.");
}
}
}

Просмотреть файл

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>
</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{5944E70C-7885-4E3C-B28E-E870A358E64E}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Microsoft.Protocols.TestTools.Test.TestRequirementCapture</RootNamespace>
<AssemblyName>TestRequirementCapture</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="TestRequirementCapture.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="TestRequirementCapture.ptfconfig" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\testtools.vsts\TestTools.VSTS.csproj">
<Project>{3cb878cb-0cd3-447f-8dd8-8a0c62b7c3af}</Project>
<Name>TestTools.VSTS</Name>
</ProjectReference>
<ProjectReference Include="..\..\testtools\TestTools.csproj">
<Project>{1ca2b935-3224-40f1-84bc-47fa1a9b242e}</Project>
<Name>TestTools</Name>
</ProjectReference>
<ProjectReference Include="..\Utilities\Utilities.csproj">
<Project>{cbe396d2-d8d0-43cd-bdb8-fd8ba46bb3fd}</Project>
<Name>Utilities</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

Просмотреть файл

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8" ?>
<TestSite xmlns="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig http://schemas.microsoft.com/windows/ProtocolsTest/2007/07/TestConfig.xsd">
<Properties>
<!-- Test suite properties which value not changed when running in different test environments -->
<Property name="FeatureName" value="PTF:RequirementCapture" />
<!--Requirements Section begins. All the property elements for the Requirements information should be in this section.-->
<!-- Skip the below requirement types from getting validated: -->
<Property name="SkipMAYRequirements" value="true"/>
<Property name="SkipMUSTRequirements" value="true"/>
<Property name="SkipSHOULDRequirements" value="true"/>
<Property name="SkipPRODUCTRequirements" value="true"/>
<!-- The real expected value of the requirement id 25 -->
<Property name="RequirementTestRequirementCapture_R25" value="1" />
<!-- When an exceptional requirement fails, the test case continues running with the failure logged in entry CheckFailed and Exceptional Requirement. -->
<!-- List the exceptional requirements as below -->
<Property name="ExceptionalRequirements" value="TestRequirementCapture_R26,TestRequirementCapture_R27" />
<!--Requirements Section ends.-->
</Properties>
<!-- The default profile name. Provide maximum logging. -->
<TestLog defaultprofile="Verbose">
<Profiles>
<!-- Name of the profile. extends indicates the profile will be included.-->
<Profile name="Verbose" extends="Error">
<!-- Show on Console -->
<Rule kind="TestStep" sink="Console" delete="false"/>
<Rule kind="Checkpoint" sink="Console" delete="false"/>
<Rule kind="CheckSucceeded" sink="Console" delete="false"/>
<Rule kind="CheckFailed" sink="Console" delete="false"/>
<Rule kind="CheckInconclusive" sink="Console" delete="false"/>
<Rule kind="Comment" sink="Console" delete="false"/>
<Rule kind="Warning" sink="Console" delete="false"/>
<Rule kind="Debug" sink="Console" delete="false"/>
<Rule kind="TestFailed" sink="Console" delete="false"/>
<Rule kind="TestInconclusive" sink="Console" delete="false"/>
<Rule kind="TestPassed" sink="Console" delete="false"/>
</Profile>
</Profiles>
</TestLog>
</TestSite>

Просмотреть файл

@ -0,0 +1,49 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Microsoft.Protocols.TestTools.Test.Utilities
{
/// <summary>
/// An attrubite used for check if an expected exception is thrown in the case.
/// It will check both exception type and message.
/// </summary>
public sealed class PTFExpectedException : ExpectedExceptionBaseAttribute
{
private Type ptfExpectedExceptionType;
private string ptfExpectedExceptionMessage;
public PTFExpectedException(Type expectedExceptionType)
{
ptfExpectedExceptionType = expectedExceptionType;
ptfExpectedExceptionMessage = string.Empty;
}
public PTFExpectedException(Type expectedExceptionType, string expectedExceptionMessage)
{
ptfExpectedExceptionType = expectedExceptionType;
ptfExpectedExceptionMessage = expectedExceptionMessage;
}
protected override void Verify(Exception exception)
{
Assert.IsNotNull(exception);
Assert.IsInstanceOfType(
exception,
ptfExpectedExceptionType,
"Wrong type of exception was thrown.");
if (!ptfExpectedExceptionMessage.Length.Equals(0))
{
int indexOfStackTrace = exception.Message.IndexOf("\r\n===== Stack Trace =====");
string getActualExceptionMessage = exception.Message.Substring(0, indexOfStackTrace);
Assert.AreEqual(
ptfExpectedExceptionMessage, getActualExceptionMessage,
"Wrong exception message was returned.");
}
}
}
}

Просмотреть файл

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Utilities")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Utilities")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("e07e68ac-5f71-4c39-be91-f7bb66d30568")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{CBE396D2-D8D0-43CD-BDB8-FD8BA46BB3FD}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Microsoft.Protocols.TestTools.Test.Utilities</RootNamespace>
<AssemblyName>Utilities</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup>
<Compile Include="PTFExpectedException.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

14
src/test/buildtest.cmd Normal file
Просмотреть файл

@ -0,0 +1,14 @@
:: Copyright (c) Microsoft. All rights reserved.
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
@echo off
if not defined buildtool (
for /f %%i in ('dir /b /ad /on "%windir%\Microsoft.NET\Framework\v4*"') do (@if exist "%windir%\Microsoft.NET\Framework\%%i\msbuild".exe set buildtool=%windir%\Microsoft.NET\Framework\%%i\msbuild.exe)
)
if not defined buildtool (
echo No msbuild.exe was found, install .Net Framework version 4.0 or higher
goto :eof
)
%buildtool% TestPTF.sln /t:clean;rebuild

19
src/test/runtest.cmd Normal file
Просмотреть файл

@ -0,0 +1,19 @@
:: Copyright (c) Microsoft. All rights reserved.
:: Licensed under the MIT license. See LICENSE file in the project root for full license information.
@echo off
if not defined vspath (
if defined VS110COMNTOOLS (
set vspath="%VS110COMNTOOLS%"
) else if defined VS120COMNTOOLS (
set vspath="%VS120COMNTOOLS%"
) else if defined VS140COMNTOOLS (
set vspath="%VS140COMNTOOLS%"
) else (
echo Visual Studio or Visual Studio test agent should be installed, version 2012 or higher
goto :eof
)
)
:: Does not run Interactive adapter cases in automation test
%vspath%..\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe "TestProperties\bin\Debug\TestProperties.dll" "TestChecker\bin\Debug\TestChecker.dll" "TestLogging\bin\Debug\TestLogging.dll" "TestRequirementCapture\bin\Debug\TestRequirementCapture.dll" "TestAdapter\bin\Debug\TestAdapter.dll" /TestCaseFilter:"Name!=InteractiveAdapterAbort&Name!=InteractiveAdapterReturnInt&Name!=InteractiveAdapterReturnString" /Settings:Local.testsettings /Logger:trx

Просмотреть файл

@ -0,0 +1,95 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Microsoft.Protocols.TestTools.ExtendedLogging
{
/// <summary>
/// Provides APIs for logging in Protocol Library and dumping message to ETW provider.
/// </summary>
public class ExtendedLogger
{
/// <summary>
/// Dumps network message to ETW provider.
/// </summary>
/// <param name="messageName">The Name of the Message. In format protocol:message</param>
/// <param name="dumpLevel">An enum indicating whether this message is a complete message on the wire or only part of the encrypted structure.</param>
/// <param name="comments">Some comments about the dumped message.</param>
/// <param name="payload">The byte array to dump.</param>
static public void DumpMessage(string messageName, DumpLevel dumpLevel, string comments, byte[] payload)
{
ExtendedLoggerConfig.TestSuiteEvents.EventWriteRawMessage(
ExtendedLoggerConfig.TestSuiteName,
ExtendedLoggerConfig.CaseName,
messageName,
(ushort)dumpLevel,
comments,
(ushort)payload.Length,
payload
);
}
/// <summary>
/// Dumps network message to ETW provider.
/// </summary>
/// <param name="messageName">The Name of the Message. In format protocol:message</param>
/// <param name="comments">Some comments about the dumped message.</param>
/// <param name="payload">The byte array to dump.</param>
static public void DumpMessage(string messageName, string comments, byte[] payload)
{
DumpMessage(messageName, DumpLevel.WholeMessage, comments, payload);
}
/// <summary>
/// Dumps network message to ETW provider.
/// </summary>
/// <param name="messageName">The Name of the Message. In format protocol:message</param>
/// <param name="payload">The byte array to dump.</param>
static public void DumpMessage(string messageName, byte[] payload)
{
DumpMessage(messageName, "", payload);
}
}
/// <summary>
/// Dump level for the DumpMessage method
/// </summary>
public enum DumpLevel
{
/// <summary>
/// The message is a message on the wire.
/// </summary>
WholeMessage = 0,
/// <summary>
/// The message is part of the message on the wire.
/// </summary>
PartialMessage = 1
}
/// <summary>
/// This class is for internal use only.
/// </summary>
public class ExtendedLoggerConfig
{
/// <summary>
/// Events of the test suite
/// </summary>
static public TEST_SUITE_EVENTS TestSuiteEvents = new TEST_SUITE_EVENTS();
/// <summary>
/// Name of the test case
/// </summary>
static public string CaseName = "N/A";
/// <summary>
/// Name of the test suite
/// </summary>
static public string TestSuiteName = "N/A";
}
}

Просмотреть файл

@ -0,0 +1,215 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//---------------------------------------------------------------------
// <autogenerated>
//
// Generated by Message Compiler (mc.exe)
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//---------------------------------------------------------------------
#pragma warning disable 1591
namespace Microsoft.Protocols.TestTools
{
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Diagnostics.Eventing;
using Microsoft.Win32;
using System.Runtime.InteropServices;
using System.Security.Principal;
public class TEST_SUITE_EVENTS : IDisposable
{
//
// Provider Protocol-Test-Suite Event Count 2
//
internal EventProviderVersionTwo m_provider = new EventProviderVersionTwo(new Guid("acb7c4c9-a810-498e-887c-1c0e0372bb58"));
//
// Task : eventGUIDs
//
//
// Event Descriptors
//
protected EventDescriptor TestSuiteLog;
protected EventDescriptor RawMessage;
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
m_provider.Dispose();
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public TEST_SUITE_EVENTS()
{
unchecked
{
TestSuiteLog = new EventDescriptor(0x1, 0x0, 0x9, 0x4, 0x0, 0x0, (long)0x8000000000000000);
RawMessage = new EventDescriptor(0x2, 0x0, 0x9, 0x4, 0x0, 0x0, (long)0x8000000000000000);
}
}
//
// Event method for TestSuiteLog
//
public bool EventWriteTestSuiteLog(string TestSuite, string CaseName, string EntryKind, string Message)
{
if (!m_provider.IsEnabled())
{
return true;
}
return m_provider.TemplateTestSuiteLog(ref TestSuiteLog, TestSuite, CaseName, EntryKind, Message);
}
//
// Event method for RawMessage
//
public bool EventWriteRawMessage(string TestSuite, string CaseName, string MessageName, ushort DumpLevel, string Comments, ushort Length, byte[] Payload)
{
if (!m_provider.IsEnabled())
{
return true;
}
return m_provider.TemplateRawMessage(ref RawMessage, TestSuite, CaseName, MessageName, DumpLevel, Comments, Length, Payload);
}
}
internal class EventProviderVersionTwo : EventProvider
{
internal EventProviderVersionTwo(Guid id)
: base(id)
{}
[StructLayout(LayoutKind.Explicit, Size = 16)]
private struct EventData
{
[FieldOffset(0)]
internal UInt64 DataPointer;
[FieldOffset(8)]
internal uint Size;
[FieldOffset(12)]
internal int Reserved;
}
internal unsafe bool TemplateTestSuiteLog(
ref EventDescriptor eventDescriptor,
string TestSuite,
string CaseName,
string EntryKind,
string Message
)
{
int argumentCount = 4;
bool status = true;
if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords))
{
byte* userData = stackalloc byte[sizeof(EventData) * argumentCount];
EventData* userDataPtr = (EventData*)userData;
userDataPtr[0].Size = (uint)(TestSuite.Length + 1)*sizeof(char);
userDataPtr[1].Size = (uint)(CaseName.Length + 1)*sizeof(char);
userDataPtr[2].Size = (uint)(EntryKind.Length + 1)*sizeof(char);
userDataPtr[3].Size = (uint)(Message.Length + 1)*sizeof(char);
fixed (char* a0 = TestSuite, a1 = CaseName, a2 = EntryKind, a3 = Message)
{
userDataPtr[0].DataPointer = (ulong)a0;
userDataPtr[1].DataPointer = (ulong)a1;
userDataPtr[2].DataPointer = (ulong)a2;
userDataPtr[3].DataPointer = (ulong)a3;
status = WriteEvent(ref eventDescriptor, argumentCount, (IntPtr)(userData));
}
}
return status;
}
internal unsafe bool TemplateRawMessage(
ref EventDescriptor eventDescriptor,
string TestSuite,
string CaseName,
string MessageName,
ushort DumpLevel,
string Comments,
ushort Length,
byte[] Payload
)
{
int argumentCount = 7;
bool status = true;
if (IsEnabled(eventDescriptor.Level, eventDescriptor.Keywords))
{
byte* userData = stackalloc byte[sizeof(EventData) * argumentCount];
EventData* userDataPtr = (EventData*)userData;
userDataPtr[0].Size = (uint)(TestSuite.Length + 1)*sizeof(char);
userDataPtr[1].Size = (uint)(CaseName.Length + 1)*sizeof(char);
userDataPtr[2].Size = (uint)(MessageName.Length + 1)*sizeof(char);
userDataPtr[3].DataPointer = (UInt64)(&DumpLevel);
userDataPtr[3].Size = (uint)(sizeof(short) );
userDataPtr[4].Size = (uint)(Comments.Length + 1)*sizeof(char);
userDataPtr[5].DataPointer = (UInt64)(&Length);
userDataPtr[5].Size = (uint)(sizeof(short) );
userDataPtr[6].Size = (uint)(sizeof(byte)*Length);
fixed (char* a0 = TestSuite, a1 = CaseName, a2 = MessageName, a3 = Comments)
{
userDataPtr[0].DataPointer = (ulong)a0;
userDataPtr[1].DataPointer = (ulong)a1;
userDataPtr[2].DataPointer = (ulong)a2;
userDataPtr[4].DataPointer = (ulong)a3;
fixed (byte* b0 = Payload)
{
userDataPtr[6].DataPointer = (ulong)b0;
status = WriteEvent(ref eventDescriptor, argumentCount, (IntPtr)(userData));
}
}
}
return status;
}
}
}
#pragma warning restore 1591

Двоичные данные
src/testtools.extendedlogging/TestSuiteProvider.man Normal file

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,3 @@
LANGUAGE 0x9,0x1
1 11 "MSG00001.bin"
1 WEVT_TEMPLATE "TestSuiteProviderTEMP.BIN"

Двоичные данные
src/testtools.extendedlogging/TestSuiteProvider.res Normal file

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{EEB7AC20-C23F-447A-A2E7-E92519592DB0}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>Microsoft.Protocols.TestTools.ExtendedLogging</RootNamespace>
<AssemblyName>Microsoft.Protocols.TestTools.ExtendedLogging</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile />
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>Microsoft.Protocols.TestTools.ExtendedLogging.XML</DocumentationFile>
<RunCodeAnalysis>false</RunCodeAnalysis>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>Microsoft.Protocols.TestTools.ExtendedLogging.XML</DocumentationFile>
<RunCodeAnalysis>false</RunCodeAnalysis>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup>
<Win32Resource>TestSuiteProvider.res</Win32Resource>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\SharedAssemblyInfo.cs">
<Link>SharedAssemblyInfo.cs</Link>
</Compile>
<Compile Include="ExtendedLogger.cs" />
<Compile Include="TestSuiteProvider.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="TestSuiteProvider.man" />
<Content Include="TestSuiteProvider.res" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
<Visible>False</Visible>
<ProductName>.NET Framework 2.0 %28x86%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
<Visible>False</Visible>
<ProductName>.NET Framework 3.0 %28x86%29</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<Copy SourceFiles="$(TargetDir)$(TargetFileName)" DestinationFolder="..\Bin\ptf\vs10\" />
<Copy SourceFiles="$(TargetDir)$(DocumentationFile)" DestinationFolder="..\Bin\ptf\vs10\xmldocs\" />
<Copy SourceFiles="$(TargetDir)$(TargetName).pdb" DestinationFolder="..\Bin\ptf\vs10\" />
</Target>
</Project>

Просмотреть файл

@ -0,0 +1,212 @@
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Protocols.TestTools.Messages.Runtime;
namespace Microsoft.Protocols.TestTools
{
/// <summary>
/// The Identifier Binding Class
/// </summary>
/// <typeparam name="Target">The target type to which the identifier is bound.</typeparam>
public class IdentifierBinding<Target> :
Microsoft.Protocols.TestTools.Messages.Runtime.IdentifierBinding<Target>
{
/// <summary>
/// Constructor
/// </summary>
public IdentifierBinding()
: base()
{ }
/// <summary>
/// Constructor
/// </summary>
/// <param name="site">The test site</param>
public IdentifierBinding(ITestSite site)
: base(ExtensionHelper.GetRuntimeHost(site))
{ }
}
/// <summary>
/// Provides a series of helper methods in testtools extension
/// </summary>
public static class ExtensionHelper
{
/// <summary>
/// Binding PTF logger checker to Message Runtime Host.
/// </summary>
static void RegisterRuntimeHost(ITestSite site, IRuntimeHost host)
{
host.AssertChecker += new EventHandler<MessageLogEventArgs>(
delegate(object sender, MessageLogEventArgs e)
{
if (e == null)
{
throw new ArgumentNullException("MessageLogEventArgs");
}
if (e.Condition)
{
site.Assert.Pass(e.Message, e.Parameters);
}
else
{
site.Assert.Fail(e.Message, e.Parameters);
}
});
host.AssumeChecker += new EventHandler<MessageLogEventArgs>(
delegate(object sender, MessageLogEventArgs e)
{
if (e == null)
{
throw new ArgumentNullException("MessageLogEventArgs");
}
if (e.Condition)
{
site.Assume.Pass(e.Message, e.Parameters);
}
else
{
site.Assume.Fail(e.Message, e.Parameters);
}
});
host.DebugChecker += new EventHandler<MessageLogEventArgs>(
delegate(object sender, MessageLogEventArgs e)
{
if (e == null)
{
throw new ArgumentNullException("MessageLogEventArgs");
}
if (e.Condition)
{
site.Debug.Pass(e.Message, e.Parameters);
}
else
{
site.Debug.Fail(e.Message, e.Parameters);
}
});
host.MessageLogger += new EventHandler<MessageLogEventArgs>(
delegate(object sender, MessageLogEventArgs e)
{
if (e == null)
{
throw new ArgumentNullException("MessageLogEventArgs");
}
site.Log.Add(
LogKindToLogEntryKind(e.LogEntryKind),
e.Message, e.Parameters);
});
host.RequirementLogger += new EventHandler<RequirementCaptureEventArgs>(
delegate(object sender, RequirementCaptureEventArgs e)
{
if (e == null)
{
throw new ArgumentNullException("RequirementCaptureEventArgs");
}
site.CaptureRequirement(
e.ProtocolName, e.RequirementId, e.RequirementDescription);
});
}
/// <summary>
/// Runtime log kind to PTF log entry.
/// </summary>
static LogEntryKind LogKindToLogEntryKind(LogKind kind)
{
LogEntryKind entryKind;
switch (kind)
{
case LogKind.CheckSucceeded:
entryKind = LogEntryKind.CheckSucceeded;
break;
case LogKind.CheckFailed:
entryKind = LogEntryKind.CheckFailed;
break;
case LogKind.Checkpoint:
entryKind = LogEntryKind.Checkpoint;
break;
case LogKind.Comment:
entryKind = LogEntryKind.Comment;
break;
case LogKind.Debug:
entryKind = LogEntryKind.Debug;
break;
case LogKind.Warning:
entryKind = LogEntryKind.Warning;
break;
default:
throw new InvalidOperationException("Unexpected LogKind.");
}
return entryKind;
}
/// <summary>
/// Gets the runtime host.
/// </summary>
/// <param name="site">The test site</param>
/// <returns>Returns the instance of the runtime host</returns>
public static IRuntimeHost GetRuntimeHost(ITestSite site)
{
if (site == null)
{
return null;
}
bool marshallerTrace = site != null ? site.Properties["Marshaler.trace"] == "true" : false;
bool disablevalidation = site != null ? site.Properties["disablevalidation"] == "true" : false;
RuntimeHostProvider.Initialize(marshallerTrace, disablevalidation);
IRuntimeHost host = RuntimeHostProvider.RuntimeHost;
//only register once
if (string.IsNullOrEmpty(site.Properties["IsRuntimeHostRegistered"]))
{
RegisterRuntimeHost(site, host);
site.Properties["IsRuntimeHostRegistered"] = "true";
}
return host;
}
/// <summary>
/// Handle VS UnitTest Framework exception
/// </summary>
/// <param name="e">The exception needs to be handled</param>
/// <param name="site">The test site</param>
public static void HandleVSException(Exception e, ITestSite site)
{
if (e == null)
{
throw new ArgumentNullException("e");
}
if (site == null)
{
throw new ArgumentNullException("site");
}
//remove the dependency to the VS UnitTest Framework.
Type exceptionType = e.GetType();
string assertFailedException = "Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException";
string assertInconclusiveException = "Microsoft.VisualStudio.TestTools.UnitTesting.AssertInconclusiveException";
if (string.Compare(exceptionType.FullName, assertFailedException, true) == 0)
{
site.Assert.Fail("asynchronous assertion failed in receive loop and has been logged");
}
else if (string.Compare(exceptionType.FullName, assertInconclusiveException, true) == 0)
{
site.Assert.Fail("asynchronous assumption failed in receive loop and has been logged");
}
}
}
}

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше