/*
* $Id$
*
* Copyright (C) 2003-2015 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.apps.jpartition.model;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public abstract class AbstractTestDevice extends AbstractTest {
protected static final int DEVICE_SIZE = 5000;
protected Device device;
protected abstract long getStartFreeSpace();
protected abstract long getEndFreeSpace();
protected abstract int getIndexFreeSpacePartition();
protected final long getFreeSpace() {
return getEndFreeSpace() - getStartFreeSpace() + 1;
}
@Before
public void setUp() throws Exception {
device = new CustomDevice("dev1", DEVICE_SIZE);
}
@Test
public void testAddPartitionWithIllegalStart() {
try {
device.addPartition(getStartFreeSpace() - 1, getFreeSpace() - 1);
Assert.fail("failed case 1");
} catch (DeviceException e) {
// success
}
try {
device.addPartition(getStartFreeSpace() - 1, getFreeSpace());
Assert.fail("failed case 2");
} catch (DeviceException e) {
// success
}
}
@Test
public void testAddPartitionWithIllegalSize() {
try {
device.addPartition(getStartFreeSpace(), -1);
Assert.fail("failed case 1");
} catch (DeviceException e) {
// success
}
try {
device.addPartition(getStartFreeSpace(), 0);
Assert.fail("failed case 2");
} catch (DeviceException e) {
// success
}
try {
device.addPartition(getStartFreeSpace(), getFreeSpace() + 1);
Assert.fail("failed case 3");
} catch (DeviceException e) {
// success
}
try {
device.addPartition(getStartFreeSpace(), getFreeSpace() + 2);
Assert.fail("failed case 4");
} catch (DeviceException e) {
// success
}
}
@Test
public void testAddPartitionAllFreeSpace() {
final int nbPartitions = device.getPartitions().size();
Partition newPart = device.addPartition(getStartFreeSpace(), getFreeSpace());
assertEquals(getStartFreeSpace(), getFreeSpace(), true, newPart);
List<Partition> partitions = device.getPartitions();
Assert.assertEquals("must have only " + nbPartitions + " partition(s)", nbPartitions,
partitions.size());
Partition part = partitions.get(getIndexFreeSpacePartition());
Assert.assertTrue("must return the same instance as addPartition", newPart == part);
}
@Test
public void testAddPartitionBeginFreeSpace() {
final int nbPartitions = device.getPartitions().size();
final long begin = getStartFreeSpace();
final long size = getFreeSpace() - 1500;
Partition newPart = device.addPartition(begin, size);
assertEquals(begin, size, true, newPart);
List<Partition> partitions = device.getPartitions();
final int expectedNbPartitions = nbPartitions + 1;
Assert.assertEquals("must have only " + expectedNbPartitions + " partition(s)",
expectedNbPartitions, partitions.size());
Partition part1 = partitions.get(getIndexFreeSpacePartition());
Assert.assertTrue("must return the same instance as addPartition", newPart == part1);
Partition part2 = partitions.get(getIndexFreeSpacePartition() + 1);
long part2Size = getFreeSpace() - part1.getSize();
assertEquals(begin + size, part2Size, false, part2);
}
@Test
public void testAddPartitionMiddleFreeSpace() {
final int nbPartitions = device.getPartitions().size();
final long shift = 500;
final long begin = getStartFreeSpace() + shift;
final long size = getFreeSpace() - 1500;
Partition newPart = device.addPartition(begin, size);
assertEquals(begin, size, true, newPart);
List<Partition> partitions = device.getPartitions();
final int expectedNbPartitions = nbPartitions + 2;
Assert.assertEquals("must have only " + expectedNbPartitions + " partition(s)",
expectedNbPartitions, partitions.size());
Partition part1 = partitions.get(getIndexFreeSpacePartition());
assertEquals(getStartFreeSpace(), shift, false, part1);
Partition part2 = partitions.get(getIndexFreeSpacePartition() + 1);
Assert.assertTrue("must return the same instance as addPartition", newPart == part2);
Partition part3 = partitions.get(getIndexFreeSpacePartition() + 2);
long part3Size = getFreeSpace() - part1.getSize() - part2.getSize();
assertEquals(begin + size, part3Size, false, part3);
}
@Test
public void testAddPartitionEndFreeSpace() {
final int nbPartitions = device.getPartitions().size();
final long shift = 1500;
final long begin = getStartFreeSpace() + shift;
final long size = getFreeSpace() - shift;
Partition newPart = device.addPartition(begin, size);
assertEquals(begin, size, true, newPart);
List<Partition> partitions = device.getPartitions();
final int expectedNbPartitions = nbPartitions + 1;
Assert.assertEquals("must have only " + expectedNbPartitions + " partition(s)",
expectedNbPartitions, partitions.size());
Partition part1 = partitions.get(getIndexFreeSpacePartition());
assertEquals(getStartFreeSpace(), shift, false, part1);
Partition part2 = partitions.get(getIndexFreeSpacePartition() + 1);
Assert.assertTrue("must return the same instance as addPartition", newPart == part2);
}
@Test
public void testRemovePartitionAllFreeSpace() {
final int nbPartitions = device.getPartitions().size();
device.addPartition(getStartFreeSpace(), getFreeSpace());
List<Partition> partitions = device.getPartitions();
Assert.assertEquals("must have only " + nbPartitions + " partition(s)", nbPartitions,
partitions.size());
Partition part = partitions.get(getIndexFreeSpacePartition());
assertEquals(getStartFreeSpace(), getFreeSpace(), true, part);
}
@Test
public void testRemovePartitionBeginFreeSpace() {
final int nbPartitions = device.getPartitions().size();
final long begin = getStartFreeSpace();
final long size = getFreeSpace() - 1500;
device.addPartition(begin, size);
List<Partition> partitions = device.getPartitions();
final int expectedNbPartitions = nbPartitions + 1;
Assert.assertEquals("must have only " + expectedNbPartitions + " partition(s)",
expectedNbPartitions, partitions.size());
Partition part1 = partitions.get(getIndexFreeSpacePartition());
assertEquals(begin, size, true, part1);
Partition part2 = partitions.get(getIndexFreeSpacePartition() + 1);
long part2Size = getFreeSpace() - part1.getSize();
assertEquals(begin + size, part2Size, false, part2);
}
@Test
public void testRemovePartitionMiddleFreeSpace() {
final int nbPartitions = device.getPartitions().size();
final long shift = 500;
final long begin = getStartFreeSpace() + shift;
final long size = getFreeSpace() - 1500;
device.addPartition(begin, size);
List<Partition> partitions = device.getPartitions();
final int expectedNbPartitions = nbPartitions + 2;
Assert.assertEquals("must have only " + expectedNbPartitions + " partition(s)",
expectedNbPartitions, partitions.size());
Partition part1 = partitions.get(getIndexFreeSpacePartition());
assertEquals(getStartFreeSpace(), shift, false, part1);
Partition part2 = partitions.get(getIndexFreeSpacePartition() + 1);
assertEquals(begin, size, true, part2);
Partition part3 = partitions.get(getIndexFreeSpacePartition() + 2);
long part3Size = getFreeSpace() - part1.getSize() - part2.getSize();
assertEquals(begin + size, part3Size, false, part3);
}
@Test
public void testRemovePartitionEndFreeSpace() {
final int nbPartitions = device.getPartitions().size();
final long shift = 1500;
final long begin = getStartFreeSpace() + shift;
final long size = getFreeSpace() - shift;
device.addPartition(begin, size);
List<Partition> partitions = device.getPartitions();
final int expectedNbPartitions = nbPartitions + 1;
Assert.assertEquals("must have only " + expectedNbPartitions + " partition(s)",
expectedNbPartitions, partitions.size());
Partition part1 = partitions.get(getIndexFreeSpacePartition());
assertEquals(getStartFreeSpace(), shift, false, part1);
Partition part2 = partitions.get(getIndexFreeSpacePartition() + 1);
assertEquals(begin, size, true, part2);
}
@Test
public void testAddPartitionInNonFreeSpace() {
testAddRemoveInBadPartitionKind(true);
}
@Test
public void testRemovePartitionInFreeSpace() {
testAddRemoveInBadPartitionKind(false);
}
private void testAddRemoveInBadPartitionKind(boolean usedPartition) {
final long nbPartitions = device.getPartitions().size();
for (Partition part : device.getPartitions()) {
if (part.isUsed() == usedPartition) {
final long start = part.getStart();
@SuppressWarnings("unused")
final long end = part.getEnd();
final long size = part.getSize();
final boolean used = part.isUsed();
try {
if (usedPartition) {
device.addPartition(start + 1, size - 2);
} else {
device.removePartition(start + 1);
}
Assert.fail("must throw an exception");
} catch (DeviceException e) {
// success
}
Assert.assertEquals(nbPartitions, device.getPartitions().size());
assertEquals(start, size, used, part);
}
}
}
}