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;
import java.util.function.Supplier;
/**
* Tests the functionality of the Headers class
* @author Bela Ban
*/
@Test(groups=Global.FUNCTIONAL,sequential=false)
public class HeadersTest {
private static final short NAKACK_ID=1, FRAG_ID=2, UDP_ID=3;
private static final MyHeader h1=new MyHeader(NAKACK_ID), h2=new MyHeader(FRAG_ID), h3=new MyHeader(UDP_ID);
public void testGetHeader() {
Header[] hdrs=createHeaders(3);
assert null == Headers.getHeader(null, (short)400);
assert null == Headers.getHeader(hdrs, (short)400);
assert Headers.getHeader(hdrs, UDP_ID) == h3;
}
public void testGetHeaders() {
Header[] hdrs=createHeaders(3);
System.out.printf("hdrs are: %s\n", Headers.printObjectHeaders(hdrs));
Map<Short, Header> map=Headers.getHeaders(hdrs);
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 void testPutHeader() {
Header[] hdrs=createHeaders(3);
assert Headers.getHeader(hdrs, NAKACK_ID) == h1;
Header[] retval=Headers.putHeader(hdrs, NAKACK_ID, new MyHeader(NAKACK_ID), true);
assert retval == null;
assert Headers.size(hdrs) == 3;
assert Headers.getHeader(hdrs, NAKACK_ID) != h1;
retval=Headers.putHeader(hdrs, (short)400, new MyHeader((short)400), true);
assert retval != null;
hdrs=retval;
assert Headers.size(hdrs) == 4;
assert hdrs.length > 3;
}
public void testPutHeaderIfAbsent() {
Header[] hdrs=createHeaders(3);
Header[] retval=Headers.putHeader(hdrs, FRAG_ID, new MyHeader(FRAG_ID), false);
assert retval == null;
assert Headers.getHeader(hdrs, FRAG_ID) == h2;
assert Headers.size(hdrs) == 3;
assert hdrs.length == 3;
retval=Headers.putHeader(hdrs, (short)400, new MyHeader((short)400), false);
assert retval != null;
hdrs=retval;
String tmp=Headers.printHeaders(hdrs);
System.out.printf("headers are %s\n", tmp);
assert Headers.size(hdrs) == 4;
assert hdrs.length == 6;
Headers.putHeader(hdrs, FRAG_ID,null, true);
assert Headers.getHeader(hdrs, FRAG_ID) == null;
MyHeader myhdr=new MyHeader(FRAG_ID);
retval=Headers.putHeader(hdrs, FRAG_ID, myhdr, false);
assert retval == null;
assert Headers.getHeader(hdrs, FRAG_ID) == myhdr;
}
public void testResize() {
Header[] hdrs=createHeaders(3);
int capacity=hdrs.length;
System.out.println("hdrs = " + Headers.printHeaders(hdrs) + ", capacity=" + capacity);
Header[] retval=Headers.putHeader(hdrs, (short)400, new MyHeader((short)400), true);
assert retval != null;
hdrs=retval;
System.out.println("hdrs = " + Headers.printHeaders(hdrs) + ", capacity=" + hdrs.length);
assert hdrs.length > capacity;
capacity=hdrs.length;
for(int i=10; i <= 13; i++) {
retval=Headers.putHeader(hdrs, (short)i, new MyHeader((short)i), true);
if(retval != null)
hdrs=retval;
}
System.out.println("hdrs = " + Headers.printHeaders(hdrs) + ", capacity=" + hdrs.length);
assert hdrs.length > capacity;
}
public void testCopy() {
Header[] hdrs=createHeaders(3);
Header[] retval=Headers.putHeader(hdrs, (short)400, new MyHeader((short)400), true);
assert retval != null;
hdrs=retval;
Header[] copy=Headers.copy(hdrs);
assert copy.length == hdrs.length;
assert Headers.size(copy) == Headers.size(hdrs);
}
public void testSize() {
Header[] hdrs=createHeaders(3);
assert Headers.size(hdrs) == 3;
}
private static Header[] createHeaders(int initial_capacity) {
Header[] hdrs=new Header[initial_capacity];
hdrs[0]=h1;
hdrs[1]=h2;
hdrs[2]=h3;
return hdrs;
}
public static class MyHeader extends Header {
public MyHeader() {
}
public MyHeader(short prot_id) {
this.prot_id=prot_id;
}
public short getMagicId() {return 1500;}
public String toString() {
return "MyHeader";
}
public Supplier<? extends Header> create() {
return MyHeader::new;
}
public void writeTo(DataOutput out) throws Exception {
}
public void readFrom(DataInput in) throws Exception {
}
public int serializedSize() {
return 0;
}
}
}