/src/test/java/nl/bitbrains/nebu/common/topology/TestPhysicalTopology.java

https://github.com/deltaforge/nebu-common-java · Java · 544 lines · 414 code · 54 blank · 76 comment · 7 complexity · 6739f8da3d28520861ec3f72bbc02793 MD5 · raw file

  1. package nl.bitbrains.nebu.common.topology;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.NoSuchElementException;
  5. import nl.bitbrains.nebu.common.topology.PhysicalDataCenter;
  6. import nl.bitbrains.nebu.common.topology.PhysicalHost;
  7. import nl.bitbrains.nebu.common.topology.PhysicalRack;
  8. import nl.bitbrains.nebu.common.topology.PhysicalRoot;
  9. import nl.bitbrains.nebu.common.topology.PhysicalStore;
  10. import nl.bitbrains.nebu.common.topology.PhysicalTopology;
  11. import org.junit.Assert;
  12. import org.junit.Before;
  13. import org.junit.Test;
  14. import org.junit.runner.RunWith;
  15. import org.mockito.Mockito;
  16. import org.mockito.MockitoAnnotations;
  17. import org.powermock.api.mockito.PowerMockito;
  18. import org.powermock.core.classloader.annotations.PrepareForTest;
  19. import org.powermock.modules.junit4.PowerMockRunner;
  20. /**
  21. * @author Jesse Donkervliet, Tim Hegeman, and Stefan Hugtenburg
  22. *
  23. */
  24. @RunWith(PowerMockRunner.class)
  25. @PrepareForTest({ PhysicalRoot.class, PhysicalDataCenter.class, PhysicalRack.class,
  26. PhysicalStore.class, PhysicalHost.class })
  27. public class TestPhysicalTopology {
  28. PhysicalRoot root;
  29. static final String rootID = "Root";
  30. @Before
  31. public void setUp() throws Exception {
  32. MockitoAnnotations.initMocks(this);
  33. this.root = TestPhysicalTopology.newRootMock(TestPhysicalTopology.rootID);
  34. }
  35. public static PhysicalRoot newRootMock(final String rootID) {
  36. final PhysicalRoot res = PowerMockito.mock(PhysicalRoot.class);
  37. Mockito.when(res.getUniqueIdentifier()).thenReturn(rootID);
  38. return res;
  39. }
  40. public static PhysicalDataCenter mockDataCenter(final String identifier) {
  41. final PhysicalDataCenter dc = PowerMockito.mock(PhysicalDataCenter.class);
  42. Mockito.when(dc.getUniqueIdentifier()).thenReturn(identifier);
  43. return dc;
  44. }
  45. public static PhysicalRack mockRack(final String identifier) {
  46. final PhysicalRack rack = PowerMockito.mock(PhysicalRack.class);
  47. Mockito.when(rack.getUniqueIdentifier()).thenReturn(identifier);
  48. return rack;
  49. }
  50. public static PhysicalHost mockCPU(final String identifier) {
  51. final PhysicalHost cpu = PowerMockito.mock(PhysicalHost.class);
  52. Mockito.when(cpu.getUniqueIdentifier()).thenReturn(identifier);
  53. return cpu;
  54. }
  55. public static PhysicalStore mockStore(final String identifier) {
  56. final PhysicalStore store = PowerMockito.mock(PhysicalStore.class);
  57. Mockito.when(store.getUniqueIdentifier()).thenReturn(identifier);
  58. return store;
  59. }
  60. public static List<PhysicalDataCenter> mockDataCentersForTree(final int dataCenters) {
  61. final ArrayList<PhysicalDataCenter> dcList = new ArrayList<PhysicalDataCenter>();
  62. for (int i = 0; i < dataCenters; i++) {
  63. final PhysicalDataCenter newDC = TestPhysicalTopology.mockDataCenter("ID_" + i);
  64. dcList.add(newDC);
  65. }
  66. return dcList;
  67. }
  68. public static List<PhysicalRack> mockRacksForTree(final List<PhysicalDataCenter> dataCenters,
  69. final int racksPerDataCenter) {
  70. final ArrayList<PhysicalRack> rackList = new ArrayList<PhysicalRack>();
  71. for (final PhysicalDataCenter dc : dataCenters) {
  72. final ArrayList<PhysicalRack> dcRackList = new ArrayList<PhysicalRack>();
  73. for (int i = 0; i < racksPerDataCenter; i++) {
  74. final PhysicalRack rack = TestPhysicalTopology.mockRack(dc.getUniqueIdentifier()
  75. + "_" + i);
  76. rackList.add(rack);
  77. dcRackList.add(rack);
  78. }
  79. Mockito.when(dc.getRacks()).thenReturn(dcRackList);
  80. }
  81. return rackList;
  82. }
  83. public static List<PhysicalHost> mockCPUsForTree(final List<PhysicalRack> racks,
  84. final int cpusPerRack) {
  85. final ArrayList<PhysicalHost> cpuList = new ArrayList<PhysicalHost>();
  86. for (final PhysicalRack rack : racks) {
  87. final ArrayList<PhysicalHost> rackCPUList = new ArrayList<PhysicalHost>();
  88. for (int i = 0; i < cpusPerRack; i++) {
  89. final PhysicalHost cpu = TestPhysicalTopology.mockCPU(rack.getUniqueIdentifier()
  90. + "_" + i);
  91. cpuList.add(cpu);
  92. rackCPUList.add(cpu);
  93. }
  94. Mockito.when(rack.getCPUs()).thenReturn(rackCPUList);
  95. }
  96. return cpuList;
  97. }
  98. public static List<PhysicalStore> mockStoresForTree(final List<PhysicalRack> racks,
  99. final int storesPerRack) {
  100. final ArrayList<PhysicalStore> storeList = new ArrayList<PhysicalStore>();
  101. for (final PhysicalRack rack : racks) {
  102. final ArrayList<PhysicalStore> rackStoreList = new ArrayList<PhysicalStore>();
  103. for (int i = 0; i < storesPerRack; i++) {
  104. final PhysicalStore store = TestPhysicalTopology.mockStore(rack
  105. .getUniqueIdentifier() + "_" + i);
  106. storeList.add(store);
  107. rackStoreList.add(store);
  108. }
  109. Mockito.when(rack.getDisks()).thenReturn(rackStoreList);
  110. }
  111. return storeList;
  112. }
  113. @Test
  114. public void testConstructor() {
  115. // When
  116. final PhysicalTopology topology = new PhysicalTopology(this.root);
  117. // Then
  118. Assert.assertEquals(topology.getRoot(), this.root);
  119. }
  120. @Test
  121. public void testGetDataCenters() {
  122. final List<PhysicalDataCenter> dcList = TestPhysicalTopology.mockDataCentersForTree(3);
  123. // When
  124. final PhysicalTopology topology = new PhysicalTopology(this.root);
  125. Mockito.when(this.root.getDataCenters()).thenReturn(dcList);
  126. // Then
  127. Assert.assertEquals(dcList, topology.getDataCenters());
  128. }
  129. @Test
  130. public void testGetRacks() {
  131. final List<PhysicalDataCenter> dcList = TestPhysicalTopology.mockDataCentersForTree(3);
  132. final List<PhysicalRack> rackList = TestPhysicalTopology.mockRacksForTree(dcList, 3);
  133. // When
  134. final PhysicalTopology topology = new PhysicalTopology(this.root);
  135. Mockito.when(this.root.getDataCenters()).thenReturn(dcList);
  136. // Then
  137. Assert.assertEquals(rackList, topology.getRacks());
  138. }
  139. @Test
  140. public void testGetCPUs() {
  141. final List<PhysicalDataCenter> dcList = TestPhysicalTopology.mockDataCentersForTree(3);
  142. final List<PhysicalRack> rackList = TestPhysicalTopology.mockRacksForTree(dcList, 3);
  143. final List<PhysicalHost> cpuList = TestPhysicalTopology.mockCPUsForTree(rackList, 3);
  144. // When
  145. final PhysicalTopology topology = new PhysicalTopology(this.root);
  146. Mockito.when(this.root.getDataCenters()).thenReturn(dcList);
  147. // Then
  148. Assert.assertEquals(cpuList, topology.getCPUs());
  149. }
  150. @Test
  151. public void testGetStores() {
  152. final List<PhysicalDataCenter> dcList = TestPhysicalTopology.mockDataCentersForTree(3);
  153. final List<PhysicalRack> rackList = TestPhysicalTopology.mockRacksForTree(dcList, 3);
  154. final List<PhysicalStore> storeList = TestPhysicalTopology.mockStoresForTree(rackList, 3);
  155. final List<PhysicalHost> hostList = TestPhysicalTopology.mockCPUsForTree(rackList, 1);
  156. final PhysicalStore extraStore = TestPhysicalTopology.mockStore("extra");
  157. final List<PhysicalStore> extraStoreList = new ArrayList<PhysicalStore>();
  158. extraStoreList.add(extraStore);
  159. Mockito.when(hostList.get(0).getDisks()).thenReturn(extraStoreList);
  160. storeList.add(extraStore);
  161. // When
  162. final PhysicalTopology topology = new PhysicalTopology(this.root);
  163. Mockito.when(this.root.getDataCenters()).thenReturn(dcList);
  164. // Then
  165. Assert.assertEquals(storeList, topology.getStores());
  166. }
  167. @Test
  168. public void testAddDataCenterConsistency() {
  169. final PhysicalTopology topology = new PhysicalTopology(this.root);
  170. final PhysicalDataCenter dc = TestPhysicalTopology.mockDataCenter("DC_A");
  171. // When
  172. topology.addDataCenter(dc);
  173. // Then
  174. Mockito.verify(this.root).addDataCenter(dc);
  175. Mockito.verify(dc).setParent(this.root);
  176. }
  177. @Test
  178. public void testRemoveDataCenterConsistency() {
  179. final PhysicalTopology topology = new PhysicalTopology(this.root);
  180. final PhysicalDataCenter dc = TestPhysicalTopology.mockDataCenter("DC_A");
  181. // When
  182. topology.removeDataCenter(dc);
  183. // Then
  184. Mockito.verify(this.root).removeDataCenter(dc);
  185. Mockito.verify(dc).setParent(null);
  186. }
  187. @Test(expected = IllegalArgumentException.class)
  188. public void testAddNullDataCenter() {
  189. final PhysicalTopology topology = new PhysicalTopology(this.root);
  190. // When
  191. topology.addDataCenter(null);
  192. // Then
  193. // ... nothing needs to happen, but no Exceptions may be thrown
  194. Assert.fail();
  195. }
  196. @Test
  197. public void testAddRackConsistency() {
  198. final PhysicalTopology topology = new PhysicalTopology(this.root);
  199. final PhysicalDataCenter dc = TestPhysicalTopology.mockDataCenter("DC_A");
  200. final PhysicalRack rack = TestPhysicalTopology.mockRack("Rack_A");
  201. // When
  202. topology.addRackToDataCenter(rack, dc);
  203. // Then
  204. Mockito.verify(dc).addRack(rack);
  205. Mockito.verify(rack).setParent(dc);
  206. }
  207. @Test
  208. public void testRemoveRackConsistency() {
  209. final PhysicalTopology topology = new PhysicalTopology(this.root);
  210. final PhysicalDataCenter dc = TestPhysicalTopology.mockDataCenter("DC_A");
  211. final PhysicalRack rack = TestPhysicalTopology.mockRack("Rack_A");
  212. // When
  213. topology.removeRackFromDataCenter(rack, dc);
  214. // Then
  215. Mockito.verify(dc).removeRack(rack);
  216. Mockito.verify(rack).setParent(null);
  217. }
  218. @Test(expected = IllegalArgumentException.class)
  219. public void testAddNullRack() {
  220. final PhysicalTopology topology = new PhysicalTopology(this.root);
  221. final PhysicalDataCenter dc = TestPhysicalTopology.mockDataCenter("DC_A");
  222. // When
  223. topology.addRackToDataCenter(null, dc);
  224. // Then
  225. // ... an Exception should have been thrown
  226. Assert.fail();
  227. }
  228. @Test(expected = IllegalArgumentException.class)
  229. public void testAddRackToNull() {
  230. final PhysicalTopology topology = new PhysicalTopology(this.root);
  231. final PhysicalRack rack = TestPhysicalTopology.mockRack("Rack_A");
  232. // When
  233. topology.addRackToDataCenter(rack, null);
  234. // Then
  235. // ... an Exception should have been thrown
  236. Assert.fail();
  237. }
  238. @Test
  239. public void testAddCPUConsistency() {
  240. final PhysicalTopology topology = new PhysicalTopology(this.root);
  241. final PhysicalRack rack = TestPhysicalTopology.mockRack("Rack_A");
  242. final PhysicalHost cpu = TestPhysicalTopology.mockCPU("CPU_A");
  243. // When
  244. topology.addCPUToRack(cpu, rack);
  245. // Then
  246. Mockito.verify(rack).addCPU(cpu);
  247. Mockito.verify(cpu).setParent(rack);
  248. }
  249. @Test
  250. public void testRemoveCPUConsistency() {
  251. final PhysicalTopology topology = new PhysicalTopology(this.root);
  252. final PhysicalRack rack = TestPhysicalTopology.mockRack("Rack_A");
  253. final PhysicalHost cpu = TestPhysicalTopology.mockCPU("CPU_A");
  254. // When
  255. topology.removeCPUFromRack(cpu, rack);
  256. // Then
  257. Mockito.verify(rack).removeCPU(cpu);
  258. Mockito.verify(cpu).setParent(null);
  259. }
  260. @Test(expected = IllegalArgumentException.class)
  261. public void testAddNullCPU() {
  262. final PhysicalTopology topology = new PhysicalTopology(this.root);
  263. final PhysicalRack rack = TestPhysicalTopology.mockRack("Rack_A");
  264. // When
  265. topology.addCPUToRack(null, rack);
  266. // Then
  267. // ... an Exception should have been thrown
  268. Assert.fail();
  269. }
  270. @Test(expected = IllegalArgumentException.class)
  271. public void testAddCPUToNull() {
  272. final PhysicalTopology topology = new PhysicalTopology(this.root);
  273. final PhysicalHost cpu = TestPhysicalTopology.mockCPU("CPUA");
  274. // When
  275. topology.addCPUToRack(cpu, null);
  276. // Then
  277. // ... an Exception should have been thrown
  278. Assert.fail();
  279. }
  280. @Test
  281. public void testAddDiskToRackConsistency() {
  282. final PhysicalTopology topology = new PhysicalTopology(this.root);
  283. final PhysicalRack rack = TestPhysicalTopology.mockRack("Rack_A");
  284. final PhysicalStore store = TestPhysicalTopology.mockStore("STORE_A");
  285. // When
  286. topology.addDiskToRack(store, rack);
  287. // Then
  288. Mockito.verify(rack).addDisk(store);
  289. Mockito.verify(store).setParent(rack);
  290. }
  291. @Test
  292. public void testRemoveDiskFromRackConsistency() {
  293. final PhysicalTopology topology = new PhysicalTopology(this.root);
  294. final PhysicalRack rack = TestPhysicalTopology.mockRack("Rack_A");
  295. final PhysicalStore store = TestPhysicalTopology.mockStore("STORE_A");
  296. // When
  297. topology.removeDiskFromRack(store, rack);
  298. // Then
  299. Mockito.verify(rack).removeDisk(store);
  300. Mockito.verify(store).setParent(null);
  301. }
  302. @Test(expected = IllegalArgumentException.class)
  303. public void testAddNullDiskToRack() {
  304. final PhysicalTopology topology = new PhysicalTopology(this.root);
  305. final PhysicalRack rack = TestPhysicalTopology.mockRack("STORE_A");
  306. // When
  307. topology.addDiskToRack(null, rack);
  308. // Then
  309. // ... an Exception should have been thrown
  310. Assert.fail();
  311. }
  312. @Test(expected = IllegalArgumentException.class)
  313. public void testAddDiskToRackToNull() {
  314. final PhysicalTopology topology = new PhysicalTopology(this.root);
  315. final PhysicalStore store = TestPhysicalTopology.mockStore("STORE_A");
  316. // When
  317. topology.addDiskToRack(store, null);
  318. // Then
  319. // ... an Exception should have been thrown
  320. Assert.fail();
  321. }
  322. @Test
  323. public void testAddDiskToHostConsistency() {
  324. final PhysicalTopology topology = new PhysicalTopology(this.root);
  325. final PhysicalHost host = TestPhysicalTopology.mockCPU("Host_A");
  326. final PhysicalStore store = TestPhysicalTopology.mockStore("STORE_A");
  327. // When
  328. topology.addDiskToHost(store, host);
  329. // Then
  330. Mockito.verify(host).addDisk(store);
  331. Mockito.verify(store).setParent(host);
  332. }
  333. @Test
  334. public void testRemoveDiskFromHostConsistency() {
  335. final PhysicalTopology topology = new PhysicalTopology(this.root);
  336. final PhysicalHost host = TestPhysicalTopology.mockCPU("Host_A");
  337. final PhysicalStore store = TestPhysicalTopology.mockStore("STORE_A");
  338. // When
  339. topology.removeDiskFromHost(store, host);
  340. // Then
  341. Mockito.verify(host).removeDisk(store);
  342. Mockito.verify(store).setParent(null);
  343. }
  344. @Test(expected = IllegalArgumentException.class)
  345. public void testAddNullDiskToHost() {
  346. final PhysicalTopology topology = new PhysicalTopology(this.root);
  347. final PhysicalHost host = TestPhysicalTopology.mockCPU("Host_A");
  348. // When
  349. topology.addDiskToHost(null, host);
  350. // Then
  351. // ... an Exception should have been thrown
  352. Assert.fail();
  353. }
  354. @Test(expected = IllegalArgumentException.class)
  355. public void testAddDiskToHostToNull() {
  356. final PhysicalTopology topology = new PhysicalTopology(this.root);
  357. final PhysicalStore store = TestPhysicalTopology.mockStore("STORE_A");
  358. // When
  359. topology.addDiskToHost(store, null);
  360. // Then
  361. // ... an Exception should have been thrown
  362. Assert.fail();
  363. }
  364. @Test
  365. public void testNotEqualsNull() {
  366. // When
  367. final PhysicalTopology topology = new PhysicalTopology(this.root);
  368. // Then
  369. Assert.assertNotEquals(topology, null);
  370. }
  371. @Test
  372. public void testEqualsSelf() {
  373. // When
  374. final PhysicalTopology topology = new PhysicalTopology(this.root);
  375. // Then
  376. Assert.assertEquals(topology, topology);
  377. }
  378. @Test
  379. public void testObjectEqualsCopy() {
  380. final PhysicalTopology topology = new PhysicalTopology(this.root);
  381. // When
  382. final PhysicalTopology topologyCopy = new PhysicalTopology(this.root);
  383. // Then
  384. Assert.assertEquals(topologyCopy, topology);
  385. }
  386. @Test
  387. public void testCopyEqualsObject() {
  388. final PhysicalTopology topology = new PhysicalTopology(this.root);
  389. // When
  390. final PhysicalTopology topologyCopy = new PhysicalTopology(this.root);
  391. // Then
  392. Assert.assertEquals(topology, topologyCopy);
  393. }
  394. @Test
  395. public void testNotEqualsOther() {
  396. final PhysicalTopology topology = new PhysicalTopology(this.root);
  397. final PhysicalRoot otherRoot = Mockito.mock(PhysicalRoot.class);
  398. Mockito.when(otherRoot.getUniqueIdentifier()).thenReturn(TestPhysicalTopology.rootID + "_");
  399. // When
  400. final PhysicalTopology other = new PhysicalTopology(otherRoot);
  401. // Then
  402. Assert.assertNotEquals(other, topology);
  403. }
  404. @Test
  405. public void testHashCodeConsistency() {
  406. // When
  407. final PhysicalTopology topology = new PhysicalTopology(this.root);
  408. // Then
  409. Assert.assertEquals(topology.hashCode(), topology.hashCode());
  410. }
  411. @Test
  412. public void testHashCodeCopy() {
  413. // When
  414. final PhysicalTopology topology = new PhysicalTopology(this.root);
  415. final PhysicalTopology topologyCopy = new PhysicalTopology(this.root);
  416. // Then
  417. Assert.assertEquals(topology.hashCode(), topologyCopy.hashCode());
  418. }
  419. @Test
  420. public void testHashCodeDifferentID() {
  421. final PhysicalRoot otherRoot = Mockito.mock(PhysicalRoot.class);
  422. Mockito.when(otherRoot.getUniqueIdentifier()).thenReturn(TestPhysicalTopology.rootID + "_");
  423. // When
  424. final PhysicalTopology topology = new PhysicalTopology(this.root);
  425. final PhysicalTopology otherTopology = new PhysicalTopology(otherRoot);
  426. Assert.assertNotEquals(topology.hashCode(), otherTopology.hashCode());
  427. }
  428. @Test
  429. public void testHasCPUByIDEmptyTreeNotFound() {
  430. final PhysicalTopology topology = new PhysicalTopology(this.root);
  431. final List<PhysicalDataCenter> dc = new ArrayList<PhysicalDataCenter>();
  432. Mockito.when(this.root.getDataCenters()).thenReturn(dc);
  433. Assert.assertFalse(topology.hasCPUByID("this does not exist"));
  434. }
  435. @Test
  436. public void testHasCPUByIDFilledTreeNotFound() {
  437. final PhysicalTopology topology = new PhysicalTopology(this.root);
  438. final List<PhysicalDataCenter> dc = TestPhysicalTopology.mockDataCentersForTree(1);
  439. final List<PhysicalRack> racks = TestPhysicalTopology.mockRacksForTree(dc, 2);
  440. final List<PhysicalHost> hosts = TestPhysicalTopology.mockCPUsForTree(racks, 2);
  441. Mockito.when(this.root.getDataCenters()).thenReturn(dc);
  442. Assert.assertFalse(topology.hasCPUByID("this does not exist"));
  443. }
  444. @Test
  445. public void testHasCPUByIDFilledTreeFound() {
  446. final PhysicalTopology topology = new PhysicalTopology(this.root);
  447. final List<PhysicalDataCenter> dc = TestPhysicalTopology.mockDataCentersForTree(1);
  448. final List<PhysicalRack> racks = TestPhysicalTopology.mockRacksForTree(dc, 2);
  449. final List<PhysicalHost> hosts = TestPhysicalTopology.mockCPUsForTree(racks, 2);
  450. Mockito.when(this.root.getDataCenters()).thenReturn(dc);
  451. Assert.assertTrue(topology.hasCPUByID("ID_0_1_1"));
  452. }
  453. @Test
  454. public void testGetCPUByIDEmptyTreeNotFound() {
  455. final PhysicalTopology topology = new PhysicalTopology(this.root);
  456. final List<PhysicalDataCenter> dc = new ArrayList<PhysicalDataCenter>();
  457. Mockito.when(this.root.getDataCenters()).thenReturn(dc);
  458. boolean caught = false;
  459. try {
  460. topology.getCPUByID("this does not exist");
  461. } catch (final NoSuchElementException e) {
  462. caught = true;
  463. }
  464. Assert.assertTrue(caught);
  465. }
  466. @Test
  467. public void testGetCPUByIDFilledTreeNotFound() {
  468. final PhysicalTopology topology = new PhysicalTopology(this.root);
  469. final List<PhysicalDataCenter> dc = TestPhysicalTopology.mockDataCentersForTree(1);
  470. final List<PhysicalRack> racks = TestPhysicalTopology.mockRacksForTree(dc, 2);
  471. final List<PhysicalHost> hosts = TestPhysicalTopology.mockCPUsForTree(racks, 2);
  472. Mockito.when(this.root.getDataCenters()).thenReturn(dc);
  473. boolean caught = false;
  474. try {
  475. topology.getCPUByID("this does not exist");
  476. } catch (final NoSuchElementException e) {
  477. caught = true;
  478. }
  479. Assert.assertTrue(caught);
  480. }
  481. @Test
  482. public void testGetCPUByIDFilledTreeFound() {
  483. final PhysicalTopology topology = new PhysicalTopology(this.root);
  484. final List<PhysicalDataCenter> dc = TestPhysicalTopology.mockDataCentersForTree(1);
  485. final List<PhysicalRack> racks = TestPhysicalTopology.mockRacksForTree(dc, 2);
  486. final List<PhysicalHost> hosts = TestPhysicalTopology.mockCPUsForTree(racks, 2);
  487. Mockito.when(this.root.getDataCenters()).thenReturn(dc);
  488. Assert.assertNotNull(topology.getCPUByID("ID_0_1_1"));
  489. }
  490. }