/**
* Copyright 2016 LinkedIn Corp. 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.
*/
package com.github.ambry.clustermap;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Tests {@link Partition} class.
*/
public class PartitionTest {
@Test
public void basics() throws JSONException {
int replicaCount = 3;
long replicaCapacityInBytes = 100 * 1024 * 1024 * 1024L;
TestUtils.TestHardwareLayout thl = new TestUtils.TestHardwareLayout("Alpha");
int dcCount = thl.getDatacenterCount();
JSONArray jsonReplicas = TestUtils.getJsonArrayReplicas(thl.getIndependentDisks(replicaCount));
JSONObject jsonObject =
TestUtils.getJsonPartition(99, PartitionState.READ_WRITE, replicaCapacityInBytes, jsonReplicas);
Partition partition = new Partition(thl.getHardwareLayout(), jsonObject);
assertEquals(partition.getReplicaIds().size(), replicaCount * dcCount);
assertEquals(partition.getReplicaCapacityInBytes(), replicaCapacityInBytes);
assertEquals(partition.getPartitionState(), PartitionState.READ_WRITE);
}
public void failValidation(HardwareLayout hardwareLayout, JSONObject jsonObject) throws JSONException {
try {
new Partition(hardwareLayout, jsonObject);
fail("Should have failed validation.");
} catch (IllegalStateException e) {
// Expected.
}
}
@Test
public void validation() throws JSONException {
int replicaCount = 3;
long replicaCapacityInBytes = 100 * 1024 * 1024 * 1024L;
TestUtils.TestHardwareLayout thl = new TestUtils.TestHardwareLayout("Alpha");
int dcCount = thl.getDatacenterCount();
JSONArray jsonReplicas = TestUtils.getJsonArrayReplicas(thl.getIndependentDisks(replicaCount));
JSONObject jsonObject;
// Bad replica capacity in bytes (too small)
jsonObject = TestUtils.getJsonPartition(99, PartitionState.READ_WRITE, -1, jsonReplicas);
failValidation(thl.getHardwareLayout(), jsonObject);
// Bad replica capacity in bytes (too big)
jsonObject =
TestUtils.getJsonPartition(99, PartitionState.READ_WRITE, 11L * 1024 * 1024 * 1024 * 1024, jsonReplicas);
failValidation(thl.getHardwareLayout(), jsonObject);
// Multiple Replica on same Disk.
List<Disk> disks = new ArrayList<Disk>(replicaCount);
Disk randomDisk = thl.getRandomDisk();
for (int i = 0; i < replicaCount; i++) {
disks.add(randomDisk);
}
JSONArray jsonReplicasSameDisk = TestUtils.getJsonArrayReplicas(disks);
jsonObject =
TestUtils.getJsonPartition(99, PartitionState.READ_WRITE, replicaCapacityInBytes, jsonReplicasSameDisk);
failValidation(thl.getHardwareLayout(), jsonObject);
// Multiple Replica on same DataNode.
JSONArray jsonReplicasSameDataNode = TestUtils.getJsonArrayReplicas(thl.getDependentDisks(replicaCount));
jsonObject =
TestUtils.getJsonPartition(99, PartitionState.READ_WRITE, replicaCapacityInBytes, jsonReplicasSameDataNode);
failValidation(thl.getHardwareLayout(), jsonObject);
}
}