/**
* BlueCove - Java library for Bluetooth
* Copyright (C) 2006-2009 Vlad Skarzhevskyy
*
* 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.
*
* @author vlads
* @version $Id$
*/
package com.intel.bluetooth.obex;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
import javax.obex.HeaderSet;
import junit.framework.TestCase;
/**
*
*/
public class HeaderTest extends TestCase {
private void validateWriteLength(int lenExpected, int headerID, Object headerValue) throws IOException {
HeaderSet headers = new OBEXHeaderSetImpl();
headers.setHeader(headerID, headerValue);
byte b[] = OBEXHeaderSetImpl.toByteArray(headers);
assertEquals("length", lenExpected, b.length);
}
public void testHeaderWriteLength() throws IOException {
validateWriteLength(3 + 12, HeaderSet.NAME, "Jumar");
validateWriteLength(2, OBEXHeaderSetImpl.OBEX_HDR_USER | OBEXHeaderSetImpl.OBEX_BYTE, new Byte((byte)1));
validateWriteLength(1 + 4, HeaderSet.LENGTH, new Long(1));
validateWriteLength(1 + 2 + 3, HeaderSet.HTTP, new byte[]{1, 2, 3});
validateWriteLength(1 + 4, HeaderSet.TIME_4_BYTE, new GregorianCalendar());
validateWriteLength(1 + 2 + 16, HeaderSet.TIME_ISO_8601, new GregorianCalendar());
}
private void validateReadWrite(HeaderSet headers) throws IOException {
byte b[] = OBEXHeaderSetImpl.toByteArray(headers);
HeaderSet r = OBEXHeaderSetImpl.readHeaders((byte)0, b, 0);
int[] headerIDArray = headers.getHeaderList();
assertEquals("HeaderList.length", headerIDArray.length, r.getHeaderList().length);
for (int i = 0; i < headerIDArray.length; i++) {
int hi = headerIDArray[i];
Object valueO = headers.getHeader(hi);
Object valueR = r.getHeader(hi);
assertNotNull("value Write", valueO);
assertNotNull("value Read", valueR);
if ((valueO instanceof Calendar)) {
Calendar cO = (Calendar) valueO;
Calendar cR = (Calendar) valueR;
assertEquals("Header time value", cO.getTime().getTime() / 1000, cR.getTime().getTime() / 1000);
} else if (!(valueO instanceof byte[])) {
assertEquals("Header value", valueO, valueR);
} else {
byte[] bO = (byte[]) valueO;
byte[] bR = (byte[]) valueR;
assertEquals("Header value.length", bO.length, bR.length);
for (int k = 0; i < bO.length; i++) {
assertEquals("value["+k+"]", bO[k], bR[k]);
}
}
}
}
public void testHeaderByteReadWrite() throws IOException {
HeaderSet hs = new OBEXHeaderSetImpl();
hs.setHeader(OBEXHeaderSetImpl.OBEX_HDR_USER | OBEXHeaderSetImpl.OBEX_BYTE, new Byte((byte)1));
validateReadWrite(hs);
hs.setHeader((OBEXHeaderSetImpl.OBEX_HDR_USER + 1) | OBEXHeaderSetImpl.OBEX_BYTE, new Byte((byte)-1));
validateReadWrite(hs);
hs.setHeader((OBEXHeaderSetImpl.OBEX_HDR_USER + 2) | OBEXHeaderSetImpl.OBEX_BYTE, new Byte(Byte.MIN_VALUE));
validateReadWrite(hs);
hs.setHeader((OBEXHeaderSetImpl.OBEX_HDR_USER + 3) | OBEXHeaderSetImpl.OBEX_BYTE, new Byte(Byte.MAX_VALUE));
validateReadWrite(hs);
}
public void testHeaderByteArrayReadWrite() throws IOException {
HeaderSet hs = new OBEXHeaderSetImpl();
hs.setHeader(HeaderSet.HTTP, new byte[]{1, -1, 120, -7});
validateReadWrite(hs);
hs.setHeader(OBEXHeaderSetImpl.OBEX_HDR_USER | OBEXHeaderSetImpl.OBEX_BYTE_STREAM, new byte[]{-1, 0, -120, Byte.MAX_VALUE});
validateReadWrite(hs);
byte[] b = new byte[0xFAB8];
for (int i = 0; i < b.length; i++) {
b[i] = (byte)(i & 0xFF);
}
hs.setHeader(OBEXHeaderSetImpl.OBEX_HDR_USER + 1 | OBEXHeaderSetImpl.OBEX_BYTE_STREAM, b);
validateReadWrite(hs);
}
public void testHeaderIntReadWrite() throws IOException {
HeaderSet hs = new OBEXHeaderSetImpl();
hs.setHeader(HeaderSet.LENGTH, new Long(1));
validateReadWrite(hs);
hs.setHeader(HeaderSet.COUNT, new Long(0x12345678));
validateReadWrite(hs);
hs.setHeader(OBEXHeaderSetImpl.OBEX_HDR_USER | OBEXHeaderSetImpl.OBEX_INT, new Long(0xFAFBFCFDl));
validateReadWrite(hs);
}
public void testHeaderStringReadWrite() throws IOException {
HeaderSet hs = new OBEXHeaderSetImpl();
hs.setHeader(HeaderSet.NAME, "Jumar");
validateReadWrite(hs);
hs.setHeader(HeaderSet.TYPE, "text");
validateReadWrite(hs);
hs.setHeader(HeaderSet.DESCRIPTION, "");
validateReadWrite(hs);
// Build long string
StringBuffer s = new StringBuffer();
for(int i = 0; i < 256; i ++) {
s.append(i);
}
hs.setHeader(OBEXHeaderSetImpl.OBEX_HDR_USER | OBEXHeaderSetImpl.OBEX_STRING, s.toString());
validateReadWrite(hs);
}
public void testHeaderCalendarReadWrite() throws IOException {
HeaderSet hs = new OBEXHeaderSetImpl();
Calendar c = new GregorianCalendar();
c.setTime(new Date());
hs.setHeader(HeaderSet.TIME_4_BYTE, c);
validateReadWrite(hs);
c = new GregorianCalendar();
c.setTime(new Date());
hs.setHeader(HeaderSet.TIME_ISO_8601, c);
validateReadWrite(hs);
}
public static Date detectDateformat(String str) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
return format.parse(str);
}
public void testHeaderCalendarESTReadWrite() throws IOException, ParseException {
HeaderSet hs = new OBEXHeaderSetImpl();
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("EST"));
c.setTime(detectDateformat("2006-01-02 18:30:21"));
hs.setHeader(HeaderSet.TIME_4_BYTE, c);
validateReadWrite(hs);
c = Calendar.getInstance(TimeZone.getTimeZone("EST"));
c.setTime(detectDateformat("2005-03-27 11:15:01"));
hs.setHeader(HeaderSet.TIME_ISO_8601, c);
validateReadWrite(hs);
}
public void testHeaderCalendarESTDaylightReadWrite() throws IOException, ParseException {
HeaderSet hs = new OBEXHeaderSetImpl();
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("EST"));
c.setTime(detectDateformat("2006-07-02 18:30:21"));
hs.setHeader(HeaderSet.TIME_4_BYTE, c);
validateReadWrite(hs);
c = Calendar.getInstance(TimeZone.getTimeZone("EST"));
c.setTime(detectDateformat("2005-07-27 11:15:01"));
hs.setHeader(HeaderSet.TIME_ISO_8601, c);
validateReadWrite(hs);
}
public void testHeaderCalendarPSTReadWrite() throws IOException, ParseException {
HeaderSet hs = new OBEXHeaderSetImpl();
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("PST"));
c.setTime(detectDateformat("2006-01-02 18:30:21"));
hs.setHeader(HeaderSet.TIME_4_BYTE, c);
validateReadWrite(hs);
c = Calendar.getInstance(TimeZone.getTimeZone("PST"));
c.setTime(detectDateformat("2005-03-27 11:15:01"));
hs.setHeader(HeaderSet.TIME_ISO_8601, c);
validateReadWrite(hs);
}
public void testHeaderCalendarPSTDaylightReadWrite() throws IOException, ParseException {
HeaderSet hs = new OBEXHeaderSetImpl();
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("PST"));
c.setTime(detectDateformat("2006-07-02 18:30:21"));
hs.setHeader(HeaderSet.TIME_4_BYTE, c);
validateReadWrite(hs);
c = Calendar.getInstance(TimeZone.getTimeZone("PST"));
c.setTime(detectDateformat("2005-07-27 11:15:01"));
hs.setHeader(HeaderSet.TIME_ISO_8601, c);
validateReadWrite(hs);
}
public void testHeaderAllReadWrite() throws IOException {
HeaderSet hs = new OBEXHeaderSetImpl();
hs.setHeader(HeaderSet.NAME, "test.txt");
hs.setHeader(HeaderSet.TYPE, "text");
hs.setHeader(OBEXHeaderSetImpl.OBEX_HDR_USER | OBEXHeaderSetImpl.OBEX_INT, new Long(0xFAFBFCFDl));
hs.setHeader(HeaderSet.COUNT, new Long(0x12345678));
hs.setHeader(HeaderSet.LENGTH, new Long(1));
hs.setHeader((OBEXHeaderSetImpl.OBEX_HDR_USER + 1) | OBEXHeaderSetImpl.OBEX_BYTE, new Byte((byte)-1));
validateReadWrite(hs);
}
}