summaryrefslogtreecommitdiffstats
path: root/tags/java/sca/2.0-M2/vtest/wsbinding/nowsdl/soapversion/src/test/java/org/apache/tuscany/sca/vtest/wsbinding/nowsdl/soapversion/GeneratedWSDLTestCase.java
blob: edd0d91072015967608389e7d6ae81c451bdc21a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.tuscany.sca.vtest.wsbinding.nowsdl.soapversion;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.wsdl.Binding;
import javax.wsdl.BindingInput;
import javax.wsdl.BindingOperation;
import javax.wsdl.BindingOutput;
import javax.wsdl.Definition;
import javax.wsdl.Operation;
import javax.wsdl.Port;
import javax.wsdl.PortType;
import javax.wsdl.Service;
import javax.wsdl.extensions.http.HTTPAddress;
import javax.wsdl.extensions.http.HTTPBinding;
import javax.wsdl.extensions.http.HTTPOperation;
import javax.wsdl.extensions.soap.SOAPAddress;
import javax.wsdl.extensions.soap.SOAPBinding;
import javax.wsdl.extensions.soap.SOAPBody;
import javax.wsdl.extensions.soap.SOAPHeader;
import javax.wsdl.extensions.soap.SOAPHeaderFault;
import javax.wsdl.extensions.soap.SOAPOperation;
import javax.wsdl.extensions.soap12.SOAP12Address;
import javax.wsdl.extensions.soap12.SOAP12Binding;
import javax.wsdl.extensions.soap12.SOAP12Body;
import javax.wsdl.extensions.soap12.SOAP12Header;
import javax.wsdl.extensions.soap12.SOAP12HeaderFault;
import javax.wsdl.extensions.soap12.SOAP12Operation;

import junit.framework.Assert;

import org.apache.tuscany.sca.vtest.utilities.ServiceFinder;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

import org.apache.tuscany.sca.vtest.wsbinding.nowsdl.soapversion.BService;
import org.apache.tuscany.sca.vtest.wsbinding.nowsdl.soapversion.CService;


/**
 * Tests the simplest form of the binding element without WSDL document
 * described in section section 2.3.2, 2.3.3, 2.3.3.1, and 2.3.4 of SCA
 * Web Services Binding V1.00
 */
public class GeneratedWSDLTestCase {

	protected static ServiceFinder serviceFinder;
    protected static String compositeName = "nowsdlsoapversion.composite";
    protected static Definition bWSDL = null;
    protected static Definition cWSDL = null;

