/**
* CopyRight by Chinamobile
*/
package com.chinamobile.bcbsp.test.bspcontroller;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import junit.framework.TestCase;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.Server;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.chinamobile.bcbsp.BSPConfiguration;
import com.chinamobile.bcbsp.Constants;
import com.chinamobile.bcbsp.action.Directive;
import com.chinamobile.bcbsp.bspcontroller.BSPController;
import com.chinamobile.bcbsp.fault.storage.Fault;
import com.chinamobile.bcbsp.rpc.WorkerManagerProtocol;
import com.chinamobile.bcbsp.test.BSPConfigurationSetter;
import com.chinamobile.bcbsp.test.TestUtil;
import com.chinamobile.bcbsp.util.StaffStatus;
import com.chinamobile.bcbsp.workermanager.WorkerManager;
import com.chinamobile.bcbsp.workermanager.WorkerManagerStatus;
public class BSPControllerTest extends TestCase {
BSPController controller = null;
BSPConfiguration conf = null;
BSPConfigurationSetter bspconfSetter = null;
WorkerManager workermanager = null;
@SuppressWarnings("static-access")
@Before
protected void setUp() throws Exception {
super.setUp();
if (conf == null) {
conf = new BSPConfiguration();
bspconfSetter = new BSPConfigurationSetter();
bspconfSetter.mkTestDir("bcbsp_test");
conf.set(Constants.BC_BSP_CONTROLLER_ADDRESS, "127.0.0.1:"
+ bspconfSetter.getFreePort(40000));
conf.set(Constants.BC_BSP_SHARE_DIRECTORY,
new File(bspconfSetter.getBcbsptestDir(), "share")
.toString());
conf.set(Constants.BC_BSP_WORKERMANAGER_RPC_HOST, "127.0.0.1");
conf.set(Constants.BC_BSP_WORKERMANAGER_RPC_PORT, ""
+ bspconfSetter.getFreePort(40000));
}
if (controller == null) {
controller = new BSPController();
TestUtil.set(controller, "conf", conf);
}
}
@After
protected void tearDown() throws Exception {
super.tearDown();
// controller.shutdown();
bspconfSetter.cleanUp();
}
@SuppressWarnings("unchecked")
@Test
public void testAddWorkerToGray() throws Exception {
WorkerManagerStatus wms = new WorkerManagerStatus("127.0.0.1",
new ArrayList<StaffStatus>(), 1, 0, 0, 0);
ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> grayWorkerManagers = null;
try {
grayWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "grayWorkerManagers");
} catch (Exception e) {
e.printStackTrace();
}
assertEquals(false, grayWorkerManagers.containsKey(wms));
controller.addWorkerToGray(wms,
TestUtil.createDonothingObject(WorkerManagerProtocol.class));
assertEquals(true, grayWorkerManagers.containsKey(wms));
grayWorkerManagers.clear();
}
@SuppressWarnings("unchecked")
@Test
public void testRegister() throws Exception {
int port = Integer.valueOf(conf
.get(Constants.BC_BSP_WORKERMANAGER_RPC_PORT));
workermanager = new WorkerManager(conf);
Server testServer = RPC.getServer(workermanager,
conf.get(Constants.BC_BSP_WORKERMANAGER_RPC_HOST), port, conf);
testServer.start();
WorkerManagerStatus wms = new WorkerManagerStatus(
conf.get(Constants.BC_BSP_WORKERMANAGER_RPC_HOST),
new ArrayList<StaffStatus>(), 1, 0, 0, 0,
conf.get(Constants.BC_BSP_WORKERMANAGER_RPC_HOST) + ":" + port,
new ArrayList<Fault>());
Map<WorkerManagerStatus, WorkerManagerProtocol> whiteWorkerManagers = null;
try {
whiteWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "whiteWorkerManagers");
} catch (Exception e) {
System.out.println("get Attribute Exception.");
e.printStackTrace();
}
assertEquals(false, whiteWorkerManagers.containsKey(wms));
assertEquals(true, whiteWorkerManagers.containsKey(wms));
whiteWorkerManagers.clear();
}
@SuppressWarnings("unchecked")
@Test
public void testUpdateWhiteWorkerManagersKey() {
WorkerManagerStatus oldone = new WorkerManagerStatus("old",
new ArrayList<StaffStatus>(), 1, 0, 0, 0);
WorkerManagerStatus newone = new WorkerManagerStatus("new",
new ArrayList<StaffStatus>(), 1, 0, 0, 0);
Map<WorkerManagerStatus, WorkerManagerProtocol> whiteWorkerManagers = null;
try {
whiteWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "whiteWorkerManagers");
} catch (Exception e) {
e.printStackTrace();
}
whiteWorkerManagers.put(oldone,
TestUtil.createDonothingObject(WorkerManagerProtocol.class));
assertEquals(true, whiteWorkerManagers.containsKey(oldone));
assertEquals(false, whiteWorkerManagers.containsKey(newone));
controller.updateWhiteWorkerManagersKey(oldone, newone);
assertEquals(false, whiteWorkerManagers.containsKey(oldone));
assertEquals(true, whiteWorkerManagers.containsKey(newone));
}
@SuppressWarnings("unchecked")
@Test
public void testUpdateGrayWorkerManagersKey() {
WorkerManagerStatus oldone = new WorkerManagerStatus("old",
new ArrayList<StaffStatus>(), 1, 0, 0, 0);
oldone.setPauseTime(100l);
WorkerManagerStatus newone = new WorkerManagerStatus("new",
new ArrayList<StaffStatus>(), 1, 0, 0, 0);
newone.setPauseTime(200l);
Map<WorkerManagerStatus, WorkerManagerProtocol> grayWorkerManagers = null;
try {
grayWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "grayWorkerManagers");
} catch (Exception e) {
e.printStackTrace();
}
grayWorkerManagers.put(oldone,
TestUtil.createDonothingObject(WorkerManagerProtocol.class));
assertEquals(true, grayWorkerManagers.containsKey(oldone));
assertEquals(false, grayWorkerManagers.containsKey(newone));
controller.updateGrayWorkerManagersKey(oldone, newone);
assertEquals(false, grayWorkerManagers.containsKey(oldone));
assertEquals(true, grayWorkerManagers.containsKey(newone));
assertEquals(100l, newone.getPauseTime());
}
@SuppressWarnings("unchecked")
@Test
public void testReport() {
WorkerManagerStatus wms = new WorkerManagerStatus("127.0.0.1",
new ArrayList<StaffStatus>(), 1, 0, 0, 0);
wms.setLastSeen(100l);
ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> whiteWorkerManagers = null, grayWorkerManagers = null;
try {
whiteWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "whiteWorkerManagers");
grayWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "grayWorkerManagers");
} catch (Exception e) {
e.printStackTrace();
}
whiteWorkerManagers.put(wms,
TestUtil.createDonothingObject(WorkerManagerProtocol.class));
assertEquals(100l, wms.getLastSeen());
try {
controller.report(new Directive(wms));
} catch (Exception e) {
System.out.println("Processing");
}
assertEquals(true, whiteWorkerManagers.containsKey(wms));
assertEquals(false, grayWorkerManagers.containsKey(wms));
assertEquals(true, wms.getLastSeen() != 100l);
whiteWorkerManagers.clear();
grayWorkerManagers.clear();
}
@SuppressWarnings("unchecked")
@Test
public void testFindWorkerManager() {
WorkerManagerStatus wms = new WorkerManagerStatus(
conf.get(Constants.BC_BSP_WORKERMANAGER_RPC_HOST),
new ArrayList<StaffStatus>(), 1, 0, 0, 0,
conf.get(Constants.BC_BSP_WORKERMANAGER_RPC_HOST) + ":"
+ conf.get(Constants.BC_BSP_WORKERMANAGER_RPC_PORT),
new ArrayList<Fault>());
ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> whiteWorkerManagers = null;
try {
whiteWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "whiteWorkerManagers");
} catch (Exception e) {
e.printStackTrace();
}
assertNull(controller.findWorkerManager(wms));
whiteWorkerManagers.put(wms,
TestUtil.createDonothingObject(WorkerManagerProtocol.class));
assertNotNull(controller.findWorkerManager(wms));
whiteWorkerManagers.clear();
}
@SuppressWarnings("unchecked")
@Test
public void testFindWorkerManagers() {
ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> whiteWorkerManagers = null;
try {
whiteWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "whiteWorkerManagers");
} catch (Exception e) {
e.printStackTrace();
}
Collection<WorkerManagerProtocol> managers = controller
.findWorkerManagers();
assertEquals(true, managers == whiteWorkerManagers.values());
}
@SuppressWarnings("unchecked")
@Test
public void testWorkerServerStatusKeySet() {
ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> whiteWorkerManagers = null;
try {
whiteWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "whiteWorkerManagers");
} catch (Exception e) {
e.printStackTrace();
}
Collection<WorkerManagerStatus> wmses = controller
.workerServerStatusKeySet();
assertEquals(true, wmses == whiteWorkerManagers.keySet());
}
@SuppressWarnings("unchecked")
@Test
public void testGetActiveWorkerManagersName() {
int i = 2, j = 3;
WorkerManagerStatus[] wmses = new WorkerManagerStatus[i + j];
String[] names = new String[i + j];
for (int k = 0; k < i + j; k++) {
names[k] = "test" + (k < i ? "gray-" + k : "white-" + (k - i));
wmses[k] = new WorkerManagerStatus(names[k],
new ArrayList<StaffStatus>(), 1, 0, 0, 0);
}
ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> whiteWorkerManagers = null, grayWorkerManagers = null, tmp = null;
try {
whiteWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "whiteWorkerManagers");
grayWorkerManagers = ( ConcurrentMap<WorkerManagerStatus, WorkerManagerProtocol> ) TestUtil
.get(controller, "grayWorkerManagers");
} catch (Exception e) {
e.printStackTrace();
}
assertEquals(0, whiteWorkerManagers.size());
assertEquals(0, grayWorkerManagers.size());
for (int k = 0; k < i + j; k++) {
tmp = (k < i ? grayWorkerManagers : whiteWorkerManagers);
tmp.put(wmses[k], ( WorkerManagerProtocol ) TestUtil
.createDonothingObject(WorkerManagerProtocol.class));
}
String[] checks = controller.getActiveWorkerManagersName();
Arrays.sort(checks);
Arrays.sort(names);
for(int k = 0; k < i + j; k++){
assertEquals(true, checks[k].equals(names[k]));
}
whiteWorkerManagers.clear();
grayWorkerManagers.clear();
}
@SuppressWarnings("static-access")
public static void main(String[] args) {
@SuppressWarnings("unused")
WorkerManager workermanager = null;
BSPConfiguration conf = new BSPConfiguration();
BSPController controller = null;
BSPConfigurationSetter bspconfSetter = new BSPConfigurationSetter();
bspconfSetter.mkTestDir("bcbsp_test");
conf.set(Constants.BC_BSP_CONTROLLER_ADDRESS, "127.0.0.1:"
+ bspconfSetter.getFreePort(40000));
conf.set(Constants.BC_BSP_SHARE_DIRECTORY,
new File(bspconfSetter.getBcbsptestDir(), "share").toString());
try {
workermanager = new WorkerManager(conf);
} catch (IOException e) {
e.printStackTrace();
}
WorkerManagerStatus wms = new WorkerManagerStatus("TEST",
new ArrayList<StaffStatus>(), 1, 0, 0, 0, "127.0.0.1:0");
try {
controller = new BSPController(conf);
controller.register(wms);
} catch (Exception e) {
e.printStackTrace();
}
bspconfSetter.cleanUp();
}
}