xref: /plugin/davcal/vendor/sabre/dav/tests/Sabre/DAVACL/ExpandPropertiesTest.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
1*a1a3b679SAndreas Boehler<?php
2*a1a3b679SAndreas Boehler
3*a1a3b679SAndreas Boehlernamespace Sabre\DAVACL;
4*a1a3b679SAndreas Boehler
5*a1a3b679SAndreas Boehleruse Sabre\DAV;
6*a1a3b679SAndreas Boehleruse Sabre\HTTP;
7*a1a3b679SAndreas Boehler
8*a1a3b679SAndreas Boehlerrequire_once 'Sabre/HTTP/ResponseMock.php';
9*a1a3b679SAndreas Boehler
10*a1a3b679SAndreas Boehlerclass ExpandPropertiesTest extends \PHPUnit_Framework_TestCase {
11*a1a3b679SAndreas Boehler
12*a1a3b679SAndreas Boehler    function getServer() {
13*a1a3b679SAndreas Boehler
14*a1a3b679SAndreas Boehler        $tree = array(
15*a1a3b679SAndreas Boehler            new DAV\Mock\PropertiesCollection('node1', [], array(
16*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}simple' => 'foo',
17*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}href'   => new DAV\Xml\Property\Href('node2'),
18*a1a3b679SAndreas Boehler                '{DAV:}displayname'     => 'Node 1',
19*a1a3b679SAndreas Boehler            )),
20*a1a3b679SAndreas Boehler            new DAV\Mock\PropertiesCollection('node2', [], array(
21*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}simple' => 'simple',
22*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}hreflist' => new DAV\Xml\Property\Href(['node1','node3']),
23*a1a3b679SAndreas Boehler                '{DAV:}displayname'     => 'Node 2',
24*a1a3b679SAndreas Boehler            )),
25*a1a3b679SAndreas Boehler            new DAV\Mock\PropertiesCollection('node3', [], array(
26*a1a3b679SAndreas Boehler                '{http://sabredav.org/ns}simple' => 'simple',
27*a1a3b679SAndreas Boehler                '{DAV:}displayname'     => 'Node 3',
28*a1a3b679SAndreas Boehler            )),
29*a1a3b679SAndreas Boehler        );
30*a1a3b679SAndreas Boehler
31*a1a3b679SAndreas Boehler        $fakeServer = new DAV\Server($tree);
32*a1a3b679SAndreas Boehler        $fakeServer->sapi = new HTTP\SapiMock();
33*a1a3b679SAndreas Boehler        $fakeServer->debugExceptions = true;
34*a1a3b679SAndreas Boehler        $fakeServer->httpResponse = new HTTP\ResponseMock();
35*a1a3b679SAndreas Boehler        $plugin = new Plugin();
36*a1a3b679SAndreas Boehler        $plugin->allowAccessToNodesWithoutACL = true;
37*a1a3b679SAndreas Boehler
38*a1a3b679SAndreas Boehler        $this->assertTrue($plugin instanceof Plugin);
39*a1a3b679SAndreas Boehler        $fakeServer->addPlugin($plugin);
40*a1a3b679SAndreas Boehler        $this->assertEquals($plugin, $fakeServer->getPlugin('acl'));
41*a1a3b679SAndreas Boehler
42*a1a3b679SAndreas Boehler        return $fakeServer;
43*a1a3b679SAndreas Boehler
44*a1a3b679SAndreas Boehler    }
45*a1a3b679SAndreas Boehler
46*a1a3b679SAndreas Boehler    function testSimple() {
47*a1a3b679SAndreas Boehler
48*a1a3b679SAndreas Boehler        $xml = '<?xml version="1.0"?>
49*a1a3b679SAndreas Boehler<d:expand-property xmlns:d="DAV:">
50*a1a3b679SAndreas Boehler  <d:property name="displayname" />
51*a1a3b679SAndreas Boehler  <d:property name="foo" namespace="http://www.sabredav.org/NS/2010/nonexistant" />
52*a1a3b679SAndreas Boehler  <d:property name="simple" namespace="http://sabredav.org/ns" />
53*a1a3b679SAndreas Boehler  <d:property name="href" namespace="http://sabredav.org/ns" />
54*a1a3b679SAndreas Boehler</d:expand-property>';
55*a1a3b679SAndreas Boehler
56*a1a3b679SAndreas Boehler        $serverVars = array(
57*a1a3b679SAndreas Boehler            'REQUEST_METHOD' => 'REPORT',
58*a1a3b679SAndreas Boehler            'HTTP_DEPTH'     => '0',
59*a1a3b679SAndreas Boehler            'REQUEST_URI'    => '/node1',
60*a1a3b679SAndreas Boehler        );
61*a1a3b679SAndreas Boehler
62*a1a3b679SAndreas Boehler        $request = HTTP\Sapi::createFromServerArray($serverVars);
63*a1a3b679SAndreas Boehler        $request->setBody($xml);
64*a1a3b679SAndreas Boehler
65*a1a3b679SAndreas Boehler        $server = $this->getServer();
66*a1a3b679SAndreas Boehler        $server->httpRequest = $request;
67*a1a3b679SAndreas Boehler
68*a1a3b679SAndreas Boehler        $server->exec();
69*a1a3b679SAndreas Boehler
70*a1a3b679SAndreas Boehler        $this->assertEquals(207, $server->httpResponse->status,'Incorrect status code received. Full body: ' . $server->httpResponse->body);
71*a1a3b679SAndreas Boehler        $this->assertEquals(array(
72*a1a3b679SAndreas Boehler            'X-Sabre-Version' => [DAV\Version::VERSION],
73*a1a3b679SAndreas Boehler            'Content-Type' => ['application/xml; charset=utf-8'],
74*a1a3b679SAndreas Boehler        ), $server->httpResponse->getHeaders());
75*a1a3b679SAndreas Boehler
76*a1a3b679SAndreas Boehler
77*a1a3b679SAndreas Boehler        $check = array(
78*a1a3b679SAndreas Boehler            '/d:multistatus',
79*a1a3b679SAndreas Boehler            '/d:multistatus/d:response' => 1,
80*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:href' => 1,
81*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat' => 2,
82*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop' => 2,
83*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/d:displayname' => 1,
84*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:simple' => 1,
85*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:href' => 1,
86*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:href' => 1,
87*a1a3b679SAndreas Boehler        );
88*a1a3b679SAndreas Boehler
89*a1a3b679SAndreas Boehler        $xml = simplexml_load_string($server->httpResponse->body);
90*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('d','DAV:');
91*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('s','http://sabredav.org/ns');
92*a1a3b679SAndreas Boehler        foreach($check as $v1=>$v2) {
93*a1a3b679SAndreas Boehler
94*a1a3b679SAndreas Boehler            $xpath = is_int($v1)?$v2:$v1;
95*a1a3b679SAndreas Boehler
96*a1a3b679SAndreas Boehler            $result = $xml->xpath($xpath);
97*a1a3b679SAndreas Boehler
98*a1a3b679SAndreas Boehler            $count = 1;
99*a1a3b679SAndreas Boehler            if (!is_int($v1)) $count = $v2;
100*a1a3b679SAndreas Boehler
101*a1a3b679SAndreas Boehler            $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . '. Full response: ' . $server->httpResponse->body);
102*a1a3b679SAndreas Boehler
103*a1a3b679SAndreas Boehler        }
104*a1a3b679SAndreas Boehler
105*a1a3b679SAndreas Boehler    }
106*a1a3b679SAndreas Boehler
107*a1a3b679SAndreas Boehler    /**
108*a1a3b679SAndreas Boehler     * @depends testSimple
109*a1a3b679SAndreas Boehler     */
110*a1a3b679SAndreas Boehler    function testExpand() {
111*a1a3b679SAndreas Boehler
112*a1a3b679SAndreas Boehler        $xml = '<?xml version="1.0"?>
113*a1a3b679SAndreas Boehler<d:expand-property xmlns:d="DAV:">
114*a1a3b679SAndreas Boehler  <d:property name="href" namespace="http://sabredav.org/ns">
115*a1a3b679SAndreas Boehler      <d:property name="displayname" />
116*a1a3b679SAndreas Boehler  </d:property>
117*a1a3b679SAndreas Boehler</d:expand-property>';
118*a1a3b679SAndreas Boehler
119*a1a3b679SAndreas Boehler        $serverVars = array(
120*a1a3b679SAndreas Boehler            'REQUEST_METHOD' => 'REPORT',
121*a1a3b679SAndreas Boehler            'HTTP_DEPTH'     => '0',
122*a1a3b679SAndreas Boehler            'REQUEST_URI'    => '/node1',
123*a1a3b679SAndreas Boehler        );
124*a1a3b679SAndreas Boehler
125*a1a3b679SAndreas Boehler        $request = HTTP\Sapi::createFromServerArray($serverVars);
126*a1a3b679SAndreas Boehler        $request->setBody($xml);
127*a1a3b679SAndreas Boehler
128*a1a3b679SAndreas Boehler        $server = $this->getServer();
129*a1a3b679SAndreas Boehler        $server->httpRequest = $request;
130*a1a3b679SAndreas Boehler
131*a1a3b679SAndreas Boehler        $server->exec();
132*a1a3b679SAndreas Boehler
133*a1a3b679SAndreas Boehler        $this->assertEquals(207, $server->httpResponse->status, 'Incorrect response status received. Full response body: ' . $server->httpResponse->body);
134*a1a3b679SAndreas Boehler        $this->assertEquals(array(
135*a1a3b679SAndreas Boehler            'X-Sabre-Version' => [DAV\Version::VERSION],
136*a1a3b679SAndreas Boehler            'Content-Type' => ['application/xml; charset=utf-8'],
137*a1a3b679SAndreas Boehler        ), $server->httpResponse->getHeaders());
138*a1a3b679SAndreas Boehler
139*a1a3b679SAndreas Boehler
140*a1a3b679SAndreas Boehler        $check = array(
141*a1a3b679SAndreas Boehler            '/d:multistatus',
142*a1a3b679SAndreas Boehler            '/d:multistatus/d:response' => 1,
143*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:href' => 1,
144*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat' => 1,
145*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop' => 1,
146*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:href' => 1,
147*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response' => 1,
148*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:href' => 1,
149*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat' => 1,
150*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop' => 1,
151*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop/d:displayname' => 1,
152*a1a3b679SAndreas Boehler        );
153*a1a3b679SAndreas Boehler
154*a1a3b679SAndreas Boehler        $xml = simplexml_load_string($server->httpResponse->body);
155*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('d','DAV:');
156*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('s','http://sabredav.org/ns');
157*a1a3b679SAndreas Boehler        foreach($check as $v1=>$v2) {
158*a1a3b679SAndreas Boehler
159*a1a3b679SAndreas Boehler            $xpath = is_int($v1)?$v2:$v1;
160*a1a3b679SAndreas Boehler
161*a1a3b679SAndreas Boehler            $result = $xml->xpath($xpath);
162*a1a3b679SAndreas Boehler
163*a1a3b679SAndreas Boehler            $count = 1;
164*a1a3b679SAndreas Boehler            if (!is_int($v1)) $count = $v2;
165*a1a3b679SAndreas Boehler
166*a1a3b679SAndreas Boehler            $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . ' Full response body: ' . $server->httpResponse->getBodyAsString());
167*a1a3b679SAndreas Boehler
168*a1a3b679SAndreas Boehler        }
169*a1a3b679SAndreas Boehler
170*a1a3b679SAndreas Boehler    }
171*a1a3b679SAndreas Boehler
172*a1a3b679SAndreas Boehler    /**
173*a1a3b679SAndreas Boehler     * @depends testSimple
174*a1a3b679SAndreas Boehler     */
175*a1a3b679SAndreas Boehler    function testExpandHrefList() {
176*a1a3b679SAndreas Boehler
177*a1a3b679SAndreas Boehler        $xml = '<?xml version="1.0"?>
178*a1a3b679SAndreas Boehler<d:expand-property xmlns:d="DAV:">
179*a1a3b679SAndreas Boehler  <d:property name="hreflist" namespace="http://sabredav.org/ns">
180*a1a3b679SAndreas Boehler      <d:property name="displayname" />
181*a1a3b679SAndreas Boehler  </d:property>
182*a1a3b679SAndreas Boehler</d:expand-property>';
183*a1a3b679SAndreas Boehler
184*a1a3b679SAndreas Boehler        $serverVars = array(
185*a1a3b679SAndreas Boehler            'REQUEST_METHOD' => 'REPORT',
186*a1a3b679SAndreas Boehler            'HTTP_DEPTH'     => '0',
187*a1a3b679SAndreas Boehler            'REQUEST_URI'    => '/node2',
188*a1a3b679SAndreas Boehler        );
189*a1a3b679SAndreas Boehler
190*a1a3b679SAndreas Boehler        $request = HTTP\Sapi::createFromServerArray($serverVars);
191*a1a3b679SAndreas Boehler        $request->setBody($xml);
192*a1a3b679SAndreas Boehler
193*a1a3b679SAndreas Boehler        $server = $this->getServer();
194*a1a3b679SAndreas Boehler        $server->httpRequest = $request;
195*a1a3b679SAndreas Boehler
196*a1a3b679SAndreas Boehler        $server->exec();
197*a1a3b679SAndreas Boehler
198*a1a3b679SAndreas Boehler        $this->assertEquals(207, $server->httpResponse->status);
199*a1a3b679SAndreas Boehler        $this->assertEquals(array(
200*a1a3b679SAndreas Boehler            'X-Sabre-Version' => [DAV\Version::VERSION],
201*a1a3b679SAndreas Boehler            'Content-Type' => ['application/xml; charset=utf-8'],
202*a1a3b679SAndreas Boehler        ), $server->httpResponse->getHeaders());
203*a1a3b679SAndreas Boehler
204*a1a3b679SAndreas Boehler
205*a1a3b679SAndreas Boehler        $check = array(
206*a1a3b679SAndreas Boehler            '/d:multistatus',
207*a1a3b679SAndreas Boehler            '/d:multistatus/d:response' => 1,
208*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:href' => 1,
209*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat' => 1,
210*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop' => 1,
211*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist' => 1,
212*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response' => 2,
213*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:href' => 2,
214*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat' => 2,
215*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop' => 2,
216*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/d:displayname' => 2,
217*a1a3b679SAndreas Boehler        );
218*a1a3b679SAndreas Boehler
219*a1a3b679SAndreas Boehler        $xml = simplexml_load_string($server->httpResponse->body);
220*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('d','DAV:');
221*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('s','http://sabredav.org/ns');
222*a1a3b679SAndreas Boehler        foreach($check as $v1=>$v2) {
223*a1a3b679SAndreas Boehler
224*a1a3b679SAndreas Boehler            $xpath = is_int($v1)?$v2:$v1;
225*a1a3b679SAndreas Boehler
226*a1a3b679SAndreas Boehler            $result = $xml->xpath($xpath);
227*a1a3b679SAndreas Boehler
228*a1a3b679SAndreas Boehler            $count = 1;
229*a1a3b679SAndreas Boehler            if (!is_int($v1)) $count = $v2;
230*a1a3b679SAndreas Boehler
231*a1a3b679SAndreas Boehler            $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result));
232*a1a3b679SAndreas Boehler
233*a1a3b679SAndreas Boehler        }
234*a1a3b679SAndreas Boehler
235*a1a3b679SAndreas Boehler    }
236*a1a3b679SAndreas Boehler
237*a1a3b679SAndreas Boehler    /**
238*a1a3b679SAndreas Boehler     * @depends testExpand
239*a1a3b679SAndreas Boehler     */
240*a1a3b679SAndreas Boehler    function testExpandDeep() {
241*a1a3b679SAndreas Boehler
242*a1a3b679SAndreas Boehler        $xml = '<?xml version="1.0"?>
243*a1a3b679SAndreas Boehler<d:expand-property xmlns:d="DAV:">
244*a1a3b679SAndreas Boehler  <d:property name="hreflist" namespace="http://sabredav.org/ns">
245*a1a3b679SAndreas Boehler      <d:property name="href" namespace="http://sabredav.org/ns">
246*a1a3b679SAndreas Boehler          <d:property name="displayname" />
247*a1a3b679SAndreas Boehler      </d:property>
248*a1a3b679SAndreas Boehler      <d:property name="displayname" />
249*a1a3b679SAndreas Boehler  </d:property>
250*a1a3b679SAndreas Boehler</d:expand-property>';
251*a1a3b679SAndreas Boehler
252*a1a3b679SAndreas Boehler        $serverVars = array(
253*a1a3b679SAndreas Boehler            'REQUEST_METHOD' => 'REPORT',
254*a1a3b679SAndreas Boehler            'HTTP_DEPTH'     => '0',
255*a1a3b679SAndreas Boehler            'REQUEST_URI'    => '/node2',
256*a1a3b679SAndreas Boehler        );
257*a1a3b679SAndreas Boehler
258*a1a3b679SAndreas Boehler        $request = HTTP\Sapi::createFromServerArray($serverVars);
259*a1a3b679SAndreas Boehler        $request->setBody($xml);
260*a1a3b679SAndreas Boehler
261*a1a3b679SAndreas Boehler        $server = $this->getServer();
262*a1a3b679SAndreas Boehler        $server->httpRequest = $request;
263*a1a3b679SAndreas Boehler
264*a1a3b679SAndreas Boehler        $server->exec();
265*a1a3b679SAndreas Boehler
266*a1a3b679SAndreas Boehler        $this->assertEquals(207, $server->httpResponse->status);
267*a1a3b679SAndreas Boehler        $this->assertEquals(array(
268*a1a3b679SAndreas Boehler            'X-Sabre-Version' => [DAV\Version::VERSION],
269*a1a3b679SAndreas Boehler            'Content-Type' => ['application/xml; charset=utf-8'],
270*a1a3b679SAndreas Boehler        ), $server->httpResponse->getHeaders());
271*a1a3b679SAndreas Boehler
272*a1a3b679SAndreas Boehler
273*a1a3b679SAndreas Boehler        $check = array(
274*a1a3b679SAndreas Boehler            '/d:multistatus',
275*a1a3b679SAndreas Boehler            '/d:multistatus/d:response' => 1,
276*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:href' => 1,
277*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat' => 1,
278*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop' => 1,
279*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist' => 1,
280*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response' => 2,
281*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:href' => 2,
282*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat' => 3,
283*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop' => 3,
284*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/d:displayname' => 2,
285*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href' => 2,
286*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response' => 1,
287*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:href' => 1,
288*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat' => 1,
289*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop' => 1,
290*a1a3b679SAndreas Boehler            '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop/d:displayname' => 1,
291*a1a3b679SAndreas Boehler        );
292*a1a3b679SAndreas Boehler
293*a1a3b679SAndreas Boehler        $xml = simplexml_load_string($server->httpResponse->body);
294*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('d','DAV:');
295*a1a3b679SAndreas Boehler        $xml->registerXPathNamespace('s','http://sabredav.org/ns');
296*a1a3b679SAndreas Boehler        foreach($check as $v1=>$v2) {
297*a1a3b679SAndreas Boehler
298*a1a3b679SAndreas Boehler            $xpath = is_int($v1)?$v2:$v1;
299*a1a3b679SAndreas Boehler
300*a1a3b679SAndreas Boehler            $result = $xml->xpath($xpath);
301*a1a3b679SAndreas Boehler
302*a1a3b679SAndreas Boehler            $count = 1;
303*a1a3b679SAndreas Boehler            if (!is_int($v1)) $count = $v2;
304*a1a3b679SAndreas Boehler
305*a1a3b679SAndreas Boehler            $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result));
306*a1a3b679SAndreas Boehler
307*a1a3b679SAndreas Boehler        }
308*a1a3b679SAndreas Boehler
309*a1a3b679SAndreas Boehler    }
310*a1a3b679SAndreas Boehler}
311