/*
* Copyright Ericsson AB 2011-2014. All Rights Reserved.
*
* The contents of this file are subject to the Lesser GNU Public License,
* (the "License"), either version 2.1 of the License, or
* (at your option) any later version.; you may not use this file except in
* compliance with the License. You should have received a copy of the
* License along with this software. If not, it can be
* retrieved online at https://www.gnu.org/licenses/lgpl.html. Moreover
* it could also be requested from Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
* WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
* EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
* OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND,
* EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
* LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE,
* YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
*
* IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
* WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
* REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
* DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
* DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY
* (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
* INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE
* OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH
* HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
*/
package com.ericsson.deviceaccess.coap.basedriver.util;
import com.ericsson.common.util.BitUtil;
import com.ericsson.deviceaccess.coap.basedriver.api.CoAPException;
import com.ericsson.deviceaccess.coap.basedriver.api.message.CoAPOptionHeader;
import com.ericsson.deviceaccess.coap.basedriver.api.message.CoAPOptionName;
import com.ericsson.deviceaccess.coap.basedriver.osgi.BlockOptionHeader;
import com.ericsson.deviceaccess.coap.basedriver.osgi.BlockwiseTransferHandler;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class BlockOptionHeaderTest {
private BlockwiseTransferHandler handler;
@Test
public void test1ByteBlockOptionHeader() {
BlockOptionHeader blockOption = new BlockOptionHeader(
CoAPOptionName.BLOCK2, 0, false, 2);
assertEquals(blockOption.getBlockNumber(), 0);
assertEquals(blockOption.getSzx(), 2);
assertFalse(blockOption.getMFlag());
assertEquals(1, blockOption.getLength());
blockOption = new BlockOptionHeader(CoAPOptionName.BLOCK1, 1, true, 2);
assertEquals(blockOption.getBlockNumber(), 1);
assertEquals(blockOption.getSzx(), 2);
assertTrue(blockOption.getMFlag());
assertEquals(1, blockOption.encode().length);
CoAPOptionHeader h = new CoAPOptionHeader(CoAPOptionName.BLOCK1,
blockOption.encode());
BlockOptionHeader blockOpt = null;
try {
blockOpt = new BlockOptionHeader(h);
assertEquals(1, blockOpt.getBlockNumber());
assertTrue(blockOpt.getMFlag());
assertEquals(blockOpt.getSzx(), 2);
} catch (CoAPException e) {
e.printStackTrace();
assertTrue(false);
}
double largeDouble = 0;
for (int i = 0; i < 4; i++) {
largeDouble += Math.pow(2, i);
}
Double largeNum = largeDouble;
int maxBlockNumber = largeNum.intValue();
int szx = 4;
blockOption = new BlockOptionHeader(CoAPOptionName.BLOCK1,
maxBlockNumber, true, szx);
assertEquals(blockOption.getBlockNumber(), maxBlockNumber);
assertEquals(blockOption.getSzx(), szx);
assertTrue(blockOption.getMFlag());
assertEquals(1, blockOption.encode().length);
h = new CoAPOptionHeader(CoAPOptionName.BLOCK1, blockOption.encode());
try {
blockOpt = new BlockOptionHeader(h);// handler.decodeBlockOption(h);
assertEquals(maxBlockNumber, blockOpt.getBlockNumber());
assertTrue(blockOpt.getMFlag());
assertEquals(blockOpt.getSzx(), szx);
} catch (CoAPException e) {
e.printStackTrace();
assertTrue(false);
}
}
@Test
public void test2ByteBlockOptionHeader() {
// Set the block number the maximum
double largeDouble = 0;
for (int i = 0; i < 12; i++) {
largeDouble += Math.pow(2, i);
}
Double largeNum = largeDouble;
int blockNumber = largeNum.intValue();
boolean mFlag = true;
BlockOptionHeader blockOption = new BlockOptionHeader(
CoAPOptionName.BLOCK2, blockNumber, mFlag, 2);
assertEquals(2, blockOption.getLength());
byte[] headerBytes = blockOption.encode();
largeDouble = 0;
for (int i = 0; i < 8; i++) {
largeDouble += Math.pow(2, i);
}
largeNum = largeDouble;
int testBlock = largeNum.intValue();
// Compare the first byte with the
int headerByte = (int) headerBytes[0] & 0xFF;
assertEquals(testBlock, headerByte);
assertEquals(blockOption.getBlockNumber(), blockNumber);
byte[] bytes = new byte[1];
short test = BitUtil.mergeBytesToShort(bytes[0], headerBytes[1]);
largeDouble = Math.pow(2, 1) + Math.pow(2, 3) + Math.pow(2, 4)
+ Math.pow(2, 5) + Math.pow(2, 6) + Math.pow(2, 7);
largeNum = largeDouble;
int headerValue = largeNum.intValue();
assertEquals(headerValue, test);
assertEquals(2, blockOption.encode().length);
CoAPOptionHeader optionHeader = new CoAPOptionHeader(
CoAPOptionName.BLOCK2, blockOption.encode());
try {
BlockOptionHeader decoded = new BlockOptionHeader(optionHeader);// handler.decodeBlockOption(optionHeader);
assertEquals(blockNumber, decoded.getBlockNumber());
assertEquals(mFlag, decoded.getMFlag());
} catch (CoAPException e) {
e.printStackTrace();
assertTrue(false);
}
}
@Test
public void test3ByteBlockOptionHeader() {
int szx = 2;
boolean mFlag = true;
Double largeNum = Math.pow(2, 18);
int testBlock = largeNum.intValue();
// System.out.println("block number for 3 block header: " + testBlock);
BlockOptionHeader blockOpt = new BlockOptionHeader(
CoAPOptionName.BLOCK2, testBlock, mFlag, szx);
assertEquals(3, blockOpt.getLength());
byte[] headerBytes = blockOpt.encode();
assertEquals(3, headerBytes.length);
CoAPOptionHeader optionHeader = new CoAPOptionHeader(
CoAPOptionName.BLOCK2, blockOpt.encode());
BlockOptionHeader decoded;
try {
decoded = new BlockOptionHeader(optionHeader);
assertEquals(testBlock, decoded.getBlockNumber());
assertEquals(szx, decoded.getSzx());
assertEquals(mFlag, decoded.getMFlag());
} catch (CoAPException e) {
e.printStackTrace();
assertTrue(false);
}
szx = 2;
mFlag = false;
double largeDouble = 0;
for (int i = 0; i < 20; i++) {
largeDouble += Math.pow(2, i);
}
largeNum = largeDouble;
testBlock = largeNum.intValue();
int value = testBlock;
int bitsNeeded = 0;
while (value > 0) {
bitsNeeded++;
value >>= 1;
}
assertEquals(bitsNeeded, 20);
blockOpt = new BlockOptionHeader(CoAPOptionName.BLOCK2, testBlock,
mFlag, szx);
assertEquals(testBlock, blockOpt.getBlockNumber());
assertEquals(3, blockOpt.getLength());
optionHeader = new CoAPOptionHeader(CoAPOptionName.BLOCK2,
blockOpt.encode());
try {
decoded = new BlockOptionHeader(optionHeader);
assertEquals(blockOpt.getBlockNumber(), decoded.getBlockNumber());
assertEquals(szx, decoded.getSzx());
assertEquals(mFlag, decoded.getMFlag());
} catch (CoAPException e) {
e.printStackTrace();
assertTrue(false);
}
}
}