// 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.common.basics;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class ByteAmountTest {
private static final long MB = 1024 * 1024;
private static final long GB = MB * 1024;
@Test
public void testConversions() {
assertEquals(2, ByteAmount.fromBytes(2).asBytes());
assertEquals(2 * MB, ByteAmount.fromMegabytes(2).asBytes());
assertEquals(2 * GB, ByteAmount.fromGigabytes(2).asBytes());
assertEquals(0, ByteAmount.fromBytes(2).asGigabytes());
assertEquals(0, ByteAmount.fromBytes(2).asMegabytes());
assertEquals(MB - 1, ByteAmount.fromBytes(MB - 1).asBytes());
assertEquals(1, ByteAmount.fromBytes(MB - 1).asMegabytes());
assertEquals(0, ByteAmount.fromBytes(MB - 1).asGigabytes());
assertEquals(GB - 1, ByteAmount.fromBytes(GB - 1).asBytes());
assertEquals(1024, ByteAmount.fromBytes(GB - 1).asMegabytes());
assertEquals(1, ByteAmount.fromBytes(GB - 1).asGigabytes());
assertEquals(5, ByteAmount.fromMegabytes(5).asMegabytes());
assertEquals(5, ByteAmount.fromGigabytes(5).asGigabytes());
assertEquals(1, ByteAmount.fromBytes((int) (MB * 1.5) - 1).asMegabytes());
assertEquals(2, ByteAmount.fromBytes((int) (MB * 1.5) + 1).asMegabytes());
assertEquals(1, ByteAmount.fromBytes((int) (GB * 1.5) - 1).asGigabytes());
assertEquals(2, ByteAmount.fromBytes((int) (GB * 1.5) + 1).asGigabytes());
assertEquals(Long.MAX_VALUE, ByteAmount.fromBytes(Long.MAX_VALUE).asBytes());
assertEquals(Long.MAX_VALUE, ByteAmount.fromMegabytes(Long.MAX_VALUE).asBytes());
assertEquals(Long.MAX_VALUE, ByteAmount.fromGigabytes(Long.MAX_VALUE).asBytes());
assertEquals(Long.MAX_VALUE - 1, ByteAmount.fromBytes(Long.MAX_VALUE - 1).asBytes());
assertEquals(Long.MAX_VALUE, ByteAmount.fromMegabytes(Long.MAX_VALUE - 1).asBytes());
assertEquals(Long.MAX_VALUE, ByteAmount.fromGigabytes(Long.MAX_VALUE - 1).asBytes());
assertTrue(ByteAmount.ZERO.isZero());
assertTrue(ByteAmount.fromBytes(0).isZero());
assertFalse(ByteAmount.fromBytes(1).isZero());
}
@Test
public void testAddition() {
assertEquals(9, ByteAmount.fromBytes(4).plus(ByteAmount.fromBytes(5)).asBytes());
assertEquals(MB + 1, ByteAmount.fromBytes(1).plus(ByteAmount.fromMegabytes(1)).asBytes());
assertEquals(GB + 1, ByteAmount.fromBytes(1).plus(ByteAmount.fromGigabytes(1)).asBytes());
assertEquals(Long.MAX_VALUE,
ByteAmount.fromBytes(Long.MAX_VALUE - 1).plus(ByteAmount.fromBytes(1)).asBytes());
}
@Test(expected = IllegalArgumentException.class)
public void testAdditionOverflow() {
ByteAmount.fromBytes(Long.MAX_VALUE).plus(ByteAmount.fromBytes(1));
}
@Test
public void testSubtraction() {
assertEquals(4, ByteAmount.fromBytes(9).minus(ByteAmount.fromBytes(5)).asBytes());
assertEquals(MB - 1, ByteAmount.fromMegabytes(1).minus(ByteAmount.fromBytes(1)).asBytes());
assertEquals(GB - 1, ByteAmount.fromGigabytes(1).minus(ByteAmount.fromBytes(1)).asBytes());
assertEquals(Long.MIN_VALUE,
ByteAmount.fromBytes(-1).minus(ByteAmount.fromBytes(Long.MAX_VALUE)).asBytes());
}
@Test(expected = IllegalArgumentException.class)
public void testSubtractionOverflow() {
ByteAmount.fromBytes(-2).minus(ByteAmount.fromBytes(Long.MAX_VALUE));
}
@Test
public void testMultiplication() {
assertEquals(0, ByteAmount.fromBytes(0).multiply(2).asBytes());
assertEquals(45, ByteAmount.fromBytes(9).multiply(5).asBytes());
assertEquals(MB * 2, ByteAmount.fromMegabytes(1).multiply(2).asBytes());
assertEquals(GB * 2, ByteAmount.fromGigabytes(1).multiply(2).asBytes());
assertEquals(ByteAmount.fromBytes(Long.MAX_VALUE - 1),
ByteAmount.fromBytes(Long.MAX_VALUE / 2).multiply(2));
}
@Test(expected = IllegalArgumentException.class)
public void testMultiplicationOverflow() {
ByteAmount.fromBytes((Long.MAX_VALUE / 2) + 1).multiply(2);
}
@Test
public void testDivision() {
assertEquals(0, ByteAmount.fromBytes(0).divide(2).asBytes());
assertEquals(1, ByteAmount.fromBytes(1).divide(2).asBytes());
assertEquals(1, ByteAmount.fromBytes(2).divide(2).asBytes());
assertEquals(2, ByteAmount.fromBytes(3).divide(2).asBytes());
assertEquals(2, ByteAmount.fromBytes(10).divide(6).asBytes());
assertEquals(3, ByteAmount.fromBytes(15).divide(5).asBytes());
assertEquals(MB / 2, ByteAmount.fromMegabytes(1).divide(2).asBytes());
assertEquals(GB / 2, ByteAmount.fromGigabytes(1).divide(2).asBytes());
}
@Test(expected = IllegalArgumentException.class)
public void testDivideByZero() {
ByteAmount.fromBytes(1).divide(0);
}
@Test
public void testIncreaseBy() {
assertEquals(0, ByteAmount.fromBytes(0).increaseBy(2).asBytes());
assertEquals(11, ByteAmount.fromBytes(10).increaseBy(10).asBytes());
assertEquals(11, ByteAmount.fromBytes(10).increaseBy(14).asBytes());
assertEquals(12, ByteAmount.fromBytes(10).increaseBy(15).asBytes());
ByteAmount.fromBytes(Long.MAX_VALUE / 2 + 1).increaseBy(100);
}
@Test(expected = IllegalArgumentException.class)
public void testIncreaseByOverflow() {
ByteAmount.fromBytes((Long.MAX_VALUE / 2) + 2).increaseBy(100);
}
@Test(expected = IllegalArgumentException.class)
public void testIncreaseByNegative() {
ByteAmount.fromBytes(1).increaseBy(-1);
}
@Test
public void testComparison() {
assertTrue(ByteAmount.fromBytes(0).lessThan(ByteAmount.fromBytes(1)));
assertFalse(ByteAmount.fromBytes(1).lessThan(ByteAmount.fromBytes(1)));
assertFalse(ByteAmount.fromBytes(2).lessThan(ByteAmount.fromBytes(1)));
assertTrue(ByteAmount.fromBytes(0).lessOrEqual(ByteAmount.fromBytes(1)));
assertTrue(ByteAmount.fromBytes(1).lessOrEqual(ByteAmount.fromBytes(1)));
assertFalse(ByteAmount.fromBytes(2).lessOrEqual(ByteAmount.fromBytes(1)));
assertFalse(ByteAmount.fromBytes(0).greaterThan(ByteAmount.fromBytes(1)));
assertFalse(ByteAmount.fromBytes(1).greaterThan(ByteAmount.fromBytes(1)));
assertTrue(ByteAmount.fromBytes(2).greaterThan(ByteAmount.fromBytes(1)));
assertFalse(ByteAmount.fromBytes(0).greaterOrEqual(ByteAmount.fromBytes(1)));
assertTrue(ByteAmount.fromBytes(1).greaterOrEqual(ByteAmount.fromBytes(1)));
assertTrue(ByteAmount.fromBytes(2).greaterOrEqual(ByteAmount.fromBytes(1)));
}
@Test
public void testMax() {
assertEquals(ByteAmount.fromBytes(1), ByteAmount.fromBytes(0).max(ByteAmount.fromBytes(1)));
assertEquals(ByteAmount.fromBytes(1), ByteAmount.fromBytes(1).max(ByteAmount.fromBytes(1)));
assertEquals(ByteAmount.fromBytes(2), ByteAmount.fromBytes(2).max(ByteAmount.fromBytes(1)));
}
@Test
public void testEquals() {
assertFalse(ByteAmount.fromBytes(0).equals(ByteAmount.fromBytes(1)));
assertTrue(ByteAmount.fromBytes(1).equals(ByteAmount.fromBytes(1)));
assertFalse(ByteAmount.fromBytes(2).equals(ByteAmount.fromBytes(1)));
assertTrue(ByteAmount.fromBytes(0).equals(ByteAmount.ZERO));
assertTrue(ByteAmount.ZERO.equals(ByteAmount.fromBytes(0)));
assertFalse(ByteAmount.fromBytes(0).equals(null));
assertFalse(ByteAmount.fromBytes(2).equals(null));
assertFalse(ByteAmount.fromBytes(2).equals("foo"));
}
@Test
public void testCompare() {
assertTrue(ByteAmount.fromBytes(0).compareTo(ByteAmount.fromBytes(1)) < 0);
assertTrue(ByteAmount.fromBytes(1).compareTo(ByteAmount.fromBytes(1)) == 0);
assertTrue(ByteAmount.fromBytes(2).compareTo(ByteAmount.fromBytes(1)) > 0);
assertTrue(ByteAmount.fromBytes(0).compareTo(ByteAmount.ZERO) == 0);
assertTrue(ByteAmount.ZERO.compareTo(ByteAmount.fromBytes(0)) == 0);
}
@Test(expected = NullPointerException.class)
public void testCompareNull() {
ByteAmount.fromBytes(0).compareTo(null);
}
@Test
public void testToString() {
assertEquals("ByteAmount{0 bytes}", ByteAmount.fromBytes(0).toString());
assertEquals("ByteAmount{524287 bytes}", ByteAmount.fromBytes((MB / 2) - 1).toString());
assertEquals("ByteAmount{1 MB (524289 bytes)}", ByteAmount.fromBytes((MB / 2) + 1).toString());
assertEquals("ByteAmount{1 MB (1048575 bytes)}", ByteAmount.fromBytes(MB - 1).toString());
assertEquals("ByteAmount{1 MB (1048576 bytes)}", ByteAmount.fromBytes(MB).toString());
assertEquals("ByteAmount{1 GB (1073741823 bytes)}", ByteAmount.fromBytes(GB - 1).toString());
assertEquals("ByteAmount{1 GB (1073741824 bytes)}", ByteAmount.fromBytes(GB).toString());
assertEquals("ByteAmount{2 GB (2147483648 bytes)}", ByteAmount.fromBytes(2 * GB).toString());
assertEquals("ByteAmount{2 GB (2147483647 bytes)}",
ByteAmount.fromBytes((2 * GB) - 1).toString());
assertEquals("ByteAmount{8589934592 GB (9223372036854775807 bytes)}",
ByteAmount.fromBytes(Long.MAX_VALUE).toString());
}
}