/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed 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 *******************************************************************************/ package org.ebayopensource.turmeric.tools.codegen; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Properties; import javax.xml.namespace.NamespaceContext; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.ebayopensource.turmeric.tools.codegen.AbstractServiceGeneratorTestCase; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; public class ServiceUIDQE3Test extends AbstractServiceGeneratorTestCase{ File destDir = null; File prDir = null; File binDir = null; NamespaceContextImpl nsc; Properties pro = new Properties(); @Before public void initialize() throws Exception{ testingdir.ensureEmpty(); destDir = getTestDestDir(); binDir = testingdir.getFile("bin"); prDir = getTestDestDir(); nsc = new NamespaceContextImpl(); pro.put("service_interface_class_name", "com.ebayopensource.test.soaframework.tools.codegen.SimpleServiceInterface"); pro.put("service_layer","COMMON"); pro.put("original_wsdl_uri","Vanilla-Codegen\\ServiceInputFiles\\AccountService.wsdl"); pro.put("service_version","1.0.0"); pro.put("admin_name","newadminname"); pro.put("sipp_version","1.1"); pro.put("service_namespace_part","Billing"); pro.put("domainName","ebayopen"); } // create a service n build. //Test 12 - Validate that when service project is created metdata properties file is generated with contents copied //from intf.properties file except namespace and service name which is got from //wsdl.And also validate the typemappings,java files path. @Test public void buildingServiceMetadataPropertiesGotFromIntfProps() throws Exception{ File wsdl = getCodegenQEDataFileInput("AccountService.wsdl"); String testArgs[] = new String[] { "-servicename","NewService", "-genType", "ServiceFromWSDLIntf", "-wsdl",wsdl.getAbsolutePath(), //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-jdest", destDir.getAbsolutePath()+"/gen-src/client", "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), }; createInterfacePropsFile(pro,destDir.getAbsolutePath()); performDirectCodeGen(testArgs, binDir); String str = destDir.getAbsolutePath()+"/gen-meta-src/META-INF/soa/common/config/newadminname/service_metadata.properties"; File metadata = new File(str); assertTrue(metadata.exists()); FileInputStream in = new FileInputStream(metadata); Properties pro = new Properties(); pro.load(in); in.close(); assertEquals("newadminname",pro.getProperty("admin_name")); assertEquals("AccountService",pro.getProperty("service_name")); assertEquals("http://www.ebayopensource.com/turmeric/services",pro.getProperty("service_namespace")); assertEquals("Billing",pro.getProperty("service_namespace_part")); assertEquals("ebayopen",pro.getProperty("domainName")); String typemappingspath = destDir.getAbsolutePath()+"/gen-meta-src/META-INF/soa/common/config/newadminname/TypeMappings.xml"; File typeMapping = new File(typemappingspath); assertTrue(typeMapping.exists()); String intfJava = destDir.getAbsolutePath()+"/gen-src/client/com/ebayopensource/test/soaframework/tools/codegen/SimpleServiceInterface.java"; File intfFile = new File(intfJava); assertTrue(intfFile.exists()); String asyncIntfJava = destDir.getAbsolutePath()+"/gen-src/client/com/ebayopensource/test/soaframework/tools/codegen/AsyncSimpleServiceInterface.java"; File asyncIntfFile = new File(asyncIntfJava); assertTrue(asyncIntfFile.exists()); String proxyJava = destDir.getAbsolutePath()+"/gen-src/client/com/ebayopensource/test/soaframework/tools/codegen/gen/NewadminnameProxy.java"; File proxyFile = new File(proxyJava); assertTrue(proxyFile.exists()); String sharedConsumer = destDir.getAbsolutePath()+"/gen-src/client/com/ebayopensource/test/soaframework/tools/codegen/newadminname/gen/SharedNewadminnameConsumer.java"; File sharedConsumerFile = new File(sharedConsumer); assertTrue(sharedConsumerFile.exists()); String typeDef = destDir.getAbsolutePath()+"/gen-src/client/com/ebayopensource/test/soaframework/tools/codegen/gen/NewadminnameTypeDefsBuilder.java"; File typeDefFile = new File(typeDef); assertTrue(typeDefFile.exists()); } // testing for metadata regeneration when the metadata is removed //Test 13 -Validate that the metadata properties file is regenerated, after the file is removed and rebuilt. //Validate the metadata properties content are from the intf.props file and wsdl. @Test public void metadataRegerationWhenFileRemoved() throws Exception{ File wsdl = getCodegenQEDataFileInput("AccountService.wsdl"); String testArgs[] = new String[] { "-servicename","NewService", "-genType", "ServiceFromWSDLIntf", "-wsdl",wsdl.getAbsolutePath(), //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath() }; String testArgs2[] = new String[] { "-servicename", "NewService", "-wsdl", wsdl.getAbsolutePath(), "-genType", "ServiceMetadataProps", //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), }; createInterfacePropsFile(pro,destDir.getAbsolutePath()); performDirectCodeGen(testArgs2, binDir); performDirectCodeGen(testArgs, binDir); String serviceMetadata = destDir.getAbsolutePath()+"/gen-meta-src/META-INF/soa/common/config/newadminname/service_metadata.properties"; File scvmetaprops = new File(serviceMetadata); if(scvmetaprops.exists()){ if(scvmetaprops.delete()){ performDirectCodeGen(testArgs, binDir); } else throw new Exception("File Could not be deleted"); } assertTrue(scvmetaprops.exists()); FileInputStream in = new FileInputStream(serviceMetadata); Properties pro = new Properties(); pro.load(in); in.close(); //added for new requirement - Domain name and namespace part. assertEquals("Billing",pro.getProperty("service_namespace_part")); assertEquals("ebayopen",pro.getProperty("domainName")); //------------------------------ serviceMetadata =null; scvmetaprops=null; } // testing for metadata regeneration when the folder where metadata file generated is removed. //Test 14 -Validate that the metadata properties file is regenerated, after folder containing file is removed and rebuilt. //Validate the metadata properties content are from the intf.props file and wsdl. @Test public void metadataRegenerationWhenFolderContainingFileRemoved() throws Exception{ File wsdl = getCodegenQEDataFileInput("AccountService.wsdl"); String testArgs[] = new String[] { "-servicename","NewService", "-genType", "ServiceFromWSDLIntf", "-wsdl",wsdl.getAbsolutePath(), //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath() }; String testArgs2[] = new String[] { "-servicename", "NewService", "-wsdl", wsdl.getAbsolutePath(), "-genType", "ServiceMetadataProps", //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), }; createInterfacePropsFile(pro,destDir.getAbsolutePath()); performDirectCodeGen(testArgs, binDir); performDirectCodeGen(testArgs2, binDir); String serviceMetadata = destDir.getAbsolutePath()+"/gen-meta-src/META-INF/soa/common/config/newadminname/service_metadata.properties"; File scvmetaprops = new File(serviceMetadata); if(scvmetaprops.exists()){ testingdir.ensureEmpty(); performDirectCodeGen(testArgs, binDir); } assertTrue(scvmetaprops.exists()); } // testing for service name updated in metadata as wsdl is updated //Test 15 - Validate if wsdl is updated manually for service name and the interface project //is rebuilt, the updated service name should appear in the regenerated metadata properties file. @Test //@Ignore public void changingWSDLSvcNameShouldUpdateMetadataOnRegeneration() throws Exception{ File wsdl = getCodegenQEDataFileInput("AccountService.wsdl"); String testArgs[] = new String[] { "-servicename","NewService", "-genType", "ServiceFromWSDLIntf", "-wsdl",wsdl.getAbsolutePath(), //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr", prDir.getAbsolutePath(), }; String testArgs2[] = new String[] { "-servicename", "NewService", "-wsdl", wsdl.getAbsolutePath(), "-genType", "ServiceMetadataProps", //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), }; createInterfacePropsFile(pro,destDir.getAbsolutePath()); performDirectCodeGen(testArgs2, binDir); performDirectCodeGen(testArgs, binDir); String str = destDir.getAbsolutePath()+"/gen-meta-src/META-INF/soa/common/config/newadminname/service_metadata.properties"; File metadata = new File(str); assertTrue(metadata.exists()); FileInputStream in = new FileInputStream(metadata); Properties pro = new Properties(); pro.load(in); assertEquals("AccountService",pro.getProperty("service_name")); in.close(); wsdl = getCodegenQEDataFileInput("AccountService_ChangedServiceName.wsdl"); String testArgs3[] = new String[] { "-servicename","NewService", "-genType", "ServiceFromWSDLIntf", "-wsdl",wsdl.getAbsolutePath(), //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath() }; performDirectCodeGen(testArgs3, binDir); metadata = new File(str); in = new FileInputStream(metadata); pro.load(in); assertEquals("AccountServiceChangedName",pro.getProperty("service_name")); in.close(); } // testing for service namespace updated in metadata as wsdl is updated //Test 16 - Validate if wsdl is updated manually for service name and the interface project //is rebuilt in v3 mode, the updated service name should appear in the regenerated metadata properties file. @Test //@Ignore public void changingWSDLSvcNameShouldUpdateMetadataOnRegenerationV3() throws Exception{ File wsdl = getCodegenQEDataFileInput("AccountService.wsdl"); String testArgs[] = new String[] { "-servicename","NewService", "-genType", "ServiceFromWSDLIntf", "-wsdl",wsdl.getAbsolutePath(), //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), }; String testArgs2[] = new String[] { "-servicename", "NewService", "-wsdl", wsdl.getAbsolutePath(), "-genType", "ServiceMetadataProps", //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), }; createInterfacePropsFile(pro,destDir.getAbsolutePath()); performDirectCodeGen(testArgs2, binDir); performDirectCodeGen(testArgs, binDir); String str = destDir.getAbsolutePath()+"/gen-meta-src/META-INF/soa/common/config/newadminname/service_metadata.properties"; File metadata = new File(str); assertTrue(metadata.exists()); FileInputStream in = new FileInputStream(metadata); Properties pro = new Properties(); pro.load(in); assertEquals("AccountService",pro.getProperty("service_name")); in.close(); wsdl = getCodegenQEDataFileInput("AccountService_ChangedServiceName.wsdl"); String testArgs3[] = new String[] { "-servicename","NewService", "-genType", "ClientNoConfig", "-wsdl",wsdl.getAbsolutePath(), //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), "-adminname","newadminname" }; performDirectCodeGen(testArgs3, binDir); metadata = new File(str); in = new FileInputStream(metadata); pro.load(in); assertEquals("AccountServiceChangedName",pro.getProperty("service_name")); assertEquals("AccountServiceChangedName",pro.getProperty("service_name")); // //added for new requirement - Domain name and namespace part. assertEquals("ebayopen",pro.getProperty("domainName")); assertEquals("Billing",pro.getProperty("service_namespace_part")); //---------------------------------------------------------- in.close(); str =null; pro= null; metadata=null; } // generate service config with admin name //Test 17 - Validate the path of generation of sc.xml by passing admin name. // also validating service name is not present in sc.xml @Test public void generateServiceConfigPassingAdminname() throws Exception{ File wsdl = getCodegenQEDataFileInput("AccountService.wsdl"); String testArgs[] = new String[] { "-servicename","NewService", "-wsdl", wsdl.getAbsolutePath(), "-genType", "ServiceMetadataProps", //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), "-adminname","newadminname" }; createInterfacePropsFile(pro,destDir.getAbsolutePath()); performDirectCodeGen(testArgs, binDir); String testArgs1[] = new String[] { "-servicename","NewService", "-interface", "com.ebayopensource.test.soaframework.tools.codegen.SimpleServiceInterface", "-sicn", "com.ebayopensource.test.soaframework.tools.codegen.SimpleServiceImpl", "-genType", "ServerConfig", //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), "-adminname","newadminname" }; performDirectCodeGen(testArgs1, binDir); String serviceConfigFile = destDir.getAbsolutePath()+"/gen-meta-src/META-INF/soa/services/config/newadminname/ServiceConfig.xml"; File scvConfig = new File(serviceConfigFile); assertTrue(scvConfig.exists()); List<String> svcNameNode = getNodeDetails(nsc,"//ns2:service-config",serviceConfigFile); String svcName = null; if(svcNameNode.size() > 0) svcName = svcNameNode.get(2); assertEquals(null,svcName); serviceConfigFile= null; } // generate client config with admin name //Test 18 - Validate the path of generation of cc.xml by passing admin name. // also validating service name is not present in cc.xml @Test public void generateClientConfigPassingAdminname() throws Exception{ CreateConsumerPropsFile(); String testArgs1[] = new String[] { "-servicename","NewService", "-sl","http://localhost:8080/calculator", "-mdest",destDir.getAbsolutePath()+"/meta-src", "-interface", "com.ebayopensource.test.soaframework.tools.codegen.SimpleServiceInterface", "-genType", "ClientConfig", //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-namespace","http://www.ebayopensource.com/test/soaframework/tools/codegen", "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), "-cn","NewClient", "-ccgn","MarketplaceClientGroup", "-adminname","newadminname", "-environment","production" }; performDirectCodeGen(testArgs1, binDir); String clientConfigFile = destDir.getAbsolutePath()+"/meta-src/META-INF/soa/client/config/NewClient/production/newadminname/ClientConfig.xml"; File clientConfig = new File(clientConfigFile); assertTrue(clientConfig.exists()); List<String> svcNameNode = getNodeDetails(nsc,"//ns2:client-config",clientConfigFile); String svcName = null; if(svcNameNode.size() > 0) svcName = svcNameNode.get(2); assertEquals(null,svcName); } //generate web.xml with admin name //Test 19 -Validate web.xml by passing admin name @Test public void generateWebXml() throws Exception{ File wsdl = getCodegenQEDataFileInput("AccountService.wsdl"); String testArgs[] = new String[] { "-servicename","NewService", "-wsdl", wsdl.getAbsolutePath(), "-genType", "ServiceMetadataProps", //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), "-adminname","newadminname" }; createInterfacePropsFile(pro,destDir.getAbsolutePath()); performDirectCodeGen(testArgs, binDir); String testArgs1[] = new String[] { "-servicename","NewService", "-genType", "webxml", //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), "-adminname","newadminname" }; performDirectCodeGen(testArgs1, binDir); String webXmlPath = destDir.getAbsolutePath()+"/gen-web-content/WEB-INF/web.xml"; // NamespaceContextImpl nsc = new NamespaceContextImpl(); // nsc.setNs2("http://java.sun.com/xml/ns/j2ee"); // List<String> nodeInitParam = getNodeDetails(nsc,"ns2//servlet",webXmlPath); // // String initparam = null; // // if(nodeInitParam.size() > 0) // initparam = nodeInitParam.get(1); //assertEquals("newadminname",initparam); } @Test //Test 20 -Validate gentype All to check all artifacts. public void genAllWithAdminname() throws Exception{ File wsdl = getCodegenQEDataFileInput("AccountService.wsdl"); createInterfacePropsFile(pro,destDir.getAbsolutePath()); String testArgs1[] = new String[] { "-servicename","NewService", "-genType", "All", "-wsdl", wsdl.getAbsolutePath(), //"-src", destDir.getAbsolutePath(), "-dest", destDir.getAbsolutePath(), "-jdest",destDir.getAbsolutePath()+"/gen-src", "-scv", "1.2.3", "-slayer","COMMON", "-bin", binDir.getAbsolutePath(), "-pr",prDir.getAbsolutePath(), "-adminname","newadminname" }; performDirectCodeGen(testArgs1, binDir); String serviceConfigFile = destDir.getAbsolutePath()+"/gen-meta-src/META-INF/soa/services/config/newadminname/ServiceConfig.xml"; File scvConfig = new File(serviceConfigFile); assertTrue(scvConfig.exists()); String metaPropsFile = destDir.getAbsolutePath()+"/gen-meta-src/META-INF/soa/common/config/newadminname/service_metadata.properties"; File metaProperties = new File(metaPropsFile); assertTrue(metaProperties.exists()); String implClass = destDir.getAbsolutePath()+"/gen-src/service/com/ebayopensource/test/soaframework/tools/codegen/impl/NewadminnameImplSkeleton.java"; File implClassFile = new File(implClass); assertTrue(implClassFile.exists()); String dispatcherClass = destDir.getAbsolutePath()+"/gen-src/com/ebayopensource/test/soaframework/tools/codegen/impl/gen/NewadminnameRequestDispatcher.java"; File dispatcherClassFile = new File(dispatcherClass); assertTrue(dispatcherClassFile.exists()); String testClass = destDir.getAbsolutePath()+"/gen-test/com/ebayopensource/test/soaframework/tools/codegen/test/NewadminnameTest.java"; File testClassFile = new File(testClass); assertTrue(testClassFile.exists()); String clientConfig = destDir.getAbsolutePath()+"/gen-meta-src/META-INF/soa/client/config/newadminname/ClientConfig.xml"; File clientConfigFile = new File(clientConfig); assertTrue(clientConfigFile.exists()); String sharedConsumerClass = destDir.getAbsolutePath()+"/gen-src/com/ebayopensource/test/soaframework/tools/codegen/newadminname/gen/SharedNewadminnameConsumer.java"; File sharedConsumerClassFile = new File(sharedConsumerClass); assertTrue(sharedConsumerClassFile.exists()); } private void CreateConsumerPropsFile() throws Exception{ File file = new File(destDir.getAbsolutePath()+File.separator +"service_consumer_project.properties"); File dDir = new File(destDir.getAbsolutePath()); if(!dDir.exists()) dDir.mkdir(); if(!file.exists()) file.createNewFile(); Properties pro = new Properties(); FileInputStream in = new FileInputStream(file); pro.load(in); pro.setProperty("client_name","clientname"); pro.setProperty("scpp_version","1.1"); FileOutputStream out= new FileOutputStream(destDir.getAbsolutePath()+ File.separator + "service_consumer_project.properties"); pro.store(out,null); out.close(); in.close(); } public List<String> getNodeDetails(NamespaceContext nsc,String exprString,String filePath) throws XPathExpressionException{ List<String> list = new ArrayList<String>(); XPathFactory factory = XPathFactory.newInstance(); // 2. Use the XPathFactory to create a new XPath object XPath xpath = factory.newXPath(); xpath.setNamespaceContext(nsc); // 3. Compile an XPath string into an XPathExpression XPathExpression expression = xpath.compile(exprString); // 4. Evaluate the XPath expression on an input document Node result = (Node)expression.evaluate(new org.xml.sax.InputSource(filePath),XPathConstants.NODE ); String svcName = null; NamedNodeMap attMap = result.getAttributes(); Node att =attMap.getNamedItem("service-name"); if(att != null) svcName = att.getNodeValue(); if(result != null){ list.add(result.getNodeName()); list.add(result.getTextContent()); list.add(svcName); } factory = null; xpath = null; expression = null; result=null; attMap = null; att = null; return list; } @After public void deinitialize(){ nsc= null; } }