Merge pull request #498 from Unroll-Me/master
[mono.git] / mcs / class / System.ServiceModel / Test / MetadataTests / TestContext.cs
1 //
2 // ITestContext.cs
3 //
4 // Author:
5 //       Martin Baulig <martin.baulig@xamarin.com>
6 //
7 // Copyright (c) 2012 Xamarin Inc. (http://www.xamarin.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining a copy
10 // of this software and associated documentation files (the "Software"), to deal
11 // in the Software without restriction, including without limitation the rights
12 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 // copies of the Software, and to permit persons to whom the Software is
14 // furnished to do so, subject to the following conditions:
15 //
16 // The above copyright notice and this permission notice shall be included in
17 // all copies or substantial portions of the Software.
18 //
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 // THE SOFTWARE.
26
27 using System;
28 using System.IO;
29 using System.Xml;
30 using System.Text;
31 using System.Reflection;
32 using System.ServiceModel.Description;
33
34 namespace MonoTests.System.ServiceModel.MetadataTests {
35
36         public abstract class TestContext {
37
38                 #region Abstract API
39
40                 public abstract MetadataSet GetMetadata (string name);
41
42                 /*
43                  * Whether or not to check whether the `WS.Binding.Extensions'
44                  * contains the policy XmlElement.
45                  * 
46                  * We only check when importing from XML, not when generating
47                  * the MetadataSet programmatically.
48                  */
49                 public abstract bool CheckPolicyXml {
50                         get;
51                 }
52
53                 #endregion
54
55                 #region Default Context
56
57                 public static TestContext LoadMetadataContext = new _LoadMetadataContext ();
58
59                 public static TestContext CreateMetadataContext = new _CreateMetadataContext ();
60
61                 public static TestContext RoundTripContext = new _RoundTripContext ();
62
63                 #endregion
64
65                 #region Implementations
66
67                 class _LoadMetadataContext : TestContext {
68                         public override MetadataSet GetMetadata (string name)
69                         {
70                                 return LoadMetadata (name);
71                         }
72
73                         public override bool CheckPolicyXml {
74                                 get {
75                                         return true;
76                                 }
77                         }
78                 }
79
80                 class _CreateMetadataContext : TestContext {
81                         public override MetadataSet GetMetadata (string name)
82                         {
83                                 return MetadataSamples.GetMetadataByName (name);
84                         }
85
86                         public override bool CheckPolicyXml {
87                                 get {
88                                         // FIXME: Not supported yet.
89                                         return false;
90                                 }
91                         }
92                 }
93
94                 class _RoundTripContext : TestContext {
95                         public override MetadataSet GetMetadata (string name)
96                         {
97                                 return RoundTrip (name);
98                         }
99
100                         public override bool CheckPolicyXml {
101                                 get {
102                                         // FIXME: Not supported yet.
103                                         return false;
104                                 }
105                         }
106                 }
107
108                 #endregion
109
110                 #region Public Static API
111
112                 public static MetadataSet LoadMetadata (string name)
113                 {
114 #if USE_EMBEDDED_METADATA
115                         return LoadMetadataFromResource (name);
116 #else
117                         return LoadMetadataFromFile (name);
118 #endif
119                 }
120
121                 public static void SaveMetadata (string name, MetadataSet metadata)
122                 {
123                         SaveMetadataToFile (name, metadata);
124                 }
125
126                 public static MetadataSet LoadMetadataFromFile (string name)
127                 {
128                         var asm = Assembly.GetExecutingAssembly ();
129                         if (!name.EndsWith (".xml"))
130                                 name = name + ".xml";
131                         var uri = new Uri (asm.CodeBase);
132                         var path = Path.GetDirectoryName (uri.AbsolutePath);
133                         path = Path.Combine (path, "Test");
134                         path = Path.Combine (path, "MetadataTests");
135                         path = Path.Combine (path, "Resources");
136                         var filename = Path.Combine (path, name);
137                         using (var stream = new StreamReader (filename)) {
138                                 var reader = new XmlTextReader (stream);
139                                 return MetadataSet.ReadFrom (reader);
140                         }
141                 }
142
143                 public static MetadataSet LoadMetadataFromResource (string name)
144                 {
145                         var asm = Assembly.GetExecutingAssembly ();
146                         if (!name.EndsWith (".xml"))
147                                 name = name + ".xml";
148                         
149                         var resname = "MetadataTests.Resources." + name;
150                         using (var stream = asm.GetManifestResourceStream (resname)) {
151                                 if (stream == null)
152                                         throw new InvalidOperationException (
153                                                 "No such resource: " + name);
154                                 var reader = new XmlTextReader (stream);
155                                 return MetadataSet.ReadFrom (reader);
156                         }
157                 }
158                 
159                 public static void SaveMetadataToFile (string name, MetadataSet metadata)
160                 {
161                         var filename = name + ".xml";
162                         if (File.Exists (filename))
163                                 return;
164
165                         using (var file = new StreamWriter (filename, false)) {
166                                 var writer = new XmlTextWriter (file);
167                                 writer.Formatting = Formatting.Indented;
168                                 metadata.WriteTo (writer);
169                         }
170
171                         Console.WriteLine ("Exported {0}.", filename);
172                 }
173
174                 internal static string SaveMetadataToString (MetadataSet metadata)
175                 {
176                         using (var ms = new MemoryStream ()) {
177                                 var writer = new XmlTextWriter (new StreamWriter (ms));
178                                 writer.Formatting = Formatting.Indented;
179                                 metadata.WriteTo (writer);
180                                 writer.Flush ();
181
182                                 return Encoding.UTF8.GetString (ms.GetBuffer (), 0, (int)ms.Position);
183                         }
184                 }
185
186                 internal static MetadataSet LoadMetadataFromString (string doc)
187                 {
188                         var buffer = Encoding.UTF8.GetBytes (doc);
189                         using (var ms = new MemoryStream (buffer)) {
190                                 var reader = new XmlTextReader (ms);
191                                 return MetadataSet.ReadFrom (reader);
192                         }
193                 }
194
195                 public static MetadataSet RoundTrip (string name)
196                 {
197                         var metadata = MetadataSamples.GetMetadataByName (name);
198
199                         var doc = SaveMetadataToString (metadata);
200                         return LoadMetadataFromString (doc);
201                 }
202
203                 #endregion
204         }
205 }
206