    @BeforeClass
    public static void init() throws Exception {
        try {
            System.out.println("Setting up");
            ServiceFinder.init(compositeName);
       		bWSDL = ServiceFinder.getWSDLDefinition("BComponent", "BService");
       		cWSDL = ServiceFinder.getWSDLDefinition("CComponent", "CService");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Lines 260-262:<br>
     * A separate WSDL document is generated for each SCA service. Each has
     * its own unique target namespace. This is to ensure that bindings on
     * different services of the same component do not clash.<br>
     */
    @Test
    @Ignore("TUSCANY-2607")
    // Don't know why target namespaces are same
    public void testSoapVersion4() throws Exception {
    	String cTargetNamespace = cWSDL.getTargetNamespace();
    	String bTargetNamespace = bWSDL.getTargetNamespace();
        Assert.assertFalse(bTargetNamespace.equals(cTargetNamespace));
    }
    
    /**
     * Lines 271-273:<br>
     * The target namespace of the WSDL document, and of the service, ports and
     * generated binding elements is:<br>
     * Base System URI for HTTP / Component Name / Service Name<br>
     */
    @Test
    @Ignore("TUSCANY-2607")
    //  The target namespace does not follow the convention
    public void testSoapVersion5() throws Exception {
    	String bTargetNamespace = bWSDL.getTargetNamespace();
    	String cTargetNamespace = cWSDL.getTargetNamespace();
    	Assert.assertTrue(bTargetNamespace.endsWith("BComponent/BService"));
    	Assert.assertTrue(cTargetNamespace.endsWith("CComponent/CService"));
    }
    
    private Map getPorts(Definition wsdl, String service) {
    	String targetNamespace = wsdl.getTargetNamespace();
    	HashMap sMap = (HashMap) wsdl.getServices();
    	for (Iterator i = sMap.keySet().iterator(); i.hasNext();) {
    		Object k1 = i.next();
    		Service s = (Service) sMap.get(k1);
    		String qName = "{" + targetNamespace + "}" + service;
    		if (s.getQName().toString().equals(qName)) {
    			return s.getPorts();
    		}
    		// Don't why implmentation changed to add Service at the end of qname
    		if (s.getQName().toString().equals(qName + "Service")) {
    			return s.getPorts();
    		}
    	}
    	return null;
    }
    
    /**
     * Lines 262-264, 290-291:<br>
     * The WSDL service has one or more ports for each web service binding on
     * the SCA service that has a SOAP requirement, or that refers to an 
     * existing WSDL binding, depending on the requirements of the web service
     * binding. Each of those ports has a single binding.<br>
     * <p>
     * 2.3.3.1 SOAP versions<br>
     * Where no specific SOAP version is required, then one or more WSDL ports
     * with associated SOAP bindings may be generated, depending on the level(s)
     * supported in the target runtime.<br>
     * <p>
     * BComponent/BService is not specified a SOAP version.
     * It should have following bindings:<br>
     * <li>SoapBinding - PortType and SOAP11</li>
     * <li>SOAP12Binding - SOAP12</li>
     * <li>HTTPBinding - Http</li>
     * <br>and following ports:<br>
     * <li>SoapAddress</li>
     * <li>SOAP12Address</li>
     * <li>HTTPAddress</li>

     */
    @Test
    public void testSoapVersion6() throws Exception {

    	Map pMap = getPorts(bWSDL, "BService");
    	int numSoapPort   = 0;
    	int numSoap12Port = 0;
    	int numHttpPort   = 0;
   		for (Iterator iter = pMap.keySet().iterator(); iter.hasNext();) {
    		Object k2 = iter.next();
    		Port p = (Port) pMap.get(k2);
    		List eeList = p.getExtensibilityElements();
    		for (int i = 0; i < eeList.size(); i++) {
    			Object address = eeList.get(i);
    			if (address instanceof SOAPAddress) {
    				numSoapPort++;
				} else if (address instanceof SOAP12Address) {
    				numSoap12Port++;
				} else if (address instanceof HTTPAddress) {
    				numHttpPort++;
				} else {
					System.out.println("address:" + address.getClass());
				}
    		}
    	}

   		Map bMap = bWSDL.getBindings();
    	int numSoapBinding   = 0;
    	int numSoap12Binding = 0;
    	int numHttpBinding   = 0;
   		for (Iterator iter = bMap.keySet().iterator(); iter.hasNext();) {
   			Object k1 = iter.next();
   			Binding b = (Binding) bMap.get(k1);
   			List eeList = b.getExtensibilityElements();
    		for (int i = 0; i < eeList.size(); i++) {
    			Object binding = eeList.get(i);
    			if (binding instanceof SOAPBinding) {
    				numSoapBinding++;
    			} else if (binding instanceof SOAP12Binding) {
    				numSoap12Binding++;
    			} else if (binding instanceof HTTPBinding) {
    				numHttpBinding++;
    			}
    		}
   		}

   		System.out.println("testSoapVersion6");
   		System.out.println("  # of SOAPPort:      " + numSoapPort);
   		System.out.println("  # of SOAP12Port:    " + numSoap12Port);
   		System.out.println("  # of HTTPPort:      " + numHttpPort);
   		System.out.println("  # of SOAPBinding:   " + numSoapBinding);
   		System.out.println("  # of SOAP12Binding: " + numSoap12Binding);
   		System.out.println("  # of HTTPBinding:   " + numHttpBinding);
   		
   		Assert.assertEquals(numSoapPort, 1);
   		Assert.assertEquals(numSoap12Port, 0);
   		Assert.assertTrue(numSoapBinding > 0);
   		Assert.assertEquals(numSoap12Binding, 0);
   		// Skipped to test HTTP

   	}
    
    /**
     * Lines 275-284:<br>
     * 2.3.3 WSDL Bindings<br>
     * The binding elements in the generated WSDL document are either defined
     * within the document, derived from the requirements of the binding, or
     * are imported from existing WSDL documents.<br>
     * Generated bindings have the following fixed assumptions:<br>
     * <li>use="literal" for input and output messages</li>
     * <li>style="document" for the binding</li>
     * <li>All faults map to soap:faults</li>
     * <li>No header or headerFault elements are generated</li>
     * <li>The transport is "http://schemas.xmlsoap.org/soap/http", unless the
     * system provides intents for alternative transports<br>
     * <p>
     */
    @Test
    public void testSoapVersion7() throws Exception {
    	Map bMap = bWSDL.getBindings();
   		for (Iterator iter = bMap.keySet().iterator(); iter.hasNext();) {
   			Object k1 = iter.next();
   			Binding b = (Binding) bMap.get(k1);
   			List eeList = b.getExtensibilityElements();
    		for (int i = 0; i < eeList.size(); i++) {
    			Object binding = eeList.get(i);
    			if (binding instanceof SOAPBinding) {
    				SOAPBinding sb = (SOAPBinding) binding;
    				Assert.assertEquals(sb.getStyle(), "document");
    				Assert.assertEquals(sb.getTransportURI(), "http://schemas.xmlsoap.org/soap/http");
    			} else if (binding instanceof SOAP12Binding) {
    				SOAP12Binding sb = (SOAP12Binding) binding;
    				Assert.assertEquals(sb.getStyle(), "document");
    				Assert.assertEquals(sb.getTransportURI(), "http://schemas.xmlsoap.org/soap/http");
    			} else if (binding instanceof HTTPBinding) {
    			}
    		}
    		List operations = b.getBindingOperations();
    		for (int i = 0; i < eeList.size(); i++) {
    			BindingOperation bop = (BindingOperation) operations.get(i);

    			List oeeList = bop.getExtensibilityElements();
    			for (int j = 0; j < eeList.size(); j++) {
    				Object op = oeeList.get(j);
        			if (op instanceof SOAPOperation) {
        				SOAPOperation sop = (SOAPOperation) op;
        				if (sop.getStyle() != null)
        					Assert.assertEquals(sop.getStyle(), "document");
        			} else if (op instanceof SOAP12Operation) {
        				SOAP12Operation sop = (SOAP12Operation) op;
        				Assert.assertEquals(sop.getStyle(), "document");
        			} else if (op instanceof HTTPOperation) {
        				// HTTPOperation hop = (HTTPOperation) op;
        			}
    			}

    			BindingInput bInput = (BindingInput) bop.getBindingInput();
    			List bInputList = bInput.getExtensibilityElements();
    			for (int j = 0; j < eeList.size(); j++) {
    				Object body = bInputList.get(j);
    				if (body instanceof SOAPBody) {
    					SOAPBody sBody = (SOAPBody) body;
    					Assert.assertEquals(sBody.getUse(), "literal");
    				} else if (body instanceof SOAP12Body) {
    					SOAP12Body sBody = (SOAP12Body) body;
    					Assert.assertEquals(sBody.getUse(), "literal");
    				} else {
    					Assert.assertFalse(body instanceof SOAPHeader);
    					Assert.assertFalse(body instanceof SOAP12Header);
    					Assert.assertFalse(body instanceof SOAPHeaderFault);
    					Assert.assertFalse(body instanceof SOAP12HeaderFault);
    				}
    			}
    			
    			BindingOutput bOutput = (BindingOutput) bop.getBindingOutput();
    			List bOutputList = bOutput.getExtensibilityElements();
    			for (int j = 0; j < eeList.size(); j++) {
    				Object body = bOutputList.get(j);
    				if (body instanceof SOAPBody) {
    					SOAPBody sBody = (SOAPBody) body;
    					Assert.assertEquals(sBody.getUse(), "literal");
    				} else if (body instanceof SOAP12Body) {
    					SOAP12Body sBody = (SOAP12Body) body;
    					Assert.assertEquals(sBody.getUse(), "literal");
    				} else {
    					Assert.assertFalse(body instanceof SOAPHeader);
    					Assert.assertFalse(body instanceof SOAP12Header);
    					Assert.assertFalse(body instanceof SOAPHeaderFault);
    					Assert.assertFalse(body instanceof SOAP12HeaderFault);
    				}
    			}
    		
    			Map bFaults = bop.getBindingFaults();
    			if (bFaults.size() > 0)
    				System.out.println("WARNING: Skipped to test binding faults");
    			
    		}
   		}
   	}
 
    /**
     * Lines 288-289:<br>
     * 2.3.3.1 SOAP versions<br>
     * Where a web service binding requires a specific SOAP version, then a
     * single WSDL port and SOAP binding of the appropriate version is
     * generated.
     */
    @Test
    public void testSoapVersion8() throws Exception {
    	
    	Map pMap = getPorts(cWSDL, "CService");
    	int numSoapPort   = 0;
    	int numSoap12Port = 0;
    	int numHttpPort   = 0;
   		for (Iterator iter = pMap.keySet().iterator(); iter.hasNext();) {
    		Object k2 = iter.next();
    		Port p = (Port) pMap.get(k2);
    		List eeList = p.getExtensibilityElements();
    		for (int i = 0; i < eeList.size(); i++) {
    			Object address = eeList.get(i);
    			if (address instanceof SOAPAddress) {
    				numSoapPort++;
				} else if (address instanceof SOAP12Address) {
    				numSoap12Port++;
				} else if (address instanceof HTTPAddress) {
    				numHttpPort++;
				};
    		}
    	}

   		Map cMap = cWSDL.getBindings();
    	int numSoapBinding   = 0;
    	int numSoap12Binding = 0;
    	int numHttpBinding   = 0;
   		for (Iterator iter = cMap.keySet().iterator(); iter.hasNext();) {
   			Object k1 = iter.next();
   			Binding b = (Binding) cMap.get(k1);
   			List eeList = b.getExtensibilityElements();
    		for (int i = 0; i < eeList.size(); i++) {
    			Object binding = eeList.get(i);
    			if (binding instanceof SOAPBinding) {
    				numSoapBinding++;
    			} else if (binding instanceof SOAP12Binding) {
    				numSoap12Binding++;
    			} else if (binding instanceof HTTPBinding) {
    				numHttpBinding++;
    			}
    		}
   		}

   		System.out.println("testSoapVersion8");
   		System.out.println("  # of SOAPPort:      " + numSoapPort);
   		System.out.println("  # of SOAP12Port:    " + numSoap12Port);
   		System.out.println("  # of HTTPPort:      " + numHttpPort);
   		System.out.println("  # of SOAPBinding:   " + numSoapBinding);
   		System.out.println("  # of SOAP12Binding: " + numSoap12Binding);
   		System.out.println("  # of HTTPBinding:   " + numHttpBinding);
   		
   		Assert.assertTrue(numSoap12Port > 0);
   		Assert.assertTrue(numSoap12Binding > 0);
   		Assert.assertEquals(numSoapPort, 0);
   		Assert.assertEquals(numSoapBinding, 0);
   		// Skipped to test HTTP
    }

    private boolean testOperation(Operation op, Method m[]) {
    	for (int i = 0; i < m.length; i++) {
    		if(m[i].getName().equals(op.getName())) {
    	    	Assert.assertNotNull(op.getInput());
    			Assert.assertNotNull(op.getOutput());
    			return true;
    		}
    	}
    	return false;
    }
    
    /**
     * Lines 293-296:<br>
     * 2.3.4 WSDL PortType<br>
     * An SCA service has a single interface. This interface is always imported
     * into the generated WSDL document. This may be done directly for
     * WSDL-defined interfaces, or indirectly via a WSDL generated from the 
     * interface type for the service.<br>
     */
    @Test
    public void testSoapVersion9() throws Exception {
    	Method bMethod[] = BService.class.getMethods();
    	Map bPTMap = bWSDL.getPortTypes();
    	Assert.assertEquals(bPTMap.size(), 1);
    	for (Iterator iter = bPTMap.keySet().iterator(); iter.hasNext();) {
    		PortType pt = (PortType) bPTMap.get(iter.next());
    		List opList = pt.getOperations();
    		Assert.assertEquals(bMethod.length, opList.size());
    		for (int i = 0; i < opList.size(); i++) {
    			Operation op = (Operation) opList.get(i);
    			Assert.assertTrue(testOperation(op, bMethod));
    		}
    	}
    	
    	Method cMethod[] = CService.class.getMethods();
    	Map cPTMap = cWSDL.getPortTypes();
    	Assert.assertEquals(cPTMap.size(), 1);
    	for (Iterator iter = cPTMap.keySet().iterator(); iter.hasNext();) {
    		PortType pt = (PortType) cPTMap.get(iter.next());
    		List opList = pt.getOperations();
    		Assert.assertEquals(cMethod.length, opList.size());
    		for (int i = 0; i < opList.size(); i++) {
    			Operation op = (Operation) opList.get(i);
    			Assert.assertTrue(testOperation(op, cMethod));
    		}
    	}
    }


    @AfterClass
    public static void destroy() throws Exception {
        System.out.println("Cleaning up");
        ServiceFinder.cleanup();
    }
}