/* * ProActive Parallel Suite(TM): * The Open Source library for parallel and distributed * Workflows & Scheduling, Orchestration, Cloud Automation * and Big Data Analysis on Enterprise Grids & Clouds. * * Copyright (c) 2007 - 2017 ActiveEon * Contact: contact@activeeon.com * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation: version 3 of * the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * If needed, contact us to obtain a release under GPL Version 2 or 3 * or a different license than the AGPL. */ package org.ow2.proactive_grid_cloud_portal.rm; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.IOException; import java.net.HttpURLConnection; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Random; import javax.management.Attribute; import javax.management.AttributeList; import javax.management.ObjectName; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.jboss.resteasy.client.ProxyFactory; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Matchers; import org.objectweb.proactive.core.util.wrapper.BooleanWrapper; import org.ow2.proactive.resourcemanager.common.util.RMProxyUserInterface; import org.ow2.proactive_grid_cloud_portal.RestTestServer; import org.ow2.proactive_grid_cloud_portal.common.SharedSessionStoreTestUtils; import org.rrd4j.ConsolFun; import org.rrd4j.DsType; import org.rrd4j.core.RrdDb; import org.rrd4j.core.RrdDef; import org.rrd4j.core.Sample; public class RMRestTest extends RestTestServer { private static final double EXPECTED_RRD_VALUE = 1.042; @BeforeClass public static void setUpRest() throws Exception { addResource(new RMRest()); } // PORTAL-286 @Test public void testStatsHistory_Locale_Fr() throws Exception { Locale.setDefault(Locale.FRANCE); JSONObject jsonObject = callGetStatHistory(); assertEquals(EXPECTED_RRD_VALUE, (Double) ((JSONArray) jsonObject.get("AverageActivity")).get(0), 0.001); } private JSONObject callGetStatHistory() throws Exception { RMProxyUserInterface rmMock = mock(RMProxyUserInterface.class); String sessionId = SharedSessionStoreTestUtils.createValidSession(rmMock); AttributeList value = new AttributeList(Collections.singletonList(new Attribute("test", createRrdDb().getBytes()))); when(rmMock.getMBeanAttributes(Matchers.<ObjectName> any(), Matchers.<String[]> any())).thenReturn(value); RMRestInterface client = ProxyFactory.create(RMRestInterface.class, "http://localhost:" + port + "/"); String statHistory = client.getStatHistory(sessionId, "hhhhh"); return (JSONObject) new JSONParser().parse(statHistory); } private RrdDb createRrdDb() throws IOException { final long start = (System.currentTimeMillis() - 10000) / 1000; final long end = System.currentTimeMillis() / 1000; RrdDef rrdDef = new RrdDef("testDB", start - 1, 300); for (String dataSource : RMRest.dataSources) { rrdDef.addDatasource(dataSource, DsType.GAUGE, 600, 0, Double.NaN); } rrdDef.addArchive(ConsolFun.AVERAGE, 0.5, 1, 150); RrdDb rrdDb = new RrdDb(rrdDef, org.rrd4j.core.RrdBackendFactory.getFactory("MEMORY")); Sample sample = rrdDb.createSample(); long time = start; while (time <= end + 172800L) { sample.setTime(time); for (String dataSource : RMRest.dataSources) { sample.setValue(dataSource, 1.042); } sample.update(); time += new Random().nextDouble() * 300 + 1; } return rrdDb; } @Test public void testShutdown_NoPreemptParameter() throws Exception { RMProxyUserInterface rm = mock(RMProxyUserInterface.class); when(rm.shutdown(false)).thenReturn(new BooleanWrapper(true)); String sessionId = SharedSessionStoreTestUtils.createValidSession(rm); HttpResponse response = callHttpGetMethod("shutdown", sessionId); assertEquals(HttpURLConnection.HTTP_OK, response.getStatusLine().getStatusCode()); verify(rm).shutdown(false); } @Test public void testShutdown_PreemptParameter() throws Exception { RMProxyUserInterface rm = mock(RMProxyUserInterface.class); when(rm.shutdown(true)).thenReturn(new BooleanWrapper(true)); String sessionId = SharedSessionStoreTestUtils.createValidSession(rm); HttpResponse response = callHttpGetMethod("shutdown?preempt=true", sessionId); assertEquals(HttpURLConnection.HTTP_OK, response.getStatusLine().getStatusCode()); verify(rm).shutdown(true); } // PORTAL-326 @Test public void testAddNodeOverloading() throws Exception { RMProxyUserInterface rm = mock(RMProxyUserInterface.class); String sessionId = SharedSessionStoreTestUtils.createValidSession(rm); when(rm.addNode(anyString())).thenReturn(new BooleanWrapper(true)); List<NameValuePair> firstCall = Collections.<NameValuePair> singletonList(new BasicNameValuePair("nodeurl", "url")); callHttpPostMethod("node", sessionId, firstCall); verify(rm).addNode("url"); reset(rm); when(rm.addNode(anyString(), anyString())).thenReturn(new BooleanWrapper(true)); List<NameValuePair> secondCall = new ArrayList<>(); secondCall.add(new BasicNameValuePair("nodeurl", "urlwithnsname")); secondCall.add(new BasicNameValuePair("nodesource", "ns")); callHttpPostMethod("node", sessionId, secondCall); verify(rm).addNode("urlwithnsname", "ns"); } private HttpResponse callHttpGetMethod(String httpMethod, String sessionId) throws IOException { HttpGet httpGet = new HttpGet("http://localhost:" + port + "/rm/" + httpMethod); httpGet.setHeader("sessionid", sessionId); return new DefaultHttpClient().execute(httpGet); } private HttpResponse callHttpPostMethod(String httpMethod, String sessionId, List<NameValuePair> postParameters) throws IOException { HttpPost httpPost = new HttpPost("http://localhost:" + port + "/rm/" + httpMethod); httpPost.setHeader("sessionid", sessionId); httpPost.setEntity(new UrlEncodedFormEntity(postParameters)); return new DefaultHttpClient().execute(httpPost); } }