/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.hadoop.io;
import junit.framework.TestCase;
/**
* This is the unit test for BytesWritable.
*/
public class TestBytesWritable extends TestCase {
public void testSizeChange() throws Exception {
byte[] hadoop = "hadoop".getBytes();
BytesWritable buf = new BytesWritable(hadoop);
int size = buf.getLength();
int orig_capacity = buf.getCapacity();
buf.setSize(size*2);
int new_capacity = buf.getCapacity();
System.arraycopy(buf.getBytes(), 0, buf.getBytes(), size, size);
assertTrue(new_capacity >= size * 2);
assertEquals(size * 2, buf.getLength());
assertTrue(new_capacity != orig_capacity);
buf.setSize(size*4);
assertTrue(new_capacity != buf.getCapacity());
for(int i=0; i < size*2; ++i) {
assertEquals(hadoop[i%size], buf.getBytes()[i]);
}
// shrink the buffer
buf.setCapacity(1);
// make sure the size has been cut down too
assertEquals(1, buf.getLength());
// but that the data is still there
assertEquals(hadoop[0], buf.getBytes()[0]);
}
public void testHash() throws Exception {
byte[] owen = "owen".getBytes();
BytesWritable buf = new BytesWritable(owen);
assertEquals(4347922, buf.hashCode());
buf.setCapacity(10000);
assertEquals(4347922, buf.hashCode());
buf.setSize(0);
assertEquals(1, buf.hashCode());
}
public void testCompare() throws Exception {
byte[][] values = new byte[][]{"abc".getBytes(),
"ad".getBytes(),
"abcd".getBytes(),
"".getBytes(),
"b".getBytes()};
BytesWritable[] buf = new BytesWritable[values.length];
for(int i=0; i < values.length; ++i) {
buf[i] = new BytesWritable(values[i]);
}
// check to make sure the compare function is symetric and reflexive
for(int i=0; i < values.length; ++i) {
for(int j=0; j < values.length; ++j) {
assertTrue(buf[i].compareTo(buf[j]) == -buf[j].compareTo(buf[i]));
assertTrue((i == j) == (buf[i].compareTo(buf[j]) == 0));
}
}
assertTrue(buf[0].compareTo(buf[1]) < 0);
assertTrue(buf[1].compareTo(buf[2]) > 0);
assertTrue(buf[2].compareTo(buf[3]) > 0);
assertTrue(buf[3].compareTo(buf[4]) < 0);
}
private void checkToString(byte[] input, String expected) {
String actual = new BytesWritable(input).toString();
assertEquals(expected, actual);
}
public void testToString() {
checkToString(new byte[]{0,1,2,0x10}, "00 01 02 10");
checkToString(new byte[]{-0x80, -0x7f, -0x1, -0x2, 1, 0},
"80 81 ff fe 01 00");
}
}