// Copyright 2016 Twitter. 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
//
// 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 com.twitter.heron.scheduler.marathon;
import java.net.HttpURLConnection;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.twitter.heron.spi.utils.NetworkUtils;
@RunWith(PowerMockRunner.class)
@PrepareForTest(NetworkUtils.class)
public class MarathonControllerTest {
private static final String MARATHON_URI = "http://marathon.uri:8080";
private static final String TOPOLOGY_NAME = "topology_name";
private static final boolean IS_VERBOSE = true;
private static MarathonController controller;
@Before
public void setUp() throws Exception {
controller = Mockito.spy(new MarathonController(MARATHON_URI, TOPOLOGY_NAME, IS_VERBOSE));
}
@After
public void after() throws Exception {
}
@BeforeClass
public static void beforeClass() throws Exception {
}
@AfterClass
public static void afterClass() throws Exception {
}
/***
* Test MarathonController's killTopology method
* @throws Exception
*/
@Test
public void testKillTopology() throws Exception {
HttpURLConnection httpURLConnection = Mockito.mock(HttpURLConnection.class);
// Failed to get connection
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(null).when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
Assert.assertFalse(controller.killTopology());
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
// Failed to send request
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(httpURLConnection)
.when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
PowerMockito.doReturn(false)
.when(NetworkUtils.class, "sendHttpDeleteRequest", Mockito.any(HttpURLConnection.class));
Assert.assertFalse(controller.killTopology());
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
NetworkUtils.sendHttpDeleteRequest(Mockito.any(HttpURLConnection.class));
// Failed to get response
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(httpURLConnection)
.when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
PowerMockito.doReturn(true)
.when(NetworkUtils.class, "sendHttpDeleteRequest", Mockito.any(HttpURLConnection.class));
PowerMockito.doReturn(false)
.when(NetworkUtils.class, "checkHttpResponseCode",
Mockito.any(HttpURLConnection.class), Mockito.anyInt());
Assert.assertFalse(controller.killTopology());
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
NetworkUtils.sendHttpDeleteRequest(Mockito.any(HttpURLConnection.class));
NetworkUtils.checkHttpResponseCode(Mockito.any(HttpURLConnection.class), Mockito.anyInt());
// Success
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(httpURLConnection)
.when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
PowerMockito.doReturn(true)
.when(NetworkUtils.class, "sendHttpDeleteRequest", Mockito.any(HttpURLConnection.class));
PowerMockito.doReturn(true)
.when(NetworkUtils.class, "checkHttpResponseCode",
Mockito.any(HttpURLConnection.class), Mockito.anyInt());
Assert.assertTrue(controller.killTopology());
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
NetworkUtils.sendHttpDeleteRequest(Mockito.any(HttpURLConnection.class));
NetworkUtils.checkHttpResponseCode(Mockito.any(HttpURLConnection.class), Mockito.anyInt());
}
/***
* Test MarathonController's restartApp method
* @throws Exception
*/
@Test
public void testRestartApp() throws Exception {
HttpURLConnection httpURLConnection = Mockito.mock(HttpURLConnection.class);
int appId = 0;
// Failed to get connection
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(null).when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
Assert.assertFalse(controller.restartApp(appId));
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
// Failed to send request
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(httpURLConnection)
.when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
PowerMockito.doReturn(false)
.when(NetworkUtils.class, "sendHttpPostRequest",
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
Assert.assertFalse(controller.restartApp(appId));
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
NetworkUtils.sendHttpPostRequest(
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
// Failed to get response
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(httpURLConnection)
.when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
PowerMockito.doReturn(true)
.when(NetworkUtils.class, "sendHttpPostRequest",
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
PowerMockito.doReturn(false)
.when(NetworkUtils.class, "checkHttpResponseCode",
Mockito.any(HttpURLConnection.class), Mockito.anyInt());
Assert.assertFalse(controller.restartApp(appId));
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
NetworkUtils.sendHttpPostRequest(
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
NetworkUtils.checkHttpResponseCode(Mockito.any(HttpURLConnection.class), Mockito.anyInt());
// Success
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(httpURLConnection)
.when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
PowerMockito.doReturn(true)
.when(NetworkUtils.class, "sendHttpPostRequest",
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
PowerMockito.doReturn(true)
.when(NetworkUtils.class, "checkHttpResponseCode",
Mockito.any(HttpURLConnection.class), Mockito.anyInt());
Assert.assertTrue(controller.restartApp(appId));
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
NetworkUtils.sendHttpPostRequest(
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
NetworkUtils.checkHttpResponseCode(Mockito.any(HttpURLConnection.class), Mockito.anyInt());
}
/***
* Test MarathonController's submitTopology method
* @throws Exception
*/
@Test
public void testSubmitTopology() throws Exception {
HttpURLConnection httpURLConnection = Mockito.mock(HttpURLConnection.class);
final String appConf = "{app: conf}";
// Failed to get connection
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(null).when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
Assert.assertFalse(controller.submitTopology(Mockito.anyString()));
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
// Failed to send request
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(httpURLConnection)
.when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
PowerMockito.doReturn(false)
.when(NetworkUtils.class, "sendHttpPostRequest",
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
Assert.assertFalse(controller.submitTopology(appConf));
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
NetworkUtils.sendHttpPostRequest(
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
// Failed to get response
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(httpURLConnection)
.when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
PowerMockito.doReturn(true)
.when(NetworkUtils.class, "sendHttpPostRequest",
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
PowerMockito.doReturn(false)
.when(NetworkUtils.class, "checkHttpResponseCode",
Mockito.any(HttpURLConnection.class), Mockito.anyInt());
Assert.assertFalse(controller.submitTopology(appConf));
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
NetworkUtils.sendHttpPostRequest(
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
NetworkUtils.checkHttpResponseCode(Mockito.any(HttpURLConnection.class), Mockito.anyInt());
// Success
PowerMockito.spy(NetworkUtils.class);
PowerMockito.doReturn(httpURLConnection)
.when(NetworkUtils.class, "getHttpConnection", Mockito.anyString());
PowerMockito.doReturn(true)
.when(NetworkUtils.class, "sendHttpPostRequest",
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
PowerMockito.doReturn(true)
.when(NetworkUtils.class, "checkHttpResponseCode",
Mockito.any(HttpURLConnection.class), Mockito.anyInt());
Assert.assertTrue(controller.submitTopology(appConf));
PowerMockito.verifyStatic();
NetworkUtils.getHttpConnection(Mockito.anyString());
NetworkUtils.sendHttpPostRequest(
Mockito.any(HttpURLConnection.class),
Mockito.anyString(),
Mockito.any(byte[].class));
NetworkUtils.checkHttpResponseCode(Mockito.any(HttpURLConnection.class), Mockito.anyInt());
}
}