Monday, February 27, 2017

JUnit test with Embedded tomcat server , how to specify automatic ports for both http and https connectors?

Leave a Comment

Description

I have made a JUnit test that focus on trying to test a call to a SOAP web service.

I am using an embedded tomcat server for my test in order to run my test with a mock server.

I am also using both http and https connectors.

I need to use automatic ports for both these connectors because the test is running on a Jenkins server and i can't just use port 443 or 8443 as they are already taken.

I understand that using the port 0 as standard port will result in tomcat using automatic port allocation but I can't manage to use it with both connectors.

Expected behavior

I'd like to use automatic port allocation also for my custom ssl connector.

Is it possible to do so in some way ?

Sample code

Here is the code for my tomcat instance :

@Before public void setup() throws Throwable {      File tomcatWorkingDir = new File(mWorkingDir);      //Empty the target/tomcat-working-dir directory if it exist     //Create the directory otherwise     if(tomcatWorkingDir.exists() && tomcatWorkingDir.isDirectory()){         LOGGER.info("cleaning tomcat-working-dir directory");         FileUtils.cleanDirectory(new File(mWorkingDir));      } else {         LOGGER.info("create tomcat-working-dir directory");         tomcatWorkingDir.mkdir();     }      LOGGER.info("disabling ssl certification validation");     //Disable JVM ssl sockets connection     disableJVMCertificate();      //Add server certificate     createServerCertificate();      //Custom SSL Connector     Connector SSLConnector = getSSLConnector();      mTomcat = new Tomcat();      //Standard http startup port     mTomcat.setPort(0);      //Set up base directory      //Otherwise, tomcat would use the current directory     mTomcat.setBaseDir(mWorkingDir);      LOGGER.info("setting the ssl connector in TOMCAT");     Service service = mTomcat.getService();     service.addConnector(SSLConnector);      //Redirect current port     Connector defaultConnector = mTomcat.getConnector();     defaultConnector.setRedirectPort(SERVER_HTTPS_PORT);      //Configure the way WAR are managed by the engine     mTomcat.getHost().setAutoDeploy(true);     mTomcat.getHost().setDeployOnStartup(true);      //Add mock server into our webApp     String servletName = "/server";     File webApp = new File(mWorkingDir,"../../../ws-mock-server/src/main/webapp");      mTomcat.addWebapp(mTomcat.getHost(), servletName, webApp.getAbsolutePath());      //start tomcat     LOGGER.info("starting TOMCAT");      mTomcat.start();   } 

and here for my custom ssl connector.

    private static Connector getSSLConnector(){     Connector connector = new Connector();     connector.setPort(SERVER_HTTPS_PORT);     connector.setSecure(true);      //Http protocol Http11AprProtocol     connector.setAttribute("protocol", "org.apache.coyote.http11.Http11AprProtocol");      //Maximum threads allowedd on this instance of tomcat     connector.setAttribute("maxThreads","200");     connector.setAttribute("SSLEnabled", true);      //No client Authentification is required in order to connect     connector.setAttribute("clientAuth", false);      //SSL TLSv1 protocol     connector.setAttribute("sslProtocol","TLS");      //Ciphers configuration describing how server will encrypt his messages     //A common cipher suite need to exist between server and client in an ssl     //communication in order for the handshake to succeed     connector.setAttribute("ciphers","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA");      LOGGER.info("setting keystore file");     //Here an absolute file path is needed in order to properly set up the keystore attribute     connector.setAttribute("keystoreFile",new File(".").getAbsolutePath().replace("\\", "/")+"/"+mWorkingDir+"/server.jks");      LOGGER.info("setting keystore pass");     connector.setAttribute("keystorePass","changeit");      return connector; } 

0 Answers

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment