blob: df48f3cacedadf5f2588a9da04102a684c684483 [file] [log] [blame]
/**
* 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 java.io.*;
import java.util.Random;
import junit.framework.TestCase;
/** Unit tests for VersionedWritable. */
public class TestVersionedWritable extends TestCase {
public TestVersionedWritable(String name) { super(name); }
/** Example class used in test cases below. */
public static class SimpleVersionedWritable extends VersionedWritable {
private static final Random RANDOM = new Random();
int state = RANDOM.nextInt();
private static byte VERSION = 1;
public byte getVersion() {
return VERSION;
}
public void write(DataOutput out) throws IOException {
super.write(out); // version.
out.writeInt(state);
}
public void readFields(DataInput in) throws IOException {
super.readFields(in); // version
this.state = in.readInt();
}
public static SimpleVersionedWritable read(DataInput in) throws IOException {
SimpleVersionedWritable result = new SimpleVersionedWritable();
result.readFields(in);
return result;
}
/** Required by test code, below. */
public boolean equals(Object o) {
if (!(o instanceof SimpleVersionedWritable))
return false;
SimpleVersionedWritable other = (SimpleVersionedWritable)o;
return this.state == other.state;
}
}
public static class AdvancedVersionedWritable extends SimpleVersionedWritable {
String shortTestString = "Now is the time for all good men to come to the aid of the Party";
String longTestString = "Four score and twenty years ago. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah.";
String compressableTestString =
"Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. " +
"Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. " +
"Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. Blah. ";
SimpleVersionedWritable containedObject = new SimpleVersionedWritable();
String[] testStringArray = {"The", "Quick", "Brown", "Fox", "Jumped", "Over", "The", "Lazy", "Dog"};
public void write(DataOutput out) throws IOException {
super.write(out);
out.writeUTF(shortTestString);
WritableUtils.writeString(out, longTestString);
int comp = WritableUtils.writeCompressedString(out, compressableTestString);
System.out.println("Compression is " + comp + "%");
containedObject.write(out); // Warning if this is a recursive call, you need a null value.
WritableUtils.writeStringArray(out, testStringArray);
}
public void readFields(DataInput in) throws IOException {
super.readFields(in);
shortTestString = in.readUTF();
longTestString = WritableUtils.readString(in);
compressableTestString = WritableUtils.readCompressedString(in);
containedObject.readFields(in); // Warning if this is a recursive call, you need a null value.
testStringArray = WritableUtils.readStringArray(in);
}
public boolean equals(Object o) {
super.equals(o);
if (!shortTestString.equals(((AdvancedVersionedWritable)o).shortTestString)) { return false;}
if (!longTestString.equals(((AdvancedVersionedWritable)o).longTestString)) { return false;}
if (!compressableTestString.equals(((AdvancedVersionedWritable)o).compressableTestString)) { return false;}
if (testStringArray.length != ((AdvancedVersionedWritable)o).testStringArray.length) { return false;}
for(int i=0;i< testStringArray.length;i++){
if (!testStringArray[i].equals(((AdvancedVersionedWritable)o).testStringArray[i])) {
return false;
}
}
if (!containedObject.equals(((AdvancedVersionedWritable)o).containedObject)) { return false;}
return true;
}
}
/* This one checks that version mismatch is thrown... */
public static class SimpleVersionedWritableV2 extends SimpleVersionedWritable {
static byte VERSION = 2;
public byte getVersion() {
return VERSION;
}
}
/** Test 1: Check that SimpleVersionedWritable. */
public void testSimpleVersionedWritable() throws Exception {
TestWritable.testWritable(new SimpleVersionedWritable());
}
/** Test 2: Check that AdvancedVersionedWritable Works (well, why wouldn't it!). */
public void testAdvancedVersionedWritable() throws Exception {
TestWritable.testWritable(new AdvancedVersionedWritable());
}
/** Test 3: Check that SimpleVersionedWritable throws an Exception. */
public void testSimpleVersionedWritableMismatch() throws Exception {
TestVersionedWritable.testVersionedWritable(new SimpleVersionedWritable(), new SimpleVersionedWritableV2());
}
/** Utility method for testing VersionedWritables. */
public static void testVersionedWritable(Writable before, Writable after) throws Exception {
DataOutputBuffer dob = new DataOutputBuffer();
before.write(dob);
DataInputBuffer dib = new DataInputBuffer();
dib.reset(dob.getData(), dob.getLength());
try {
after.readFields(dib);
} catch (VersionMismatchException vmme) {
System.out.println("Good, we expected this:" + vmme);
return;
}
throw new Exception("A Version Mismatch Didn't Happen!");
}
}