/* * * 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.geode.tools.pulse.tests.junit; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.geode.test.junit.categories.UITest; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.RequestBuilder; import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import java.net.URI; import java.util.List; import java.util.Properties; /** * Base class to be extended by other JUnit test classes. This class defines and automatically * invokes test for testing server login-logout so no need to add this test in each sub-class. It * also provides doLogin(), doLogout() and print error functionality as protected functions. * * <b>Sub-classes should ensure that they call doLogin() in @BeforeClass and doLogout() * in @AfterClass otherwise tests will fail.</b> * * */ @Ignore @Category(UITest.class) public abstract class BaseServiceTest { protected static Properties propsForJUnit = new Properties(); protected static String strHost = null; protected static String strPort = null; protected static String LOGIN_URL; protected static String LOGOUT_URL; protected static String IS_AUTHENTICATED_USER_URL; protected static String PULSE_UPDATE_URL; protected static final String PULSE_UPDATE_PARAM = "pulseData"; protected static final String PULSE_UPDATE_1_VALUE = "{'ClusterSelectedRegion':{'regionFullPath':'/GlobalVilage_2/GlobalVilage_9'}}"; protected static final String PULSE_UPDATE_2_VALUE = "{'ClusterSelectedRegion':{'regionFullPath':'/Rubbish'}}"; protected static final String PULSE_UPDATE_3_VALUE = "{'ClusterSelectedRegionsMember':{'regionFullPath':'/GlobalVilage_2/GlobalVilage_9'}}"; protected static final String PULSE_UPDATE_4_VALUE = "{'ClusterSelectedRegionsMember':{'regionFullPath':'/Rubbish'}}"; protected static final String PULSE_UPDATE_5_VALUE = "{'MemberGatewayHub':{'memberName':'pnq-visitor1'}}"; protected static final String PULSE_UPDATE_6_VALUE = "{'MemberGatewayHub':{'memberName':'pnq-visitor2'}}"; protected static CloseableHttpClient httpclient = null; private final ObjectMapper mapper = new ObjectMapper(); @BeforeClass public static void beforeClass() throws Exception { InputStream stream = BaseServiceTest.class.getClassLoader().getResourceAsStream("pulse.properties"); try { propsForJUnit.load(stream); } catch (Exception exProps) { System.out.println( "BaseServiceTest :: Error loading properties from pulse.properties in classpath"); } strHost = propsForJUnit.getProperty("pulse.host"); strPort = propsForJUnit.getProperty("pulse.port"); System.out.println( "BaseServiceTest :: Loaded properties from classpath. Checking properties for hostname. Hostname found = " + strHost); LOGIN_URL = "http://" + strHost + ":" + strPort + "/pulse/j_spring_security_check"; LOGOUT_URL = "http://" + strHost + ":" + strPort + "/pulse/clusterLogout"; IS_AUTHENTICATED_USER_URL = "http://" + strHost + ":" + strPort + "/pulse/authenticateUser"; PULSE_UPDATE_URL = "http://" + strHost + ":" + strPort + "/pulse/pulseUpdate"; } /** * * @throws java.lang.Exception */ @Before public void setUp() throws Exception { doLogout(); System.out.println("BaseServiceTest :: Setup done"); } /** * * @throws java.lang.Exception */ @After public void tearDown() throws Exception { doLogin(); System.out.println("BaseServiceTest :: Teardown done"); } /** * Login to pulse server and setup httpClient for tests To be called from setupBeforeClass in each * test class */ protected static void doLogin() throws Exception { System.out .println("BaseServiceTest :: Executing doLogin with user : admin, password : admin."); CloseableHttpResponse loginResponse = null; try { BasicCookieStore cookieStore = new BasicCookieStore(); httpclient = HttpClients.custom().setDefaultCookieStore(cookieStore).build(); HttpUriRequest login = RequestBuilder.post().setUri(new URI(LOGIN_URL)) .addParameter("j_username", "admin").addParameter("j_password", "admin").build(); loginResponse = httpclient.execute(login); try { HttpEntity entity = loginResponse.getEntity(); EntityUtils.consume(entity); System.out .println("BaseServiceTest :: HTTP request status : " + loginResponse.getStatusLine()); List<Cookie> cookies = cookieStore.getCookies(); if (cookies.isEmpty()) { } else { for (int i = 0; i < cookies.size(); i++) { } } } finally { if (loginResponse != null) loginResponse.close(); } } catch (Exception failed) { logException(failed); throw failed; } System.out.println("BaseServiceTest :: Executed doLogin"); } /** * Logout to pulse server and close httpClient To be called from setupAfterClass in each test * class */ protected static void doLogout() throws Exception { System.out .println("BaseServiceTest :: Executing doLogout with user : admin, password : admin."); if (httpclient != null) { CloseableHttpResponse logoutResponse = null; try { HttpUriRequest logout = RequestBuilder.get().setUri(new URI(LOGOUT_URL)).build(); logoutResponse = httpclient.execute(logout); try { HttpEntity entity = logoutResponse.getEntity(); EntityUtils.consume(entity); } finally { if (logoutResponse != null) logoutResponse.close(); httpclient.close(); httpclient = null; } } catch (Exception failed) { logException(failed); throw failed; } System.out.println("BaseServiceTest :: Executed doLogout"); } else { System.out.println("BaseServiceTest :: User NOT logged-in"); } } /** * Print exception string to system.out * * @param failed */ protected static void logException(Exception failed) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); failed.printStackTrace(pw); System.out .println("BaseServiceTest :: Logging exception details : " + sw.getBuffer().toString()); } /** * * Tests that service returns json object * * Test method for * {@link org.apache.geode.tools.pulse.internal.service.ClusterSelectedRegionService#execute(javax.servlet.http.HttpServletRequest)}. */ @Test public void testServerLoginLogout() { System.out.println("BaseServiceTest :: ------TESTCASE BEGIN : SERVER LOGIN-LOGOUT------"); try { doLogin(); HttpUriRequest pulseupdate = RequestBuilder.get().setUri(new URI(IS_AUTHENTICATED_USER_URL)).build(); CloseableHttpResponse response = httpclient.execute(pulseupdate); try { HttpEntity entity = response.getEntity(); System.out.println("BaseServiceTest :: HTTP request status : " + response.getStatusLine()); BufferedReader respReader = new BufferedReader(new InputStreamReader(entity.getContent())); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); String sz = null; while ((sz = respReader.readLine()) != null) { pw.print(sz); } String jsonResp = sw.getBuffer().toString(); System.out.println("BaseServiceTest :: JSON response returned : " + jsonResp); EntityUtils.consume(entity); JsonNode jsonObj = mapper.readTree(jsonResp); boolean isUserLoggedIn = jsonObj.get("isUserLoggedIn").booleanValue(); Assert.assertNotNull("BaseServiceTest :: Server returned null response in 'isUserLoggedIn'", isUserLoggedIn); Assert.assertTrue("BaseServiceTest :: User login failed for this username, password", (isUserLoggedIn == true)); } finally { response.close(); } doLogout(); } catch (Exception failed) { logException(failed); Assert.fail("Exception ! "); } System.out.println("BaseServiceTest :: ------TESTCASE END : SERVER LOGIN-LOGOUT------"); } }