package com.nokia.mid.s40.codec; import java.io.IOException; import gnu.testlet.TestHarness; import gnu.testlet.Testlet; public class TestDataEncodeDecode implements Testlet { public int getExpectedPass() { return 92; } public int getExpectedFail() { return 0; } public int getExpectedKnownFail() { return 0; } void testString(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "event"); encoder.put(DataType.STRING, "name", "value"); encoder.putEnd(DataType.STRUCT, "event"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "event"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "name"); th.check(decoder.getType(), DataType.STRING); th.check(decoder.getString(DataType.STRING), "value"); decoder.getEnd(DataType.STRUCT); } void testMethod(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "event"); encoder.put(DataType.METHOD, "name", "value"); encoder.putEnd(DataType.STRUCT, "event"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "event"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "name"); th.check(decoder.getType(), DataType.METHOD); th.check(decoder.getString(DataType.METHOD), "value"); decoder.getEnd(DataType.STRUCT); } void testBoolean(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "event"); encoder.put(DataType.BOOLEAN, "val1", true); encoder.put(DataType.BOOLEAN, "val2", false); encoder.putEnd(DataType.STRUCT, "event"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "event"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "val1"); th.check(decoder.getType(), DataType.BOOLEAN); th.check(decoder.getBoolean()); th.check(decoder.getName(), "val2"); th.check(decoder.getType(), DataType.BOOLEAN); th.check(!decoder.getBoolean()); decoder.getEnd(DataType.STRUCT); } void testLong(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "event"); encoder.put(DataType.LONG, "l1", 42L); encoder.put(DataType.ULONG, "l2", 7L); encoder.putEnd(DataType.STRUCT, "event"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "event"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "l1"); th.check(decoder.getType(), DataType.LONG); th.check(decoder.getInteger(DataType.LONG), 42L); th.check(decoder.getName(), "l2"); th.check(decoder.getType(), DataType.ULONG); th.check(decoder.getInteger(DataType.ULONG), 7L); decoder.getEnd(DataType.STRUCT); } void testArray(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "event"); encoder.putStart(DataType.ARRAY, "array"); encoder.put(DataType.LONG, "l1", 42L); encoder.put(DataType.ULONG, "l2", 7L); encoder.putEnd(DataType.ARRAY, "array"); encoder.putEnd(DataType.STRUCT, "event"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "event"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "array"); th.check(decoder.getType(), DataType.ARRAY); decoder.getStart(DataType.ARRAY); th.check(decoder.getName(), "l1"); th.check(decoder.getType(), DataType.LONG); th.check(decoder.getInteger(DataType.LONG), 42L); th.check(decoder.getName(), "l2"); th.check(decoder.getType(), DataType.ULONG); th.check(decoder.getInteger(DataType.ULONG), 7L); decoder.getEnd(DataType.ARRAY); decoder.getEnd(DataType.STRUCT); } void testNested(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "struct1"); encoder.putStart(DataType.STRUCT, "struct2"); encoder.putStart(DataType.STRUCT, "struct3"); encoder.put(DataType.LONG, "value", 42L); encoder.putEnd(DataType.STRUCT, "struct3"); encoder.putEnd(DataType.STRUCT, "struct2"); encoder.putEnd(DataType.STRUCT, "struct1"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "struct1"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "struct2"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "struct3"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "value"); th.check(decoder.getType(), DataType.LONG); th.check(decoder.getInteger(DataType.LONG), 42L); decoder.getEnd(DataType.STRUCT); decoder.getEnd(DataType.STRUCT); decoder.getEnd(DataType.STRUCT); } void testList(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "event"); encoder.putStart(DataType.LIST, "list"); encoder.put(DataType.STRING, "str1", "val1"); encoder.put(DataType.STRING, "str2", "val2"); encoder.putEnd(DataType.LIST, "list"); encoder.putEnd(DataType.STRUCT, "event"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "event"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "list"); th.check(decoder.getType(), DataType.LIST); decoder.getStart(DataType.LIST); th.check(decoder.listHasMoreItems()); th.check(decoder.listHasMoreItems()); th.check(decoder.listHasMoreItems()); th.check(decoder.getName(), "str1"); th.check(decoder.getType(), DataType.STRING); th.check(decoder.getString(DataType.STRING), "val1"); th.check(decoder.listHasMoreItems()); th.check(decoder.getName(), "str2"); th.check(decoder.getType(), DataType.STRING); th.check(decoder.getString(DataType.STRING), "val2"); th.check(!decoder.listHasMoreItems()); decoder.getEnd(DataType.LIST); decoder.getEnd(DataType.STRUCT); } void testMissingSimple(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "event"); encoder.putStart(DataType.ARRAY, "arr"); encoder.put(DataType.STRING, "str1", "val1"); encoder.putEnd(DataType.ARRAY, "arr"); encoder.putEnd(DataType.STRUCT, "event"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "event"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "arr"); th.check(decoder.getType(), DataType.ARRAY); decoder.getStart(DataType.ARRAY); th.check(decoder.getName(), "str1"); th.check(decoder.getType(), DataType.STRING); th.check(decoder.getString(DataType.STRING), "val1"); try { decoder.getString(DataType.STRING); th.fail("Exception expected"); } catch (IOException e) { th.check(e.getMessage(), "tag (" + DataType.STRING + ") invalid"); } try { decoder.getInteger(DataType.ULONG); th.fail("Exception expected"); } catch (IOException e) { th.check(e.getMessage(), "tag (" + DataType.ULONG + ") invalid"); } decoder.getEnd(DataType.ARRAY); decoder.getEnd(DataType.STRUCT); } void testMissingStartEnd(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "event"); encoder.put(DataType.STRING, "str1", "val1"); encoder.putEnd(DataType.STRUCT, "event"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "event"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); try { decoder.getStart(DataType.ARRAY); th.fail("Exception expected"); } catch (IOException e) { th.check(e.getMessage(), "no start found " + DataType.ARRAY); } try { decoder.getStart(DataType.STRUCT); th.fail("Exception expected"); } catch (IOException e) { th.check(e.getMessage(), "no start found " + DataType.STRUCT); } try { decoder.getEnd(DataType.ARRAY); th.fail("Exception expected"); } catch (IOException e) { th.check(e.getMessage(), "no end found " + DataType.ARRAY); } th.check(decoder.getName(), "str1"); th.check(decoder.getType(), DataType.STRING); th.check(decoder.getString(DataType.STRING), "val1"); decoder.getEnd(DataType.STRUCT); try { decoder.getEnd(DataType.ARRAY); th.fail("Exception expected"); } catch (IOException e) { th.check(e.getMessage(), "no end found " + DataType.ARRAY); } } void testEndTooLate(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "event"); encoder.putStart(DataType.ARRAY, "array"); encoder.put(DataType.STRING, "str1", "val1"); encoder.putEnd(DataType.STRUCT, "event"); encoder.putEnd(DataType.ARRAY, "array"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "event"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); th.check(decoder.getName(), "array"); th.check(decoder.getType(), DataType.ARRAY); decoder.getStart(DataType.ARRAY); try { decoder.getEnd(DataType.ARRAY); th.fail("Exception expected"); } catch (IOException e) { th.check(e.getMessage(), "no end found " + DataType.ARRAY); } th.check(decoder.getName(), "str1"); th.check(decoder.getType(), DataType.STRING); th.check(decoder.getString(DataType.STRING), "val1"); try { decoder.getEnd(DataType.STRUCT); } catch (IOException e) { th.check(e.getMessage(), "no end found " + DataType.STRUCT); } } void testSkipOver(TestHarness th) throws IOException { DataEncoder encoder = new DataEncoder("whatever"); encoder.putStart(DataType.STRUCT, "event"); encoder.putStart(DataType.ARRAY, "array"); encoder.put(DataType.STRING, "str1", "val1"); encoder.put(DataType.STRING, "str2", "val2"); encoder.put(DataType.STRING, "str3", "val3"); encoder.putEnd(DataType.ARRAY, "array"); encoder.put(DataType.STRING, "str4", "val4"); encoder.putEnd(DataType.STRUCT, "event"); byte[] data = encoder.getData(); DataDecoder decoder = new DataDecoder("whatever", data, 0, data.length); th.check(decoder.getName(), "event"); th.check(decoder.getType(), DataType.STRUCT); decoder.getStart(DataType.STRUCT); decoder.getStart(DataType.ARRAY); decoder.getEnd(DataType.ARRAY); th.check(decoder.getName(), "str4"); th.check(decoder.getType(), DataType.STRING); th.check(decoder.getString(DataType.STRING), "val4"); decoder.getEnd(DataType.STRUCT); } public void test(TestHarness th) { try { testString(th); testMethod(th); testBoolean(th); testLong(th); testArray(th); testNested(th); testList(th); testMissingSimple(th); testMissingStartEnd(th); testEndTooLate(th); testSkipOver(th); } catch (Exception e) { th.fail("Unexpected exception: " + e); e.printStackTrace(); } } }