package org.mozilla.io; import java.io.*; import javax.microedition.io.*; import com.nokia.mid.s40.io.LocalMessageProtocolMessage; import com.nokia.mid.s40.io.LocalMessageProtocolConnection; import com.nokia.mid.s40.codec.DataEncoder; import com.nokia.mid.s40.codec.DataDecoder; import gnu.testlet.TestHarness; import gnu.testlet.Testlet; public class TestNokiaContactsServer implements Testlet { public int getExpectedPass() { return 87; } public int getExpectedFail() { return 0; } public int getExpectedKnownFail() { return 0; } LocalMessageProtocolConnection client; static final String PROTO_NAME = "nokia.contacts"; public void testProtocolVersion(TestHarness th) throws IOException { DataEncoder dataEncoder = new DataEncoder("Conv-BEB"); dataEncoder.putStart(14, "event"); dataEncoder.put(13, "name", "Common"); dataEncoder.putStart(14, "message"); dataEncoder.put(13, "name", "ProtocolVersion"); dataEncoder.put(10, "version", "2.[0-10]"); dataEncoder.putEnd(14, "message"); dataEncoder.putEnd(14, "event"); byte[] sendData = dataEncoder.getData(); client.send(sendData, 0, sendData.length); LocalMessageProtocolMessage msg = client.newMessage(null); client.receive(msg); byte[] clientData = msg.getData(); DataDecoder dataDecoder = new DataDecoder("Conv-BEB", clientData, 0, clientData.length); dataDecoder.getStart(14); String name = dataDecoder.getString(13); th.check(name, "Common"); th.check(dataDecoder.getName(), "message"); dataDecoder.getStart(14); String string2 = dataDecoder.getString(13); String string = string2 + ":" + dataDecoder.getString(10); dataDecoder.getEnd(14); th.check(string.startsWith("ProtocolVersion:")); th.check(string.indexOf(58) + 1 != -1); th.check(string.substring(string.indexOf(58) + 1).length() > 0); } public void testNotifySubscribe(TestHarness th) throws IOException { DataEncoder dataEncoder = new DataEncoder("Conv-BEB"); dataEncoder.putStart(14, "event"); dataEncoder.put(13, "name", "NotifySubscribe"); dataEncoder.put(7, "trans_id", System.currentTimeMillis()); dataEncoder.putEnd(14, "event"); byte[] sendData = dataEncoder.getData(); client.send(sendData, 0, sendData.length); LocalMessageProtocolMessage msg = client.newMessage(null); client.receive(msg); byte[] clientData = msg.getData(); DataDecoder dataDecoder = new DataDecoder("Conv-BEB", clientData, 0, clientData.length); dataDecoder.getStart(14); th.check(dataDecoder.getString(13), "Notify"); dataDecoder.getInteger(7); byte by = (byte)dataDecoder.getInteger(2); th.check(by == 1 || by == 2 || by == 3); // We should understand the meaning of this byte th.check(dataDecoder.getName(), "Contact"); dataDecoder.getStart(15); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "ContactID"); // mozContact.id th.check(dataDecoder.getString(11).length() > 0); // The following commented out tests are meant for future reference. // This is all the data that we've seen requested by MIDlets to the // nokia.contacts server. //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "FirstName"); // mozContact.givenName [array] //th.check(dataDecoder.getString(11), "Test"); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "LastName"); // mozContact.familyName [array] //th.check(dataDecoder.getString(11), "Contact"); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "NickName"); // mozContact.nickname [array] //th.check(dataDecoder.getString(11), ""); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "DisplayName"); // mozContact.name [array] th.check(dataDecoder.getString(11), "Test Contact 1"); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Title"); // mozContact.jobTitle [array] //th.check(dataDecoder.getString(11), ""); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Company"); // mozContact.org [array] //th.check(dataDecoder.getString(11), ""); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Notes"); // mozContact.note [array] //th.check(dataDecoder.getString(11), ""); // groupnames (???) th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "Numbers"); // mozContact.tel [array] dataDecoder.getStart(16); dataDecoder.getStart(15); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "Number"); th.check(dataDecoder.getString(11), "+16505550100"); th.check(!dataDecoder.listHasMoreItems()); dataDecoder.getEnd(15); dataDecoder.getStart(15); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "Number"); th.check(dataDecoder.getString(11), "+16505550101"); th.check(!dataDecoder.listHasMoreItems()); dataDecoder.getEnd(15); try { dataDecoder.getStart(15); } catch (IOException e) { th.check(e.getMessage(), "no start found 15"); } dataDecoder.getEnd(16); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "DefaultNumber"); // mozContact.tel [array] // get default numbers //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "DefaultEmail"); // mozContact.email [array] //th.check(dataDecoder.getString(11), ""); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Emails"); // mozContact.email [array] // get emails // source (???) // pictureurl (???) // mozContact.url [array] //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "WebURL"); // mozContact.url [array] //th.check(dataDecoder.getString(11), ""); // ringtoneurl (???) // animatedtoneurl (???) //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "PostalAddresses"); // mozContact.adr [array] // get postal addresses //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "OtherAddresses"); // mozContact.adr [array] // get other addresses //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Birthday"); // mozContact.bday // get birthday //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Anniversary"); // mozContact.anniversary // get anniversary // imaddresses (mozContact.impp [array]) //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "IMAddresses"); // mozContact.impp [array] // get IM addresses dataDecoder.getEnd(15); msg = client.newMessage(null); client.receive(msg); msg = client.newMessage(null); client.receive(msg); } public void testGetFirst(TestHarness th) throws IOException { DataEncoder dataEncoder = new DataEncoder("Conv-BEB"); dataEncoder.putStart(14, "event"); dataEncoder.put(13, "name", "getFirst"); dataEncoder.put(7, "trans_id", 42L); dataEncoder.putStart(16, "sources"); dataEncoder.put(7, "source", 1L); dataEncoder.put(7, "source", 2L); dataEncoder.putEnd(16, "sources"); dataEncoder.put(7, "numEntries", 1L); dataEncoder.putStart(15, "filter"); dataEncoder.putEnd(15, "filter"); dataEncoder.putEnd(14, "event"); byte[] sendData = dataEncoder.getData(); client.send(sendData, 0, sendData.length); LocalMessageProtocolMessage msg = client.newMessage(null); client.receive(msg); byte[] clientData = msg.getData(); DataDecoder dataDecoder = new DataDecoder("Conv-BEB", clientData, 0, clientData.length); dataDecoder.getStart(14); th.check(dataDecoder.getString(13), "getFirst"); dataDecoder.getInteger(7); th.check(dataDecoder.getString(10).toLowerCase(), "ok"); dataDecoder.getStart(16); th.check(dataDecoder.getName(), "Contact"); dataDecoder.getStart(15); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "ContactID"); // mozContact.id th.check(dataDecoder.getString(11).length() > 0); // The following commented out tests are meant for future reference. // This is all the data that we've seen requested by MIDlets to the // nokia.contacts server. //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "FirstName"); // mozContact.givenName [array] //th.check(dataDecoder.getString(11), "Test"); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "LastName"); // mozContact.familyName [array] //th.check(dataDecoder.getString(11), "Contact"); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "NickName"); // mozContact.nickname [array] //th.check(dataDecoder.getString(11), ""); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "DisplayName"); // mozContact.name [array] th.check(dataDecoder.getString(11), "Test Contact 1"); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Title"); // mozContact.jobTitle [array] //th.check(dataDecoder.getString(11), ""); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Company"); // mozContact.org [array] //th.check(dataDecoder.getString(11), ""); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Notes"); // mozContact.note [array] //th.check(dataDecoder.getString(11), ""); // groupnames (???) th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "Numbers"); // mozContact.tel [array] dataDecoder.getStart(16); dataDecoder.getStart(15); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "Number"); th.check(dataDecoder.getString(11), "+16505550100"); th.check(!dataDecoder.listHasMoreItems()); dataDecoder.getEnd(15); dataDecoder.getStart(15); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "Number"); th.check(dataDecoder.getString(11), "+16505550101"); th.check(!dataDecoder.listHasMoreItems()); dataDecoder.getEnd(15); try { dataDecoder.getStart(15); } catch (IOException e) { th.check(e.getMessage(), "no start found 15"); } dataDecoder.getEnd(16); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "DefaultNumber"); // mozContact.tel [array] // get default numbers //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "DefaultEmail"); // mozContact.email [array] //th.check(dataDecoder.getString(11), ""); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Emails"); // mozContact.email [array] // get emails // source (???) // pictureurl (???) // mozContact.url [array] //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "WebURL"); // mozContact.url [array] //th.check(dataDecoder.getString(11), ""); // ringtoneurl (???) // animatedtoneurl (???) //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "PostalAddresses"); // mozContact.adr [array] // get postal addresses //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "OtherAddresses"); // mozContact.adr [array] // get other addresses //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Birthday"); // mozContact.bday // get birthday //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Anniversary"); // mozContact.anniversary // get anniversary // imaddresses (mozContact.impp [array]) //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "IMAddresses"); // mozContact.impp [array] // get IM addresses dataDecoder.getEnd(15); dataDecoder.getEnd(16); } public void testGetNext(TestHarness th, int prevContactID, String displayName, String number1, String number2) throws IOException { DataEncoder dataEncoder = new DataEncoder("Conv-BEB"); dataEncoder.putStart(14, "event"); dataEncoder.put(13, "name", "getNext"); dataEncoder.put(7, "trans_id", 42L); dataEncoder.putStart(16, "sources"); dataEncoder.put(7, "source", 1L); dataEncoder.put(7, "source", 2L); dataEncoder.putEnd(16, "sources"); dataEncoder.putStart(15, "startEntry"); dataEncoder.put(11, "contactID", prevContactID); dataEncoder.putEnd(15, "startEntry"); dataEncoder.putStart(15, "filter"); dataEncoder.putEnd(15, "filter"); dataEncoder.put(0, "includeStartEntry", false); dataEncoder.put(7, "numEntries", 1L); dataEncoder.putEnd(14, "event"); byte[] sendData = dataEncoder.getData(); client.send(sendData, 0, sendData.length); LocalMessageProtocolMessage msg = client.newMessage(null); client.receive(msg); byte[] clientData = msg.getData(); DataDecoder dataDecoder = new DataDecoder("Conv-BEB", clientData, 0, clientData.length); dataDecoder.getStart(14); th.check(dataDecoder.getString(13), "getNext"); dataDecoder.getInteger(7); th.check(dataDecoder.getString(10).toLowerCase(), "ok"); dataDecoder.getStart(16); th.check(dataDecoder.getName(), "Contact"); dataDecoder.getStart(15); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "ContactID"); // mozContact.id th.check(dataDecoder.getString(11).length() > 0); // The following commented out tests are meant for future reference. // This is all the data that we've seen requested by MIDlets to the // nokia.contacts server. //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "FirstName"); // mozContact.givenName [array] //th.check(dataDecoder.getString(11), "Test"); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "LastName"); // mozContact.familyName [array] //th.check(dataDecoder.getString(11), "Contact"); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "NickName"); // mozContact.nickname [array] //th.check(dataDecoder.getString(11), ""); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "DisplayName"); // mozContact.name [array] th.check(dataDecoder.getString(11), displayName); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Title"); // mozContact.jobTitle [array] //th.check(dataDecoder.getString(11), ""); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Company"); // mozContact.org [array] //th.check(dataDecoder.getString(11), ""); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Notes"); // mozContact.note [array] //th.check(dataDecoder.getString(11), ""); // groupnames (???) th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "Numbers"); // mozContact.tel [array] dataDecoder.getStart(16); dataDecoder.getStart(15); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "Number"); th.check(dataDecoder.getString(11), number1); th.check(!dataDecoder.listHasMoreItems()); dataDecoder.getEnd(15); dataDecoder.getStart(15); th.check(dataDecoder.listHasMoreItems()); th.check(dataDecoder.getName(), "Number"); th.check(dataDecoder.getString(11), number2); th.check(!dataDecoder.listHasMoreItems()); dataDecoder.getEnd(15); try { dataDecoder.getStart(15); } catch (IOException e) { th.check(e.getMessage(), "no start found 15"); } dataDecoder.getEnd(16); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "DefaultNumber"); // mozContact.tel [array] // get default numbers //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "DefaultEmail"); // mozContact.email [array] //th.check(dataDecoder.getString(11), ""); //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Emails"); // mozContact.email [array] // get emails // source (???) // pictureurl (???) // mozContact.url [array] //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "WebURL"); // mozContact.url [array] //th.check(dataDecoder.getString(11), ""); // ringtoneurl (???) // animatedtoneurl (???) //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "PostalAddresses"); // mozContact.adr [array] // get postal addresses //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "OtherAddresses"); // mozContact.adr [array] // get other addresses //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Birthday"); // mozContact.bday // get birthday //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "Anniversary"); // mozContact.anniversary // get anniversary // imaddresses (mozContact.impp [array]) //th.check(dataDecoder.listHasMoreItems()); //th.check(dataDecoder.getName(), "IMAddresses"); // mozContact.impp [array] // get IM addresses dataDecoder.getEnd(15); dataDecoder.getEnd(16); } public void testGetNextNoEntry(TestHarness th) throws IOException { DataEncoder dataEncoder = new DataEncoder("Conv-BEB"); dataEncoder.putStart(14, "event"); dataEncoder.put(13, "name", "getNext"); dataEncoder.put(7, "trans_id", 42L); dataEncoder.putStart(16, "sources"); dataEncoder.put(7, "source", 1L); dataEncoder.put(7, "source", 2L); dataEncoder.putEnd(16, "sources"); dataEncoder.putStart(15, "startEntry"); dataEncoder.put(11, "contactID", 2); dataEncoder.putEnd(15, "startEntry"); dataEncoder.putStart(15, "filter"); dataEncoder.putEnd(15, "filter"); dataEncoder.put(0, "includeStartEntry", false); dataEncoder.put(7, "numEntries", 1L); dataEncoder.putEnd(14, "event"); byte[] sendData = dataEncoder.getData(); client.send(sendData, 0, sendData.length); LocalMessageProtocolMessage msg = client.newMessage(null); client.receive(msg); byte[] clientData = msg.getData(); DataDecoder dataDecoder = new DataDecoder("Conv-BEB", clientData, 0, clientData.length); dataDecoder.getStart(14); th.check(dataDecoder.getString(13), "getNext"); dataDecoder.getInteger(7); th.check(dataDecoder.getString(10).toLowerCase(), "entry not found"); } public void test(TestHarness th) { try { client = (LocalMessageProtocolConnection)Connector.open("localmsg://"+PROTO_NAME); testProtocolVersion(th); testNotifySubscribe(th); testGetFirst(th); testGetNext(th, 1, "Test Contact 2", "+16505550102", "+16505550103"); testGetNext(th, 2, "Test Contact 5", "+16505550104", "+16505550105"); testGetNextNoEntry(th); client.close(); } catch (IOException ioe) { th.fail("Unexpected exception"); ioe.printStackTrace(); } } }