Commit 6c53cf31 6c53cf3101f508c7e89b1ee139dc158556bf8cea by Christian Gerdes

Initial commit from CodePlex 2017-09-02

0 parents
Showing 33 changed files with 4236 additions and 0 deletions
1 
2 Microsoft Visual Studio Solution File, Format Version 12.00
3 # Visual Studio 2012
4 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebServicePluginForWebTestMessageEditor", "WebTestWebServiceMessageEditor\WebServicePluginForWebTestMessageEditor.csproj", "{23707A49-589B-4A36-BDAA-2896E647D07D}"
5 EndProject
6 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebServicePluginForWebTestResultTab", "WebTestWebServiceResultAddin\WebServicePluginForWebTestResultTab.csproj", "{48B3509E-1FD8-4875-8FC6-137647EB83AA}"
7 EndProject
8 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebServicePluginForWebTestRuntime", "WebTestWebServiceRuntime\WebServicePluginForWebTestRuntime.csproj", "{F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}"
9 EndProject
10 Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "WebServicePluginsSetup", "WebTestWebServiceSetup\WebServicePluginsSetup.wixproj", "{73ACCDA5-47C1-40C9-B63E-AFF657E046E4}"
11 EndProject
12 Global
13 GlobalSection(TeamFoundationVersionControl) = preSolution
14 SccNumberOfProjects = 4
15 SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
16 SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs03
17 SccProjectUniqueName0 = WebTestWebServiceRuntime\\WebServicePluginForWebTestRuntime.csproj
18 SccProjectName0 = WebTestWebServiceRuntime
19 SccAuxPath0 = https://tfs.codeplex.com/tfs/tfs03
20 SccLocalPath0 = WebTestWebServiceRuntime
21 SccProvider0 = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
22 SccProjectUniqueName1 = WebTestWebServiceResultAddin\\WebServicePluginForWebTestResultTab.csproj
23 SccProjectName1 = WebTestWebServiceResultAddin
24 SccAuxPath1 = https://tfs.codeplex.com/tfs/tfs03
25 SccLocalPath1 = WebTestWebServiceResultAddin
26 SccProvider1 = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
27 SccProjectUniqueName2 = WebTestWebServiceMessageEditor\\WebServicePluginForWebTestMessageEditor.csproj
28 SccProjectName2 = WebTestWebServiceMessageEditor
29 SccAuxPath2 = https://tfs.codeplex.com/tfs/tfs03
30 SccLocalPath2 = WebTestWebServiceMessageEditor
31 SccProvider2 = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
32 SccProjectUniqueName3 = WebTestWebServiceSetup\\WebServicePluginsSetup.wixproj
33 SccProjectName3 = WebTestWebServiceSetup
34 SccAuxPath3 = https://tfs.codeplex.com/tfs/tfs03
35 SccLocalPath3 = WebTestWebServiceSetup
36 SccProvider3 = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
37 EndGlobalSection
38 GlobalSection(SolutionConfigurationPlatforms) = preSolution
39 Debug|Any CPU = Debug|Any CPU
40 Debug|Mixed Platforms = Debug|Mixed Platforms
41 Debug|x86 = Debug|x86
42 Release|Any CPU = Release|Any CPU
43 Release|Mixed Platforms = Release|Mixed Platforms
44 Release|x86 = Release|x86
45 EndGlobalSection
46 GlobalSection(ProjectConfigurationPlatforms) = postSolution
47 {23707A49-589B-4A36-BDAA-2896E647D07D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
48 {23707A49-589B-4A36-BDAA-2896E647D07D}.Debug|Any CPU.Build.0 = Debug|Any CPU
49 {23707A49-589B-4A36-BDAA-2896E647D07D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
50 {23707A49-589B-4A36-BDAA-2896E647D07D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
51 {23707A49-589B-4A36-BDAA-2896E647D07D}.Debug|x86.ActiveCfg = Debug|Any CPU
52 {23707A49-589B-4A36-BDAA-2896E647D07D}.Release|Any CPU.ActiveCfg = Release|Any CPU
53 {23707A49-589B-4A36-BDAA-2896E647D07D}.Release|Any CPU.Build.0 = Release|Any CPU
54 {23707A49-589B-4A36-BDAA-2896E647D07D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
55 {23707A49-589B-4A36-BDAA-2896E647D07D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
56 {23707A49-589B-4A36-BDAA-2896E647D07D}.Release|x86.ActiveCfg = Release|Any CPU
57 {48B3509E-1FD8-4875-8FC6-137647EB83AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
58 {48B3509E-1FD8-4875-8FC6-137647EB83AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
59 {48B3509E-1FD8-4875-8FC6-137647EB83AA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
60 {48B3509E-1FD8-4875-8FC6-137647EB83AA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
61 {48B3509E-1FD8-4875-8FC6-137647EB83AA}.Debug|x86.ActiveCfg = Debug|Any CPU
62 {48B3509E-1FD8-4875-8FC6-137647EB83AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
63 {48B3509E-1FD8-4875-8FC6-137647EB83AA}.Release|Any CPU.Build.0 = Release|Any CPU
64 {48B3509E-1FD8-4875-8FC6-137647EB83AA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
65 {48B3509E-1FD8-4875-8FC6-137647EB83AA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
66 {48B3509E-1FD8-4875-8FC6-137647EB83AA}.Release|x86.ActiveCfg = Release|Any CPU
67 {F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
68 {F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}.Debug|Any CPU.Build.0 = Debug|Any CPU
69 {F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
70 {F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
71 {F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}.Debug|x86.ActiveCfg = Debug|Any CPU
72 {F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}.Release|Any CPU.ActiveCfg = Release|Any CPU
73 {F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}.Release|Any CPU.Build.0 = Release|Any CPU
74 {F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
75 {F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
76 {F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}.Release|x86.ActiveCfg = Release|Any CPU
77 {73ACCDA5-47C1-40C9-B63E-AFF657E046E4}.Debug|Any CPU.ActiveCfg = Debug|x86
78 {73ACCDA5-47C1-40C9-B63E-AFF657E046E4}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
79 {73ACCDA5-47C1-40C9-B63E-AFF657E046E4}.Debug|Mixed Platforms.Build.0 = Debug|x86
80 {73ACCDA5-47C1-40C9-B63E-AFF657E046E4}.Debug|x86.ActiveCfg = Debug|x86
81 {73ACCDA5-47C1-40C9-B63E-AFF657E046E4}.Debug|x86.Build.0 = Debug|x86
82 {73ACCDA5-47C1-40C9-B63E-AFF657E046E4}.Release|Any CPU.ActiveCfg = Release|x86
83 {73ACCDA5-47C1-40C9-B63E-AFF657E046E4}.Release|Mixed Platforms.ActiveCfg = Release|x86
84 {73ACCDA5-47C1-40C9-B63E-AFF657E046E4}.Release|Mixed Platforms.Build.0 = Release|x86
85 {73ACCDA5-47C1-40C9-B63E-AFF657E046E4}.Release|x86.ActiveCfg = Release|x86
86 {73ACCDA5-47C1-40C9-B63E-AFF657E046E4}.Release|x86.Build.0 = Release|x86
87 EndGlobalSection
88 GlobalSection(SolutionProperties) = preSolution
89 HideSolutionNode = FALSE
90 EndGlobalSection
91 EndGlobal
1 //*************************************************************************************************
2 // MessageEditor.Designer.cs
3 // Owner: Mahipal Kante
4 //
5 // UI of Editor for Web Service Request Body
6 // The Web Service response can be plain XML or 'application/soap+msbin1'
7 // (binary - used by Silverlight application with WCF RIA) or JSON
8 //
9 // Copyright(c) Microsoft Corporation, 2010
10 //*************************************************************************************************
11 namespace WebTest.WebService.Plugin.MessageEditors
12 {
13 partial class MessageEditor
14 {
15 /// <summary>
16 /// Required designer variable.
17 /// </summary>
18 private System.ComponentModel.IContainer components = null;
19
20 /// <summary>
21 /// Clean up any resources being used.
22 /// </summary>
23 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
24 protected override void Dispose(bool disposing)
25 {
26 if (disposing && (components != null))
27 {
28 components.Dispose();
29 }
30 base.Dispose(disposing);
31 }
32
33 #region Component Designer generated code
34
35 /// <summary>
36 /// Required method for Designer support - do not modify
37 /// the contents of this method with the code editor.
38 /// </summary>
39 private void InitializeComponent()
40 {
41 this.requestTextBox = new System.Windows.Forms.TextBox();
42 this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
43 this.tabControl1 = new System.Windows.Forms.TabControl();
44 this.tabPage1 = new System.Windows.Forms.TabPage();
45 this.treeViewRequest = new System.Windows.Forms.TreeView();
46 this.tabPage2 = new System.Windows.Forms.TabPage();
47 this.panel1 = new System.Windows.Forms.Panel();
48 this.requestXMLEditor = new System.Windows.Forms.LinkLabel();
49 this.tableLayoutPanel1.SuspendLayout();
50 this.tabControl1.SuspendLayout();
51 this.tabPage1.SuspendLayout();
52 this.tabPage2.SuspendLayout();
53 this.panel1.SuspendLayout();
54 this.SuspendLayout();
55 //
56 // requestTextBox
57 //
58 this.requestTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
59 this.requestTextBox.Location = new System.Drawing.Point(3, 3);
60 this.requestTextBox.Multiline = true;
61 this.requestTextBox.Name = "requestTextBox";
62 this.requestTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
63 this.requestTextBox.Size = new System.Drawing.Size(326, 166);
64 this.requestTextBox.TabIndex = 0;
65 this.requestTextBox.WordWrap = false;
66 //
67 // tableLayoutPanel1
68 //
69 this.tableLayoutPanel1.ColumnCount = 1;
70 this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
71 this.tableLayoutPanel1.Controls.Add(this.tabControl1, 0, 1);
72 this.tableLayoutPanel1.Controls.Add(this.panel1, 0, 0);
73 this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
74 this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
75 this.tableLayoutPanel1.Name = "tableLayoutPanel1";
76 this.tableLayoutPanel1.RowCount = 2;
77 this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));
78 this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
79 this.tableLayoutPanel1.Size = new System.Drawing.Size(346, 229);
80 this.tableLayoutPanel1.TabIndex = 1;
81 //
82 // tabControl1
83 //
84 this.tabControl1.Controls.Add(this.tabPage1);
85 this.tabControl1.Controls.Add(this.tabPage2);
86 this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
87 this.tabControl1.Location = new System.Drawing.Point(3, 28);
88 this.tabControl1.Name = "tabControl1";
89 this.tabControl1.SelectedIndex = 0;
90 this.tabControl1.Size = new System.Drawing.Size(340, 198);
91 this.tabControl1.TabIndex = 0;
92 //
93 // tabPage1
94 //
95 this.tabPage1.Controls.Add(this.treeViewRequest);
96 this.tabPage1.Location = new System.Drawing.Point(4, 22);
97 this.tabPage1.Name = "tabPage1";
98 this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
99 this.tabPage1.Size = new System.Drawing.Size(332, 172);
100 this.tabPage1.TabIndex = 0;
101 this.tabPage1.Text = "TreeView";
102 this.tabPage1.UseVisualStyleBackColor = true;
103 //
104 // treeViewRequest
105 //
106 this.treeViewRequest.Dock = System.Windows.Forms.DockStyle.Fill;
107 this.treeViewRequest.LabelEdit = true;
108 this.treeViewRequest.Location = new System.Drawing.Point(3, 3);
109 this.treeViewRequest.Name = "treeViewRequest";
110 this.treeViewRequest.Size = new System.Drawing.Size(326, 166);
111 this.treeViewRequest.TabIndex = 0;
112 //
113 // tabPage2
114 //
115 this.tabPage2.Controls.Add(this.requestTextBox);
116 this.tabPage2.Location = new System.Drawing.Point(4, 22);
117 this.tabPage2.Name = "tabPage2";
118 this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
119 this.tabPage2.Size = new System.Drawing.Size(332, 172);
120 this.tabPage2.TabIndex = 1;
121 this.tabPage2.Text = "Text View";
122 this.tabPage2.UseVisualStyleBackColor = true;
123 //
124 // panel1
125 //
126 this.panel1.Controls.Add(this.requestXMLEditor);
127 this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
128 this.panel1.Location = new System.Drawing.Point(3, 3);
129 this.panel1.Name = "panel1";
130 this.panel1.Size = new System.Drawing.Size(340, 19);
131 this.panel1.TabIndex = 1;
132 //
133 // requestXMLEditor
134 //
135 this.requestXMLEditor.AutoSize = true;
136 this.requestXMLEditor.Location = new System.Drawing.Point(4, 4);
137 this.requestXMLEditor.Name = "requestXMLEditor";
138 this.requestXMLEditor.Size = new System.Drawing.Size(96, 13);
139 this.requestXMLEditor.TabIndex = 0;
140 this.requestXMLEditor.TabStop = true;
141 this.requestXMLEditor.Text = "View in XML Editor";
142 this.requestXMLEditor.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.requestXMLEditor_LinkClicked);
143 //
144 // UserControl1
145 //
146 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
147 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
148 this.Controls.Add(this.tableLayoutPanel1);
149 this.Name = "UserControl1";
150 this.Size = new System.Drawing.Size(346, 229);
151 this.tableLayoutPanel1.ResumeLayout(false);
152 this.tabControl1.ResumeLayout(false);
153 this.tabPage1.ResumeLayout(false);
154 this.tabPage2.ResumeLayout(false);
155 this.tabPage2.PerformLayout();
156 this.panel1.ResumeLayout(false);
157 this.panel1.PerformLayout();
158 this.ResumeLayout(false);
159
160 }
161
162 #endregion
163
164 private System.Windows.Forms.TextBox requestTextBox;
165 private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
166 private System.Windows.Forms.TabControl tabControl1;
167 private System.Windows.Forms.TabPage tabPage1;
168 private System.Windows.Forms.TabPage tabPage2;
169 private System.Windows.Forms.TreeView treeViewRequest;
170 private System.Windows.Forms.Panel panel1;
171 private System.Windows.Forms.LinkLabel requestXMLEditor;
172 }
173 }
1 //*************************************************************************************************
2 // MessageEditor.cs
3 // Owner: Mahipal Kante
4 //
5 // UI of Editor for Web Service Request Body
6 // The Web Service response can be plain XML or 'application/soap+msbin1'
7 // (binary - used by Silverlight application with WCF RIA) or JSON
8 //
9 // Copyright(c) Microsoft Corporation, 2010
10 //*************************************************************************************************
11 using System;
12 using System.Collections.Generic;
13 using System.ComponentModel;
14 using System.Drawing;
15 using System.Data;
16 using System.Linq;
17 using System.Text;
18 using System.Windows.Forms;
19 using System.Xml;
20 using WebTest.WebService.Plugin.ResultTab;
21 using WebTest.WebService.Plugin.Runtime;
22
23 namespace WebTest.WebService.Plugin.MessageEditors
24 {
25 internal partial class MessageEditor : UserControl
26 {
27 /// <summary>
28 ///
29 /// </summary>
30 /// <param name="contentHandler">Handler for given content type</param>
31 public MessageEditor(ContentHandler contentHandler)
32 {
33 InitializeComponent();
34
35 this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.TabChanged);
36 this.xmlTreeView = new XmlTreeView(this.treeViewRequest);
37
38 this.contentHandler = contentHandler;
39 this.xmlTreeView.ShowXML(contentHandler.XmlDocument);
40 this.requestTextBox.Text = contentHandler.XmlString;
41
42 ContextMenu treeContextMenu = new ContextMenu();
43 this.treeParameterizeMenuItem = new MenuItem("Parameterize");
44 treeContextMenu.MenuItems.Add(treeParameterizeMenuItem);
45 this.treeViewRequest.ContextMenu = treeContextMenu;
46
47
48 this.treeParameterizeMenuItem.MenuItems.Clear();
49 this.treeParameterizeMenuItem.MenuItems.Add(new MenuItem("Type Parameter", AddParameter));
50
51 Connect connect = Connect.GetInstance();
52 if (connect != null)
53 {
54 this.webTestDetail = connect.GetActiveWebTest();
55 }
56 requestXMLEditor.Visible = (this.webTestDetail != null);
57 if (this.webTestDetail != null)
58 {
59 List<string> parameters = this.webTestDetail.GetParameterList();
60
61 foreach (string parameter in parameters)
62 {
63 this.treeParameterizeMenuItem.MenuItems.Add(new MenuItem(parameter, AddParameter));
64 }
65 }
66 }
67
68 /// <summary>
69 /// Makes sure both tabs are synced with the current changes that are done in Text Box
70 /// </summary>
71 public void UpdateContent()
72 {
73 if (this.tabControl1.SelectedTab.Equals(this.tabPage2))
74 {
75 this.contentHandler.XmlString = this.requestTextBox.Text;
76 }
77 }
78
79 private void AddParameter(object sender, EventArgs e)
80 {
81 MenuItem menuItem = sender as MenuItem;
82 if (menuItem == null)
83 {
84 return;
85 }
86 this.xmlTreeView.AddParameter(menuItem.Text);
87 }
88
89 private void TabChanged(object sender, EventArgs e)
90 {
91 if (this.tabControl1.SelectedTab.Equals(this.tabPage1))
92 {
93 this.contentHandler.XmlString = this.requestTextBox.Text;
94 xmlTreeView.ShowXML(this.contentHandler.XmlDocument);
95 }
96 else
97 {
98 this.requestTextBox.Text = this.contentHandler.XmlString;
99 }
100 }
101
102 private void requestXMLEditor_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
103 {
104 Connect.GetInstance().ShowInXMLEditor("Request Content", this.requestTextBox.Text);
105 }
106
107 private ContentHandler contentHandler;
108
109 private WebTestDetail webTestDetail;
110 private XmlTreeView xmlTreeView;
111 private MenuItem treeParameterizeMenuItem;
112 }
113 }
1 <?xml version="1.0" encoding="utf-8"?>
2 <root>
3 <!--
4 Microsoft ResX Schema
5
6 Version 2.0
7
8 The primary goals of this format is to allow a simple XML format
9 that is mostly human readable. The generation and parsing of the
10 various data types are done through the TypeConverter classes
11 associated with the data types.
12
13 Example:
14
15 ... ado.net/XML headers & schema ...
16 <resheader name="resmimetype">text/microsoft-resx</resheader>
17 <resheader name="version">2.0</resheader>
18 <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
19 <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
20 <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
21 <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
22 <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
23 <value>[base64 mime encoded serialized .NET Framework object]</value>
24 </data>
25 <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
26 <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
27 <comment>This is a comment</comment>
28 </data>
29
30 There are any number of "resheader" rows that contain simple
31 name/value pairs.
32
33 Each data row contains a name, and value. The row also contains a
34 type or mimetype. Type corresponds to a .NET class that support
35 text/value conversion through the TypeConverter architecture.
36 Classes that don't support this are serialized and stored with the
37 mimetype set.
38
39 The mimetype is used for serialized objects, and tells the
40 ResXResourceReader how to depersist the object. This is currently not
41 extensible. For a given mimetype the value must be set accordingly:
42
43 Note - application/x-microsoft.net.object.binary.base64 is the format
44 that the ResXResourceWriter will generate, however the reader can
45 read any of the formats listed below.
46
47 mimetype: application/x-microsoft.net.object.binary.base64
48 value : The object must be serialized with
49 : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
50 : and then encoded with base64 encoding.
51
52 mimetype: application/x-microsoft.net.object.soap.base64
53 value : The object must be serialized with
54 : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
55 : and then encoded with base64 encoding.
56
57 mimetype: application/x-microsoft.net.object.bytearray.base64
58 value : The object must be serialized into a byte array
59 : using a System.ComponentModel.TypeConverter
60 : and then encoded with base64 encoding.
61 -->
62 <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
63 <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
64 <xsd:element name="root" msdata:IsDataSet="true">
65 <xsd:complexType>
66 <xsd:choice maxOccurs="unbounded">
67 <xsd:element name="metadata">
68 <xsd:complexType>
69 <xsd:sequence>
70 <xsd:element name="value" type="xsd:string" minOccurs="0" />
71 </xsd:sequence>
72 <xsd:attribute name="name" use="required" type="xsd:string" />
73 <xsd:attribute name="type" type="xsd:string" />
74 <xsd:attribute name="mimetype" type="xsd:string" />
75 <xsd:attribute ref="xml:space" />
76 </xsd:complexType>
77 </xsd:element>
78 <xsd:element name="assembly">
79 <xsd:complexType>
80 <xsd:attribute name="alias" type="xsd:string" />
81 <xsd:attribute name="name" type="xsd:string" />
82 </xsd:complexType>
83 </xsd:element>
84 <xsd:element name="data">
85 <xsd:complexType>
86 <xsd:sequence>
87 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
88 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
89 </xsd:sequence>
90 <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
91 <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
92 <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
93 <xsd:attribute ref="xml:space" />
94 </xsd:complexType>
95 </xsd:element>
96 <xsd:element name="resheader">
97 <xsd:complexType>
98 <xsd:sequence>
99 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
100 </xsd:sequence>
101 <xsd:attribute name="name" type="xsd:string" use="required" />
102 </xsd:complexType>
103 </xsd:element>
104 </xsd:choice>
105 </xsd:complexType>
106 </xsd:element>
107 </xsd:schema>
108 <resheader name="resmimetype">
109 <value>text/microsoft-resx</value>
110 </resheader>
111 <resheader name="version">
112 <value>2.0</value>
113 </resheader>
114 <resheader name="reader">
115 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
116 </resheader>
117 <resheader name="writer">
118 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
119 </resheader>
120 </root>
...\ No newline at end of file ...\ No newline at end of file
1 //*************************************************************************************************
2 // Msbin1MessageEditor.cs
3 // Owner: Mahipal Kante
4 //
5 // Web Test Plugin for editing 'application/soap+msbin1' content type Web Service Requests
6 // (used by Silverlight application with WCF RIA)
7 //
8 // Copyright(c) Microsoft Corporation, 2010
9 //*************************************************************************************************
10 using Microsoft.VisualStudio.TestTools.WebTesting;
11 using WebTest.WebService.Plugin.ResultTab;
12 using WebTest.WebService.Plugin.Runtime;
13
14 namespace WebTest.WebService.Plugin.MessageEditors
15 {
16 /// <summary>
17 /// Editor for MSBin1 content type (WCF messages)
18 /// </summary>
19 public class Msbin1MessageEditor : IBinaryHttpBodyEditorPlugin
20 {
21 /// <summary>
22 ///
23 /// </summary>
24 public Msbin1MessageEditor()
25 {
26 }
27
28 /// <summary>
29 /// Determine if this plugin supports a content type.
30 /// </summary>
31 /// <param name="contentType">The content type to test.</param>
32 /// <returns>Returns true if the plugin supports the specified content type.</returns>
33 public bool SupportsContentType(string contentType)
34 {
35 return contentType.ToLower().Contains("msbin1");
36 }
37
38 /// <summary>
39 /// Create a UserControl to edit the specified bytes. This control will be hosted in the
40 /// plugin dialog which provides OK and Cancel buttons.
41 /// </summary>
42 /// <param name="contentType">The content type of the BinaryHttpBody.</param>
43 /// <param name="initialValue">
44 /// The bytes to edit. The bytes are the payload of a BinaryHttpBody.
45 /// </param>
46 /// <returns>
47 /// A UserControl capable of displaying and editing the byte array value of
48 /// the specified content type.
49 /// </returns>
50 public object CreateEditor(string contentType, byte[] initialValue)
51 {
52 contentHandler = new Msbin1ContentHandler(contentType.ToLower().Contains("soap"));
53 contentHandler.MessageBytes = initialValue;
54 messageEditor = new MessageEditor(contentHandler);
55 return messageEditor;
56 }
57
58 /// <summary>
59 /// Gets the edited bytes after the OK button is clicked on the plugin dialog.
60 /// </summary>
61 public byte[] GetNewValue()
62 {
63 messageEditor.UpdateContent();
64 return contentHandler.MessageBytes;
65 }
66
67 private MessageEditor messageEditor = null;
68 private Msbin1ContentHandler contentHandler = null;
69 }
70 }
1 using System.Reflection;
2 using System.Runtime.CompilerServices;
3 using System.Runtime.InteropServices;
4
5 // General Information about an assembly is controlled through the following
6 // set of attributes. Change these attribute values to modify the information
7 // associated with an assembly.
8 [assembly: AssemblyTitle("ClassLibrary1")]
9 [assembly: AssemblyDescription("")]
10 [assembly: AssemblyConfiguration("")]
11 [assembly: AssemblyCompany("Microsoft IT")]
12 [assembly: AssemblyProduct("ClassLibrary1")]
13 [assembly: AssemblyCopyright("Copyright © Microsoft IT 2010")]
14 [assembly: AssemblyTrademark("")]
15 [assembly: AssemblyCulture("")]
16
17 // Setting ComVisible to false makes the types in this assembly not visible
18 // to COM components. If you need to access a type in this assembly from
19 // COM, set the ComVisible attribute to true on that type.
20 [assembly: ComVisible(false)]
21
22 // The following GUID is for the ID of the typelib if this project is exposed to COM
23 [assembly: Guid("fe8ec1e0-7f8a-4935-b5f3-00f482453031")]
24
25 // Version information for an assembly consists of the following four values:
26 //
27 // Major Version
28 // Minor Version
29 // Build Number
30 // Revision
31 //
32 // You can specify all the values or you can default the Build and Revision Numbers
33 // by using the '*' as shown below:
34 // [assembly: AssemblyVersion("1.0.*")]
35 [assembly: AssemblyVersion("1.0.0.0")]
36 [assembly: AssemblyFileVersion("1.0.0.0")]
1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <PropertyGroup>
4 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6 <ProductVersion>8.0.30703</ProductVersion>
7 <SchemaVersion>2.0</SchemaVersion>
8 <ProjectGuid>{23707A49-589B-4A36-BDAA-2896E647D07D}</ProjectGuid>
9 <OutputType>Library</OutputType>
10 <AppDesignerFolder>Properties</AppDesignerFolder>
11 <RootNamespace>WebTest.WebService.Plugin.MessageEditors</RootNamespace>
12 <AssemblyName>WebTest.WebService.Plugin.MessageEditors</AssemblyName>
13 <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
14 <FileAlignment>512</FileAlignment>
15 <SccProjectName>SAK</SccProjectName>
16 <SccLocalPath>SAK</SccLocalPath>
17 <SccAuxPath>SAK</SccAuxPath>
18 <SccProvider>SAK</SccProvider>
19 <TargetFrameworkProfile />
20 </PropertyGroup>
21 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
22 <DebugSymbols>true</DebugSymbols>
23 <DebugType>full</DebugType>
24 <Optimize>false</Optimize>
25 <OutputPath>bin\Debug\</OutputPath>
26 <DefineConstants>DEBUG;TRACE</DefineConstants>
27 <ErrorReport>prompt</ErrorReport>
28 <WarningLevel>4</WarningLevel>
29 <Prefer32Bit>false</Prefer32Bit>
30 </PropertyGroup>
31 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
32 <DebugType>pdbonly</DebugType>
33 <Optimize>true</Optimize>
34 <OutputPath>bin\Release\</OutputPath>
35 <DefineConstants>TRACE</DefineConstants>
36 <ErrorReport>prompt</ErrorReport>
37 <WarningLevel>4</WarningLevel>
38 <Prefer32Bit>false</Prefer32Bit>
39 </PropertyGroup>
40 <ItemGroup>
41 <Reference Include="Extensibility, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
42 <EmbedInteropTypes>True</EmbedInteropTypes>
43 </Reference>
44 <Reference Include="Microsoft.VisualStudio.QualityTools.WebTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
45 <Reference Include="System" />
46 <Reference Include="System.Core" />
47 <Reference Include="System.Drawing" />
48 <Reference Include="System.Windows.Forms" />
49 <Reference Include="System.Xml.Linq" />
50 <Reference Include="System.Data.DataSetExtensions" />
51 <Reference Include="Microsoft.CSharp" />
52 <Reference Include="System.Data" />
53 <Reference Include="System.Xml" />
54 </ItemGroup>
55 <ItemGroup>
56 <Compile Include="Msbin1MessageEditor.cs" />
57 <Compile Include="Properties\AssemblyInfo.cs" />
58 <Compile Include="MessageEditor.cs">
59 <SubType>UserControl</SubType>
60 </Compile>
61 <Compile Include="MessageEditor.Designer.cs">
62 <DependentUpon>MessageEditor.cs</DependentUpon>
63 </Compile>
64 <Compile Include="WebServicePostRecording.cs" />
65 <Compile Include="XmlMessageEditor.cs" />
66 </ItemGroup>
67 <ItemGroup>
68 <EmbeddedResource Include="MessageEditor.resx">
69 <DependentUpon>MessageEditor.cs</DependentUpon>
70 </EmbeddedResource>
71 </ItemGroup>
72 <ItemGroup>
73 <ProjectReference Include="..\WebTestWebServiceResultAddin\WebServicePluginForWebTestResultTab.csproj">
74 <Project>{48B3509E-1FD8-4875-8FC6-137647EB83AA}</Project>
75 <Name>WebServicePluginForWebTestResultTab</Name>
76 </ProjectReference>
77 <ProjectReference Include="..\WebTestWebServiceRuntime\WebServicePluginForWebTestRuntime.csproj">
78 <Project>{F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}</Project>
79 <Name>WebServicePluginForWebTestRuntime</Name>
80 </ProjectReference>
81 </ItemGroup>
82 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
83 <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
84 Other similar extension points exist, see Microsoft.Common.targets.
85 <Target Name="BeforeBuild">
86 </Target>
87 <Target Name="AfterBuild">
88 </Target>
89 -->
90 </Project>
...\ No newline at end of file ...\ No newline at end of file
1 //*************************************************************************************************
2 // WebServicePostRecording.cs
3 // Owner: Mahipal Kante
4 //
5 // WebTestRecorderPlugin Implementation:
6 // Web Test Plugin for adding references to the other Web Service plugins
7 // (Extraction/Validation rules etc) to the WebTest after completing recording.
8 // This gets executed if user selects the plugin in the dialog that gets displayed
9 // before a record session.
10 //
11 // Copyright(c) Microsoft Corporation, 2010
12 //*************************************************************************************************
13 using System.ComponentModel;
14 using Microsoft.VisualStudio.TestTools.WebTesting;
15 using System.Diagnostics.CodeAnalysis;
16 using WebTest.WebService.Plugin.ResultTab;
17 using WebTest.WebService.Plugin.Runtime;
18
19 namespace WebTest.WebService.Plugin.MessageEditors
20 {
21 [DisplayName("Plugin for Web Service Messages")]
22 [Description("XPath extraction/validation rules that extract data from Web Service responses for various content types")]
23 class WebServicePostRecording : WebTestRecorderPlugin
24 {
25 /// <summary>
26 /// Parameters:
27 /// sender:
28 /// The source of the event.
29 ///
30 /// e:
31 /// A Microsoft.VisualStudio.TestTools.WebTesting.PostWebTestRecordingEventArgs
32 /// that contains the event data.
33 /// </summary>
34 /// <param name="sender"></param>
35 /// <param name="e"></param>
36 [SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")]
37 public override void PostWebTestDynamicParameterDetection(object sender, PostWebTestRecordingEventArgs e)
38 {
39 Connect connect = Connect.GetInstance();
40 if (connect != null)
41 {
42 connect.AddWebTestRecording(e.RecordedWebTest);
43 }
44
45 bool pluginFound = false;
46 foreach (WebTestPluginReference pluginReference1 in e.RecordedWebTest.WebTestPluginReferences)
47 {
48 if (pluginReference1.Type.ToString().Equals(typeof(WebServicePlugin).ToString()))
49 {
50 pluginFound = true;
51 break;
52 }
53 }
54
55 if (!pluginFound)
56 {
57 WebTestPluginReference pluginReference = new WebTestPluginReference();
58 pluginReference.Type = typeof(WebServicePlugin);
59 e.RecordedWebTest.WebTestPluginReferences.Add(pluginReference);
60 }
61
62 // Mark it as modified
63 e.RecordedWebTestModified = true;
64 }
65 }
66 }
1 //*************************************************************************************************
2 // XmlMessageEditor.cs
3 // Owner: Mahipal Kante
4 //
5 // Web Test Plugin for editing XML string type Web Service Requests
6 //
7 // Copyright(c) Microsoft Corporation, 2010
8 //*************************************************************************************************
9 using Microsoft.VisualStudio.TestTools.WebTesting;
10 using WebTest.WebService.Plugin.ResultTab;
11 using WebTest.WebService.Plugin.Runtime;
12
13 namespace WebTest.WebService.Plugin.MessageEditors
14 {
15 /// <summary>
16 /// Editor for generic text based hierarchical messages such as XML, JSON etc
17 /// </summary>
18 public class XmlMessageEditor : IStringHttpBodyEditorPlugin
19 {
20 public XmlMessageEditor()
21 {
22 }
23
24 /// <summary>
25 /// Determine if this plugin supports a content type.
26 /// </summary>
27 /// <param name="contentType">The content type to test.</param>
28 /// <returns>Returns true if the plugin supports the specified content type.</returns>
29 public bool SupportsContentType(string contentType)
30 {
31 return (ContentHandlerFactory.GetHandler(contentType) != null);
32 }
33
34 /// <summary>
35 /// Create a UserControl to edit the specified bytes. This control will be hosted in the
36 /// plugin dialog which provides OK and Cancel buttons.
37 /// </summary>
38 /// <param name="contentType">The content type of the BinaryHttpBody.</param>
39 /// <param name="initialValue">
40 /// The bytes to edit. The bytes are the payload of a BinaryHttpBody.
41 /// </param>
42 /// <returns>A UserControl capable of displaying and editing the byte array
43 /// value of the specified content type.
44 /// </returns>
45 public object CreateEditor(string contentType, string initialValue)
46 {
47 contentHandler = ContentHandlerFactory.GetHandler(contentType);
48 contentHandler.MessageString = initialValue;
49 messageEditor = new MessageEditor(contentHandler);
50 return messageEditor;
51 }
52
53 /// <summary>
54 /// Gets the edited bytes after the OK button is clicked on the plugin dialog.
55 /// </summary>
56 public string GetNewValue()
57 {
58 messageEditor.UpdateContent();
59 return contentHandler.MessageString;
60 }
61
62 private MessageEditor messageEditor;
63 private ContentHandler contentHandler = null;
64 }
65 }
No preview for this file type
No preview for this file type
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.17929
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10
11 namespace WebTest.WebService.Plugin.ResultTab.Properties {
12 using System;
13
14
15 /// <summary>
16 /// A strongly-typed resource class, for looking up localized strings, etc.
17 /// </summary>
18 // This class was auto-generated by the StronglyTypedResourceBuilder
19 // class via a tool like ResGen or Visual Studio.
20 // To add or remove a member, edit your .ResX file then rerun ResGen
21 // with the /str option, or rebuild your VS project.
22 [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23 [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 internal class Resources {
26
27 private static global::System.Resources.ResourceManager resourceMan;
28
29 private static global::System.Globalization.CultureInfo resourceCulture;
30
31 [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 internal Resources() {
33 }
34
35 /// <summary>
36 /// Returns the cached ResourceManager instance used by this class.
37 /// </summary>
38 [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 internal static global::System.Resources.ResourceManager ResourceManager {
40 get {
41 if (object.ReferenceEquals(resourceMan, null)) {
42 global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebTest.WebService.Plugin.ResultTab.Properties.Resources", typeof(Resources).Assembly);
43 resourceMan = temp;
44 }
45 return resourceMan;
46 }
47 }
48
49 /// <summary>
50 /// Overrides the current thread's CurrentUICulture property for all
51 /// resource lookups using this strongly typed resource class.
52 /// </summary>
53 [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 internal static global::System.Globalization.CultureInfo Culture {
55 get {
56 return resourceCulture;
57 }
58 set {
59 resourceCulture = value;
60 }
61 }
62 }
63 }
1 <?xml version="1.0" encoding="utf-8"?>
2 <root>
3 <!--
4 Microsoft ResX Schema
5
6 Version 2.0
7
8 The primary goals of this format is to allow a simple XML format
9 that is mostly human readable. The generation and parsing of the
10 various data types are done through the TypeConverter classes
11 associated with the data types.
12
13 Example:
14
15 ... ado.net/XML headers & schema ...
16 <resheader name="resmimetype">text/microsoft-resx</resheader>
17 <resheader name="version">2.0</resheader>
18 <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
19 <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
20 <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
21 <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
22 <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
23 <value>[base64 mime encoded serialized .NET Framework object]</value>
24 </data>
25 <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
26 <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
27 <comment>This is a comment</comment>
28 </data>
29
30 There are any number of "resheader" rows that contain simple
31 name/value pairs.
32
33 Each data row contains a name, and value. The row also contains a
34 type or mimetype. Type corresponds to a .NET class that support
35 text/value conversion through the TypeConverter architecture.
36 Classes that don't support this are serialized and stored with the
37 mimetype set.
38
39 The mimetype is used for serialized objects, and tells the
40 ResXResourceReader how to depersist the object. This is currently not
41 extensible. For a given mimetype the value must be set accordingly:
42
43 Note - application/x-microsoft.net.object.binary.base64 is the format
44 that the ResXResourceWriter will generate, however the reader can
45 read any of the formats listed below.
46
47 mimetype: application/x-microsoft.net.object.binary.base64
48 value : The object must be serialized with
49 : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
50 : and then encoded with base64 encoding.
51
52 mimetype: application/x-microsoft.net.object.soap.base64
53 value : The object must be serialized with
54 : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
55 : and then encoded with base64 encoding.
56
57 mimetype: application/x-microsoft.net.object.bytearray.base64
58 value : The object must be serialized into a byte array
59 : using a System.ComponentModel.TypeConverter
60 : and then encoded with base64 encoding.
61 -->
62 <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
63 <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
64 <xsd:element name="root" msdata:IsDataSet="true">
65 <xsd:complexType>
66 <xsd:choice maxOccurs="unbounded">
67 <xsd:element name="metadata">
68 <xsd:complexType>
69 <xsd:sequence>
70 <xsd:element name="value" type="xsd:string" minOccurs="0" />
71 </xsd:sequence>
72 <xsd:attribute name="name" use="required" type="xsd:string" />
73 <xsd:attribute name="type" type="xsd:string" />
74 <xsd:attribute name="mimetype" type="xsd:string" />
75 <xsd:attribute ref="xml:space" />
76 </xsd:complexType>
77 </xsd:element>
78 <xsd:element name="assembly">
79 <xsd:complexType>
80 <xsd:attribute name="alias" type="xsd:string" />
81 <xsd:attribute name="name" type="xsd:string" />
82 </xsd:complexType>
83 </xsd:element>
84 <xsd:element name="data">
85 <xsd:complexType>
86 <xsd:sequence>
87 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
88 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
89 </xsd:sequence>
90 <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
91 <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
92 <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
93 <xsd:attribute ref="xml:space" />
94 </xsd:complexType>
95 </xsd:element>
96 <xsd:element name="resheader">
97 <xsd:complexType>
98 <xsd:sequence>
99 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
100 </xsd:sequence>
101 <xsd:attribute name="name" type="xsd:string" use="required" />
102 </xsd:complexType>
103 </xsd:element>
104 </xsd:choice>
105 </xsd:complexType>
106 </xsd:element>
107 </xsd:schema>
108 <resheader name="resmimetype">
109 <value>text/microsoft-resx</value>
110 </resheader>
111 <resheader name="version">
112 <value>2.0</value>
113 </resheader>
114 <resheader name="reader">
115 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
116 </resheader>
117 <resheader name="writer">
118 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
119 </resheader>
120 </root>
...\ No newline at end of file ...\ No newline at end of file
1 <?xml version="1.0" encoding="utf-8"?>
2 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
3 <PropertyGroup>
4 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6 <ProductVersion>8.0.30424</ProductVersion>
7 <SchemaVersion>2.0</SchemaVersion>
8 <ProjectGuid>{48B3509E-1FD8-4875-8FC6-137647EB83AA}</ProjectGuid>
9 <OutputType>Library</OutputType>
10 <StartupObject>
11 </StartupObject>
12 <NoStandardLibraries>false</NoStandardLibraries>
13 <AssemblyName>WebTest.WebService.Plugin.ResultTab</AssemblyName>
14 <DeploymentDirectory>.\bin\</DeploymentDirectory>
15 <SccProjectName>SAK</SccProjectName>
16 <SccLocalPath>SAK</SccLocalPath>
17 <SccAuxPath>SAK</SccAuxPath>
18 <SccProvider>SAK</SccProvider>
19 <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
20 <TargetFrameworkProfile />
21 </PropertyGroup>
22 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
23 <DebugSymbols>true</DebugSymbols>
24 <Optimize>false</Optimize>
25 <OutputPath>.\bin\Debug\</OutputPath>
26 <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
27 <DefineConstants>DEBUG;TRACE</DefineConstants>
28 <WarningLevel>4</WarningLevel>
29 <IncrementalBuild>false</IncrementalBuild>
30 <DocumentationFile>WebTest.WebService.Plugin.ResultTab.xml</DocumentationFile>
31 <Prefer32Bit>false</Prefer32Bit>
32 </PropertyGroup>
33 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
34 <DebugSymbols>false</DebugSymbols>
35 <Optimize>true</Optimize>
36 <OutputPath>.\bin\Release\</OutputPath>
37 <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
38 <DefineConstants>TRACE</DefineConstants>
39 <WarningLevel>4</WarningLevel>
40 <IncrementalBuild>false</IncrementalBuild>
41 <DocumentationFile>WebTest.WebService.Plugin.ResultTab.xml</DocumentationFile>
42 <Prefer32Bit>false</Prefer32Bit>
43 </PropertyGroup>
44 <PropertyGroup>
45 <RootNamespace>WebTest.WebService.Plugin.ResultTab</RootNamespace>
46 </PropertyGroup>
47 <ItemGroup>
48 <Reference Include="Extensibility, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
49 <EmbedInteropTypes>False</EmbedInteropTypes>
50 </Reference>
51 <Reference Include="Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
52 <EmbedInteropTypes>True</EmbedInteropTypes>
53 </Reference>
54 <Reference Include="Microsoft.VisualStudio.QualityTools.LoadTestFramework" />
55 <Reference Include="Microsoft.VisualStudio.QualityTools.LoadTestPackage">
56 <HintPath>C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies\Microsoft.VisualStudio.QualityTools.LoadTestPackage.dll</HintPath>
57 <HintPath>C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies\Microsoft.VisualStudio.QualityTools.LoadTestPackage.dll</HintPath>
58 <Private>False</Private>
59 </Reference>
60 <Reference Include="Microsoft.VisualStudio.QualityTools.WebTestFramework" />
61 <Reference Include="System" />
62 <Reference Include="System.Core" />
63 <Reference Include="System.Data" />
64 <Reference Include="System.Drawing" />
65 <Reference Include="System.Windows.Forms" />
66 <Reference Include="System.Xml" />
67 <Reference Include="Microsoft.CSharp" />
68 <Reference Include="Microsoft.VisualStudio.Shell.11.0" />
69 <Reference Include="Microsoft.VisualStudio.Shell.Immutable.11.0" />
70 <Reference Include="Microsoft.VisualStudio.OLE.Interop" />
71 <Reference Include="Microsoft.VisualStudio.Shell.Interop" />
72 <Reference Include="Microsoft.VisualStudio.Shell.Interop.8.0" />
73 <Reference Include="Microsoft.VisualStudio.Shell.Interop.9.0" />
74 <Reference Include="Microsoft.VisualStudio.Shell.Interop.10.0" />
75 <Reference Include="VSLangProj, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
76 <EmbedInteropTypes>True</EmbedInteropTypes>
77 </Reference>
78 <Reference Include="VSLangProj2, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
79 <EmbedInteropTypes>True</EmbedInteropTypes>
80 </Reference>
81 <Reference Include="VSLangProj80, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
82 <EmbedInteropTypes>True</EmbedInteropTypes>
83 </Reference>
84 </ItemGroup>
85 <ItemGroup>
86 <Compile Include="AssemblyInfo.cs">
87 <SubType>Code</SubType>
88 </Compile>
89 <Compile Include="Connect.cs">
90 <SubType>Code</SubType>
91 </Compile>
92 <Compile Include="Properties\Resources.Designer.cs">
93 <AutoGen>True</AutoGen>
94 <DesignTime>True</DesignTime>
95 <DependentUpon>Resources.resx</DependentUpon>
96 </Compile>
97 <Compile Include="WebServiceResult.cs">
98 <SubType>UserControl</SubType>
99 </Compile>
100 <Compile Include="WebServiceResult.Designer.cs">
101 <DependentUpon>WebServiceResult.cs</DependentUpon>
102 </Compile>
103 <Compile Include="WebTestDetail.cs" />
104 <Compile Include="XmlTreeView.cs" />
105 </ItemGroup>
106 <ItemGroup>
107 <COMReference Include="EnvDTE">
108 <Guid>{80CC9F66-E7D8-4DDD-85B6-D9E6CD0E93E2}</Guid>
109 <VersionMajor>8</VersionMajor>
110 <VersionMinor>0</VersionMinor>
111 <Lcid>0</Lcid>
112 <WrapperTool>primary</WrapperTool>
113 <Isolated>False</Isolated>
114 <EmbedInteropTypes>False</EmbedInteropTypes>
115 </COMReference>
116 <COMReference Include="EnvDTE100">
117 <Guid>{26AD1324-4B7C-44BC-84F8-B86AED45729F}</Guid>
118 <VersionMajor>10</VersionMajor>
119 <VersionMinor>0</VersionMinor>
120 <Lcid>0</Lcid>
121 <WrapperTool>primary</WrapperTool>
122 <Isolated>False</Isolated>
123 <EmbedInteropTypes>False</EmbedInteropTypes>
124 </COMReference>
125 <COMReference Include="EnvDTE80">
126 <Guid>{1A31287A-4D7D-413E-8E32-3B374931BD89}</Guid>
127 <VersionMajor>8</VersionMajor>
128 <VersionMinor>0</VersionMinor>
129 <Lcid>0</Lcid>
130 <WrapperTool>primary</WrapperTool>
131 <Isolated>False</Isolated>
132 <EmbedInteropTypes>False</EmbedInteropTypes>
133 </COMReference>
134 <COMReference Include="EnvDTE90">
135 <Guid>{2CE2370E-D744-4936-A090-3FFFE667B0E1}</Guid>
136 <VersionMajor>9</VersionMajor>
137 <VersionMinor>0</VersionMinor>
138 <Lcid>0</Lcid>
139 <WrapperTool>primary</WrapperTool>
140 <Isolated>False</Isolated>
141 <EmbedInteropTypes>False</EmbedInteropTypes>
142 </COMReference>
143 <COMReference Include="Microsoft.VisualStudio.CommandBars">
144 <Guid>{1CBA492E-7263-47BB-87FE-639000619B15}</Guid>
145 <VersionMajor>8</VersionMajor>
146 <VersionMinor>0</VersionMinor>
147 <Lcid>0</Lcid>
148 <WrapperTool>primary</WrapperTool>
149 <Isolated>False</Isolated>
150 <EmbedInteropTypes>False</EmbedInteropTypes>
151 </COMReference>
152 <COMReference Include="stdole">
153 <Guid>{00020430-0000-0000-C000-000000000046}</Guid>
154 <VersionMajor>2</VersionMajor>
155 <VersionMinor>0</VersionMinor>
156 <Lcid>0</Lcid>
157 <WrapperTool>primary</WrapperTool>
158 <Isolated>False</Isolated>
159 <EmbedInteropTypes>False</EmbedInteropTypes>
160 </COMReference>
161 </ItemGroup>
162 <ItemGroup>
163 <Content Include="WebServicePluginForWebTestResultTab.AddIn">
164 <SubType>Designer</SubType>
165 </Content>
166 </ItemGroup>
167 <ItemGroup>
168 <EmbeddedResource Include="Properties\Resources.resx">
169 <Generator>ResXFileCodeGenerator</Generator>
170 <LastGenOutput>Resources.Designer.cs</LastGenOutput>
171 </EmbeddedResource>
172 <EmbeddedResource Include="WebServiceResult.resx">
173 <DependentUpon>WebServiceResult.cs</DependentUpon>
174 </EmbeddedResource>
175 </ItemGroup>
176 <ItemGroup>
177 <ProjectReference Include="..\WebTestWebServiceRuntime\WebServicePluginForWebTestRuntime.csproj">
178 <Project>{F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}</Project>
179 <Name>WebServicePluginForWebTestRuntime</Name>
180 <Private>False</Private>
181 </ProjectReference>
182 </ItemGroup>
183 <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
184 <PropertyGroup>
185 <PreBuildEvent>
186 </PreBuildEvent>
187 <PostBuildEvent>
188 </PostBuildEvent>
189 </PropertyGroup>
190 <ProjectExtensions />
191 <Target Name="AfterBuild">
192 <PropertyGroup>
193 <DllName>$(AssemblyName).dll</DllName>
194 <PdbName>$(AssemblyName).pdb</PdbName>
195 <DocFileName>$(AssemblyName).xml</DocFileName>
196 </PropertyGroup>
197 <Delete Condition="Exists('$(DeploymentDirectory)$(DllName)')" Files="$(DeploymentDirectory)$(DllName)">
198 </Delete>
199 <Delete Condition="Exists('$(DeploymentDirectory)$(PdbName)')" Files="$(DeploymentDirectory)$(PdbName)">
200 </Delete>
201 <Delete Condition="Exists('$(DeploymentDirectory)$(DocFileName)')" Files="$(DeploymentDirectory)$(DocFileName)">
202 </Delete>
203 <Copy Condition="Exists('$(OutputPath)$(DllName)')" SourceFiles="$(OutputPath)$(DllName)" DestinationFolder="$(DeploymentDirectory)">
204 <Output TaskParameter="DestinationFiles" ItemName="FileWrites" />
205 </Copy>
206 <Copy Condition="Exists('$(OutputPath)$(PdbName)')" SourceFiles="$(OutputPath)$(PdbName)" DestinationFolder="$(DeploymentDirectory)">
207 <Output TaskParameter="DestinationFiles" ItemName="FileWrites" />
208 </Copy>
209 <Copy Condition="Exists('$(OutputPath)$(DocFileName)')" SourceFiles="$(OutputPath)$(DocFileName)" DestinationFolder="$(DeploymentDirectory)">
210 <Output TaskParameter="DestinationFiles" ItemName="FileWrites" />
211 </Copy>
212 </Target>
213 </Project>
...\ No newline at end of file ...\ No newline at end of file
1 namespace WebTest.WebService.Plugin.ResultTab
2 {
3 partial class WebServiceResult
4 {
5 /// <summary>
6 /// Required designer variable.
7 /// </summary>
8 private System.ComponentModel.IContainer components = null;
9
10 /// <summary>
11 /// Clean up any resources being used.
12 /// </summary>
13 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
14 protected override void Dispose(bool disposing)
15 {
16 if (disposing && (components != null))
17 {
18 components.Dispose();
19 }
20 base.Dispose(disposing);
21 }
22
23 #region Component Designer generated code
24
25 /// <summary>
26 /// Required method for Designer support - do not modify
27 /// the contents of this method with the code editor.
28 /// </summary>
29 private void InitializeComponent()
30 {
31 this.splitContainer1 = new System.Windows.Forms.SplitContainer();
32 this.groupBox1 = new System.Windows.Forms.GroupBox();
33 this.panel1 = new System.Windows.Forms.Panel();
34 this.requestXMLEditor = new System.Windows.Forms.LinkLabel();
35 this.updateLinkLabel = new System.Windows.Forms.LinkLabel();
36 this.editRequest = new System.Windows.Forms.CheckBox();
37 this.RequestTab = new System.Windows.Forms.TabControl();
38 this.RequestTabPageTextView = new System.Windows.Forms.TabPage();
39 this.requestTextBox = new System.Windows.Forms.TextBox();
40 this.RequestTabPageTreeView = new System.Windows.Forms.TabPage();
41 this.treeViewRequest = new System.Windows.Forms.TreeView();
42 this.groupBox2 = new System.Windows.Forms.GroupBox();
43 this.panel2 = new System.Windows.Forms.Panel();
44 this.responseXMLEditor = new System.Windows.Forms.LinkLabel();
45 this.ResponseTab = new System.Windows.Forms.TabControl();
46 this.ResponseTabPageTextView = new System.Windows.Forms.TabPage();
47 this.responseTextBox = new System.Windows.Forms.TextBox();
48 this.ResponseTabPageTreeView = new System.Windows.Forms.TabPage();
49 this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
50 this.treeViewResponse = new System.Windows.Forms.TreeView();
51 this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
52 this.XPathButton = new System.Windows.Forms.Button();
53 this.XPathTextBox = new System.Windows.Forms.TextBox();
54 this.label1 = new System.Windows.Forms.Label();
55 ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
56 this.splitContainer1.Panel1.SuspendLayout();
57 this.splitContainer1.Panel2.SuspendLayout();
58 this.splitContainer1.SuspendLayout();
59 this.groupBox1.SuspendLayout();
60 this.panel1.SuspendLayout();
61 this.RequestTab.SuspendLayout();
62 this.RequestTabPageTextView.SuspendLayout();
63 this.RequestTabPageTreeView.SuspendLayout();
64 this.groupBox2.SuspendLayout();
65 this.panel2.SuspendLayout();
66 this.ResponseTab.SuspendLayout();
67 this.ResponseTabPageTextView.SuspendLayout();
68 this.ResponseTabPageTreeView.SuspendLayout();
69 this.tableLayoutPanel1.SuspendLayout();
70 this.tableLayoutPanel2.SuspendLayout();
71 this.SuspendLayout();
72 //
73 // splitContainer1
74 //
75 this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
76 this.splitContainer1.Location = new System.Drawing.Point(0, 0);
77 this.splitContainer1.Name = "splitContainer1";
78 //
79 // splitContainer1.Panel1
80 //
81 this.splitContainer1.Panel1.Controls.Add(this.groupBox1);
82 //
83 // splitContainer1.Panel2
84 //
85 this.splitContainer1.Panel2.Controls.Add(this.groupBox2);
86 this.splitContainer1.Size = new System.Drawing.Size(649, 237);
87 this.splitContainer1.SplitterDistance = 340;
88 this.splitContainer1.TabIndex = 0;
89 //
90 // groupBox1
91 //
92 this.groupBox1.Controls.Add(this.panel1);
93 this.groupBox1.Controls.Add(this.RequestTab);
94 this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
95 this.groupBox1.Location = new System.Drawing.Point(0, 0);
96 this.groupBox1.Name = "groupBox1";
97 this.groupBox1.Size = new System.Drawing.Size(340, 237);
98 this.groupBox1.TabIndex = 0;
99 this.groupBox1.TabStop = false;
100 this.groupBox1.Text = "Request";
101 //
102 // panel1
103 //
104 this.panel1.Controls.Add(this.requestXMLEditor);
105 this.panel1.Controls.Add(this.updateLinkLabel);
106 this.panel1.Controls.Add(this.editRequest);
107 this.panel1.Location = new System.Drawing.Point(125, 9);
108 this.panel1.Name = "panel1";
109 this.panel1.Size = new System.Drawing.Size(198, 26);
110 this.panel1.TabIndex = 1;
111 //
112 // requestXMLEditor
113 //
114 this.requestXMLEditor.AutoSize = true;
115 this.requestXMLEditor.Location = new System.Drawing.Point(3, 5);
116 this.requestXMLEditor.Name = "requestXMLEditor";
117 this.requestXMLEditor.Size = new System.Drawing.Size(96, 13);
118 this.requestXMLEditor.TabIndex = 5;
119 this.requestXMLEditor.TabStop = true;
120 this.requestXMLEditor.Text = "View in XML Editor";
121 this.requestXMLEditor.Visible = false;
122 this.requestXMLEditor.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.requestXMLEditor_LinkClicked);
123 //
124 // updateLinkLabel
125 //
126 this.updateLinkLabel.AutoSize = true;
127 this.updateLinkLabel.Location = new System.Drawing.Point(153, 4);
128 this.updateLinkLabel.Name = "updateLinkLabel";
129 this.updateLinkLabel.Size = new System.Drawing.Size(42, 13);
130 this.updateLinkLabel.TabIndex = 4;
131 this.updateLinkLabel.TabStop = true;
132 this.updateLinkLabel.Text = "Update";
133 this.updateLinkLabel.Visible = false;
134 this.updateLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.updateLinkLabel_LinkClicked);
135 //
136 // editRequest
137 //
138 this.editRequest.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
139 this.editRequest.AutoSize = true;
140 this.editRequest.Location = new System.Drawing.Point(115, 4);
141 this.editRequest.Name = "editRequest";
142 this.editRequest.Size = new System.Drawing.Size(44, 17);
143 this.editRequest.TabIndex = 2;
144 this.editRequest.Text = "Edit";
145 this.editRequest.UseVisualStyleBackColor = true;
146 this.editRequest.Visible = false;
147 //
148 // RequestTab
149 //
150 this.RequestTab.Controls.Add(this.RequestTabPageTextView);
151 this.RequestTab.Controls.Add(this.RequestTabPageTreeView);
152 this.RequestTab.Dock = System.Windows.Forms.DockStyle.Fill;
153 this.RequestTab.Location = new System.Drawing.Point(3, 16);
154 this.RequestTab.Name = "RequestTab";
155 this.RequestTab.SelectedIndex = 0;
156 this.RequestTab.Size = new System.Drawing.Size(334, 218);
157 this.RequestTab.TabIndex = 1;
158 this.RequestTab.SelectedIndexChanged += new System.EventHandler(this.RequestTabChanged);
159 //
160 // RequestTabPageTextView
161 //
162 this.RequestTabPageTextView.Controls.Add(this.requestTextBox);
163 this.RequestTabPageTextView.Location = new System.Drawing.Point(4, 22);
164 this.RequestTabPageTextView.Name = "RequestTabPageTextView";
165 this.RequestTabPageTextView.Padding = new System.Windows.Forms.Padding(3);
166 this.RequestTabPageTextView.Size = new System.Drawing.Size(326, 192);
167 this.RequestTabPageTextView.TabIndex = 0;
168 this.RequestTabPageTextView.Text = "Text View";
169 this.RequestTabPageTextView.UseVisualStyleBackColor = true;
170 //
171 // requestTextBox
172 //
173 this.requestTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
174 this.requestTextBox.Location = new System.Drawing.Point(3, 3);
175 this.requestTextBox.Multiline = true;
176 this.requestTextBox.Name = "requestTextBox";
177 this.requestTextBox.ReadOnly = true;
178 this.requestTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
179 this.requestTextBox.Size = new System.Drawing.Size(320, 186);
180 this.requestTextBox.TabIndex = 0;
181 this.requestTextBox.WordWrap = false;
182 //
183 // RequestTabPageTreeView
184 //
185 this.RequestTabPageTreeView.Controls.Add(this.treeViewRequest);
186 this.RequestTabPageTreeView.Location = new System.Drawing.Point(4, 22);
187 this.RequestTabPageTreeView.Name = "RequestTabPageTreeView";
188 this.RequestTabPageTreeView.Padding = new System.Windows.Forms.Padding(3);
189 this.RequestTabPageTreeView.Size = new System.Drawing.Size(326, 192);
190 this.RequestTabPageTreeView.TabIndex = 1;
191 this.RequestTabPageTreeView.Text = "Tree View";
192 this.RequestTabPageTreeView.UseVisualStyleBackColor = true;
193 //
194 // treeViewRequest
195 //
196 this.treeViewRequest.Dock = System.Windows.Forms.DockStyle.Fill;
197 this.treeViewRequest.HideSelection = false;
198 this.treeViewRequest.Location = new System.Drawing.Point(3, 3);
199 this.treeViewRequest.Name = "treeViewRequest";
200 this.treeViewRequest.Size = new System.Drawing.Size(320, 186);
201 this.treeViewRequest.TabIndex = 0;
202 //
203 // groupBox2
204 //
205 this.groupBox2.Controls.Add(this.panel2);
206 this.groupBox2.Controls.Add(this.ResponseTab);
207 this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
208 this.groupBox2.Location = new System.Drawing.Point(0, 0);
209 this.groupBox2.Name = "groupBox2";
210 this.groupBox2.Size = new System.Drawing.Size(305, 237);
211 this.groupBox2.TabIndex = 0;
212 this.groupBox2.TabStop = false;
213 this.groupBox2.Text = "Response";
214 //
215 // panel2
216 //
217 this.panel2.Controls.Add(this.responseXMLEditor);
218 this.panel2.Location = new System.Drawing.Point(132, 9);
219 this.panel2.Name = "panel2";
220 this.panel2.Size = new System.Drawing.Size(115, 23);
221 this.panel2.TabIndex = 1;
222 //
223 // responseXMLEditor
224 //
225 this.responseXMLEditor.AutoSize = true;
226 this.responseXMLEditor.Location = new System.Drawing.Point(3, 7);
227 this.responseXMLEditor.Name = "responseXMLEditor";
228 this.responseXMLEditor.Size = new System.Drawing.Size(96, 13);
229 this.responseXMLEditor.TabIndex = 0;
230 this.responseXMLEditor.TabStop = true;
231 this.responseXMLEditor.Text = "View in XML Editor";
232 this.responseXMLEditor.Visible = false;
233 this.responseXMLEditor.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.responseXMLEditor_LinkClicked);
234 //
235 // ResponseTab
236 //
237 this.ResponseTab.Controls.Add(this.ResponseTabPageTextView);
238 this.ResponseTab.Controls.Add(this.ResponseTabPageTreeView);
239 this.ResponseTab.Dock = System.Windows.Forms.DockStyle.Fill;
240 this.ResponseTab.Location = new System.Drawing.Point(3, 16);
241 this.ResponseTab.Name = "ResponseTab";
242 this.ResponseTab.SelectedIndex = 0;
243 this.ResponseTab.Size = new System.Drawing.Size(299, 218);
244 this.ResponseTab.TabIndex = 2;
245 this.ResponseTab.SelectedIndexChanged += new System.EventHandler(this.ResponseTabChanged);
246 //
247 // ResponseTabPageTextView
248 //
249 this.ResponseTabPageTextView.Controls.Add(this.responseTextBox);
250 this.ResponseTabPageTextView.Location = new System.Drawing.Point(4, 22);
251 this.ResponseTabPageTextView.Name = "ResponseTabPageTextView";
252 this.ResponseTabPageTextView.Padding = new System.Windows.Forms.Padding(3);
253 this.ResponseTabPageTextView.Size = new System.Drawing.Size(291, 192);
254 this.ResponseTabPageTextView.TabIndex = 0;
255 this.ResponseTabPageTextView.Text = "Text View";
256 this.ResponseTabPageTextView.UseVisualStyleBackColor = true;
257 //
258 // responseTextBox
259 //
260 this.responseTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
261 this.responseTextBox.Location = new System.Drawing.Point(3, 3);
262 this.responseTextBox.Multiline = true;
263 this.responseTextBox.Name = "responseTextBox";
264 this.responseTextBox.ReadOnly = true;
265 this.responseTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
266 this.responseTextBox.Size = new System.Drawing.Size(285, 186);
267 this.responseTextBox.TabIndex = 0;
268 this.responseTextBox.WordWrap = false;
269 //
270 // ResponseTabPageTreeView
271 //
272 this.ResponseTabPageTreeView.Controls.Add(this.tableLayoutPanel1);
273 this.ResponseTabPageTreeView.Location = new System.Drawing.Point(4, 22);
274 this.ResponseTabPageTreeView.Name = "ResponseTabPageTreeView";
275 this.ResponseTabPageTreeView.Padding = new System.Windows.Forms.Padding(3);
276 this.ResponseTabPageTreeView.Size = new System.Drawing.Size(291, 192);
277 this.ResponseTabPageTreeView.TabIndex = 1;
278 this.ResponseTabPageTreeView.Text = "Tree View";
279 this.ResponseTabPageTreeView.UseVisualStyleBackColor = true;
280 //
281 // tableLayoutPanel1
282 //
283 this.tableLayoutPanel1.ColumnCount = 1;
284 this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
285 this.tableLayoutPanel1.Controls.Add(this.treeViewResponse, 0, 0);
286 this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 1);
287 this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
288 this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3);
289 this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
290 this.tableLayoutPanel1.Name = "tableLayoutPanel1";
291 this.tableLayoutPanel1.RowCount = 2;
292 this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
293 this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F));
294 this.tableLayoutPanel1.Size = new System.Drawing.Size(285, 186);
295 this.tableLayoutPanel1.TabIndex = 2;
296 //
297 // treeViewResponse
298 //
299 this.treeViewResponse.Dock = System.Windows.Forms.DockStyle.Fill;
300 this.treeViewResponse.HideSelection = false;
301 this.treeViewResponse.Location = new System.Drawing.Point(3, 3);
302 this.treeViewResponse.Name = "treeViewResponse";
303 this.treeViewResponse.Size = new System.Drawing.Size(279, 153);
304 this.treeViewResponse.TabIndex = 1;
305 //
306 // tableLayoutPanel2
307 //
308 this.tableLayoutPanel2.ColumnCount = 3;
309 this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 40F));
310 this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
311 this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 35F));
312 this.tableLayoutPanel2.Controls.Add(this.XPathButton, 2, 0);
313 this.tableLayoutPanel2.Controls.Add(this.XPathTextBox, 1, 0);
314 this.tableLayoutPanel2.Controls.Add(this.label1, 0, 0);
315 this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
316 this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 159);
317 this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(0);
318 this.tableLayoutPanel2.Name = "tableLayoutPanel2";
319 this.tableLayoutPanel2.RowCount = 1;
320 this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
321 this.tableLayoutPanel2.Size = new System.Drawing.Size(285, 27);
322 this.tableLayoutPanel2.TabIndex = 2;
323 //
324 // XPathButton
325 //
326 this.XPathButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
327 this.XPathButton.Location = new System.Drawing.Point(250, 3);
328 this.XPathButton.Margin = new System.Windows.Forms.Padding(0);
329 this.XPathButton.Name = "XPathButton";
330 this.XPathButton.Size = new System.Drawing.Size(35, 21);
331 this.XPathButton.TabIndex = 1;
332 this.XPathButton.Text = "Run";
333 this.XPathButton.UseVisualStyleBackColor = true;
334 this.XPathButton.Click += new System.EventHandler(this.XPathButton_Click);
335 //
336 // XPathTextBox
337 //
338 this.XPathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
339 | System.Windows.Forms.AnchorStyles.Left)
340 | System.Windows.Forms.AnchorStyles.Right)));
341 this.XPathTextBox.Location = new System.Drawing.Point(43, 3);
342 this.XPathTextBox.Name = "XPathTextBox";
343 this.XPathTextBox.Size = new System.Drawing.Size(204, 20);
344 this.XPathTextBox.TabIndex = 2;
345 //
346 // label1
347 //
348 this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
349 this.label1.AutoSize = true;
350 this.label1.Location = new System.Drawing.Point(3, 7);
351 this.label1.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);
352 this.label1.Name = "label1";
353 this.label1.Size = new System.Drawing.Size(37, 13);
354 this.label1.TabIndex = 3;
355 this.label1.Text = "XPath";
356 //
357 // WebServiceResult
358 //
359 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
360 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
361 this.Controls.Add(this.splitContainer1);
362 this.Name = "WebServiceResult";
363 this.Size = new System.Drawing.Size(649, 237);
364 this.splitContainer1.Panel1.ResumeLayout(false);
365 this.splitContainer1.Panel2.ResumeLayout(false);
366 ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
367 this.splitContainer1.ResumeLayout(false);
368 this.groupBox1.ResumeLayout(false);
369 this.panel1.ResumeLayout(false);
370 this.panel1.PerformLayout();
371 this.RequestTab.ResumeLayout(false);
372 this.RequestTabPageTextView.ResumeLayout(false);
373 this.RequestTabPageTextView.PerformLayout();
374 this.RequestTabPageTreeView.ResumeLayout(false);
375 this.groupBox2.ResumeLayout(false);
376 this.panel2.ResumeLayout(false);
377 this.panel2.PerformLayout();
378 this.ResponseTab.ResumeLayout(false);
379 this.ResponseTabPageTextView.ResumeLayout(false);
380 this.ResponseTabPageTextView.PerformLayout();
381 this.ResponseTabPageTreeView.ResumeLayout(false);
382 this.tableLayoutPanel1.ResumeLayout(false);
383 this.tableLayoutPanel2.ResumeLayout(false);
384 this.tableLayoutPanel2.PerformLayout();
385 this.ResumeLayout(false);
386
387 }
388
389 #endregion
390
391 private System.Windows.Forms.SplitContainer splitContainer1;
392 private System.Windows.Forms.GroupBox groupBox1;
393 private System.Windows.Forms.TextBox requestTextBox;
394 private System.Windows.Forms.GroupBox groupBox2;
395 private System.Windows.Forms.TextBox responseTextBox;
396 private System.Windows.Forms.TreeView treeViewResponse;
397 private System.Windows.Forms.TabControl ResponseTab;
398 private System.Windows.Forms.TabPage ResponseTabPageTextView;
399 private System.Windows.Forms.TabPage ResponseTabPageTreeView;
400 private System.Windows.Forms.TabControl RequestTab;
401 private System.Windows.Forms.TabPage RequestTabPageTextView;
402 private System.Windows.Forms.TabPage RequestTabPageTreeView;
403 private System.Windows.Forms.TreeView treeViewRequest;
404 private System.Windows.Forms.CheckBox editRequest;
405 private System.Windows.Forms.LinkLabel updateLinkLabel;
406 private System.Windows.Forms.LinkLabel requestXMLEditor;
407 private System.Windows.Forms.Panel panel1;
408 private System.Windows.Forms.Panel panel2;
409 private System.Windows.Forms.LinkLabel responseXMLEditor;
410 private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
411 private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
412 private System.Windows.Forms.Button XPathButton;
413 private System.Windows.Forms.TextBox XPathTextBox;
414 private System.Windows.Forms.Label label1;
415 }
416 }
1 //*************************************************************************************************
2 // WebServiceResult.cs
3 // Owner: Mahipal Kante
4 //
5 // UI of the Web Test Result Tab for Web Service request/response
6 //
7 // Copyright(c) Microsoft Corporation, 2010
8 //*************************************************************************************************
9 using System;
10 using System.Collections.Generic;
11 using System.ComponentModel;
12 using System.Drawing;
13 using System.Data;
14 using System.Linq;
15 using System.Text;
16 using System.Windows.Forms;
17 using Microsoft.VisualStudio.TestTools.WebTesting;
18 using EnvDTE;
19 using mshtml;
20 using System.IO;
21 using System.Xml;
22 using Microsoft.VisualStudio.TestTools.WebTesting.Rules;
23 using WebTest.WebService.Plugin.Runtime;
24 using System.Xml.XPath;
25
26 namespace WebTest.WebService.Plugin.ResultTab
27 {
28 internal partial class WebServiceResult : UserControl
29 {
30 public WebServiceResult(Connect connect)
31 {
32 this.connect = connect;
33
34 InitializeComponent();
35
36 this.xmlViewRequest = new XmlTreeView(this.treeViewRequest);
37 this.xmlViewResponse = new XmlTreeView(this.treeViewResponse);
38 this.requestTextBox.TextChanged += new EventHandler(requestTextBox_TextChanged);
39 this.editRequest.CheckedChanged += new EventHandler(EditRequestCheckedChanged);
40 this.treeViewResponse.AfterSelect += new TreeViewEventHandler(treeViewResponse_AfterSelect);
41
42 this.ResponseTab.SelectedTab = this.ResponseTabPageTreeView;
43 this.RequestTab.SelectedTab = this.RequestTabPageTreeView;
44 AddContextMenus();
45 AddToolTips();
46 }
47
48 internal WebTestDetail WebTestDetail
49 {
50 get;
51 set;
52 }
53
54 internal void SetWebTestRequestResult(WebTestRequestResult webTestRequestResult, WebTestResultUnit webTestResultUnit)
55 {
56 if (this.xmlViewRequest.MessageEdited)
57 {
58 DialogResult result = MessageBox.Show("You have updated the Request Content. Do you want to save?", "Request Update Pending", MessageBoxButtons.YesNo);
59
60 if (result.Equals(DialogResult.Yes))
61 {
62 UpdateWebTestForRequest();
63 }
64 }
65
66 ResetUI();
67
68 this.webTestRequestResult = webTestRequestResult;
69 this.webTestResultUnit = webTestResultUnit;
70
71 ShowRequest(webTestRequestResult.Request);
72 ShowResponse(webTestRequestResult.Response);
73 }
74
75 private void AddContextMenus()
76 {
77 this.responseEditContextMenu = new ContextMenu();
78 this.requestEditContextMenu = new ContextMenu();
79 this.responseViewContextMenu = new ContextMenu();
80 this.requestViewContextMenu = new ContextMenu();
81
82 this.responseEditContextMenu.MenuItems.Add(new MenuItem("Add Extraction Rule", AddExtractionRule));
83 this.responseEditContextMenu.MenuItems.Add(new MenuItem("Add Validation Rule", AddValidationRule));
84
85 MenuItem m = new MenuItem("Parameterize");
86 m.MenuItems.Add(new MenuItem("Type Parameter", AddParameter));
87 m.Popup += new EventHandler(ParameterMenuClicked);
88 this.requestEditContextMenu.MenuItems.Add(m);
89 }
90
91 private void AddToolTips()
92 {
93 // Set Tooltips
94 ToolTip toolTip = new ToolTip();
95 toolTip.SetToolTip(this.editRequest, "Edit the original content of request");
96
97 toolTip = new ToolTip();
98 toolTip.SetToolTip(this.requestXMLEditor, "View request contents in XML Editor");
99
100 toolTip = new ToolTip();
101 toolTip.SetToolTip(this.responseXMLEditor, "View response contents in XML Editor");
102
103 toolTip = new ToolTip();
104 toolTip.SetToolTip(this.updateLinkLabel, "Update the content of original request");
105 }
106
107 private void EditRequestCheckedChanged(object sender, EventArgs e)
108 {
109 bool editing = false;
110 if (this.webTestResultUnit != null)
111 {
112 if (this.editRequest.Checked)
113 {
114 if (this.WebTestDetail != null)
115 {
116 WebTestRequest requestInWebTest =
117 WebTestDetail.WebTest.GetItem(this.webTestResultUnit.DeclarativeWebTestItemId)
118 as WebTestRequest;
119
120 if (requestInWebTest != null)
121 {
122 ShowRequest(requestInWebTest);
123 editing = true;
124 }
125 }
126 }
127 else
128 {
129 ShowRequest(this.webTestRequestResult.Request);
130 }
131 }
132
133 if (editing)
134 {
135 this.requestTextBox.ReadOnly = false;
136 this.updateLinkLabel.Visible = true;
137 this.treeViewRequest.LabelEdit = true;
138 this.treeViewRequest.ContextMenu = this.requestEditContextMenu;
139 }
140 else
141 {
142 this.requestTextBox.ReadOnly = true;
143 this.updateLinkLabel.Visible = false;
144 this.treeViewRequest.LabelEdit = false;
145 this.treeViewRequest.ContextMenu = this.requestViewContextMenu;
146 }
147 }
148
149 private void ResetUI()
150 {
151 this.webTestRequestResult = null;
152 this.webTestResultUnit = null;
153
154 this.xPathNavigator = null;
155 this.xPathNamespaces = null;
156
157 this.requestTextBox.Text = string.Empty;
158 this.responseTextBox.Text = string.Empty;
159 this.XPathTextBox.Text = string.Empty;
160 this.responseContentHandler = null;
161 this.requestContentHandler = null;
162 this.treeViewRequest.Nodes.Clear();
163 this.treeViewResponse.Nodes.Clear();
164 this.editRequest.Checked = false;
165 this.updateLinkLabel.Visible = false;
166
167 this.requestTreePopulated = false;
168 this.xmlViewRequest.MessageEdited = false;
169 }
170
171 private void ShowResponse(WebTestResponse webTestResponse)
172 {
173 if (webTestResponse != null && webTestResponse.BodyBytes != null)
174 {
175 responseContentHandler = ContentHandlerFactory.GetHandler(webTestResponse.ContentType);
176 if (responseContentHandler != null)
177 {
178 if (responseContentHandler.IsBinary)
179 {
180 responseContentHandler.MessageBytes = webTestResponse.BodyBytes;
181 }
182 else
183 {
184 responseContentHandler.MessageString = webTestResponse.BodyString;
185 }
186
187 this.responseTextBox.Text = responseContentHandler.XmlString;
188 this.xmlViewResponse.ShowXML(responseContentHandler.XmlDocument);
189 }
190 }
191
192 if (this.treeViewResponse.Nodes.Count > 0)
193 {
194 if (webTestResultUnit == null || WebTestDetail == null)
195 {
196 this.treeViewResponse.ContextMenu = this.responseViewContextMenu;
197 }
198 else
199 {
200 this.treeViewResponse.ContextMenu = this.responseEditContextMenu;
201 }
202 }
203 else
204 {
205 this.treeViewResponse.ContextMenu = null;
206 }
207
208 if (string.IsNullOrEmpty(this.responseTextBox.Text))
209 {
210 this.responseXMLEditor.Visible = false;
211 }
212 else
213 {
214 this.responseXMLEditor.Visible = true;
215 }
216 }
217
218 private void ShowRequest(WebTestRequest webTestRequest)
219 {
220 this.requestContentHandler = null;
221 if (webTestRequest != null && webTestRequest.Body != null)
222 {
223 BinaryHttpBody binaryHttpBody = webTestRequest.Body as BinaryHttpBody;
224 if (binaryHttpBody != null)
225 {
226 this.requestContentHandler = ContentHandlerFactory.GetHandler(binaryHttpBody.ContentType);
227 if (this.requestContentHandler != null)
228 {
229 this.requestContentHandler.MessageBytes = binaryHttpBody.Data;
230 }
231 }
232
233 StringHttpBody stringHttpBody = webTestRequest.Body as StringHttpBody;
234 if (stringHttpBody != null)
235 {
236 this.requestContentHandler = ContentHandlerFactory.GetHandler(stringHttpBody.ContentType);
237 if (this.requestContentHandler != null)
238 {
239 this.requestContentHandler.MessageString = stringHttpBody.BodyString;
240 }
241 }
242
243 if (this.requestContentHandler != null)
244 {
245 this.requestTextBox.Text = this.requestContentHandler.XmlString;
246 xmlViewRequest.ShowXML(this.requestContentHandler.XmlDocument);
247 this.requestTreePopulated = true;
248 }
249 }
250
251 this.xmlViewRequest.MessageEdited = false;
252
253 if (string.IsNullOrEmpty(this.requestTextBox.Text))
254 {
255 this.requestXMLEditor.Visible = false;
256 this.editRequest.Visible = false;
257 }
258 else
259 {
260 this.requestXMLEditor.Visible = true;
261 this.editRequest.Visible = (this.WebTestDetail != null);
262 }
263 }
264
265 private void ParameterMenuClicked(object sender, EventArgs e)
266 {
267 MenuItem menuItem = sender as MenuItem;
268
269 if (menuItem != null)
270 {
271 DeclarativeWebTest webTest = WebTestDetail.WebTest;
272 menuItem.MenuItems.Clear();
273
274 menuItem.MenuItems.Add(new MenuItem("Type Parameter", AddParameter));
275 for (int i = 1; i < this.webTestResultUnit.DeclarativeWebTestItemId; i++)
276 {
277 WebTestRequest requestInWebTest = webTest.GetItem(i) as WebTestRequest;
278 if (requestInWebTest != null)
279 {
280 foreach (ExtractionRuleReference reference in requestInWebTest.ExtractionRuleReferences)
281 {
282 menuItem.MenuItems.Add(new MenuItem(reference.ContextParameterName, AddParameter));
283 }
284 }
285 }
286 }
287 }
288
289 private void AddParameter(object sender, EventArgs e)
290 {
291 MenuItem menuItem = sender as MenuItem;
292 if (menuItem == null)
293 {
294 return;
295 }
296 this.xmlViewRequest.AddParameter(menuItem.Text);
297 }
298
299 private void requestTextBox_TextChanged(object sender, EventArgs e)
300 {
301 this.xmlViewRequest.MessageEdited = true;
302 }
303
304 /// <summary>
305 /// 1. Enable Extraction Rule if known Web Test
306 /// 2. Before adding extraction rule, check if there is an open unsaved document
307 /// 3. Prompt user to save if unsaved, and save it
308 /// 4. Parse Declarative Web Test from file, and add extraction rule
309 /// 5. Open the document again, if it was open previously
310 /// 6. Using TimeStamp,determine if Declarative Web Test at hand is uptodate.
311 /// </summary>
312 /// <param name="sender"></param>
313 /// <param name="e"></param>
314 private void AddExtractionRule(object sender, EventArgs e)
315 {
316 if (string.IsNullOrEmpty(this.XPathTextBox.Text))
317 {
318 return;
319 }
320
321 if (WebTestDetail != null)
322 {
323 // If there are pending changes, save first, as we are going to make our
324 // changes to the file directly.
325 WebTestDetail.PrepareToSave();
326
327 WebTestRequest requestInWebTest = WebTestDetail.WebTest.GetItem(this.webTestResultUnit.DeclarativeWebTestItemId) as WebTestRequest;
328
329 if (requestInWebTest != null)
330 {
331 string contextParamName = "xpathParam";
332 TreeNode selectedNode = this.treeViewResponse.SelectedNode;
333 if (selectedNode != null)
334 {
335 if (selectedNode.Nodes.Count > 0)
336 {
337 contextParamName = selectedNode.Text;
338 }
339 else if (selectedNode.Parent != null)
340 {
341 contextParamName = selectedNode.Parent.Text;
342 }
343 }
344
345 ExtractionRuleReference extractTextReference = new ExtractionRuleReference();
346 extractTextReference.Type = typeof(XPathExtractionRule);
347 extractTextReference.ContextParameterName = contextParamName;
348 extractTextReference.Properties.Add(new PluginOrRuleProperty("XPathToSearch", this.XPathTextBox.Text));
349 extractTextReference.Properties.Add(new PluginOrRuleProperty("Index", "0"));
350 extractTextReference.Properties.Add(new PluginOrRuleProperty("ExtractRandomMatch", "False"));
351
352 requestInWebTest.ExtractionRuleReferences.Add(extractTextReference);
353
354 WebTestDetail.Save();
355
356 string message = string.Format(
357 @"The extraction rule was created, and the text is extracted to a context parameter named '{0}'. You will need to add bindings to this context parameter in the appropriate places in the script.
358
359 XPath to Evaluate: {1}
360
361 The extraction rule was created under the following request:
362 {2}", contextParamName, this.XPathTextBox.Text, requestInWebTest.Url);
363
364 MessageBox.Show(message, "Extraction Rule Created");
365 }
366 }
367 }
368
369 private void AddValidationRule(object sender, EventArgs e)
370 {
371 if (string.IsNullOrEmpty(this.XPathTextBox.Text))
372 {
373 return;
374 }
375
376 if (WebTestDetail != null)
377 {
378 TreeNode treeNode = this.treeViewResponse.SelectedNode;
379 TreeNode parentNode = treeNode.Parent;
380
381 if (parentNode == null)
382 {
383 return;
384 }
385
386 // If there are pending changes, save first, as we are going to make our
387 // changes to the file directly.
388 WebTestDetail.PrepareToSave();
389
390 WebTestRequest requestInWebTest = WebTestDetail.WebTest.GetItem(this.webTestResultUnit.DeclarativeWebTestItemId) as WebTestRequest;
391
392 if (requestInWebTest != null)
393 {
394 string expectedValue = string.Empty;
395 SetupResponseXpath();
396
397 // Compile a standard XPath expression
398 XPathExpression expr;
399 expr = this.xPathNavigator.Compile(this.XPathTextBox.Text);
400 expr.SetContext(xPathNamespaces);
401 XPathNodeIterator iterator = this.xPathNavigator.Select(expr);
402
403 if (iterator.MoveNext())
404 {
405 XPathNavigator nav2 = iterator.Current.Clone();
406 expectedValue = nav2.InnerXml;
407 }
408
409 ValidationRuleReference validationTextReference = new ValidationRuleReference();
410 validationTextReference.Type = typeof(XPathValidationRule);
411 validationTextReference.Properties.Add(new PluginOrRuleProperty("XPathToSearch", this.XPathTextBox.Text));
412 validationTextReference.Properties.Add(new PluginOrRuleProperty("Index", "0"));
413 validationTextReference.Properties.Add(new PluginOrRuleProperty("IgnoreCase", "True"));
414 validationTextReference.Properties.Add(new PluginOrRuleProperty("ExpectedValue", expectedValue));
415
416 requestInWebTest.ValidationRuleReferences.Add(validationTextReference);
417
418 WebTestDetail.Save();
419
420 string message = string.Format(
421 @"The validation rule was created.
422
423 XPath to Evaluate: {0}
424 Expected Value: '{1}'
425
426 The extraction rule was created under the following request:
427 {2}", this.XPathTextBox.Text, expectedValue, requestInWebTest.Url);
428
429 MessageBox.Show(message, "Validation Rule Created");
430 }
431 }
432 }
433
434 private void ResponseTabChanged(object sender, EventArgs e)
435 {
436 }
437
438 private void RequestTabChanged(object sender, EventArgs e)
439 {
440 if (requestTreePopulated && (!this.editRequest.Checked))
441 {
442 return;
443 }
444
445 if (string.IsNullOrEmpty(this.requestTextBox.Text))
446 {
447 return;
448 }
449
450 if (this.RequestTab.SelectedTab.Equals(this.RequestTabPageTreeView))
451 {
452 if (this.requestContentHandler != null)
453 {
454 this.requestContentHandler.XmlString = this.requestTextBox.Text;
455 this.xmlViewRequest.ShowXML(this.requestContentHandler.XmlDocument);
456 }
457 }
458 else
459 {
460 if (this.requestContentHandler != null)
461 {
462 this.requestTextBox.Text = this.requestContentHandler.XmlString;
463 }
464 }
465 this.requestTreePopulated = true;
466 }
467
468 private void requestXMLEditor_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
469 {
470 if (this.requestContentHandler != null)
471 {
472 string message = string.Empty;
473 if (!this.RequestTab.SelectedTab.Equals(this.RequestTabPageTreeView))
474 {
475 this.requestContentHandler.XmlString = this.requestTextBox.Text;
476 }
477
478 this.connect.ShowInXMLEditor(this.webTestRequestResult.Request.Url + " [Request]",
479 this.requestContentHandler.XmlString);
480 }
481 }
482
483 private void responseXMLEditor_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
484 {
485 if (this.responseContentHandler != null)
486 {
487 this.connect.ShowInXMLEditor(this.webTestRequestResult.Request.Url + " [Response]", this.responseTextBox.Text);
488 }
489 }
490
491 private void updateLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
492 {
493 UpdateWebTestForRequest();
494 }
495
496 private void UpdateWebTestForRequest()
497 {
498 if (WebTestDetail != null && this.requestContentHandler != null)
499 {
500 // If there are pending changes, save first, as we are going to make our
501 // changes to the file directly.
502 WebTestDetail.PrepareToSave();
503
504 // Get the original request
505 WebTestRequest requestInWebTest =
506 WebTestDetail.WebTest.GetItem(this.webTestResultUnit.DeclarativeWebTestItemId)
507 as WebTestRequest;
508 if (requestInWebTest == null)
509 {
510 // error
511 return;
512 }
513
514 // Update content if edited in text box
515 if (!this.RequestTab.SelectedTab.Equals(this.RequestTabPageTreeView))
516 {
517 this.requestContentHandler.XmlString = this.requestTextBox.Text;
518 }
519
520 // Fill the request body with updated content
521 if (this.requestContentHandler.IsBinary)
522 {
523 BinaryHttpBody binaryHttpBody = requestInWebTest.Body as BinaryHttpBody;
524 if (binaryHttpBody != null)
525 {
526 // set the new binary data into http body
527 binaryHttpBody.Data = this.requestContentHandler.MessageBytes;
528 return;
529 }
530 }
531 else
532 {
533 StringHttpBody stringHttpBody = requestInWebTest.Body as StringHttpBody;
534 if (stringHttpBody != null)
535 {
536 stringHttpBody.BodyString = this.requestContentHandler.MessageString;
537 }
538 }
539
540 // Save WebTest
541 WebTestDetail.Save();
542 this.xmlViewRequest.MessageEdited = false;
543 }
544 }
545
546 #region XPathResponse
547 private void treeViewResponse_AfterSelect(object sender, TreeViewEventArgs e)
548 {
549 TreeNode selectedNode = this.treeViewResponse.SelectedNode;
550 if (selectedNode == null)
551 {
552 return;
553 }
554
555
556 TreeNode parentNode = selectedNode.Parent;
557 if (parentNode == null)
558 {
559 this.XPathTextBox.Text = "/" + GetXPathSubExpression(selectedNode.Text);
560 return;
561 }
562
563 if (selectedNode.Nodes.Count == 0)
564 {
565 selectedNode = parentNode;
566 parentNode = parentNode.Parent;
567 }
568
569 string xPath = string.Empty;
570
571 bool addedDoubleSlashes = false;
572 while (parentNode != null)
573 {
574 int index = 1;
575 if (parentNode.Nodes.Count > 1)
576 {
577 for (int i = 0; i < selectedNode.Index; i++)
578 {
579 if (parentNode.Nodes[i].Text.Equals(selectedNode.Text))
580 {
581 index++;
582 }
583 }
584
585 string xpathExpression = GetXPathSubExpression(selectedNode.Text);
586
587 if (index > 1)
588 {
589 xPath = "/" + xpathExpression + "[" + index + "]" + xPath;
590 }
591 else
592 {
593 xPath = "/" + xpathExpression + xPath;
594 }
595
596 addedDoubleSlashes = false;
597 }
598 else
599 {
600 if (string.IsNullOrEmpty(xPath))
601 {
602 xPath = "/" + GetXPathSubExpression(selectedNode.Text);
603 }
604 else if (!addedDoubleSlashes)
605 {
606 // Ignore intermediate single elements to reduce XPath length
607 xPath = "/" + xPath;
608 addedDoubleSlashes = true;
609 }
610 }
611
612 selectedNode = parentNode;
613 parentNode = parentNode.Parent;
614 }
615
616 if (!addedDoubleSlashes)
617 {
618 xPath = "/" + xPath;
619 }
620 this.XPathTextBox.Text = xPath;
621 }
622
623 private string GetXPathSubExpression(string name)
624 {
625 if (name.Contains(':'))
626 {
627 return name;
628 }
629 else
630 {
631 return string.Format("*[local-name()='{0}']", name);
632 }
633 }
634
635 private void XPathButton_Click(object sender, EventArgs e)
636 {
637 try
638 {
639 SetupResponseXpath();
640
641 // Compile a standard XPath expression
642 XPathExpression expr;
643 expr = this.xPathNavigator.Compile(this.XPathTextBox.Text);
644 expr.SetContext(xPathNamespaces);
645 XPathNodeIterator iterator = this.xPathNavigator.Select(expr);
646
647 int i = 1;
648 while (iterator.MoveNext())
649 {
650 XPathNavigator nav2 = iterator.Current.Clone();
651 string value = string.Empty;
652 if (nav2.NodeType.Equals(XPathNodeType.Element))
653 {
654 value = nav2.InnerXml;
655 }
656 else
657 {
658 value = nav2.Value;
659 }
660
661 if (i < iterator.Count)
662 {
663 string displayText = string.Format("Result[{0} of {1}]:{2}{3}{4}{5}{6}Do you want to display next?",
664 i,
665 iterator.Count,
666 Environment.NewLine,
667 Environment.NewLine,
668 value,
669 Environment.NewLine,
670 Environment.NewLine);
671 DialogResult result = MessageBox.Show(displayText, "XPath Result", MessageBoxButtons.YesNoCancel);
672 if (!result.Equals(DialogResult.Yes))
673 {
674 return;
675 }
676 }
677 else
678 {
679 string displayText = string.Format("Result[{0} of {1}]:{2}{3}{4}",
680 i,
681 iterator.Count,
682 Environment.NewLine,
683 Environment.NewLine,
684 value);
685 MessageBox.Show(displayText, "XPath Result");
686
687 return;
688 }
689 i++;
690 }
691
692 MessageBox.Show("No Results to Display", "XPath Result");
693 }
694 catch (Exception ex)
695 {
696 MessageBox.Show(ex.Message, "XPath Result");
697 }
698 }
699
700 private void SetupResponseXpath()
701 {
702 if (xPathNavigator == null && this.responseContentHandler != null)
703 {
704
705 this.xPathNavigator = new XPathDocument(
706 new StringReader(this.responseContentHandler.XmlString)
707 ).CreateNavigator();
708
709 this.xPathNamespaces = new XmlNamespaceManager(this.xPathNavigator.NameTable);
710 while (this.xPathNavigator.MoveToFollowing(XPathNodeType.Element))
711 {
712 IDictionary<string, string> whatever = this.xPathNavigator.GetNamespacesInScope(XmlNamespaceScope.All);
713 foreach (KeyValuePair<string, string> key in whatever)
714 {
715 this.xPathNamespaces.AddNamespace(key.Key, key.Value);
716 }
717 }
718 }
719 }
720
721 #endregion
722
723 private WebTestRequestResult webTestRequestResult;
724 private WebTestResultUnit webTestResultUnit;
725 private ContextMenu responseEditContextMenu;
726 private ContextMenu requestEditContextMenu;
727
728 private XmlTreeView xmlViewRequest;
729 private XmlTreeView xmlViewResponse;
730
731 private ContextMenu responseViewContextMenu;
732 private ContextMenu requestViewContextMenu;
733
734 private bool requestTreePopulated = false;
735
736 private XPathNavigator xPathNavigator = null;
737 private XmlNamespaceManager xPathNamespaces = null;
738
739 private ContentHandler responseContentHandler;
740 private ContentHandler requestContentHandler;
741 private Connect connect;
742 }
743 }
1 <?xml version="1.0" encoding="utf-8"?>
2 <root>
3 <!--
4 Microsoft ResX Schema
5
6 Version 2.0
7
8 The primary goals of this format is to allow a simple XML format
9 that is mostly human readable. The generation and parsing of the
10 various data types are done through the TypeConverter classes
11 associated with the data types.
12
13 Example:
14
15 ... ado.net/XML headers & schema ...
16 <resheader name="resmimetype">text/microsoft-resx</resheader>
17 <resheader name="version">2.0</resheader>
18 <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
19 <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
20 <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
21 <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
22 <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
23 <value>[base64 mime encoded serialized .NET Framework object]</value>
24 </data>
25 <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
26 <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
27 <comment>This is a comment</comment>
28 </data>
29
30 There are any number of "resheader" rows that contain simple
31 name/value pairs.
32
33 Each data row contains a name, and value. The row also contains a
34 type or mimetype. Type corresponds to a .NET class that support
35 text/value conversion through the TypeConverter architecture.
36 Classes that don't support this are serialized and stored with the
37 mimetype set.
38
39 The mimetype is used for serialized objects, and tells the
40 ResXResourceReader how to depersist the object. This is currently not
41 extensible. For a given mimetype the value must be set accordingly:
42
43 Note - application/x-microsoft.net.object.binary.base64 is the format
44 that the ResXResourceWriter will generate, however the reader can
45 read any of the formats listed below.
46
47 mimetype: application/x-microsoft.net.object.binary.base64
48 value : The object must be serialized with
49 : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
50 : and then encoded with base64 encoding.
51
52 mimetype: application/x-microsoft.net.object.soap.base64
53 value : The object must be serialized with
54 : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
55 : and then encoded with base64 encoding.
56
57 mimetype: application/x-microsoft.net.object.bytearray.base64
58 value : The object must be serialized into a byte array
59 : using a System.ComponentModel.TypeConverter
60 : and then encoded with base64 encoding.
61 -->
62 <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
63 <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
64 <xsd:element name="root" msdata:IsDataSet="true">
65 <xsd:complexType>
66 <xsd:choice maxOccurs="unbounded">
67 <xsd:element name="metadata">
68 <xsd:complexType>
69 <xsd:sequence>
70 <xsd:element name="value" type="xsd:string" minOccurs="0" />
71 </xsd:sequence>
72 <xsd:attribute name="name" use="required" type="xsd:string" />
73 <xsd:attribute name="type" type="xsd:string" />
74 <xsd:attribute name="mimetype" type="xsd:string" />
75 <xsd:attribute ref="xml:space" />
76 </xsd:complexType>
77 </xsd:element>
78 <xsd:element name="assembly">
79 <xsd:complexType>
80 <xsd:attribute name="alias" type="xsd:string" />
81 <xsd:attribute name="name" type="xsd:string" />
82 </xsd:complexType>
83 </xsd:element>
84 <xsd:element name="data">
85 <xsd:complexType>
86 <xsd:sequence>
87 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
88 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
89 </xsd:sequence>
90 <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
91 <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
92 <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
93 <xsd:attribute ref="xml:space" />
94 </xsd:complexType>
95 </xsd:element>
96 <xsd:element name="resheader">
97 <xsd:complexType>
98 <xsd:sequence>
99 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
100 </xsd:sequence>
101 <xsd:attribute name="name" type="xsd:string" use="required" />
102 </xsd:complexType>
103 </xsd:element>
104 </xsd:choice>
105 </xsd:complexType>
106 </xsd:element>
107 </xsd:schema>
108 <resheader name="resmimetype">
109 <value>text/microsoft-resx</value>
110 </resheader>
111 <resheader name="version">
112 <value>2.0</value>
113 </resheader>
114 <resheader name="reader">
115 <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
116 </resheader>
117 <resheader name="writer">
118 <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
119 </resheader>
120 </root>
...\ No newline at end of file ...\ No newline at end of file
1 //*************************************************************************************************
2 // WebTestDetail.cs
3 // Owner: Mahipal Kante
4 //
5 // Details of WebTest
6 //
7 // Copyright(c) Microsoft Corporation, 2010
8 //*************************************************************************************************
9 using System;
10 using System.IO;
11 using System.Collections.Generic;
12 using System.Linq;
13 using System.Text;
14 using EnvDTE80;
15 using EnvDTE;
16 using Microsoft.VisualStudio.TestTools.WebTesting;
17
18 namespace WebTest.WebService.Plugin.ResultTab
19 {
20 /// <summary>
21 /// Details of a Declarative WebTest project Item
22 /// </summary>
23 public class WebTestDetail
24 {
25 /// <summary>
26 ///
27 /// </summary>
28 /// <param name="fullPath"></param>
29 /// <param name="applicationObject"></param>
30 public WebTestDetail(string fullPath, DTE2 applicationObject)
31 {
32 this.FullPath = fullPath;
33 this._applicationObject = applicationObject;
34 }
35
36 /// <summary>
37 /// Web Test object
38 /// </summary>
39 public DeclarativeWebTest WebTest
40 {
41 get
42 {
43 if (webTest == null || (new FileInfo(FullPath).LastWriteTime > LastSavedTimeStamp))
44 {
45 webTest = DeclarativeWebTestSerializer.Open(FullPath);
46 LastSavedTimeStamp = new FileInfo(FullPath).LastWriteTime;
47 }
48 return webTest;
49 }
50 set
51 {
52 webTest = value;
53 LastSavedTimeStamp = new FileInfo(FullPath).LastWriteTime;
54 }
55 }
56
57 /// <summary>
58 /// Path to the WebTest file
59 /// </summary>
60 public string FullPath
61 {
62 get;
63 set;
64 }
65
66 /// <summary>
67 /// LastSavedTimeStamp
68 /// </summary>
69 public DateTime LastSavedTimeStamp
70 {
71 get;
72 set;
73 }
74
75 /// <summary>
76 /// ProjectItem of DTE
77 /// </summary>
78 public ProjectItem ProjectItem
79 {
80 get;
81 set;
82 }
83
84 /// <summary>
85 /// If there are pending changes, save first, as we are going to make our
86 /// changes to the file directly.
87 /// </summary>
88 public void PrepareToSave()
89 {
90 if (this.ProjectItem != null && this.ProjectItem.Document != null)
91 {
92 this.ProjectItem.Document.Close(vsSaveChanges.vsSaveChangesPrompt);
93 }
94 }
95
96 /// <summary>
97 /// Save WebTest to file
98 /// </summary>
99 public void Save()
100 {
101 DeclarativeWebTestSerializer.Save(this.WebTest, this.FullPath);
102 this.LastSavedTimeStamp = DateTime.Now;
103
104 if (this.ProjectItem != null)
105 {
106 Window window = this.ProjectItem.Open();
107 window.Activate();
108 }
109 }
110
111 /// <summary>
112 /// Parse parameters from all items of Web Test
113 /// </summary>
114 /// <returns></returns>
115 public List<string> GetParameterList()
116 {
117 List<string> list = new List<string>();
118
119 DeclarativeWebTest w = WebTest;
120
121 for (int i = 1; i <= w.Items.Count; i++)
122 {
123 WebTestRequest requestInWebTest = webTest.GetItem(i) as WebTestRequest;
124 if (requestInWebTest != null)
125 {
126 foreach (ExtractionRuleReference reference in requestInWebTest.ExtractionRuleReferences)
127 {
128 list.Add(reference.ContextParameterName);
129 }
130 }
131 }
132
133 return list;
134 }
135
136 private DTE2 _applicationObject;
137 private DeclarativeWebTest webTest = null;
138 }
139 }
1 //*************************************************************************************************
2 // XmlTreeView.cs
3 // Owner: Mahipal Kante
4 //
5 // Wrapper for TreeView that bings XML to TreeView
6 //
7 // Copyright(c) Microsoft Corporation, 2010
8 //*************************************************************************************************
9 using System;
10 using System.Collections.Generic;
11 using System.Linq;
12 using System.Text;
13 using System.Windows.Forms;
14 using System.Xml;
15
16 namespace WebTest.WebService.Plugin.ResultTab
17 {
18 /// <summary>
19 /// Wrapper for TreeView to enable XML content view
20 /// </summary>
21 public class XmlTreeView
22 {
23 private TreeView treeView;
24 private XmlDocument dom;
25
26 /// <summary>
27 /// Wrapper for TreeView to enable XML content view
28 /// </summary>
29 /// <param name="treeView">TreeView where XML content needs to be shown</param>
30 public XmlTreeView(TreeView treeView)
31 {
32 this.treeView = treeView;
33 treeView.BeforeExpand += new TreeViewCancelEventHandler(TreeExpanded);
34 treeView.AfterLabelEdit += new NodeLabelEditEventHandler(treeViewRequest_AfterLabelEdit);
35 }
36
37 /// <summary>
38 /// Show XML in tree
39 /// </summary>
40 /// <param name="xmlString"></param>
41 /// <returns></returns>
42 public XmlDocument ShowXML(string xmlString)
43 {
44 try
45 {
46 // Load the XML file.
47 this.dom = new XmlDocument();
48 dom.LoadXml(xmlString);
49 ShowXML(dom);
50 return dom;
51 }
52 catch (Exception)
53 {
54 //MessageBox.Show(ex.Message, "Error");
55 }
56 return null;
57 }
58
59 /// <summary>
60 /// Show XML in tree
61 /// </summary>
62 /// <param name="reader"></param>
63 /// <returns></returns>
64 public XmlDocument ShowXML(XmlReader reader)
65 {
66 try
67 {
68 // Load the XML file.
69 this.dom = new XmlDocument();
70 dom.Load(reader);
71 ShowXML(dom);
72 return dom;
73 }
74 catch (Exception)
75 {
76 //MessageBox.Show(ex.Message, "Error");
77 }
78 return null;
79 }
80
81 /// <summary>
82 /// Show XML in tree
83 /// </summary>
84 /// <param name="dom"></param>
85 public void ShowXML(XmlDocument dom)
86 {
87 try
88 {
89 this.dom = dom;
90 XmlNode xNode = dom.DocumentElement;
91
92 // Load the XML into the TreeView.
93 treeView.Nodes.Clear();
94
95 TreeNode treeNode = new TreeNode(xNode.Name);
96 treeNode.Tag = xNode;
97 if (xNode.HasChildNodes)
98 {
99 treeNode.Nodes.Add(new TreeNode("dummy"));
100 }
101 else
102 {
103 treeNode.Text = xNode.InnerXml.Trim();
104 }
105
106 treeView.Nodes.Add(treeNode);
107 treeNode.Collapse();
108 }
109 catch (Exception ex)
110 {
111 MessageBox.Show(ex.Message, "Error");
112 }
113 }
114
115 /// <summary>
116 /// Indicates whether message has been edited since last update
117 /// </summary>
118 public bool MessageEdited
119 {
120 get;
121 set;
122 }
123
124 /// <summary>
125 /// replaces currently selected XML node's contents with given parameter name
126 /// </summary>
127 /// <param name="parameterName">name of the parameter</param>
128 public void AddParameter(string parameterName)
129 {
130 TreeNode treeNode = this.treeView.SelectedNode;
131 TreeNode parentTreeNode = treeNode.Parent;
132 if (treeNode != null && parentTreeNode != null)
133 {
134 if (parameterName.Equals("Type Parameter"))
135 {
136 if (!treeNode.IsEditing)
137 {
138 treeNode.BeginEdit();
139 }
140 return;
141 }
142
143 ParameterizeNode(treeNode, "{{" + parameterName + "}}");
144 }
145 }
146
147 private void treeViewRequest_AfterLabelEdit(object sender, System.Windows.Forms.NodeLabelEditEventArgs e)
148 {
149 if (e.Label != null)
150 {
151 if (e.Label.Length > 0)
152 {
153 //Stop editing without canceling the label change.
154 e.Node.EndEdit(false);
155 ParameterizeNode(e.Node, e.Label);
156 }
157 else
158 {
159 // Cancel the label edit action, inform the user, and
160 // place the node in edit mode again
161 e.CancelEdit = true;
162 MessageBox.Show("Invalid input.\nThe label cannot be blank",
163 "Node Label Edit");
164 e.Node.BeginEdit();
165 }
166 }
167 }
168
169 private void TreeExpanded(object sender, TreeViewCancelEventArgs e)
170 {
171 if (e.Node.Nodes.Count == 1 && e.Node.Nodes[0].Text.Equals("dummy"))
172 {
173 e.Node.Nodes.Clear();
174 XmlNode parentNode = e.Node.Tag as XmlNode;
175 XmlNodeList nodeList = parentNode.ChildNodes;
176 for (int i = 0; i <= nodeList.Count - 1; i++)
177 {
178 XmlNode xNode = parentNode.ChildNodes[i];
179 TreeNode treeNode = new TreeNode();
180 treeNode.Tag = xNode;
181 if (xNode.NodeType.Equals(XmlNodeType.Element))
182 {
183 treeNode.Text = xNode.Name;
184 if (xNode.HasChildNodes)
185 {
186 treeNode.Nodes.Add(new TreeNode("dummy"));
187 }
188 else
189 {
190 treeNode.Nodes.Add(new TreeNode(xNode.Value));
191 }
192 }
193 else
194 {
195 treeNode.Text = xNode.Value;
196 }
197
198 e.Node.Nodes.Add(treeNode);
199 treeNode.Collapse();
200 }
201 }
202 }
203
204 private void ParameterizeNode(TreeNode treeNode, string parameter)
205 {
206 TreeNode parentTreeNode = treeNode.Parent;
207 XmlNode xNode = treeNode.Tag as XmlNode;
208 if (xNode != null)
209 {
210 XmlNode parentXNode = parentTreeNode.Tag as XmlNode;
211 treeNode.Text = parameter;
212 if (xNode is XmlText)
213 {
214 xNode.Value = parameter;
215 }
216 else
217 {
218 XmlText textNode = dom.CreateTextNode(parameter);
219 parentXNode.ReplaceChild(textNode, xNode);
220 treeNode.Tag = textNode;
221 treeNode.Nodes.Clear();
222 }
223 this.MessageEdited = true;
224 }
225 }
226 }
227 }
1 //*************************************************************************************************
2 // ContentHandler.cs
3 // Owner: Mahipal Kante
4 //
5 // Base class for handling a content type
6 //
7 // Copyright(c) Microsoft Corporation, 2010
8 //*************************************************************************************************
9 using System;
10 using System.Collections.Generic;
11 using System.Linq;
12 using System.Text;
13 using System.Xml;
14 using System.IO;
15 using System.Xml.XPath;
16
17 namespace WebTest.WebService.Plugin.Runtime
18 {
19 /// <summary>
20 /// Base class for handling a content type
21 /// </summary>
22 public class ContentHandler
23 {
24 private string xmlString = string.Empty;
25 private XmlDocument xmlDocument = null;
26
27 /// <summary>
28 /// Is it a binary format?
29 /// </summary>
30 public virtual bool IsBinary
31 {
32 get
33 {
34 return false;
35 }
36 }
37
38 /// <summary>
39 /// Raw binary content
40 /// </summary>
41 public virtual Byte[] MessageBytes
42 {
43 get
44 {
45 throw new NotImplementedException();
46 }
47 set
48 {
49 throw new NotImplementedException();
50 }
51 }
52
53 /// <summary>
54 /// Raw string content
55 /// </summary>
56 public virtual string MessageString
57 {
58 get
59 {
60 return XmlToString(this.XmlDocument);
61 }
62 set
63 {
64 this.xmlString = value;
65 this.xmlDocument = null;
66 }
67 }
68
69 /// <summary>
70 /// message converted to XML
71 /// </summary>
72 public string XmlString
73 {
74 get
75 {
76 return XmlToIndentedString(this.XmlDocument);
77 }
78 set
79 {
80 this.xmlString = value;
81 this.xmlDocument = null;
82 }
83 }
84
85 /// <summary>
86 /// XML Document of the message
87 /// </summary>
88 public XmlDocument XmlDocument
89 {
90 get
91 {
92 if (this.xmlDocument == null)
93 {
94 if (string.IsNullOrEmpty(this.xmlString))
95 {
96 this.LoadDocument();
97 }
98 else
99 {
100 try
101 {
102 this.xmlDocument = new XmlDocument();
103 this.xmlDocument.LoadXml(this.xmlString);
104 }
105 catch (Exception)
106 {
107 // Try setting it as a native format message
108 this.MessageString = this.xmlString;
109 this.LoadDocument();
110 }
111 }
112 }
113
114 return xmlDocument;
115 }
116 set
117 {
118 this.xmlDocument = value;
119 }
120 }
121
122 /// <summary>
123 /// XPath document of XML
124 /// </summary>
125 public virtual XPathDocument XPathDocument
126 {
127 get
128 {
129 return new XPathDocument(new StringReader(this.xmlString));
130 }
131 }
132
133 /// <summary>
134 /// Evaluates XPath
135 /// </summary>
136 /// <param name="xPath">xPath expression</param>
137 /// <returns></returns>
138 public XPathNodeIterator EvaluateXPath(string xPath)
139 {
140 XPathDocument x = this.XPathDocument;
141 XPathNavigator nav = x.CreateNavigator();
142 XmlNamespaceManager context = new XmlNamespaceManager(nav.NameTable);
143 while (nav.MoveToFollowing(XPathNodeType.Element))
144 {
145 IDictionary<string, string> whatever = nav.GetNamespacesInScope(XmlNamespaceScope.All);
146 foreach (KeyValuePair<string, string> key in whatever)
147 {
148 context.AddNamespace(key.Key, key.Value);
149 }
150 }
151
152 // Compile a standard XPath expression
153 XPathExpression expr;
154 expr = nav.Compile(xPath);
155 expr.SetContext(context);
156 return nav.Select(expr);
157 }
158
159 /// <summary>
160 /// Override to perform custom load
161 /// </summary>
162 protected virtual void LoadDocument()
163 {
164 }
165
166 /// <summary>
167 /// Converts XmlDocument to String
168 /// </summary>
169 /// <param name="dom"></param>
170 /// <returns></returns>
171 public static string XmlToString(XmlDocument dom)
172 {
173 string message = string.Empty;
174 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
175 using (var stream = new MemoryStream())
176 {
177 using (XmlTextWriter writer = new XmlTextWriter(stream, encoding))
178 {
179 dom.WriteTo(writer);
180 }
181 message = encoding.GetString(stream.ToArray());
182 }
183
184 return message;
185 }
186
187 /// <summary>
188 /// Converts XmlDocument to String
189 /// </summary>
190 /// <param name="dom"></param>
191 /// <returns></returns>
192 public static string XmlToIndentedString(XmlDocument dom)
193 {
194 string message = string.Empty;
195 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
196 using (var stream = new MemoryStream())
197 {
198 using (XmlTextWriter writer = new XmlTextWriter(stream, encoding))
199 {
200 writer.Formatting = Formatting.Indented;
201 dom.WriteTo(writer);
202 }
203 message = encoding.GetString(stream.ToArray());
204 }
205
206 return message;
207 }
208
209 /// <summary>
210 /// Parses XML in string form and returns XmlDocument
211 /// </summary>
212 /// <param name="xmlString"></param>
213 /// <returns></returns>
214 public static XmlDocument StringToXml(string xmlString)
215 {
216 XmlDocument dom = new XmlDocument();
217 dom.LoadXml(xmlString);
218 return dom;
219 }
220 }
221 }
1 //*************************************************************************************************
2 // ContentHandlerFactory.cs
3 // Owner: Mahipal Kante
4 //
5 // Creates appropriate handler for a given content type
6 //
7 // Copyright(c) Microsoft Corporation, 2010
8 //*************************************************************************************************
9 using System;
10 using System.Collections.Generic;
11 using System.Linq;
12 using System.Text;
13
14 namespace WebTest.WebService.Plugin.Runtime
15 {
16 /// <summary>
17 /// Creates appropriate handler for a given content type
18 /// </summary>
19 public class ContentHandlerFactory
20 {
21 /// <summary>
22 /// Creates appropriate handler for a given content type
23 /// </summary>
24 /// <param name="contentType">content type</param>
25 /// <returns></returns>
26 public static ContentHandler GetHandler(string contentType)
27 {
28 if (contentType.ToLower().Contains("msbin1"))
29 {
30 return new Msbin1ContentHandler(contentType.ToLower().Contains("soap"));
31 }
32 else if (contentType.ToLower().Contains("json"))
33 {
34 return new JsonContentHandler();
35 }
36 else if (contentType.ToLower().Contains("xml"))
37 {
38 return new ContentHandler();
39 }
40 else
41 {
42 return null;
43 }
44 }
45 }
46 }
1 //*************************************************************************************************
2 // DataBindingHelper.cs
3 // Owner: Mahipal Kante
4 //
5 // Data Binding helper class
6 //
7 // Copyright(c) Microsoft Corporation, 2010
8 //*************************************************************************************************
9 using System;
10 using System.Collections.Generic;
11 using System.Linq;
12 using System.Text;
13 using Microsoft.VisualStudio.TestTools.WebTesting;
14 using System.Globalization;
15
16 namespace WebTest.WebService.Plugin.Runtime
17 {
18 internal class DataBindingHelper
19 {
20 // ************************************************************************
21 // Updating the binding sites goes through the string and replaces all
22 // sites with the appropriate value found in the context's property bag.
23 // ************************************************************************
24 internal static string UpdateBindingSites(WebTestContext testCaseContext, string preBoundString)
25 {
26 string bindingSite;
27 int startingIndex = 0;
28 int bindingSiteIndex;
29 int nextStartingIndex = 0;
30 StringBuilder postBoundBuilder = null;
31
32 // Scan the entire length of the string
33 if (!String.IsNullOrEmpty(preBoundString))
34 {
35 while ((bindingSite = GetNextBindingSite(preBoundString, startingIndex, out bindingSiteIndex, out nextStartingIndex)) != null)
36 {
37 //lazy create the StringBuilder, since many fields will not be context-bound
38 if (postBoundBuilder == null)
39 {
40 postBoundBuilder = new StringBuilder();
41 }
42
43 // First copy any data up to the start of the binding site
44 postBoundBuilder.Append(preBoundString.Substring(startingIndex, bindingSiteIndex - startingIndex));
45
46 //advance the starting index to be ready for the next pass
47 startingIndex = nextStartingIndex;
48
49 string boundValue = null;
50
51 if (bindingSite.StartsWith("$", StringComparison.Ordinal) && !bindingSite.StartsWith("$HIDDEN", StringComparison.Ordinal))
52 {
53 boundValue = GetBindingMacroValue(testCaseContext, bindingSite);
54 }
55
56 if (boundValue == null)
57 {
58 // Now add the value for this binding site to the string
59 if (!testCaseContext.ContainsKey(bindingSite))
60 {
61 //string message = String.Format(CultureInfo.InvariantCulture, Strings.Get(Strings.BindingSiteException), bindingSite);
62 throw new WebTestException("Data Not Found for:" + bindingSite);
63 }
64
65 boundValue = testCaseContext[bindingSite] as string;
66 if (boundValue == null)
67 {
68 // call ToString() if the value was not a string
69 boundValue = testCaseContext[bindingSite].ToString();
70 }
71 }
72
73 postBoundBuilder.Append(boundValue);
74 }
75
76 //if we actually did any binding, add the rest of the string to the string builder and return the bound string
77 if (postBoundBuilder != null)
78 {
79 postBoundBuilder.Append(preBoundString.Substring(nextStartingIndex));
80 return postBoundBuilder.ToString();
81 }
82 }
83
84 //no binding occurred, so return the original string
85 return preBoundString;
86 }
87
88 /// <summary>
89 /// Returns the next name of a binding site -- without {{ and }}
90 /// </summary>
91 /// <param name="searchString">The string to search for binding sites.</param>
92 /// <param name="startIndex">The index at which to start looking in the string.</param>
93 /// <param name="startBindingIndex">The index of the first { character in the binding site. Behavior is undefined if no binding site was found.</param>
94 /// <param name="endIndex">The index at which parsing stopped. This should be used as the next starting index.</param>
95 /// <returns></returns>
96 private static string GetNextBindingSite(string searchString, int startIndex, out int startBindingIndex, out int endIndex)
97 {
98 endIndex = startIndex;
99 startBindingIndex = searchString.IndexOf("{{", startIndex, StringComparison.Ordinal);
100
101 if (startBindingIndex == -1)
102 {
103 //no binding was found
104 return null;
105 }
106
107 if (searchString.Length < startBindingIndex + 4)
108 {
109 //this is an error because the string is not long enough for the binding to be closed
110 return null;
111 }
112
113 int endBindingIndex = searchString.IndexOf("}}", startBindingIndex + 2, StringComparison.Ordinal);
114
115 if (endBindingIndex == -1)
116 {
117 //this is an error because the binding is not closed
118 return null;
119 }
120
121 endIndex = endBindingIndex + 2;
122
123 return searchString.Substring(startBindingIndex + 2, endBindingIndex - startBindingIndex - 2);
124 }
125
126 private static string GetBindingMacroValue(WebTestContext testCaseContext, string bindingSite)
127 {
128 if (string.Equals(bindingSite, "$AgentCount", StringComparison.OrdinalIgnoreCase))
129 {
130 return testCaseContext.AgentCount.ToString(CultureInfo.CurrentCulture);
131 }
132
133 if (string.Equals(bindingSite, "$AgentId", StringComparison.OrdinalIgnoreCase))
134 {
135 return testCaseContext.AgentId.ToString(CultureInfo.CurrentCulture);
136 }
137
138 if (string.Equals(bindingSite, "$AgentName", StringComparison.OrdinalIgnoreCase))
139 {
140 return testCaseContext.AgentName;
141 }
142
143 if (string.Equals(bindingSite, "$ControllerName", StringComparison.OrdinalIgnoreCase))
144 {
145 return testCaseContext.ControllerName;
146 }
147
148 if (string.Equals(bindingSite, "$WebTestUserId", StringComparison.OrdinalIgnoreCase))
149 {
150 return testCaseContext.WebTestUserId.ToString(CultureInfo.CurrentCulture);
151 }
152
153 if (string.Equals(bindingSite, "$WebTestIteration", StringComparison.OrdinalIgnoreCase))
154 {
155 return testCaseContext.WebTestIteration.ToString(CultureInfo.CurrentCulture);
156 }
157
158 const string randomIntMacroPrefix = "$RandomInt(";
159 if (bindingSite.StartsWith(randomIntMacroPrefix, StringComparison.OrdinalIgnoreCase) &&
160 bindingSite.EndsWith(")", StringComparison.Ordinal))
161 {
162 Random rand = new Random();
163 string arguments = bindingSite.Substring(randomIntMacroPrefix.Length, bindingSite.Length - randomIntMacroPrefix.Length - 1);
164 if (arguments.Length == 0)
165 {
166 return rand.Next().ToString(CultureInfo.CurrentCulture);
167 }
168 else if (arguments.Contains(","))
169 {
170 string[] args = arguments.Split(new char[] { ',' });
171 if (args.Length == 2)
172 {
173 try
174 {
175 return rand.Next(
176 int.Parse(args[0], CultureInfo.InvariantCulture),
177 int.Parse(args[1], CultureInfo.InvariantCulture)).ToString(CultureInfo.CurrentCulture);
178 }
179 catch
180 {
181 }
182 }
183 }
184 else
185 {
186 try
187 {
188 return rand.Next(int.Parse(arguments, CultureInfo.InvariantCulture)).ToString(CultureInfo.CurrentCulture);
189 }
190 catch
191 {
192 }
193 }
194 }
195
196 const string randomDoubleMacroPrefix = "$RandomDouble(";
197 if (bindingSite.StartsWith(randomDoubleMacroPrefix, StringComparison.OrdinalIgnoreCase) &&
198 bindingSite.EndsWith(")", StringComparison.Ordinal))
199 {
200 Random rand = new Random();
201 string arguments = bindingSite.Substring(randomDoubleMacroPrefix.Length, bindingSite.Length - randomDoubleMacroPrefix.Length - 1);
202 if (arguments.Length == 0)
203 {
204 return rand.NextDouble().ToString(CultureInfo.CurrentCulture);
205 }
206 else if (arguments.Contains(","))
207 {
208 string[] args = arguments.Split(new char[] { ',' });
209 if (args.Length == 2)
210 {
211 try
212 {
213 double min = double.Parse(args[0], CultureInfo.InvariantCulture);
214 double max = double.Parse(args[1], CultureInfo.InvariantCulture);
215 double range = max - min;
216
217 double randValue = min + (range * rand.NextDouble());
218 return randValue.ToString(CultureInfo.CurrentCulture);
219 }
220 catch
221 {
222 }
223 }
224 }
225 else
226 {
227 try
228 {
229 double randValue = double.Parse(arguments, CultureInfo.InvariantCulture) * rand.NextDouble();
230 return randValue.ToString(CultureInfo.CurrentCulture);
231 }
232 catch
233 {
234 }
235 }
236 }
237
238 return null;
239 }
240 }
241 }
1 //*************************************************************************************************
2 // JsonContentHandler.cs
3 // Owner: Mahipal Kante
4 //
5 // Encode/decode JSON format for Web Service response. converts JSON into XML back and forth
6 //
7 // Copyright(c) Microsoft Corporation, 2010
8 //*************************************************************************************************
9 using System;
10 using System.Collections.Generic;
11 using System.Linq;
12 using System.Text;
13 using System.Xml;
14 using System.Runtime.Serialization.Json;
15 using System.IO;
16 using System.Xml.XPath;
17
18 namespace WebTest.WebService.Plugin.Runtime
19 {
20 public class JsonContentHandler : ContentHandler
21 {
22 public override string MessageString
23 {
24 get
25 {
26 string message = string.Empty;
27 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
28
29 using (var stream = new MemoryStream())
30 {
31 using (XmlDictionaryWriter writer = JsonReaderWriterFactory.CreateJsonWriter(stream, encoding))
32 {
33 this.XmlDocument.WriteTo(writer);
34 }
35 message = encoding.GetString(stream.ToArray());
36 }
37
38 return message;
39 }
40 set
41 {
42 this.jsonMessage = value;
43 this.XmlString = string.Empty;
44 }
45 }
46
47 public override XPathDocument XPathDocument
48 {
49 get
50 {
51 return new XPathDocument(GetReader());
52 }
53 }
54
55 protected override void LoadDocument()
56 {
57 try
58 {
59 this.XmlDocument = new XmlDocument();
60 this.XmlDocument.Load(GetReader());
61 }
62 catch (Exception)
63 {
64 // try setting it as an XML
65 this.XmlString = jsonMessage;
66 }
67 }
68
69 private XmlDictionaryReader GetReader()
70 {
71 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
72
73 XmlDictionaryReader jsonReader =
74 System.Runtime.Serialization.Json.JsonReaderWriterFactory.CreateJsonReader(
75 encoding.GetBytes(this.jsonMessage),
76 XmlDictionaryReaderQuotas.Max);
77
78 return jsonReader;
79 }
80
81 private string jsonMessage = string.Empty;
82 }
83 }
1 //*************************************************************************************************
2 // Msbin1ContentHandler.cs
3 // Owner: Mahipal Kante
4 //
5 // Encode/decode MSBin1 binary format for Web Service response
6 // When the Web Service response is 'application/soap+msbin1 or application/msbin1'
7 // (binary - used by Silverlight application with WCF RIA)
8 //
9 // Copyright(c) Microsoft Corporation, 2010
10 //*************************************************************************************************
11 using System;
12 using System.Collections.Generic;
13 using System.Linq;
14 using System.Text;
15 using System.Xml;
16 using System.ServiceModel.Channels;
17 using System.IO;
18
19 namespace WebTest.WebService.Plugin.Runtime
20 {
21 public class Msbin1ContentHandler : ContentHandler
22 {
23 private static readonly BufferManager _bufferManager = BufferManager.CreateBufferManager(int.MaxValue, int.MaxValue);
24
25 public Msbin1ContentHandler(bool isSoapMessage)
26 {
27 soapMessage = isSoapMessage;
28 }
29
30 public override Byte[] MessageBytes
31 {
32 get
33 {
34 MemoryStream memStream = new MemoryStream();
35 if (soapMessage)
36 {
37 // Encrypt result back into binary data
38 XmlWriter meWrite = XmlWriter.Create(memStream);
39 meWrite.WriteRaw(this.MessageString);
40 meWrite.Flush();
41 memStream.Position = 0;
42
43 XmlReader meRead = XmlReader.Create(memStream);
44 Message newMessage = Message.CreateMessage(meRead, int.MaxValue, originalMessage.Version);
45 var bindingElement = new BinaryMessageEncodingBindingElement();
46 var factory = bindingElement.CreateMessageEncoderFactory();
47 using (MemoryStream memoryStream = new MemoryStream())
48 {
49 factory.Encoder.WriteMessage(newMessage, memoryStream);
50 return memoryStream.ToArray();
51 }
52 }
53 else
54 {
55 XmlDictionaryWriter meWrite = XmlDictionaryWriter.CreateBinaryWriter(memStream);
56 XmlDocument document = StringToXml(this.MessageString);
57 document.Save(meWrite);
58 return memStream.ToArray();
59 }
60 }
61 set
62 {
63 this.messageBytes = value;
64 // Decrypt body bytes to string
65
66 if (soapMessage)
67 {
68 var bindingElement = new BinaryMessageEncodingBindingElement();
69 var factory = bindingElement.CreateMessageEncoderFactory();
70 originalMessage = factory.Encoder.ReadMessage(new ArraySegment<byte>(messageBytes), _bufferManager);
71 this.MessageString = originalMessage.ToString();
72 }
73 else
74 {
75 XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(messageBytes, XmlDictionaryReaderQuotas.Max);
76
77 XmlDocument document = new XmlDocument();
78 document.Load(reader);
79 this.MessageString = XmlToString(document);
80 }
81 }
82 }
83
84 public override bool IsBinary
85 {
86 get
87 {
88 return true;
89 }
90 }
91
92 private byte[] messageBytes = null;
93 private Message originalMessage = null;
94 private bool soapMessage = false;
95 }
96 }
1 using System.Reflection;
2 using System.Runtime.CompilerServices;
3 using System.Runtime.InteropServices;
4
5 // General Information about an assembly is controlled through the following
6 // set of attributes. Change these attribute values to modify the information
7 // associated with an assembly.
8 [assembly: AssemblyTitle("WebTestSilverLightPlugin")]
9 [assembly: AssemblyDescription("")]
10 [assembly: AssemblyConfiguration("")]
11 [assembly: AssemblyCompany("Microsoft IT")]
12 [assembly: AssemblyProduct("WebTestSilverLightPlugin")]
13 [assembly: AssemblyCopyright("Copyright © Microsoft IT 2010")]
14 [assembly: AssemblyTrademark("")]
15 [assembly: AssemblyCulture("")]
16
17 // Setting ComVisible to false makes the types in this assembly not visible
18 // to COM components. If you need to access a type in this assembly from
19 // COM, set the ComVisible attribute to true on that type.
20 [assembly: ComVisible(false)]
21
22 // The following GUID is for the ID of the typelib if this project is exposed to COM
23 [assembly: Guid("88c51893-3ea0-4a7b-8942-cf06ba21bf79")]
24
25 // Version information for an assembly consists of the following four values:
26 //
27 // Major Version
28 // Minor Version
29 // Build Number
30 // Revision
31 //
32 // You can specify all the values or you can default the Build and Revision Numbers
33 // by using the '*' as shown below:
34 // [assembly: AssemblyVersion("1.0.*")]
35 [assembly: AssemblyVersion("1.0.0.0")]
36 [assembly: AssemblyFileVersion("1.0.0.0")]
1 //*************************************************************************************************
2 // WebServicePlugin.cs
3 // Owner: Mahipal Kante
4 //
5 // This Web Test plugin performs Data Binding on binary format for Web Service response
6 // When the Web Service response is 'application/soap+msbin1'
7 // (binary - used by Silverlight application with WCF RIA)
8 //
9 // Copyright(c) Microsoft Corporation, 2010
10 //*************************************************************************************************
11 using Microsoft.VisualStudio.TestTools.WebTesting;
12 using System.Diagnostics.CodeAnalysis;
13
14 namespace WebTest.WebService.Plugin.Runtime
15 {
16 public class WebServicePlugin : WebTestPlugin
17 {
18 /// Summary:
19 /// When overridden in a derived class, represents the method that will handle
20 /// the event associated with the completion of a Web page.
21 ///
22 /// Parameters:
23 /// sender:
24 /// The source of the event.
25 ///
26 /// e:
27 /// A PostPageEventArgs that contains the event data.
28 ///
29 [SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")]
30 public override void PostPage(object sender, PostPageEventArgs e)
31 {
32 }
33
34 //
35 // Summary:
36 // When overridden in a derived class, represents the method that will handle
37 // the event associated with the completion of an HTTP request.
38 //
39 // Parameters:
40 // sender:
41 // The source of the event.
42 //
43 // e:
44 // A PostRequestEventArgs that contains the event data.
45 [SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")]
46 public override void PostRequest(object sender, PostRequestEventArgs e)
47 {
48 }
49
50 //
51 // Summary:
52 // When overridden in a derived class, represents the method that will handle
53 // the event associated with the completion of a transaction that is defined
54 // in the Web test.
55 //
56 // Parameters:
57 // sender:
58 // The source of the event.
59 //
60 // e:
61 // A PostTransactionEventArgs that contains the event data.
62 [SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")]
63 public override void PostTransaction(object sender, PostTransactionEventArgs e)
64 {
65 }
66
67 //
68 // Summary:
69 // When overridden in a derived class, represents the method that will handle
70 // the event associated with the end of a Web test.
71 //
72 // Parameters:
73 // sender:
74 // The source of the event.
75 //
76 // e:
77 // A Microsoft.VisualStudio.TestTools.WebTesting.PostWebTestEventArgs that contains
78 // the event data.
79 [SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")]
80 public override void PostWebTest(object sender, PostWebTestEventArgs e)
81 {
82 }
83
84 //
85 // Summary:
86 // When overridden in a derived class, represents the method that will handle
87 // the event associated with the start of a Web page.
88 //
89 // Parameters:
90 // sender:
91 // The source of the event.
92 //
93 // e:
94 // A PrePageEventArgs that contains the event data.
95 [SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")]
96 public override void PrePage(object sender, PrePageEventArgs e)
97 {
98 }
99
100 //
101 // Summary:
102 // When overridden in a derived class, represents the method that will handle
103 // the event associated with the start of an HTTP request.
104 //
105 // Parameters:
106 // sender:
107 // The source of the event.
108 //
109 // e:
110 // A PreRequestEventArgs that contains the event data.
111 [SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")]
112 public override void PreRequest(object sender, PreRequestEventArgs e)
113 {
114 }
115
116 /// <summary>
117 /// This method performs Data Binding on MSBin1 binray format for Web Service response
118 /// When the Web Service response is 'application/soap+msbin1'
119 // (binary - used by Silverlight application with WCF RIA)
120 /// </summary>
121 /// <param name="sender"></param>
122 /// <param name="e"></param>
123 [SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")]
124 public override void PreRequestDataBinding(object sender, PreRequestDataBindingEventArgs e)
125 {
126 BinaryHttpBody binaryHttpBody = e.Request.Body as BinaryHttpBody;
127 if (binaryHttpBody == null || string.IsNullOrEmpty(binaryHttpBody.ContentType))
128 {
129 return;
130 }
131
132 if (!binaryHttpBody.ContentType.Contains("msbin1"))
133 {
134 return;
135 }
136
137 ContentHandler contentHandler = ContentHandlerFactory.GetHandler(binaryHttpBody.ContentType);
138 if (contentHandler != null)
139 {
140 contentHandler.MessageBytes = binaryHttpBody.Data;
141
142 string text = contentHandler.MessageString;
143
144 // do Data Binding on the string version of binary data
145 string newText = DataBindingHelper.UpdateBindingSites(e.WebTest.Context, text);
146
147 contentHandler.MessageString = newText;
148
149 // set the new binary data into http body
150 binaryHttpBody.Data = contentHandler.MessageBytes;
151 }
152 }
153
154 //
155 // Summary:
156 // When overridden in a derived class, represents the method that will handle
157 // the event associated with the start of a transaction that is defined in the
158 // Web test.
159 //
160 // Parameters:
161 // sender:
162 // The source of the event.
163 //
164 // e:
165 // A PreTransactionEventArgs that contains the event data.
166 [SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")]
167 public override void PreTransaction(object sender, PreTransactionEventArgs e)
168 {
169 }
170
171 //
172 // Summary:
173 // When overridden in a derived class, represents the method that will handle
174 // the event associated with the start of a Web test.
175 //
176 // Parameters:
177 // sender:
178 // The source of the event.
179 //
180 // e:
181 // A Microsoft.VisualStudio.TestTools.WebTesting.PostWebTestEventArgs that contains
182 // the event data.
183 [SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers")]
184 public override void PreWebTest(object sender, PreWebTestEventArgs e)
185 {
186 }
187 }
188 }
1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <PropertyGroup>
4 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6 <ProductVersion>8.0.30703</ProductVersion>
7 <SchemaVersion>2.0</SchemaVersion>
8 <ProjectGuid>{F9E36CFA-A657-4DD4-BD17-BA3D91EB469F}</ProjectGuid>
9 <OutputType>Library</OutputType>
10 <AppDesignerFolder>Properties</AppDesignerFolder>
11 <RootNamespace>WebTest.WebService.Plugin.Runtime</RootNamespace>
12 <AssemblyName>WebTest.WebService.Plugin.Runtime</AssemblyName>
13 <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
14 <FileAlignment>512</FileAlignment>
15 <SccProjectName>SAK</SccProjectName>
16 <SccLocalPath>SAK</SccLocalPath>
17 <SccAuxPath>SAK</SccAuxPath>
18 <SccProvider>SAK</SccProvider>
19 <TargetFrameworkProfile />
20 </PropertyGroup>
21 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
22 <DebugSymbols>true</DebugSymbols>
23 <DebugType>full</DebugType>
24 <Optimize>false</Optimize>
25 <OutputPath>bin\Debug\</OutputPath>
26 <DefineConstants>DEBUG;TRACE</DefineConstants>
27 <ErrorReport>prompt</ErrorReport>
28 <WarningLevel>4</WarningLevel>
29 <Prefer32Bit>false</Prefer32Bit>
30 </PropertyGroup>
31 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
32 <DebugType>pdbonly</DebugType>
33 <Optimize>true</Optimize>
34 <OutputPath>bin\Release\</OutputPath>
35 <DefineConstants>TRACE</DefineConstants>
36 <ErrorReport>prompt</ErrorReport>
37 <WarningLevel>4</WarningLevel>
38 <Prefer32Bit>false</Prefer32Bit>
39 </PropertyGroup>
40 <ItemGroup>
41 <Reference Include="Microsoft.VisualStudio.QualityTools.WebTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
42 <Reference Include="System" />
43 <Reference Include="System.Core" />
44 <Reference Include="System.Runtime.Serialization" />
45 <Reference Include="System.ServiceModel" />
46 <Reference Include="System.Xml.Linq" />
47 <Reference Include="System.Data.DataSetExtensions" />
48 <Reference Include="Microsoft.CSharp" />
49 <Reference Include="System.Data" />
50 <Reference Include="System.Xml" />
51 </ItemGroup>
52 <ItemGroup>
53 <Compile Include="JsonContentHandler.cs" />
54 <Compile Include="ContentHandler.cs" />
55 <Compile Include="ContentHandlerFactory.cs" />
56 <Compile Include="DataBindingHelper.cs" />
57 <Compile Include="Msbin1ContentHandler.cs" />
58 <Compile Include="WebServicePlugin.cs" />
59 <Compile Include="Properties\AssemblyInfo.cs" />
60 <Compile Include="XPathExtractionRule.cs" />
61 <Compile Include="XPathValidationRule.cs" />
62 </ItemGroup>
63 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
64 <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
65 Other similar extension points exist, see Microsoft.Common.targets.
66 <Target Name="BeforeBuild">
67 </Target>
68 <Target Name="AfterBuild">
69 </Target>
70 -->
71 </Project>
...\ No newline at end of file ...\ No newline at end of file
1 //*************************************************************************************************
2 // XPathExtractionRule.cs
3 // Owner: Mahipal Kante
4 //
5 // This web test plugin extracts data from a Web Service response using XPath expression.
6 // The Web Service response can be plain XML or 'application/soap+msbin1'
7 // (binary - used by Silverlight application with WCF RIA) or JSON
8 //
9 // Copyright(c) Microsoft Corporation, 2010
10 //*************************************************************************************************
11 using System;
12 using System.Collections.Generic;
13 using System.Linq;
14 using System.Text;
15 using System.ComponentModel;
16 using Microsoft.VisualStudio.TestTools.WebTesting;
17 using System.Xml.XPath;
18 using System.Xml;
19 using System.IO;
20
21 namespace WebTest.WebService.Plugin.Runtime
22 {
23 [DisplayName("XPathExtractionRule")]
24 [Description("Extracts a value using XPath expression")]
25 public class XPathExtractionRule : ExtractionRule
26 {
27 // The name of the desired input field
28 private string xPathValue;
29 [DisplayName("XPathToSearch")]
30 [Description("Extracts a value using XPath expression")]
31 public string XPathToSearch
32 {
33 get { return xPathValue; }
34 set { xPathValue = value; }
35 }
36
37 // To set a default value use:[DefaultValue(<value>)]
38 private int indexValue;
39 [Description("Indicates which occurrence of the string to extract. This is zero-based index.")]
40 public int Index
41 {
42 get { return indexValue; }
43 set { indexValue = value; }
44 }
45
46 private bool randomMatch;
47 [DisplayName("ExtractRandomMatch")]
48 [Description("If true, all matches are found and one of the matches is randomly returned.")]
49 public bool ExtractRandomMatch
50 {
51 get { return randomMatch; }
52 set { randomMatch = value; }
53 }
54
55 /// <summary>
56 /// The Extract method. The parameter e contains the Web test context.
57 /// </summary>
58 /// <param name="sender"></param>
59 /// <param name="e"></param>
60 public override void Extract(object sender, ExtractionEventArgs e)
61 {
62 try
63 {
64 ContentHandler contentHandler = ContentHandlerFactory.GetHandler(e.Response.ContentType);
65 if (contentHandler == null)
66 {
67 return;
68 }
69
70 if (contentHandler.IsBinary)
71 {
72 contentHandler.MessageBytes = e.Response.BodyBytes;
73 }
74 else
75 {
76 contentHandler.MessageString = e.Response.BodyString;
77 }
78
79 XPathNodeIterator iterator = contentHandler.EvaluateXPath(XPathToSearch);
80
81 List<string> values = new List<string>();
82
83 int i = 0;
84 while (iterator.MoveNext())
85 {
86 XPathNavigator nav2 = iterator.Current.Clone();
87
88 string value;
89 if (nav2.NodeType.Equals(XPathNodeType.Element))
90 {
91 value = nav2.InnerXml;
92 }
93 else
94 {
95 value = nav2.Value;
96 }
97
98 values.Add(value);
99 if (!ExtractRandomMatch && (i == Index))
100 {
101 // add the extracted value to the Web test context
102 e.WebTest.Context.Add(this.ContextParameterName, value);
103 e.Success = true;
104 return;
105 }
106 i++;
107 }
108
109 if (ExtractRandomMatch && (values.Count > 0))
110 {
111 Random random = new Random();
112 e.WebTest.Context.Add(this.ContextParameterName, values[random.Next(values.Count)]);
113 e.Success = true;
114 return;
115 }
116 }
117 catch (Exception ex)
118 {
119 e.Message = ex.Message;
120 }
121
122 e.Success = false;
123 return;
124 }
125 }
126 }
1 //*************************************************************************************************
2 // XPathValidationRule.cs
3 // Owner: Mahipal Kante
4 //
5 // This web test plugin validates a Web Service response using XPath expression.
6 // The Web Service response can be plain XML or 'application/soap+msbin1'
7 // (binary - used by Silverlight application with WCF RIA) or JSON
8 //
9 // Copyright(c) Microsoft Corporation, 2010
10 //*************************************************************************************************
11 using System;
12 using System.Collections.Generic;
13 using System.Linq;
14 using System.Text;
15 using System.ComponentModel;
16 using Microsoft.VisualStudio.TestTools.WebTesting;
17 using System.Xml.XPath;
18 using System.IO;
19 using System.Xml;
20
21 namespace WebTest.WebService.Plugin.Runtime
22 {
23 [DisplayName("XPathValidationRule")]
24 [Description("Validates response using XPath expression")]
25 public class XPathValidationRule : ValidationRule
26 {
27 // The name of the desired input field
28 private string xPathValue;
29 [DisplayName("XPathToSearch")]
30 [Description("XPath expression to evaluate")]
31 public string XPathToSearch
32 {
33 get { return xPathValue; }
34 set { xPathValue = value; }
35 }
36
37 private int indexValue = -1;
38 [Description("Indicates which occurrence of the XPath result to validate. This is a zero based index. -1 indicates try and match against all of them.")]
39 public int Index
40 {
41 get { return indexValue; }
42 set { indexValue = value; }
43 }
44
45 private string expectedValue = string.Empty;
46 [DisplayName("ExpectedValue")]
47 [Description("The Expected result of XPath evaluation")]
48 public string ExpectedValue
49 {
50 get { return expectedValue; }
51 set { expectedValue = value; }
52 }
53
54 private bool ignoreCase = true;
55 [DisplayName("IgnoreCase")]
56 [Description("Ignores case when comparing the result of XPath with the expected value")]
57 public bool IgnoreCase
58 {
59 get { return ignoreCase; }
60 set { ignoreCase = value; }
61 }
62
63 /// <summary>
64 /// The Validation method. The parameter e contains the Web test context.
65 /// </summary>
66 /// <param name="sender"></param>
67 /// <param name="e"></param>
68 public override void Validate(object sender, ValidationEventArgs e)
69 {
70 try
71 {
72 ContentHandler contentHandler = ContentHandlerFactory.GetHandler(e.Response.ContentType);
73 if (contentHandler == null)
74 {
75 return;
76 }
77
78 if (contentHandler.IsBinary)
79 {
80 contentHandler.MessageBytes = e.Response.BodyBytes;
81 }
82 else
83 {
84 contentHandler.MessageString = e.Response.BodyString;
85 }
86
87 XPathNodeIterator iterator = contentHandler.EvaluateXPath(XPathToSearch);
88 int i = 0;
89 while (iterator.MoveNext())
90 {
91 XPathNavigator nav2 = iterator.Current.Clone();
92 if ((i == -1) || (i == Index))
93 {
94 string value;
95 if (nav2.NodeType.Equals(XPathNodeType.Element))
96 {
97 value = nav2.InnerXml;
98 }
99 else
100 {
101 value = nav2.Value;
102 }
103
104
105 if (ignoreCase)
106 {
107 e.IsValid = ExpectedValue.Equals(value, StringComparison.OrdinalIgnoreCase);
108 }
109 else
110 {
111 e.IsValid = ExpectedValue.Equals(value, StringComparison.Ordinal);
112 }
113
114 if (i == Index || e.IsValid)
115 {
116 return;
117 }
118 }
119 i++;
120 }
121 }
122 catch (Exception ex)
123 {
124 e.Message = ex.Message;
125 }
126
127 e.IsValid = false;
128 return;
129 }
130 }
131 }
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
3
4 <Product Id="{289E27D1-0F89-4F1A-A2C7-9584091B9950}" Name="Web Test Plugin for Web Service Messages - VS 2012" Language="1033" Version="3.0.0.0" Manufacturer="Microsoft IT" UpgradeCode="{BF388820-5266-41AF-BFFE-DC183C37D624}">
5 <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
6 <Media Id="1" Cabinet="WebServicePlugins1.cab" EmbedCab="yes" />
7
8 <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
9
10 <Feature Id="ProductFeature" Title="Web Test Plugin for Web Service Messages" Level="1">
11 <ComponentRef Id="WebTestMessageEditor" />
12 <ComponentRef Id="WebTestResultTab" />
13 <ComponentRef Id="WebTestRuntime" />
14 </Feature>
15
16 <Property Id="VS2012INSTALLFOLDER" Secure="yes">
17 <RegistrySearch Id="VS2012InstallationFolderRegistrySearchId" Type="raw"
18 Root="HKLM" Key="SOFTWARE\Microsoft\VisualStudio\11.0" Name="InstallDir"></RegistrySearch>
19 </Property>
20
21 <Condition Message="Visual Studio 2012 not found.">
22 Installed OR VS2012INSTALLFOLDER
23 </Condition>
24 </Product>
25
26 <Fragment>
27 <Directory Id="TARGETDIR" Name="SourceDir">
28 <Directory Id="VS2012INSTALLFOLDER">
29 <Directory Id="PrivateAssemblies" Name="PrivateAssemblies">
30 <Directory Id="WebTestPlugins" Name="WebTestPlugins">
31 <Component Id="WebTestMessageEditor" Guid="{17E95CD2-6B83-46C9-AEE5-019853FF62EC}">
32 <File Source="$(var.WebServicePluginForWebTestMessageEditor.TargetPath)" Vital="yes" DiskId="1"/>
33 </Component>
34 </Directory>
35 </Directory>
36 <Directory Id="PublicAssemblies" Name="PublicAssemblies">
37 <Component Id="WebTestRuntime" Guid="{854C9BA4-3E3E-4D0A-9DB1-DFF8140E834C}">
38 <File Source="$(var.WebServicePluginForWebTestRuntime.TargetPath)" Vital="yes" DiskId="1"/>
39 </Component>
40 </Directory>
41 </Directory>
42
43 <Directory Id="AppDataFolder">
44 <Directory Id="MSAppDataDir" Name="Microsoft">
45 <Directory Id="VSAppDataDir" Name="VisualStudio">
46 <Directory Id="VSAppDataVersionDir" Name="11.0">
47 <Directory Id="VSAddins" Name="Addins">
48 <Component Id="WebTestResultTab" Guid="{27569640-6946-4E4F-8E55-109E99A79DB9}">
49 <RegistryValue KeyPath="yes" Root="HKCU" Key="SOFTWARE\Microsoft\WebServicePlugin" Name="Installed" Type="integer" Value="1" Action="write" />
50 <File Source="$(var.WebServicePluginForWebTestResultTab.TargetPath)" Vital="yes" DiskId="1"/>
51 <File Source="$(var.WebServicePluginForWebTestResultTab.ProjectDir)WebServicePluginForWebTestResultTab.Addin" Vital="yes" DiskId="1"/>
52 <RemoveFolder Id="RemoveMSAppDataDir" Directory="MSAppDataDir" On="uninstall"/>
53 <RemoveFolder Id="RemoveVSAppDataDir" Directory="VSAppDataDir" On="uninstall"/>
54 <RemoveFolder Id="RemoveVSAppDataVersionDir" Directory="VSAppDataVersionDir" On="uninstall"/>
55 <RemoveFolder Id="RemoveVSAddins" Directory="VSAddins" On="uninstall"/>
56 </Component>
57 </Directory>
58 </Directory>
59 </Directory>
60 </Directory>
61 </Directory>
62 </Directory>
63 </Fragment>
64 </Wix>
...\ No newline at end of file ...\ No newline at end of file
1 Install Wix Toolset to load installer project
2 http://wix.codeplex.com/
...\ No newline at end of file ...\ No newline at end of file
1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <PropertyGroup>
4 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5 <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
6 <ProductVersion>3.6</ProductVersion>
7 <ProjectGuid>73accda5-47c1-40c9-b63e-aff657e046e4</ProjectGuid>
8 <SchemaVersion>2.0</SchemaVersion>
9 <OutputName>Setup</OutputName>
10 <OutputType>Package</OutputType>
11 <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
12 <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
13 <Name>WebServicePluginsSetup</Name>
14 <SccProjectName>SAK</SccProjectName>
15 <SccLocalPath>SAK</SccLocalPath>
16 <SccAuxPath>SAK</SccAuxPath>
17 <SccProvider>SAK</SccProvider>
18 </PropertyGroup>
19 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
20 <OutputPath>bin\$(Configuration)\</OutputPath>
21 <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
22 <DefineConstants>Debug</DefineConstants>
23 </PropertyGroup>
24 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
25 <OutputPath>bin\$(Configuration)\</OutputPath>
26 <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
27 </PropertyGroup>
28 <ItemGroup>
29 <Compile Include="Product.wxs" />
30 </ItemGroup>
31 <ItemGroup>
32 <ProjectReference Include="..\WebTestWebServiceMessageEditor\WebServicePluginForWebTestMessageEditor.csproj">
33 <Name>WebServicePluginForWebTestMessageEditor</Name>
34 <Project>{23707a49-589b-4a36-bdaa-2896e647d07d}</Project>
35 <Private>True</Private>
36 <DoNotHarvest>True</DoNotHarvest>
37 <RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
38 <RefTargetDir>INSTALLFOLDER</RefTargetDir>
39 </ProjectReference>
40 <ProjectReference Include="..\WebTestWebServiceResultAddin\WebServicePluginForWebTestResultTab.csproj">
41 <Name>WebServicePluginForWebTestResultTab</Name>
42 <Project>{48b3509e-1fd8-4875-8fc6-137647eb83aa}</Project>
43 <Private>True</Private>
44 <DoNotHarvest>True</DoNotHarvest>
45 <RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
46 <RefTargetDir>INSTALLFOLDER</RefTargetDir>
47 </ProjectReference>
48 <ProjectReference Include="..\WebTestWebServiceRuntime\WebServicePluginForWebTestRuntime.csproj">
49 <Name>WebServicePluginForWebTestRuntime</Name>
50 <Project>{f9e36cfa-a657-4dd4-bd17-ba3d91eb469f}</Project>
51 <Private>True</Private>
52 <DoNotHarvest>True</DoNotHarvest>
53 <RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
54 <RefTargetDir>INSTALLFOLDER</RefTargetDir>
55 </ProjectReference>
56 </ItemGroup>
57 <Import Project="$(WixTargetsPath)" />
58 <!--
59 To modify your build process, add your task inside one of the targets below and uncomment it.
60 Other similar extension points exist, see Wix.targets.
61 <Target Name="BeforeBuild">
62 </Target>
63 <Target Name="AfterBuild">
64 </Target>
65 -->
66 </Project>
...\ No newline at end of file ...\ No newline at end of file