| /** |
| * 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!"); |
| } |
| } |
| |