package org.jgroups.tests; import org.jgroups.Global; import org.jgroups.Header; import org.jgroups.util.Headers; import org.testng.annotations.Test; import java.io.*; import java.util.Map; /** * Tests the functionality of the Headers class * @author Bela Ban */ @Test(groups=Global.FUNCTIONAL,sequential=false) public class HeadersTest { private static final short UDP_ID=1, FRAG_ID=2, NAKACK_ID=3; private static final MyHeader h1=new MyHeader(), h2=new MyHeader(), h3=new MyHeader(); public static void testConstructor() { Headers hdrs=new Headers(5); System.out.println("hdrs = " + hdrs); assert hdrs.capacity() == 5 : "capacity must be 5 but was " + hdrs.capacity(); short[] ids=hdrs.getRawIDs(); assert ids.length == hdrs.capacity(); Header[] headers=hdrs.getRawHeaders(); assert headers.length == hdrs.capacity(); assert hdrs.size() == 0; } public static void testContructor2() { Headers old=createHeaders(3); Headers hdrs=new Headers(old); System.out.println("hdrs = " + hdrs); assert hdrs.capacity() == 3 : "capacity must be 3 but was " + hdrs.capacity(); short[] ids=hdrs.getRawIDs(); Header[] headers=hdrs.getRawHeaders(); assert ids.length == hdrs.capacity(); assert headers.length == hdrs.capacity(); assert hdrs.size() == 3; // make sure 'hdrs' is not changed when 'old' is modified, as 'hdrs' is a copy old.putHeader((short)300, new MyHeader()); assert hdrs.capacity() == 3 : "capacity must be 3 but was " + hdrs.capacity(); assert ids.length == hdrs.capacity(); assert headers.length == hdrs.capacity(); assert hdrs.size() == 3; } public static void testGetRawData() { Headers hdrs=createHeaders(3); short[] ids=hdrs.getRawIDs(); Header[] headers=hdrs.getRawHeaders(); assert ids.length == 3; assert headers.length == 3; assert ids[0] == NAKACK_ID; assert headers[0] == h1; assert ids[1] == FRAG_ID; assert headers[1] == h2; assert ids[2] == UDP_ID; assert headers[2] == h3; assert ids.length == hdrs.capacity(); assert headers.length == hdrs.capacity(); assert hdrs.size() == 3; } public static void testGetHeaders() { Headers hdrs=createHeaders(3); Map<Short, Header> map=hdrs.getHeaders(); System.out.println("map = " + map); assert map != null && map.size() == 3; assert map.get(NAKACK_ID) == h1; assert map.get(FRAG_ID) == h2; assert map.get(UDP_ID) == h3; } public static void testSize() { Headers hdrs=createHeaders(3); assert hdrs.size() == 3; } private static Headers createHeaders(int initial_capacity) { Headers hdrs=new Headers(initial_capacity); hdrs.putHeader(NAKACK_ID, h1); hdrs.putHeader(FRAG_ID, h2); hdrs.putHeader(UDP_ID, h3); return hdrs; } public static void testPutHeader() { Headers hdrs=createHeaders(3); assert hdrs.getHeader(NAKACK_ID) == h1; hdrs.putHeader(NAKACK_ID, new MyHeader()); assert hdrs.size() == 3; assert hdrs.getHeader(NAKACK_ID) != h1; assert hdrs.capacity() == 3; hdrs.putHeader((short)400, new MyHeader()); assert hdrs.size() == 4; assert hdrs.capacity() > 3; } public static void testPutHeaderIfAbsent() { Headers hdrs=createHeaders(3); Header hdr=hdrs.putHeaderIfAbsent(FRAG_ID, new MyHeader()); assert hdr == h2; assert hdr == hdrs.getHeader(FRAG_ID); assert hdrs.size() == 3; assert hdrs.capacity() == 3; hdr=hdrs.putHeaderIfAbsent((short)400, new MyHeader()); System.out.println("hdrs = " + hdrs); assert hdr == null; assert hdrs.size() == 4; assert hdrs.capacity() == 6; } public static void testGetHeader() { Headers hdrs=createHeaders(3); assert null == hdrs.getHeader((short)400); assert hdrs.getHeader(UDP_ID) == h3; } public static void testResize() { Headers hdrs=createHeaders(3); int capacity=hdrs.capacity(); System.out.println("hdrs = " + hdrs + ", capacity=" + capacity); hdrs.putHeader((short)400, new MyHeader()); System.out.println("hdrs = " + hdrs + ", capacity=" + hdrs.capacity()); assert hdrs.capacity() > capacity; capacity=hdrs.capacity(); for(int i=10; i <= 13; i++) hdrs.putHeader((short)i, new MyHeader()); System.out.println("hdrs = " + hdrs + ", capacity=" + hdrs.capacity()); assert hdrs.capacity() > capacity; } public static class MyHeader extends Header { public MyHeader() { } public String toString() { return "MyHeader"; } public void writeTo(DataOutput out) throws Exception { } public void readFrom(DataInput in) throws Exception { } public int size() { return 0; } } }