2 * Copyright 2016 Hans Leidekker for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "webservices.h"
22 #include "wine/test.h"
24 static void test_WsCreateMessage(void)
28 WS_MESSAGE_STATE state
;
29 WS_ENVELOPE_VERSION env_version
;
30 WS_ADDRESSING_VERSION addr_version
;
31 WS_MESSAGE_PROPERTY prop
;
33 hr
= WsCreateMessage( 0, 0, NULL
, 0, NULL
, NULL
);
34 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
36 hr
= WsCreateMessage( 0, 0, NULL
, 0, &msg
, NULL
);
37 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
39 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, 0, NULL
, 0, &msg
, NULL
);
40 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
42 hr
= WsCreateMessage( 0, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg
, NULL
);
43 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
45 env_version
= WS_ENVELOPE_VERSION_SOAP_1_1
;
46 prop
.id
= WS_MESSAGE_PROPERTY_ENVELOPE_VERSION
;
47 prop
.value
= &env_version
;
48 prop
.valueSize
= sizeof(env_version
);
49 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, &prop
,
51 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
53 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
,
55 ok( hr
== S_OK
, "got %#lx\n", hr
);
58 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
59 ok( hr
== S_OK
, "got %#lx\n", hr
);
60 ok( state
== WS_MESSAGE_STATE_EMPTY
, "got %u\n", state
);
62 env_version
= 0xdeadbeef;
63 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION
, &env_version
,
64 sizeof(env_version
), NULL
);
65 ok( hr
== S_OK
, "got %#lx\n", hr
);
66 ok( env_version
== WS_ENVELOPE_VERSION_SOAP_1_1
, "got %u\n", env_version
);
68 addr_version
= 0xdeadbeef;
69 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ADDRESSING_VERSION
, &addr_version
,
70 sizeof(addr_version
), NULL
);
71 ok( hr
== S_OK
, "got %#lx\n", hr
);
72 ok( addr_version
== WS_ADDRESSING_VERSION_0_9
, "got %u\n", addr_version
);
74 state
= WS_MESSAGE_STATE_EMPTY
;
75 hr
= WsSetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
76 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
78 env_version
= WS_ENVELOPE_VERSION_SOAP_1_1
;
79 hr
= WsSetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION
, &env_version
,
80 sizeof(env_version
), NULL
);
81 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
83 addr_version
= WS_ADDRESSING_VERSION_0_9
;
84 hr
= WsSetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ADDRESSING_VERSION
, &addr_version
,
85 sizeof(addr_version
), NULL
);
86 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
90 static void test_WsCreateMessageForChannel(void)
95 WS_MESSAGE_STATE state
;
96 WS_ENVELOPE_VERSION env_version
;
97 WS_ADDRESSING_VERSION addr_version
;
98 WS_CHANNEL_PROPERTY prop
;
101 hr
= WsCreateMessageForChannel( NULL
, NULL
, 0, NULL
, NULL
);
102 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
104 hr
= WsCreateMessageForChannel( NULL
, NULL
, 0, &msg
, NULL
);
105 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
108 hr
= WsCreateChannel( WS_CHANNEL_TYPE_REQUEST
, WS_HTTP_CHANNEL_BINDING
, NULL
, 0, NULL
,
110 ok( hr
== S_OK
, "got %#lx\n", hr
);
112 hr
= WsCreateMessageForChannel( channel
, NULL
, 0, &msg
, NULL
);
113 ok( hr
== S_OK
, "got %#lx\n", hr
);
116 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
117 ok( hr
== S_OK
, "got %#lx\n", hr
);
118 ok( state
== WS_MESSAGE_STATE_EMPTY
, "got %u\n", state
);
120 env_version
= 0xdeadbeef;
121 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION
, &env_version
,
122 sizeof(env_version
), NULL
);
123 ok( hr
== S_OK
, "got %#lx\n", hr
);
124 ok( env_version
== WS_ENVELOPE_VERSION_SOAP_1_2
, "got %u\n", env_version
);
126 addr_version
= 0xdeadbeef;
127 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ADDRESSING_VERSION
, &addr_version
,
128 sizeof(addr_version
), NULL
);
129 ok( hr
== S_OK
, "got %#lx\n", hr
);
130 ok( addr_version
== WS_ADDRESSING_VERSION_1_0
, "got %u\n", addr_version
);
132 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_IS_ADDRESSED
, &addressed
, sizeof(addressed
),
134 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
136 WsFreeChannel( channel
);
137 WsFreeMessage( msg
);
139 env_version
= WS_ENVELOPE_VERSION_SOAP_1_1
;
140 prop
.id
= WS_CHANNEL_PROPERTY_ENVELOPE_VERSION
;
141 prop
.value
= &env_version
;
142 prop
.valueSize
= sizeof(env_version
);
143 hr
= WsCreateChannel( WS_CHANNEL_TYPE_REQUEST
, WS_HTTP_CHANNEL_BINDING
, &prop
, 1, NULL
,
145 ok( hr
== S_OK
, "got %#lx\n", hr
);
147 hr
= WsCreateMessageForChannel( channel
, NULL
, 0, &msg
, NULL
);
148 ok( hr
== S_OK
, "got %#lx\n", hr
);
150 env_version
= 0xdeadbeef;
151 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION
, &env_version
,
152 sizeof(env_version
), NULL
);
153 ok( hr
== S_OK
, "got %#lx\n", hr
);
154 ok( env_version
== WS_ENVELOPE_VERSION_SOAP_1_1
, "got %u\n", env_version
);
156 WsFreeChannel( channel
);
157 WsFreeMessage( msg
);
160 hr
= WsCreateChannel( WS_CHANNEL_TYPE_DUPLEX_SESSION
, WS_TCP_CHANNEL_BINDING
, NULL
, 0, NULL
,
162 ok( hr
== S_OK
, "got %#lx\n", hr
);
164 hr
= WsCreateMessageForChannel( channel
, NULL
, 0, &msg
, NULL
);
165 ok( hr
== S_OK
, "got %#lx\n", hr
);
168 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
169 ok( hr
== S_OK
, "got %#lx\n", hr
);
170 ok( state
== WS_MESSAGE_STATE_EMPTY
, "got %u\n", state
);
172 env_version
= 0xdeadbeef;
173 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION
, &env_version
,
174 sizeof(env_version
), NULL
);
175 ok( hr
== S_OK
, "got %#lx\n", hr
);
176 ok( env_version
== WS_ENVELOPE_VERSION_SOAP_1_2
, "got %u\n", env_version
);
178 addr_version
= 0xdeadbeef;
179 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ADDRESSING_VERSION
, &addr_version
,
180 sizeof(addr_version
), NULL
);
181 ok( hr
== S_OK
, "got %#lx\n", hr
);
182 ok( addr_version
== WS_ADDRESSING_VERSION_1_0
, "got %u\n", addr_version
);
184 WsFreeChannel( channel
);
185 WsFreeMessage( msg
);
188 hr
= WsCreateChannel( WS_CHANNEL_TYPE_DUPLEX
, WS_UDP_CHANNEL_BINDING
, NULL
, 0, NULL
,
190 ok( hr
== S_OK
, "got %#lx\n", hr
);
192 hr
= WsCreateMessageForChannel( channel
, NULL
, 0, &msg
, NULL
);
193 ok( hr
== S_OK
, "got %#lx\n", hr
);
195 env_version
= 0xdeadbeef;
196 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION
, &env_version
,
197 sizeof(env_version
), NULL
);
198 ok( hr
== S_OK
, "got %#lx\n", hr
);
199 ok( env_version
== WS_ENVELOPE_VERSION_SOAP_1_2
, "got %u\n", env_version
);
201 addr_version
= 0xdeadbeef;
202 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ADDRESSING_VERSION
, &addr_version
,
203 sizeof(addr_version
), NULL
);
204 ok( hr
== S_OK
, "got %#lx\n", hr
);
205 ok( addr_version
== WS_ADDRESSING_VERSION_1_0
, "got %u\n", addr_version
);
207 WsFreeChannel( channel
);
208 WsFreeMessage( msg
);
211 static void test_WsInitializeMessage(void)
215 WS_MESSAGE_STATE state
;
216 WS_ENVELOPE_VERSION env_version
;
217 WS_ADDRESSING_VERSION addr_version
;
220 hr
= WsInitializeMessage( NULL
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
221 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
223 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
,
225 ok( hr
== S_OK
, "got %#lx\n", hr
);
227 hr
= WsInitializeMessage( msg
, 0xdeadbeef, NULL
, NULL
);
228 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
230 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
231 ok( hr
== S_OK
, "got %#lx\n", hr
);
233 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
234 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
237 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
238 ok( hr
== S_OK
, "got %#lx\n", hr
);
239 ok( state
== WS_MESSAGE_STATE_INITIALIZED
, "got %u\n", state
);
242 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_IS_ADDRESSED
, &addressed
, sizeof(addressed
),
244 ok( hr
== S_OK
, "got %#lx\n", hr
);
245 ok( !addressed
, "unexpected value %d\n", addressed
);
247 state
= WS_MESSAGE_STATE_EMPTY
;
248 hr
= WsSetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
249 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
251 env_version
= WS_ENVELOPE_VERSION_SOAP_1_1
;
252 hr
= WsSetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION
, &env_version
,
253 sizeof(env_version
), NULL
);
254 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
256 addr_version
= WS_ADDRESSING_VERSION_0_9
;
257 hr
= WsSetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ADDRESSING_VERSION
, &addr_version
,
258 sizeof(addr_version
), NULL
);
259 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
260 WsFreeMessage( msg
);
263 static void test_WsAddressMessage(void)
267 WS_ENDPOINT_ADDRESS endpoint
;
270 hr
= WsAddressMessage( NULL
, NULL
, NULL
);
271 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
273 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
,
275 ok( hr
== S_OK
, "got %#lx\n", hr
);
277 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_IS_ADDRESSED
, &addressed
, sizeof(addressed
),
279 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
281 hr
= WsAddressMessage( msg
, NULL
, NULL
);
282 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
284 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
285 ok( hr
== S_OK
, "got %#lx\n", hr
);
288 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_IS_ADDRESSED
, &addressed
, sizeof(addressed
),
290 ok( hr
== S_OK
, "got %#lx\n", hr
);
291 ok( !addressed
, "unexpected value %d\n", addressed
);
293 hr
= WsAddressMessage( msg
, NULL
, NULL
);
294 ok( hr
== S_OK
, "got %#lx\n", hr
);
297 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_IS_ADDRESSED
, &addressed
, sizeof(addressed
),
299 ok( hr
== S_OK
, "got %#lx\n", hr
);
300 ok( addressed
== TRUE
, "unexpected value %d\n", addressed
);
301 WsFreeMessage( msg
);
303 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
,
305 ok( hr
== S_OK
, "got %#lx\n", hr
);
307 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
308 ok( hr
== S_OK
, "got %#lx\n", hr
);
310 memset( &endpoint
, 0, sizeof(endpoint
) );
311 endpoint
.url
.chars
= (WCHAR
*)L
"http://localhost/";
312 endpoint
.url
.length
= ARRAY_SIZE( L
"http://localhost/" ) - 1;
313 hr
= WsAddressMessage( msg
, &endpoint
, NULL
);
314 ok( hr
== S_OK
, "got %#lx\n", hr
);
317 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_IS_ADDRESSED
, &addressed
, sizeof(addressed
),
319 ok( hr
== S_OK
, "got %#lx\n", hr
);
320 ok( addressed
== TRUE
, "unexpected value %d\n", addressed
);
321 WsFreeMessage( msg
);
324 static HRESULT
set_output( WS_XML_WRITER
*writer
)
326 WS_XML_WRITER_TEXT_ENCODING text
= { {WS_XML_WRITER_ENCODING_TYPE_TEXT
}, WS_CHARSET_UTF8
};
327 WS_XML_WRITER_BUFFER_OUTPUT buf
= { {WS_XML_WRITER_OUTPUT_TYPE_BUFFER
} };
328 return WsSetOutput( writer
, &text
.encoding
, &buf
.output
, NULL
, 0, NULL
);
331 static void check_output( WS_XML_WRITER
*writer
, const char *expected
, int len
, unsigned int skip_start
,
332 unsigned int skip_len
, unsigned int line
)
337 if (len
== -1) len
= strlen( expected
);
338 memset( &bytes
, 0, sizeof(bytes
) );
339 hr
= WsGetWriterProperty( writer
, WS_XML_WRITER_PROPERTY_BYTES
, &bytes
, sizeof(bytes
), NULL
);
340 ok( hr
== S_OK
, "%u: got %#lx\n", line
, hr
);
341 ok( bytes
.length
== len
, "%u: got %lu expected %d\n", line
, bytes
.length
, len
);
342 if (bytes
.length
!= len
) return;
345 ok( !memcmp( bytes
.bytes
, expected
, skip_start
), "%u: got %s expected %s\n", line
,
346 bytes
.bytes
, expected
);
347 ok( !memcmp( bytes
.bytes
+ skip_start
+ skip_len
, expected
+ skip_start
+ skip_len
,
348 len
- skip_start
- skip_len
), "%u: got %s expected %s\n", line
, bytes
.bytes
, expected
);
351 ok( !memcmp( bytes
.bytes
, expected
, len
), "%u: got %s expected %s\n", line
, bytes
.bytes
,
355 static void check_output_header( WS_MESSAGE
*msg
, const char *expected
, int len
, unsigned int skip_start
,
356 unsigned int skip_len
, unsigned int line
)
358 WS_XML_WRITER
*writer
;
362 hr
= WsCreateWriter( NULL
, 0, &writer
, NULL
);
363 ok( hr
== S_OK
, "got %#lx\n", hr
);
365 hr
= set_output( writer
);
366 ok( hr
== S_OK
, "got %#lx\n", hr
);
368 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_HEADER_BUFFER
, &buf
, sizeof(buf
), NULL
);
369 ok( hr
== S_OK
, "got %#lx\n", hr
);
371 hr
= WsWriteXmlBuffer( writer
, buf
, NULL
);
372 ok( hr
== S_OK
, "got %#lx\n", hr
);
374 check_output( writer
, expected
, len
, skip_start
, skip_len
, line
);
375 WsFreeWriter( writer
);
378 static void test_WsWriteEnvelopeStart(void)
380 static const char expected
[] =
381 "<s:Envelope xmlns:a=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" "
382 "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header>"
383 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
384 "<a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address>"
385 "</a:ReplyTo></s:Header>";
386 static const char expected2
[] =
387 "<s:Envelope xmlns:a=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" "
388 "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header>"
389 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
390 "<a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address>"
391 "</a:ReplyTo></s:Header><s:Body/></s:Envelope>";
392 static const char expected3
[] =
393 "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header/><s:Body/></s:Envelope>";
394 static const char expected4
[] =
395 "<Envelope><Header/><Body/></Envelope>";
396 static const char expected5
[] =
397 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
398 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
399 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
400 "</s:Header><s:Body/></s:Envelope>";
401 static const char expected6
[] =
402 "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header/><s:Body/></s:Envelope>";
403 static const char expected7
[] =
404 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
405 "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header>"
406 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
407 "</s:Header><s:Body/></s:Envelope>";
408 static const char expected8
[] =
409 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
410 "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header/><s:Body/></s:Envelope>";
411 static const char expected9
[] =
412 "<s:Envelope xmlns:a=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\" "
413 "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header>"
414 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
415 "<a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address>"
416 "</a:ReplyTo><a:To s:mustUnderstand=\"1\">http://localhost/</a:To></s:Header><s:Body/></s:Envelope>";
417 static const char expected10
[] =
418 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
419 "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header>"
420 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
421 "<a:To s:mustUnderstand=\"1\">http://localhost/</a:To></s:Header><s:Body/></s:Envelope>";
424 WS_XML_WRITER
*writer
;
425 WS_MESSAGE_STATE state
;
426 WS_ENDPOINT_ADDRESS addr
;
428 memset( &addr
, 0, sizeof(addr
) );
429 addr
.url
.chars
= (WCHAR
*) L
"http://localhost/";
430 addr
.url
.length
= 17;
432 hr
= WsWriteEnvelopeStart( NULL
, NULL
, NULL
, NULL
, NULL
);
433 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
435 hr
= WsCreateWriter( NULL
, 0, &writer
, NULL
);
436 ok( hr
== S_OK
, "got %#lx\n", hr
);
438 hr
= WsWriteEnvelopeStart( NULL
, writer
, NULL
, NULL
, NULL
);
439 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
441 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg
, NULL
);
442 ok( hr
== S_OK
, "got %#lx\n", hr
);
444 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
445 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
447 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
448 ok( hr
== S_OK
, "got %#lx\n", hr
);
449 hr
= set_output( writer
);
450 ok( hr
== S_OK
, "got %#lx\n", hr
);
451 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
452 ok( hr
== S_OK
, "got %#lx\n", hr
);
453 check_output( writer
, expected
, -1, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
454 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
457 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
458 ok( hr
== S_OK
, "got %#lx\n", hr
);
459 ok( state
== WS_MESSAGE_STATE_WRITING
, "got %u\n", state
);
460 WsFreeMessage( msg
);
462 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_TRANSPORT
, NULL
, 0, &msg
, NULL
);
463 ok( hr
== S_OK
, "got %#lx\n", hr
);
464 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
465 ok( hr
== S_OK
, "got %#lx\n", hr
);
466 hr
= set_output( writer
);
467 ok( hr
== S_OK
, "got %#lx\n", hr
);
468 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
469 ok( hr
== S_OK
, "got %#lx\n", hr
);
470 check_output_header( msg
, expected3
, -1, 0, 0, __LINE__
);
471 WsFreeMessage( msg
);
473 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_NONE
, WS_ADDRESSING_VERSION_TRANSPORT
, NULL
, 0, &msg
, NULL
);
474 ok( hr
== S_OK
, "got %#lx\n", hr
);
475 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
476 ok( hr
== S_OK
, "got %#lx\n", hr
);
477 hr
= set_output( writer
);
478 ok( hr
== S_OK
, "got %#lx\n", hr
);
479 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
480 ok( hr
== S_OK
, "got %#lx\n", hr
);
481 check_output_header( msg
, expected4
, -1, 0, 0, __LINE__
);
482 WsFreeMessage( msg
);
484 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
485 ok( hr
== S_OK
, "got %#lx\n", hr
);
486 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
487 ok( hr
== S_OK
, "got %#lx\n", hr
);
488 hr
= set_output( writer
);
489 ok( hr
== S_OK
, "got %#lx\n", hr
);
490 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
491 ok( hr
== S_OK
, "got %#lx\n", hr
);
492 check_output_header( msg
, expected5
, -1, strstr(expected5
, "urn:uuid:") - expected5
, 46, __LINE__
);
493 WsFreeMessage( msg
);
495 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_TRANSPORT
, NULL
, 0, &msg
, NULL
);
496 ok( hr
== S_OK
, "got %#lx\n", hr
);
497 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
498 ok( hr
== S_OK
, "got %#lx\n", hr
);
499 hr
= set_output( writer
);
500 ok( hr
== S_OK
, "got %#lx\n", hr
);
501 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
502 ok( hr
== S_OK
, "got %#lx\n", hr
);
503 check_output_header( msg
, expected6
, -1, 0, 0, __LINE__
);
504 WsFreeMessage( msg
);
506 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
507 ok( hr
== S_OK
, "got %#lx\n", hr
);
508 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
509 ok( hr
== S_OK
, "got %#lx\n", hr
);
510 hr
= set_output( writer
);
511 ok( hr
== S_OK
, "got %#lx\n", hr
);
512 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
513 ok( hr
== S_OK
, "got %#lx\n", hr
);
514 check_output_header( msg
, expected7
, -1, strstr(expected7
, "urn:uuid:") - expected7
, 46, __LINE__
);
515 WsFreeMessage( msg
);
517 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
518 ok( hr
== S_OK
, "got %#lx\n", hr
);
519 hr
= WsInitializeMessage( msg
, WS_BLANK_MESSAGE
, NULL
, NULL
);
520 ok( hr
== S_OK
, "got %#lx\n", hr
);
521 hr
= set_output( writer
);
522 ok( hr
== S_OK
, "got %#lx\n", hr
);
523 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
524 ok( hr
== S_OK
, "got %#lx\n", hr
);
525 check_output_header( msg
, expected8
, -1, 0, 0, __LINE__
);
526 WsFreeMessage( msg
);
528 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg
, NULL
);
529 ok( hr
== S_OK
, "got %#lx\n", hr
);
530 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
531 ok( hr
== S_OK
, "got %#lx\n", hr
);
532 hr
= WsAddressMessage( msg
, &addr
, NULL
);
533 hr
= set_output( writer
);
534 ok( hr
== S_OK
, "got %#lx\n", hr
);
535 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
536 ok( hr
== S_OK
, "got %#lx\n", hr
);
537 check_output_header( msg
, expected9
, -1, strstr(expected9
, "urn:uuid:") - expected9
, 46, __LINE__
);
538 WsFreeMessage( msg
);
540 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
541 ok( hr
== S_OK
, "got %#lx\n", hr
);
542 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
543 ok( hr
== S_OK
, "got %#lx\n", hr
);
544 hr
= WsAddressMessage( msg
, &addr
, NULL
);
545 hr
= set_output( writer
);
546 ok( hr
== S_OK
, "got %#lx\n", hr
);
547 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
548 ok( hr
== S_OK
, "got %#lx\n", hr
);
549 check_output_header( msg
, expected10
, -1, strstr(expected10
, "urn:uuid:") - expected10
, 46, __LINE__
);
550 WsFreeMessage( msg
);
552 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
553 ok( hr
== S_OK
, "got %#lx\n", hr
);
554 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
555 ok( hr
== S_OK
, "got %#lx\n", hr
);
556 WsFreeMessage( msg
);
558 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_NONE
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg
, NULL
);
559 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
560 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_NONE
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
561 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
562 WsFreeWriter( writer
);
565 static void test_WsWriteEnvelopeEnd(void)
567 static const char expected
[] =
568 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
569 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
570 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
571 "</s:Header><s:Body/></s:Envelope>";
574 WS_XML_WRITER
*writer
;
575 WS_MESSAGE_STATE state
;
577 hr
= WsWriteEnvelopeEnd( NULL
, NULL
);
578 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
580 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
,
582 ok( hr
== S_OK
, "got %#lx\n", hr
);
584 hr
= WsWriteEnvelopeEnd( msg
, NULL
);
585 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
587 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
588 ok( hr
== S_OK
, "got %#lx\n", hr
);
590 hr
= WsWriteEnvelopeEnd( msg
, NULL
);
591 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
593 hr
= WsCreateWriter( NULL
, 0, &writer
, NULL
);
594 ok( hr
== S_OK
, "got %#lx\n", hr
);
596 hr
= set_output( writer
);
597 ok( hr
== S_OK
, "got %#lx\n", hr
);
599 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
600 ok( hr
== S_OK
, "got %#lx\n", hr
);
602 hr
= WsWriteEnvelopeEnd( msg
, NULL
);
603 ok( hr
== S_OK
, "got %#lx\n", hr
);
604 check_output( writer
, expected
, -1, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
605 check_output_header( msg
, expected
, -1, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
608 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
609 ok( hr
== S_OK
, "got %#lx\n", hr
);
610 ok( state
== WS_MESSAGE_STATE_DONE
, "got %u\n", state
);
612 WsFreeMessage( msg
);
613 WsFreeWriter( writer
);
616 static void test_WsWriteBody(void)
618 static char expected
[] =
619 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
620 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
621 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
622 "</s:Header><s:Body><u xmlns=\"ns\"><val>1</val></u></s:Body></s:Envelope>";
623 static char expected2
[] =
624 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
625 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
626 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
627 "</s:Header><s:Body/></s:Envelope>";
628 WS_XML_STRING localname
= {1, (BYTE
*)"t"}, localname2
= {1, (BYTE
*)"u"};
629 WS_XML_STRING val
= {3, (BYTE
*)"val"}, ns
= {2, (BYTE
*)"ns"};
632 WS_XML_WRITER
*writer
;
633 WS_MESSAGE_STATE state
;
634 WS_ELEMENT_DESCRIPTION desc
;
635 WS_STRUCT_DESCRIPTION s
;
636 WS_FIELD_DESCRIPTION f
, *fields
[1];
642 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
,
644 ok( hr
== S_OK
, "got %#lx\n", hr
);
646 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
647 ok( hr
== S_OK
, "got %#lx\n", hr
);
649 hr
= WsCreateWriter( NULL
, 0, &writer
, NULL
);
650 ok( hr
== S_OK
, "got %#lx\n", hr
);
652 hr
= set_output( writer
);
653 ok( hr
== S_OK
, "got %#lx\n", hr
);
655 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
656 ok( hr
== S_OK
, "got %#lx\n", hr
);
658 hr
= WsWriteBody( NULL
, NULL
, 0, NULL
, 0, NULL
);
659 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
661 hr
= WsWriteBody( msg
, NULL
, 0, NULL
, 0, NULL
);
662 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
664 memset( &f
, 0, sizeof(f
) );
665 f
.mapping
= WS_ELEMENT_FIELD_MAPPING
;
668 f
.type
= WS_UINT32_TYPE
;
671 memset( &s
, 0, sizeof(s
) );
672 s
.size
= sizeof(struct test
);
673 s
.alignment
= TYPE_ALIGNMENT(struct test
);
676 s
.typeLocalName
= &localname
;
679 desc
.elementLocalName
= &localname2
;
680 desc
.elementNs
= &ns
;
681 desc
.type
= WS_STRUCT_TYPE
;
682 desc
.typeDescription
= &s
;
686 hr
= WsWriteBody( msg
, &desc
, WS_WRITE_REQUIRED_POINTER
, &ptr
, sizeof(ptr
), NULL
);
687 ok( hr
== S_OK
, "got %#lx\n", hr
);
688 check_output( writer
, expected
, 240, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
689 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
692 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
693 ok( hr
== S_OK
, "got %#lx\n", hr
);
694 ok( state
== WS_MESSAGE_STATE_WRITING
, "got %u\n", state
);
696 hr
= WsWriteEnvelopeEnd( msg
, NULL
);
697 ok( hr
== S_OK
, "got %#lx\n", hr
);
698 check_output( writer
, expected
, -1, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
699 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
701 hr
= WsWriteBody( msg
, &desc
, WS_WRITE_REQUIRED_POINTER
, &ptr
, sizeof(ptr
), NULL
);
702 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
704 WsFreeMessage( msg
);
705 WsFreeWriter( writer
);
708 static void test_WsSetHeader(void)
710 static const char expected
[] =
711 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
712 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
713 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
714 "<a:Action s:mustUnderstand=\"1\">action</a:Action></s:Header>"
715 "<s:Body/></s:Envelope>";
716 static const char expected2
[] =
717 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
718 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
719 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
720 "<a:Action s:mustUnderstand=\"1\">action2</a:Action></s:Header>"
721 "<s:Body/></s:Envelope>";
722 static const WS_XML_STRING action2
= {7, (BYTE
*)"action2"};
725 WS_XML_WRITER
*writer
;
726 const WCHAR
*ptr
= L
"action";
728 hr
= WsSetHeader( NULL
, 0, 0, 0, NULL
, 0, NULL
);
729 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
731 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
,
733 ok( hr
== S_OK
, "got %#lx\n", hr
);
735 hr
= WsSetHeader( msg
, 0, 0, 0, NULL
, 0, NULL
);
736 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
738 hr
= WsSetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_WRITE_REQUIRED_POINTER
, &ptr
,
740 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
742 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
743 ok( hr
== S_OK
, "got %#lx\n", hr
);
745 hr
= WsSetHeader( msg
, 0, WS_WSZ_TYPE
, WS_WRITE_REQUIRED_POINTER
, &ptr
, sizeof(ptr
), NULL
);
746 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
748 hr
= WsSetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_WRITE_REQUIRED_POINTER
, &ptr
,
750 ok( hr
== S_OK
, "got %#lx\n", hr
);
751 check_output_header( msg
, expected
, -1, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
753 hr
= WsCreateWriter( NULL
, 0, &writer
, NULL
);
754 ok( hr
== S_OK
, "got %#lx\n", hr
);
756 hr
= set_output( writer
);
757 ok( hr
== S_OK
, "got %#lx\n", hr
);
759 hr
= WsWriteEnvelopeStart( msg
, writer
, NULL
, NULL
, NULL
);
760 ok( hr
== S_OK
, "got %#lx\n", hr
);
761 check_output( writer
, expected
, 250, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
762 check_output_header( msg
, expected
, -1, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
764 /* called after WsWriteEnvelopeStart */
765 hr
= WsSetHeader( msg
, WS_ACTION_HEADER
, WS_XML_STRING_TYPE
, WS_WRITE_REQUIRED_VALUE
, &action2
,
766 sizeof(action2
), NULL
);
767 ok( hr
== S_OK
, "got %#lx\n", hr
);
768 check_output( writer
, expected
, 250, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
769 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
771 WsFreeMessage( msg
);
772 WsFreeWriter( writer
);
775 static void test_WsRemoveHeader(void)
777 static const char expected
[] =
778 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
779 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
780 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
781 "<a:Action s:mustUnderstand=\"1\">action</a:Action></s:Header>"
782 "<s:Body/></s:Envelope>";
783 static const char expected2
[] =
784 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
785 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
786 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
787 "</s:Header><s:Body/></s:Envelope>";
788 static const WS_XML_STRING action
= {6, (BYTE
*)"action"};
792 hr
= WsSetHeader( NULL
, 0, 0, 0, NULL
, 0, NULL
);
793 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
795 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
,
797 ok( hr
== S_OK
, "got %#lx\n", hr
);
799 hr
= WsRemoveHeader( NULL
, 0, NULL
);
800 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
802 hr
= WsRemoveHeader( msg
, 0, NULL
);
803 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
805 hr
= WsRemoveHeader( msg
, WS_ACTION_HEADER
, NULL
);
806 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
808 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
809 ok( hr
== S_OK
, "got %#lx\n", hr
);
810 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
812 hr
= WsRemoveHeader( msg
, 0, NULL
);
813 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
815 hr
= WsRemoveHeader( msg
, WS_ACTION_HEADER
, NULL
);
816 ok( hr
== S_OK
, "got %#lx\n", hr
);
817 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
819 hr
= WsSetHeader( msg
, WS_ACTION_HEADER
, WS_XML_STRING_TYPE
, WS_WRITE_REQUIRED_VALUE
, &action
,
820 sizeof(action
), NULL
);
821 ok( hr
== S_OK
, "got %#lx\n", hr
);
822 check_output_header( msg
, expected
, -1, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
824 hr
= WsRemoveHeader( msg
, WS_ACTION_HEADER
, NULL
);
825 ok( hr
== S_OK
, "got %#lx\n", hr
);
826 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
829 hr
= WsRemoveHeader( msg
, WS_ACTION_HEADER
, NULL
);
830 ok( hr
== S_OK
, "got %#lx\n", hr
);
831 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
833 WsFreeMessage( msg
);
836 static void test_WsAddMappedHeader(void)
838 static const WS_XML_STRING header
= {6, (BYTE
*)"Header"}, value
= {5, (BYTE
*)"value"};
842 hr
= WsAddMappedHeader( NULL
, NULL
, 0, 0, NULL
, 0, NULL
);
843 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
845 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
846 ok( hr
== S_OK
, "got %#lx\n", hr
);
848 hr
= WsAddMappedHeader( msg
, NULL
, 0, 0, NULL
, 0, NULL
);
849 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
851 hr
= WsAddMappedHeader( msg
, &header
, 0, 0, NULL
, 0, NULL
);
852 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
854 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
855 ok( hr
== S_OK
, "got %#lx\n", hr
);
857 hr
= WsAddMappedHeader( msg
, &header
, WS_XML_STRING_TYPE
, WS_WRITE_REQUIRED_VALUE
, NULL
, 0, NULL
);
858 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
860 hr
= WsAddMappedHeader( msg
, &header
, WS_XML_STRING_TYPE
, WS_WRITE_REQUIRED_VALUE
, &value
, sizeof(value
), NULL
);
861 ok( hr
== S_OK
, "got %#lx\n", hr
);
864 hr
= WsAddMappedHeader( msg
, &header
, WS_XML_STRING_TYPE
, WS_WRITE_REQUIRED_VALUE
, &value
, sizeof(value
), NULL
);
865 ok( hr
== S_OK
, "got %#lx\n", hr
);
867 WsFreeMessage( msg
);
870 static void test_WsRemoveMappedHeader(void)
872 static const WS_XML_STRING header
= {6, (BYTE
*)"Header"}, value
= {5, (BYTE
*)"value"};
876 hr
= WsRemoveMappedHeader( NULL
, NULL
, NULL
);
877 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
879 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
880 ok( hr
== S_OK
, "got %#lx\n", hr
);
882 hr
= WsRemoveMappedHeader( msg
, NULL
, NULL
);
883 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
885 hr
= WsRemoveMappedHeader( msg
, &header
, NULL
);
886 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
888 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
889 ok( hr
== S_OK
, "got %#lx\n", hr
);
891 hr
= WsAddMappedHeader( msg
, &header
, WS_XML_STRING_TYPE
, WS_WRITE_REQUIRED_VALUE
, &value
, sizeof(value
), NULL
);
892 ok( hr
== S_OK
, "got %#lx\n", hr
);
894 hr
= WsRemoveMappedHeader( msg
, &header
, NULL
);
895 ok( hr
== S_OK
, "got %#lx\n", hr
);
898 hr
= WsRemoveMappedHeader( msg
, &header
, NULL
);
899 ok( hr
== S_OK
, "got %#lx\n", hr
);
901 WsFreeMessage( msg
);
904 static void test_WsAddCustomHeader(void)
906 static const char expected
[] =
907 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
908 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
909 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
910 "<header xmlns=\"ns\">value</header></s:Header><s:Body/></s:Envelope>";
911 static const char expected2
[] =
912 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
913 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
914 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
915 "</s:Header><s:Body/></s:Envelope>";
916 static const char expected3
[] =
917 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
918 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
919 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
920 "<header xmlns=\"ns\">value</header><header xmlns=\"ns\">value2</header>"
921 "</s:Header><s:Body/></s:Envelope>";
922 static const char expected4
[] =
923 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
924 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
925 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
926 "<header xmlns=\"ns\">value</header><header xmlns=\"ns\">value2</header>"
927 "<header2 xmlns=\"ns\">value2</header2></s:Header><s:Body/></s:Envelope>";
928 static WS_XML_STRING header
= {6, (BYTE
*)"header"}, ns
= {2, (BYTE
*)"ns"};
929 static WS_XML_STRING header2
= {7, (BYTE
*)"header2"};
932 WS_ELEMENT_DESCRIPTION desc
;
933 WS_STRUCT_DESCRIPTION s
;
934 WS_FIELD_DESCRIPTION f
, *fields
[1];
940 hr
= WsAddCustomHeader( NULL
, NULL
, 0, NULL
, 0, 0, NULL
);
941 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
943 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
944 ok( hr
== S_OK
, "got %#lx\n", hr
);
946 hr
= WsAddCustomHeader( msg
, NULL
, 0, NULL
, 0, 0, NULL
);
947 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
949 memset( &f
, 0, sizeof(f
) );
950 f
.mapping
= WS_TEXT_FIELD_MAPPING
;
951 f
.type
= WS_WSZ_TYPE
;
954 memset( &s
, 0, sizeof(s
) );
955 s
.size
= sizeof(struct header
);
956 s
.alignment
= TYPE_ALIGNMENT(struct header
);
960 desc
.elementLocalName
= &header
;
961 desc
.elementNs
= &ns
;
962 desc
.type
= WS_STRUCT_TYPE
;
963 desc
.typeDescription
= &s
;
964 hr
= WsAddCustomHeader( msg
, &desc
, 0, NULL
, 0, 0, NULL
);
965 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
967 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
968 ok( hr
== S_OK
, "got %#lx\n", hr
);
969 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
971 test
.value
= L
"value";
972 hr
= WsAddCustomHeader( msg
, &desc
, WS_WRITE_REQUIRED_VALUE
, &test
, sizeof(test
), 0, NULL
);
973 ok( hr
== S_OK
, "got %#lx\n", hr
);
974 check_output_header( msg
, expected
, -1, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
976 test
.value
= L
"value2";
977 hr
= WsAddCustomHeader( msg
, &desc
, WS_WRITE_REQUIRED_VALUE
, &test
, sizeof(test
), 0, NULL
);
978 ok( hr
== S_OK
, "got %#lx\n", hr
);
979 check_output_header( msg
, expected3
, -1, strstr(expected3
, "urn:uuid:") - expected3
, 46, __LINE__
);
981 desc
.elementLocalName
= &header2
;
982 hr
= WsAddCustomHeader( msg
, &desc
, WS_WRITE_REQUIRED_VALUE
, &test
, sizeof(test
), 0, NULL
);
983 ok( hr
== S_OK
, "got %#lx\n", hr
);
984 check_output_header( msg
, expected4
, -1, strstr(expected4
, "urn:uuid:") - expected4
, 46, __LINE__
);
986 hr
= WsAddCustomHeader( msg
, &desc
, WS_WRITE_REQUIRED_VALUE
, NULL
, 0, 0, NULL
);
987 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
989 WsFreeMessage( msg
);
992 static void test_WsRemoveCustomHeader(void)
994 static const char expected
[] =
995 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
996 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
997 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
998 "<test xmlns=\"ns\">value</test></s:Header><s:Body/></s:Envelope>";
999 static const char expected2
[] =
1000 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
1001 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
1002 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
1003 "</s:Header><s:Body/></s:Envelope>";
1004 static const char expected3
[] =
1005 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
1006 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
1007 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
1008 "<test xmlns=\"ns\">value</test><test xmlns=\"ns\">value2</test>"
1009 "</s:Header><s:Body/></s:Envelope>";
1010 static WS_XML_STRING localname
= {4, (BYTE
*)"test"}, ns
= {2, (BYTE
*)"ns"};
1011 static const WS_XML_STRING value
= {5, (BYTE
*)"value"};
1012 static const WS_XML_STRING value2
= {6, (BYTE
*)"value2"};
1015 WS_ELEMENT_DESCRIPTION desc
;
1017 hr
= WsRemoveCustomHeader( NULL
, NULL
, NULL
, NULL
);
1018 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1020 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
1021 ok( hr
== S_OK
, "got %#lx\n", hr
);
1023 hr
= WsRemoveCustomHeader( msg
, &localname
, &ns
, NULL
);
1024 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
1026 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
1027 ok( hr
== S_OK
, "got %#lx\n", hr
);
1028 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
1030 desc
.elementLocalName
= &localname
;
1031 desc
.elementNs
= &ns
;
1032 desc
.type
= WS_XML_STRING_TYPE
;
1033 desc
.typeDescription
= NULL
;
1034 hr
= WsAddCustomHeader( msg
, &desc
, WS_WRITE_REQUIRED_VALUE
, &value
, sizeof(value
), 0, NULL
);
1035 ok( hr
== S_OK
, "got %#lx\n", hr
);
1036 check_output_header( msg
, expected
, -1, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
1038 hr
= WsAddCustomHeader( msg
, &desc
, WS_WRITE_REQUIRED_VALUE
, &value2
, sizeof(value2
), 0, NULL
);
1039 ok( hr
== S_OK
, "got %#lx\n", hr
);
1040 check_output_header( msg
, expected3
, -1, strstr(expected3
, "urn:uuid:") - expected3
, 46, __LINE__
);
1042 hr
= WsRemoveCustomHeader( msg
, NULL
, NULL
, NULL
);
1043 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1045 hr
= WsRemoveCustomHeader( msg
, &localname
, NULL
, NULL
);
1046 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1048 hr
= WsRemoveCustomHeader( msg
, &localname
, &ns
, NULL
);
1049 ok( hr
== S_OK
, "got %#lx\n", hr
);
1050 check_output_header( msg
, expected2
, -1, strstr(expected2
, "urn:uuid:") - expected2
, 46, __LINE__
);
1053 hr
= WsRemoveCustomHeader( msg
, &localname
, &ns
, NULL
);
1054 ok( hr
== S_OK
, "got %#lx\n", hr
);
1056 WsFreeMessage( msg
);
1059 static HRESULT
set_input( WS_XML_READER
*reader
, const char *data
, ULONG size
)
1061 WS_XML_READER_TEXT_ENCODING text
= {{WS_XML_READER_ENCODING_TYPE_TEXT
}, WS_CHARSET_AUTO
};
1062 WS_XML_READER_BUFFER_INPUT buf
;
1064 buf
.input
.inputType
= WS_XML_READER_INPUT_TYPE_BUFFER
;
1065 buf
.encodedData
= (void *)data
;
1066 buf
.encodedDataSize
= size
;
1067 return WsSetInput( reader
, &text
.encoding
, &buf
.input
, NULL
, 0, NULL
);
1070 static void test_WsReadEnvelopeStart(void)
1072 static const char xml
[] =
1073 "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body/></s:Envelope>";
1074 static const char faultxml
[] =
1075 "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body>"
1076 "<s:Fault/></s:Body></s:Envelope>";
1077 WS_MESSAGE
*msg
, *msg2
, *msg3
;
1078 WS_XML_READER
*reader
;
1079 WS_MESSAGE_STATE state
;
1080 const WS_XML_NODE
*node
;
1084 hr
= WsReadEnvelopeStart( NULL
, NULL
, NULL
, NULL
, NULL
);
1085 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1087 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg
, NULL
);
1088 ok( hr
== S_OK
, "got %#lx\n", hr
);
1090 hr
= WsReadEnvelopeStart( msg
, NULL
, NULL
, NULL
, NULL
);
1091 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1093 hr
= WsCreateReader( NULL
, 0, &reader
, NULL
);
1094 ok( hr
== S_OK
, "got %#lx\n", hr
);
1096 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
1097 ok( hr
== S_OK
, "got %#lx\n", hr
);
1099 hr
= WsReadEnvelopeStart( msg
, reader
, NULL
, NULL
, NULL
);
1100 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
1102 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg2
, NULL
);
1103 ok( hr
== S_OK
, "got %#lx\n", hr
);
1105 hr
= set_input( reader
, xml
, strlen(xml
) );
1106 ok( hr
== S_OK
, "got %#lx\n", hr
);
1108 hr
= WsReadEnvelopeStart( msg2
, reader
, NULL
, NULL
, NULL
);
1109 ok( hr
== S_OK
, "got %#lx\n", hr
);
1112 hr
= WsGetMessageProperty( msg2
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
1113 ok( hr
== S_OK
, "got %#lx\n", hr
);
1114 ok( state
== WS_MESSAGE_STATE_READING
, "got %u\n", state
);
1116 hr
= WsGetReaderNode( reader
, &node
, NULL
);
1117 ok( hr
== S_OK
, "got %#lx\n", hr
);
1118 ok( node
->nodeType
== WS_XML_NODE_TYPE_END_ELEMENT
, "got %u\n", node
->nodeType
);
1120 hr
= WsReadEndElement( reader
, NULL
);
1121 ok( hr
== S_OK
, "got %#lx\n", hr
);
1123 hr
= WsGetReaderNode( reader
, &node
, NULL
);
1124 ok( hr
== S_OK
, "got %#lx\n", hr
);
1125 ok( node
->nodeType
== WS_XML_NODE_TYPE_END_ELEMENT
, "got %u\n", node
->nodeType
);
1127 hr
= WsReadEndElement( reader
, NULL
);
1128 ok( hr
== S_OK
, "got %#lx\n", hr
);
1130 hr
= WsGetReaderNode( reader
, &node
, NULL
);
1131 ok( hr
== S_OK
, "got %#lx\n", hr
);
1132 ok( node
->nodeType
== WS_XML_NODE_TYPE_EOF
, "got %u\n", node
->nodeType
);
1134 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg3
, NULL
);
1135 ok( hr
== S_OK
, "got %#lx\n", hr
);
1137 hr
= set_input( reader
, faultxml
, strlen(faultxml
) );
1138 ok( hr
== S_OK
, "got %#lx\n", hr
);
1140 hr
= WsReadEnvelopeStart( msg3
, reader
, NULL
, NULL
, NULL
);
1141 ok( hr
== S_OK
, "got %#lx\n", hr
);
1144 hr
= WsGetMessageProperty( msg3
, WS_MESSAGE_PROPERTY_IS_FAULT
, &isfault
, sizeof(isfault
), NULL
);
1145 ok( hr
== S_OK
, "got %#lx\n", hr
);
1146 ok( isfault
, "isfault == FALSE\n" );
1148 WsFreeMessage( msg
);
1149 WsFreeMessage( msg2
);
1150 WsFreeMessage( msg3
);
1151 WsFreeReader( reader
);
1154 static void test_WsReadEnvelopeEnd(void)
1156 static const char xml
[] =
1157 "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body></s:Body></s:Envelope>";
1158 WS_MESSAGE
*msg
, *msg2
;
1159 WS_XML_READER
*reader
;
1160 WS_MESSAGE_STATE state
;
1163 hr
= WsReadEnvelopeEnd( NULL
, NULL
);
1164 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1166 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg
, NULL
);
1167 ok( hr
== S_OK
, "got %#lx\n", hr
);
1169 hr
= WsCreateReader( NULL
, 0, &reader
, NULL
);
1170 ok( hr
== S_OK
, "got %#lx\n", hr
);
1172 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
1173 ok( hr
== S_OK
, "got %#lx\n", hr
);
1175 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg2
, NULL
);
1176 ok( hr
== S_OK
, "got %#lx\n", hr
);
1178 hr
= set_input( reader
, xml
, strlen(xml
) );
1179 ok( hr
== S_OK
, "got %#lx\n", hr
);
1181 hr
= WsReadEnvelopeEnd( msg2
, NULL
);
1182 ok( hr
== WS_E_INVALID_OPERATION
, "got %#lx\n", hr
);
1184 hr
= WsReadEnvelopeStart( msg2
, reader
, NULL
, NULL
, NULL
);
1185 ok( hr
== S_OK
, "got %#lx\n", hr
);
1187 hr
= WsReadEnvelopeEnd( msg2
, NULL
);
1188 ok( hr
== S_OK
, "got %#lx\n", hr
);
1191 hr
= WsGetMessageProperty( msg2
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
1192 ok( hr
== S_OK
, "got %#lx\n", hr
);
1193 ok( state
== WS_MESSAGE_STATE_DONE
, "got %u\n", state
);
1195 WsFreeMessage( msg
);
1196 WsFreeMessage( msg2
);
1197 WsFreeReader( reader
);
1200 static void test_WsReadBody(void)
1202 static const char xml
[] =
1203 "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body>"
1204 "<u xmlns=\"ns\"><val>1</val></u></s:Body></s:Envelope>";
1205 static const char faultxml
[] =
1206 "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body>"
1207 "<s:Fault><faultcode>s:Client</faultcode><faultstring>OLS Exception</faultstring></s:Fault>"
1208 "</s:Body></s:Envelope>";
1209 static const WS_XML_STRING faultcode
= { 6, (BYTE
*)"Client" };
1210 static const WS_STRING faultstring
= { 13, (WCHAR
*)L
"OLS Exception" };
1212 WS_MESSAGE
*msg
, *msg2
, *msg3
;
1213 WS_XML_READER
*reader
;
1214 WS_MESSAGE_STATE state
;
1216 WS_XML_STRING localname
= {1, (BYTE
*)"t"}, localname2
= {1, (BYTE
*)"u"};
1217 WS_XML_STRING val
= {3, (BYTE
*)"val"}, ns
= {2, (BYTE
*)"ns"};
1218 WS_ELEMENT_DESCRIPTION desc
, faultdesc
;
1219 WS_STRUCT_DESCRIPTION s
;
1220 WS_FIELD_DESCRIPTION f
, *fields
[1];
1228 hr
= WsCreateHeap( 1 << 16, 0, NULL
, 0, &heap
, NULL
);
1229 ok( hr
== S_OK
, "got %#lx\n", hr
);
1231 hr
= WsReadBody( NULL
, NULL
, 0, NULL
, NULL
, 0, NULL
);
1232 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1234 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg
, NULL
);
1235 ok( hr
== S_OK
, "got %#lx\n", hr
);
1237 hr
= WsCreateReader( NULL
, 0, &reader
, NULL
);
1238 ok( hr
== S_OK
, "got %#lx\n", hr
);
1240 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
1241 ok( hr
== S_OK
, "got %#lx\n", hr
);
1243 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg2
, NULL
);
1244 ok( hr
== S_OK
, "got %#lx\n", hr
);
1246 hr
= WsReadBody( msg2
, NULL
, 0, NULL
, NULL
, 0, NULL
);
1247 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1249 hr
= set_input( reader
, xml
, strlen(xml
) );
1250 ok( hr
== S_OK
, "got %#lx\n", hr
);
1252 hr
= WsReadEnvelopeStart( msg2
, reader
, NULL
, NULL
, NULL
);
1253 ok( hr
== S_OK
, "got %#lx\n", hr
);
1255 hr
= WsReadBody( msg2
, NULL
, WS_READ_REQUIRED_VALUE
, heap
, &test
, sizeof(test
), NULL
);
1256 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1258 memset( &f
, 0, sizeof(f
) );
1259 f
.mapping
= WS_ELEMENT_FIELD_MAPPING
;
1262 f
.type
= WS_UINT32_TYPE
;
1265 memset( &s
, 0, sizeof(s
) );
1266 s
.size
= sizeof(struct test
);
1267 s
.alignment
= TYPE_ALIGNMENT(struct test
);
1270 s
.typeLocalName
= &localname
;
1273 desc
.elementLocalName
= &localname2
;
1274 desc
.elementNs
= &ns
;
1275 desc
.type
= WS_STRUCT_TYPE
;
1276 desc
.typeDescription
= &s
;
1278 memset( &test
, 0, sizeof(test
) );
1279 hr
= WsReadBody( msg2
, &desc
, WS_READ_REQUIRED_VALUE
, heap
, &test
, sizeof(test
), NULL
);
1280 ok( hr
== S_OK
, "got %#lx\n", hr
);
1281 ok( test
.val
== 1, "got %u\n", test
.val
);
1284 hr
= WsGetMessageProperty( msg2
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
1285 ok( hr
== S_OK
, "got %#lx\n", hr
);
1286 ok( state
== WS_MESSAGE_STATE_READING
, "got %u\n", state
);
1288 hr
= WsReadEnvelopeEnd( msg2
, NULL
);
1289 ok( hr
== S_OK
, "got %#lx\n", hr
);
1291 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg3
, NULL
);
1292 ok( hr
== S_OK
, "got %#lx\n", hr
);
1294 hr
= set_input( reader
, faultxml
, strlen(faultxml
) );
1295 ok( hr
== S_OK
, "got %#lx\n", hr
);
1297 hr
= WsReadEnvelopeStart( msg3
, reader
, NULL
, NULL
, NULL
);
1298 ok( hr
== S_OK
, "got %#lx\n", hr
);
1301 hr
= WsGetMessageProperty( msg3
, WS_MESSAGE_PROPERTY_IS_FAULT
, &isfault
, sizeof(isfault
), NULL
);
1302 ok( hr
== S_OK
, "got %#lx\n", hr
);
1303 ok( isfault
, "isfault == FALSE\n" );
1305 faultdesc
.elementLocalName
= NULL
;
1306 faultdesc
.elementNs
= NULL
;
1307 faultdesc
.type
= WS_FAULT_TYPE
;
1308 faultdesc
.typeDescription
= NULL
;
1310 memset( &fault
, 0, sizeof(fault
) );
1311 hr
= WsReadBody( msg3
, &faultdesc
, WS_READ_REQUIRED_VALUE
, heap
, &fault
, sizeof(fault
), NULL
);
1312 ok( hr
== S_OK
, "got %#lx\n", hr
);
1313 ok( fault
.code
->value
.localName
.length
== faultcode
.length
, "got %lu\n", fault
.code
->value
.localName
.length
);
1314 ok( !memcmp( fault
.code
->value
.localName
.bytes
, faultcode
.bytes
, faultcode
.length
), "wrong fault code\n" );
1315 ok( !fault
.code
->subCode
, "subcode is not NULL\n" );
1316 ok( fault
.reasonCount
== 1, "got %lu\n", fault
.reasonCount
);
1317 ok( fault
.reasons
[0].text
.length
== faultstring
.length
, "got %lu\n", fault
.reasons
[0].text
.length
);
1318 ok( !memcmp( fault
.reasons
[0].text
.chars
, faultstring
.chars
, faultstring
.length
* sizeof(WCHAR
) ),
1319 "wrong fault string\n" );
1321 hr
= WsReadEnvelopeEnd( msg3
, NULL
);
1322 ok( hr
== S_OK
, "got %#lx\n", hr
);
1325 WsFreeMessage( msg
);
1326 WsFreeMessage( msg2
);
1327 WsFreeMessage( msg3
);
1328 WsFreeReader( reader
);
1332 static void test_WsResetMessage(void)
1335 WS_MESSAGE_STATE state
;
1336 WS_ENVELOPE_VERSION env_version
;
1337 WS_ADDRESSING_VERSION addr_version
;
1340 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_1
, WS_ADDRESSING_VERSION_0_9
, NULL
, 0, &msg
, NULL
);
1341 ok( hr
== S_OK
, "got %#lx\n", hr
);
1344 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
1345 ok( hr
== S_OK
, "got %#lx\n", hr
);
1346 ok( state
== WS_MESSAGE_STATE_EMPTY
, "got %u\n", state
);
1348 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
1349 ok( hr
== S_OK
, "got %#lx\n", hr
);
1352 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
1353 ok( hr
== S_OK
, "got %#lx\n", hr
);
1354 ok( state
== WS_MESSAGE_STATE_INITIALIZED
, "got %u\n", state
);
1356 hr
= WsResetMessage( msg
, NULL
);
1357 ok( hr
== S_OK
, "got %#lx\n", hr
);
1360 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_STATE
, &state
, sizeof(state
), NULL
);
1361 ok( hr
== S_OK
, "got %#lx\n", hr
);
1362 ok( state
== WS_MESSAGE_STATE_EMPTY
, "got %u\n", state
);
1364 env_version
= 0xdeadbeef;
1365 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ENVELOPE_VERSION
, &env_version
,
1366 sizeof(env_version
), NULL
);
1367 ok( hr
== S_OK
, "got %#lx\n", hr
);
1368 ok( env_version
== WS_ENVELOPE_VERSION_SOAP_1_1
, "got %u\n", env_version
);
1370 addr_version
= 0xdeadbeef;
1371 hr
= WsGetMessageProperty( msg
, WS_MESSAGE_PROPERTY_ADDRESSING_VERSION
, &addr_version
,
1372 sizeof(addr_version
), NULL
);
1373 ok( hr
== S_OK
, "got %#lx\n", hr
);
1374 ok( addr_version
== WS_ADDRESSING_VERSION_0_9
, "got %u\n", addr_version
);
1376 WsFreeMessage( msg
);
1379 static void test_WsGetHeader(void)
1381 static char expected
[] =
1382 "<s:Envelope xmlns:a=\"http://www.w3.org/2005/08/addressing\" "
1383 "xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
1384 "<a:MessageID>urn:uuid:00000000-0000-0000-0000-000000000000</a:MessageID>"
1385 "<a:Action s:mustUnderstand=\"1\">action</a:Action></s:Header><s:Body/></s:Envelope>";
1386 static char expected2
[] =
1387 "<Envelope><Header><Action mustUnderstand=\"1\" "
1388 "xmlns=\"http://schemas.microsoft.com/ws/2005/05/addressing/none\">action</Action>"
1389 "</Header><Body/></Envelope>";
1390 static char expected3
[] =
1391 "<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header>"
1392 "<Action s:mustUnderstand=\"1\" "
1393 "xmlns=\"http://schemas.microsoft.com/ws/2005/05/addressing/none\">action</Action>"
1394 "</s:Header><s:Body/></s:Envelope>";
1399 hr
= WsGetHeader( NULL
, 0, 0, 0, NULL
, NULL
, 0, NULL
);
1400 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1402 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_1_0
, NULL
, 0, &msg
, NULL
);
1403 ok( hr
== S_OK
, "got %#lx\n", hr
);
1405 hr
= WsGetHeader( msg
, 0, 0, 0, NULL
, NULL
, 0, NULL
);
1406 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1408 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
1409 ok( hr
== S_OK
, "got %#lx\n", hr
);
1411 hr
= WsGetHeader( msg
, 0, 0, 0, NULL
, NULL
, 0, NULL
);
1412 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1414 hr
= WsGetHeader( msg
, WS_ACTION_HEADER
, 0, 0, NULL
, NULL
, 0, NULL
);
1415 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1417 hr
= WsGetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, 0, NULL
, NULL
, 0, NULL
);
1418 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1420 hr
= WsGetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_READ_NILLABLE_POINTER
, NULL
, NULL
, 0, NULL
);
1421 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1423 hr
= WsGetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_READ_REQUIRED_POINTER
, NULL
, NULL
, 0, NULL
);
1424 ok( hr
== WS_E_INVALID_FORMAT
, "got %#lx\n", hr
);
1427 hr
= WsSetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_WRITE_REQUIRED_POINTER
, &ptr
, sizeof(ptr
), NULL
);
1428 ok( hr
== S_OK
, "got %#lx\n", hr
);
1429 check_output_header( msg
, expected
, -1, strstr(expected
, "urn:uuid:") - expected
, 46, __LINE__
);
1431 hr
= WsGetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_READ_REQUIRED_POINTER
, NULL
, NULL
, 0, NULL
);
1432 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1435 hr
= WsGetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_READ_REQUIRED_POINTER
, NULL
, &ptr
, 0, NULL
);
1436 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1439 hr
= WsGetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_READ_REQUIRED_POINTER
, NULL
, &ptr
, sizeof(ptr
), NULL
);
1440 ok( hr
== S_OK
, "got %#lx\n", hr
);
1441 ok( ptr
!= NULL
, "ptr not set\n" );
1442 ok( !memcmp( ptr
, L
"action", sizeof(L
"action") ), "wrong data\n" );
1443 WsFreeMessage( msg
);
1445 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_NONE
, WS_ADDRESSING_VERSION_TRANSPORT
, NULL
, 0, &msg
, NULL
);
1446 ok( hr
== S_OK
, "got %#lx\n", hr
);
1448 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
1449 ok( hr
== S_OK
, "got %#lx\n", hr
);
1452 hr
= WsSetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_WRITE_REQUIRED_POINTER
, &ptr
, sizeof(ptr
), NULL
);
1453 ok( hr
== S_OK
, "got %#lx\n", hr
);
1454 if (hr
== S_OK
) check_output_header( msg
, expected2
, -1, 0, 0, __LINE__
);
1457 hr
= WsGetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_READ_REQUIRED_POINTER
, NULL
, &ptr
, sizeof(ptr
), NULL
);
1458 ok( hr
== S_OK
, "got %#lx\n", hr
);
1459 ok( ptr
!= NULL
, "ptr not set\n" );
1460 ok( !memcmp( ptr
, L
"action", sizeof(L
"action") ), "wrong data\n" );
1461 WsFreeMessage( msg
);
1463 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_SOAP_1_2
, WS_ADDRESSING_VERSION_TRANSPORT
, NULL
, 0, &msg
, NULL
);
1464 ok( hr
== S_OK
, "got %#lx\n", hr
);
1466 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
1467 ok( hr
== S_OK
, "got %#lx\n", hr
);
1470 hr
= WsSetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_WRITE_REQUIRED_POINTER
, &ptr
, sizeof(ptr
), NULL
);
1471 ok( hr
== S_OK
, "got %#lx\n", hr
);
1472 if (hr
== S_OK
) check_output_header( msg
, expected3
, -1, 0, 0, __LINE__
);
1475 hr
= WsGetHeader( msg
, WS_ACTION_HEADER
, WS_WSZ_TYPE
, WS_READ_REQUIRED_POINTER
, NULL
, &ptr
, sizeof(ptr
), NULL
);
1476 ok( hr
== S_OK
, "got %#lx\n", hr
);
1477 ok( ptr
!= NULL
, "ptr not set\n" );
1478 ok( !memcmp( ptr
, L
"action", sizeof(L
"action") ), "wrong data\n" );
1479 WsFreeMessage( msg
);
1482 static void test_WsGetCustomHeader(void)
1484 static char expected
[] =
1485 "<Envelope><Header><Custom xmlns=\"ns\">value</Custom></Header><Body/></Envelope>";
1486 static WS_XML_STRING custom
= {6, (BYTE
*)"Custom"}, ns
= {2, (BYTE
*)"ns"};
1487 WS_ELEMENT_DESCRIPTION desc
;
1488 WS_STRUCT_DESCRIPTION s
;
1489 WS_FIELD_DESCRIPTION f
, *fields
[1];
1497 hr
= WsGetCustomHeader( NULL
, NULL
, 0, 0, 0, NULL
, NULL
, 0, NULL
, NULL
);
1498 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1500 hr
= WsCreateMessage( WS_ENVELOPE_VERSION_NONE
, WS_ADDRESSING_VERSION_TRANSPORT
, NULL
, 0, &msg
, NULL
);
1501 ok( hr
== S_OK
, "got %#lx\n", hr
);
1503 hr
= WsGetCustomHeader( msg
, NULL
, 0, 0, 0, NULL
, NULL
, 0, NULL
, NULL
);
1504 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1506 hr
= WsInitializeMessage( msg
, WS_REQUEST_MESSAGE
, NULL
, NULL
);
1507 ok( hr
== S_OK
, "got %#lx\n", hr
);
1509 memset( &f
, 0, sizeof(f
) );
1510 f
.mapping
= WS_TEXT_FIELD_MAPPING
;
1511 f
.type
= WS_WSZ_TYPE
;
1514 memset( &s
, 0, sizeof(s
) );
1515 s
.size
= sizeof(struct header
);
1516 s
.alignment
= TYPE_ALIGNMENT(struct header
);
1520 desc
.elementLocalName
= &custom
;
1521 desc
.elementNs
= &ns
;
1522 desc
.type
= WS_STRUCT_TYPE
;
1523 desc
.typeDescription
= &s
;
1525 test
.value
= L
"value";
1526 hr
= WsAddCustomHeader( msg
, &desc
, WS_WRITE_REQUIRED_VALUE
, &test
, sizeof(test
), 0, NULL
);
1527 ok( hr
== S_OK
, "got %#lx\n", hr
);
1528 check_output_header( msg
, expected
, -1, 0, 0, __LINE__
);
1530 hr
= WsGetCustomHeader( msg
, &desc
, 0, 0, 0, NULL
, NULL
, 0, NULL
, NULL
);
1531 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1533 hr
= WsGetCustomHeader( msg
, &desc
, WS_SINGLETON_HEADER
, 1, 0, NULL
, NULL
, 0, NULL
, NULL
);
1534 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1536 hr
= WsGetCustomHeader( msg
, &desc
, WS_SINGLETON_HEADER
, 0, WS_READ_REQUIRED_VALUE
, NULL
, NULL
, 0, NULL
, NULL
);
1537 ok( hr
== E_INVALIDARG
, "got %#lx\n", hr
);
1539 memset( &test
, 0, sizeof(test
) );
1540 hr
= WsGetCustomHeader( msg
, &desc
, WS_SINGLETON_HEADER
, 0, WS_READ_REQUIRED_VALUE
, NULL
, &test
, sizeof(test
),
1542 ok( hr
== S_OK
, "got %#lx\n", hr
);
1543 ok( test
.value
!= NULL
, "value not set\n" );
1544 ok( !memcmp( test
.value
, L
"value", sizeof(L
"value") ), "wrong value\n" );
1545 WsFreeMessage( msg
);
1550 test_WsCreateMessage();
1551 test_WsCreateMessageForChannel();
1552 test_WsInitializeMessage();
1553 test_WsAddressMessage();
1554 test_WsWriteEnvelopeStart();
1555 test_WsWriteEnvelopeEnd();
1558 test_WsRemoveHeader();
1559 test_WsAddMappedHeader();
1560 test_WsRemoveMappedHeader();
1561 test_WsAddCustomHeader();
1562 test_WsRemoveCustomHeader();
1563 test_WsReadEnvelopeStart();
1564 test_WsReadEnvelopeEnd();
1566 test_WsResetMessage();
1568 test_WsGetCustomHeader();