[System.IO.Compression.FileSystem] Fixed date time when creating Zip entries from...
[mono.git] / mcs / class / WindowsBase / Test / System.IO.Packaging / PackageRelationshipTests.cs
1 // Permission is hereby granted, free of charge, to any person obtaining\r
2 // a copy of this software and associated documentation files (the\r
3 // "Software"), to deal in the Software without restriction, including\r
4 // without limitation the rights to use, copy, modify, merge, publish,\r
5 // distribute, sublicense, and/or sell copies of the Software, and to\r
6 // permit persons to whom the Software is furnished to do so, subject to\r
7 // the following conditions:\r
8 // \r
9 // The above copyright notice and this permission notice shall be\r
10 // included in all copies or substantial portions of the Software.\r
11 // \r
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
19 //\r
20 // Copyright (c) 2008 Novell, Inc. (http://www.novell.com)\r
21 // Copyright (c) 2011 Xamarin Inc. (http://www.xamarin.com)\r
22 //\r
23 // Authors:\r
24 //    Alan McGovern (amcgovern@novell.com)\r
25 //    Rolf Bjarne Kvinge (rolf@xamarin.com)\r
26 //\r
27 \r
28 \r
29 using System;\r
30 using System.Collections.Generic;\r
31 using System.IO;\r
32 using System.IO.Packaging;\r
33 using System.Linq;\r
34 using System.Text;\r
35 using System.Xml;\r
36 using NUnit.Framework;\r
37 \r
38 namespace MonoTests.System.IO.Packaging {\r
39     \r
40     [TestFixture]\r
41     public class PackageRelationshipTests : TestBase {\r
42         [Test]\r
43         public void AddInvalidRelationshipTwice ()\r
44         {\r
45             try {\r
46                 package.CreateRelationship (new Uri ("", UriKind.Relative), TargetMode.Internal, "bmp");\r
47             } catch (ArgumentException) {\r
48                 try {\r
49                     package.CreateRelationship (new Uri ("", UriKind.Relative), TargetMode.Internal, "bmp");\r
50                 } catch (ArgumentException) {\r
51                     Assert.AreEqual (0, package.GetRelationships ().Count (), "Need to be buggy and return null");\r
52                     return; // Success\r
53                 }\r
54             }\r
55 \r
56             Assert.Fail ("Should have thrown an ArgumentException then InvalidOperationException");\r
57         }\r
58 \r
59         [Test]\r
60         public void AddThreeRelationShips ()\r
61         {\r
62             PackageRelationship r1 = package.CreateRelationship (uris [0], TargetMode.Internal, "a");\r
63             PackageRelationship r2 = package.CreateRelationship (uris [1], TargetMode.Internal, "b");\r
64             PackageRelationship r3 = package.CreateRelationship (uris [2], TargetMode.Internal, "a");\r
65 \r
66             Assert.AreEqual (3, package.GetRelationships ().Count (), "#1");\r
67             Assert.AreEqual (2, package.GetRelationshipsByType ("a").Count (), "#2");\r
68                         Assert.AreEqual (0, package.GetRelationshipsByType ("A").Count (), "#3");\r
69         }\r
70 \r
71         [Test]\r
72         public void CheckProperties ()\r
73         {\r
74             AddThreeRelationShips ();\r
75             PackageRelationship r = package.GetRelationshipsByType ("b").ToArray () [0];\r
76             Assert.AreEqual (uris [1], r.TargetUri, "#1");\r
77             Assert.AreEqual (TargetMode.Internal, r.TargetMode, "#2");\r
78             Assert.AreEqual (new Uri ("/", UriKind.Relative), r.SourceUri, "#3");\r
79             Assert.AreEqual ("b", r.RelationshipType, "#4");\r
80             Assert.AreEqual (package, r.Package, "#5");\r
81             Assert.IsTrue (package == r.Package, "#6");\r
82             Assert.IsTrue (!string.IsNullOrEmpty (r.Id), "#7");\r
83             Assert.IsTrue (char.IsLetter (r.Id [0]), "#8");\r
84         }\r
85 \r
86         [Test]\r
87         public void CreatePackageTest ()\r
88         {\r
89             package.CreateRelationship (uris[0], TargetMode.Internal, "a");\r
90             package.CreateRelationship (uris[1], TargetMode.External, "a");\r
91             package.CreateRelationship (new Uri ("http://www.example.com", UriKind.Absolute), TargetMode.External, "ex");\r
92             package.Close ();\r
93 \r
94             package = Package.Open (new MemoryStream (stream.ToArray ()));\r
95             PackageRelationship[] rels = package.GetRelationships ().ToArray ();\r
96             Assert.AreEqual (3, rels.Length, "#1");\r
97 \r
98             Assert.AreEqual (uris[0], rels[0].TargetUri, "#2");\r
99             Assert.AreEqual (TargetMode.Internal, rels[0].TargetMode, "#3");\r
100 \r
101             Assert.AreEqual (uris[1], rels[1].TargetUri, "#4");\r
102             Assert.AreEqual (TargetMode.External, rels[1].TargetMode, "#5");\r
103 \r
104             Assert.AreEqual ("http://www.example.com/", rels[2].TargetUri.ToString (), "#6");\r
105             Assert.AreEqual (TargetMode.External, rels[1].TargetMode, "#7");\r
106         }\r
107 \r
108         [Test]\r
109         public void ExternalRelationshipTest ()\r
110         {\r
111             package.CreateRelationship (new Uri ("/file2", UriKind.Relative), TargetMode.External, "RelType");\r
112             package.CreateRelationship (new Uri ("http://www.example.com", UriKind.Absolute), TargetMode.External, "RelType");\r
113         }\r
114 \r
115         [Test]\r
116         public void InternalRelationshipTest ()\r
117         {\r
118             package.CreateRelationship (new Uri ("/file2", UriKind.Relative), TargetMode.Internal, "RelType");\r
119             try {\r
120                 package.CreateRelationship (new Uri ("http://www.example.com", UriKind.Absolute), TargetMode.Internal, "RelType");\r
121                 Assert.Fail ("Internal relationships must be relative");\r
122             } catch (ArgumentException) {\r
123             }\r
124         }\r
125 \r
126         [Test]\r
127         public void RemoveById ()\r
128         {\r
129             AddThreeRelationShips ();\r
130             PackageRelationship r = package.GetRelationshipsByType ("a").ToArray () [0];\r
131             package.DeleteRelationship (r.Id);\r
132             Assert.AreEqual (2, package.GetRelationships ().Count (), "#1");\r
133             Assert.AreEqual (1, package.GetRelationshipsByType ("a").Count (), "#2");\r
134         }\r
135 \r
136         [Test]\r
137         public void RemoveThreeRelationships ()\r
138         {\r
139             AddThreeRelationShips ();\r
140             foreach (PackageRelationship p in new List<PackageRelationship> (package.GetRelationships ()))\r
141                 package.DeleteRelationship (p.Id);\r
142             Assert.AreEqual (0, package.GetRelationships ().Count (), "Should contain no relationships");\r
143         }\r
144 \r
145         [Test]\r
146         [ExpectedException (typeof (InvalidOperationException))]\r
147         public void RemoveThreeRelationshipsBreak ()\r
148         {\r
149             AddThreeRelationShips ();\r
150             foreach (PackageRelationship p in package.GetRelationships ())\r
151                 package.DeleteRelationship (p.Id);\r
152         }\r
153 \r
154         [Test]\r
155         public void CheckRelationshipData ()\r
156         {\r
157             AddThreeRelationShips ();\r
158             PackagePart part = package.GetPart (new Uri ("/_rels/.rels", UriKind.Relative));\r
159                         Assert.IsNotNull (package.GetPart (new Uri ("/_RELS/.RELS", UriKind.Relative)), "#0");\r
160             package.Flush ();\r
161             Assert.IsNotNull (part, "#1");\r
162 \r
163             Stream stream = part.GetStream ();\r
164             Assert.IsTrue (stream.Length > 0, "#2a");\r
165 \r
166             XmlDocument doc = new XmlDocument ();\r
167             XmlNamespaceManager manager = new XmlNamespaceManager (doc.NameTable);\r
168             manager.AddNamespace("rel", "http://schemas.openxmlformats.org/package/2006/relationships");\r
169             doc.Load (new StreamReader (stream));\r
170 \r
171             Assert.IsNotNull (doc.SelectSingleNode ("/rel:Relationships", manager), "#2b");\r
172 \r
173             XmlNodeList list = doc.SelectNodes ("/rel:Relationships/*", manager);\r
174             Assert.AreEqual (3, list.Count);\r
175 \r
176             List<PackageRelationship> relationships = new List<PackageRelationship>(package.GetRelationships ());\r
177             foreach (XmlNode node in list) {\r
178                 Assert.AreEqual (3, node.Attributes.Count, "#3");\r
179                 Assert.IsNotNull (node.Attributes ["Id"], "#4");\r
180                 Assert.IsNotNull (node.Attributes ["Target"], "#5");\r
181                 Assert.IsNotNull (node.Attributes ["Type"], "#6");\r
182                 Assert.IsTrue(relationships.Exists(d => d.Id == node.Attributes["Id"].InnerText &&\r
183                                                         d.TargetUri == new Uri (node.Attributes["Target"].InnerText, UriKind.Relative) &&\r
184                                                         d.RelationshipType == node.Attributes["Type"].InnerText));\r
185             }\r
186         }\r
187     }\r
188 }\r