/* * Copyright (C) 2007 Esmertec AG. * Copyright (C) 2007 The Android Open Source Project * * Licensed 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. */ #include <embUnit.h> #include <stdlib.h> #include <string.h> #include "wbxml_parser.h" #define DEFINE_TEST(test) \ new_TestFixture(#test, test) #define ASSERT_EQUAL_INT(expected, actual) \ { \ int tmp = actual; /* avoid duplicated evaluation in TEST_ASSERT_EQUAL_INT */ \ TEST_ASSERT_EQUAL_INT(expected, tmp); \ } /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.wireless-village.org/CSP1.1"></WV-CSP-Message> */ static const char simple_wbxml[] = { 0x03, 0x10, 0x6a, 0x00, 0xc9, 0x05, 0x03, 0x31, 0x2e, 0x31, 0x00, 0x01, 0x01 }; /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.wireless-village.org/CSP1.1" /> */ static const char simple_nocontent_wbxml[] = { 0x03, 0x10, 0x6a, 0x00, 0x89, 0x05, 0x03, 0x31, 0x2e, 0x31, 0x00, 0x01 }; /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.wireless-village.org/CSP1.1"> <Session></Session> </WV-CSP-Message> */ static const char simple2_wbxml[] = { 0x03, 0x10, 0x6a, 0x00, 0xc9, 0x05, 0x03, 0x31, 0x2e, 0x31, 0x00, 0x01, 0x6d, 0x01, 0x01 }; /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.wireless-village.org/CSP1.1"> <Session> <SessionDescriptor> <SessionType>Outband</SessionType> </SessionDescriptor> </Session> </WV-CSP-Message> */ static const char simple3_wbxml[] = { 0x03, 0x10, 0x6a, 0x00, 0xc9, 0x05, 0x03, 0x31, 0x2e, 0x31, 0x00, 0x01, 0x6d, 0x6e, 0x70, 0x80, 0x19, 0x01, 0x01, 0x01, 0x01 }; /* A STR_I (the '0x03' after '0x70') without ending '\0' */ static const char incomplete_str_i_wbxml[] = { 0x03, 0x10, 0x6a, 0x00, 0xc9, 0x05, 0x03, 0x31, 0x2e, 0x31, 0x00, 0x01, 0x6d, 0x6e, 0x70, 0x03, 0x44, 0x55, 0x66, 0x01, 0x01, 0x01, 0x01 }; /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.wireless-village.org/CSP1.1"> <Session> <SessionDescriptor> <SessionType></SessionType> </SessionDescriptor> </Session> </WV-CSP-Message> */ /*  = U+10ffff = mb_u_int32 C3 ff 7f */ static const char big_entity_wbxml[] = { 0x03, 0x10, 0x6a, 0x00, 0xc9, 0x05, 0x03, 0x31, 0x2e, 0x31, 0x00, 0x01, 0x6d, 0x6e, 0x70, 0x02, 0xc3, 0xff, 0x7f, 0x01, 0x01, 0x01, 0x01 }; /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.wireless-village.org/CSP1.1"> <Session> <SessionDescriptor> <SessionType>�</SessionType> </SessionDescriptor> </Session> </WV-CSP-Message> */ /* � = 0x110000 = mb_u_int32 C4 80 00 */ static const char invalid_entity_wbxml[] = { 0x03, 0x10, 0x6a, 0x00, 0xc9, 0x05, 0x03, 0x31, 0x2e, 0x31, 0x00, 0x01, 0x6d, 0x6e, 0x70, 0x02, 0xc4, 0x80, 0x00, 0x01, 0x01, 0x01, 0x01 }; /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.wireless-village.org/CSP1.1"> <Session> <SessionDescriptor> <SessionType>Outband</SessionType> </SessionDescriptor> <Transaction> <TransactionDescriptor> <TransactionMode>Response</TransactionMode> <TransactionID>transId1</TransactionID> </TransactionDescriptor> <TransactionContent xmlns="http://www.wireless-village.org/TRC1.1"> <Login-Response> <ClientID>Esmertec112233</ClientID> <Result> <Code>401</Code> <Description>Please complete authentication challenge</Description> </Result> <Nonce>e6b68ebd81309d538357e39e2fba3204</Nonce> <DigestSchema>MD5</DigestSchema> <CapabilityRequest>F</CapabilityRequest> </Login-Response> </TransactionContent> </Transaction> </Session> </WV-CSP-Message> */ static const char loginresponse_wbxml[] = { 0x03, 0x10, 0x6a, 0x00, 0xc9, 0x05, 0x03, 0x31, 0x2e, 0x31, 0x00, 0x01, 0x6d, 0x6e, 0x70, 0x80, 0x19, 0x01, 0x01, 0x72, 0x74, 0x76, 0x80, 0x21, 0x01, 0x75, 0x03, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x49, 0x64, 0x31, 0x00, 0x01, 0x01, 0xf3, 0x07, 0x03, 0x31, 0x2e, 0x31, 0x00, 0x01, 0x00, 0x01, 0x5e, 0x00, 0x00, 0x4a, 0x03, 0x45, 0x73, 0x6d, 0x65, 0x72, 0x74, 0x65, 0x63, 0x31, 0x31, 0x32, 0x32, 0x33, 0x33, 0x00, 0x01, 0x6a, 0x4b, 0x03, 0x34, 0x30, 0x31, 0x00, 0x01, 0x52, 0x03, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x00, 0x01, 0x01, 0x00, 0x01, 0x60, 0x03, 0x65, 0x36, 0x62, 0x36, 0x38, 0x65, 0x62, 0x64, 0x38, 0x31, 0x33, 0x30, 0x39, 0x64, 0x35, 0x33, 0x38, 0x33, 0x35, 0x37, 0x65, 0x33, 0x39, 0x65, 0x32, 0x66, 0x62, 0x61, 0x33, 0x32, 0x30, 0x34, 0x00, 0x01, 0x4f, 0x03, 0x4d, 0x44, 0x35, 0x00, 0x01, 0x4b, 0x80, 0x0b, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }; /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.openmobilealliance.org/DTD/IMPS-CSP1.3"> <Session> <SessionDescriptor> <SessionType>Inband</SessionType> <SessionID>im.user.com#48815@server.com</SessionID> </SessionDescriptor> <Transaction> <TransactionDescriptor> <TransactionMode>Response</TransactionMode> <TransactionID>IMApp01#12345@NOK5110</TransactionID> </TransactionDescriptor> <TransactionContent xmlns="http://www.openmobilealliance.org/DTD/IMPS-TRC1.3"> <Status> <Result> <Code>201</Code> <Description>Partially successful.</Description> <DetailedResult> <Code>531</Code> <Description>Unknown user.</Description> <UserID>wv:bad_user1@im.com</UserID> <UserID>wv:bad_user2@im.com</UserID> </DetailedResult> <DetailedResult> <Code>532</Code> <Description>Blocked.</Description> <UserID>wv:bad_user3@im.com</UserID> <UserID>wv:bad_user4@im.com</UserID> </DetailedResult> </Result> </Status> </TransactionContent> </Transaction> <Poll>F</Poll> </Session> </WV-CSP-Message> */ static const char statusprim_wbxml[] = { 0x03, 0x12, 0x6a, 0x00, 0xc9, 0x0b, 0x03, 0x31, 0x2e, 0x33, 0x00, 0x01, 0x6d, 0x6e, 0x70, 0x80, 0x11, 0x01, 0x6f, 0x03, 0x69, 0x6d, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x23, 0x34, 0x38, 0x38, 0x31, 0x35, 0x40, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x01, 0x01, 0x72, 0x74, 0x76, 0x80, 0x21, 0x01, 0x75, 0x03, 0x49, 0x4d, 0x41, 0x70, 0x70, 0x30, 0x31, 0x23, 0x31, 0x32, 0x33, 0x34, 0x35, 0x40, 0x4e, 0x4f, 0x4b, 0x35, 0x31, 0x31, 0x30, 0x00, 0x01, 0x01, 0xf3, 0x0d, 0x03, 0x31, 0x2e, 0x33, 0x00, 0x01, 0x71, 0x6a, 0x4b, 0xc3, 0x01, 0xc9, 0x01, 0x52, 0x03, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x2e, 0x00, 0x01, 0x53, 0x4b, 0xc3, 0x02, 0x02, 0x13, 0x01, 0x52, 0x03, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x00, 0x01, 0x7a, 0x03, 0x77, 0x76, 0x3a, 0x62, 0x61, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x31, 0x40, 0x69, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x01, 0x7a, 0x03, 0x77, 0x76, 0x3a, 0x62, 0x61, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x32, 0x40, 0x69, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x01, 0x01, 0x53, 0x4b, 0xc3, 0x02, 0x02, 0x14, 0x01, 0x52, 0x03, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x2e, 0x00, 0x01, 0x7a, 0x03, 0x77, 0x76, 0x3a, 0x62, 0x61, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x33, 0x40, 0x69, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x01, 0x7a, 0x03, 0x77, 0x76, 0x3a, 0x62, 0x61, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x34, 0x40, 0x69, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x61, 0x80, 0x0b, 0x01, 0x01, 0x01, }; /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"> <Session> <SessionDescriptor> <SessionType>Inband</SessionType> <SessionID>AA0BD762.00000000.test1</SessionID> </SessionDescriptor> <Transaction> <TransactionDescriptor> <TransactionMode>Request</TransactionMode> <TransactionID>transId8</TransactionID> </TransactionDescriptor> <TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"> <SendMessage-Request> <DeliveryReport>T</DeliveryReport> <MessageInfo> <Recipient> <User> <UserID>wv:test2</UserID> </User> </Recipient> <Sender> <User> <UserID>wv:test1</UserID> </User> </Sender> <DateTime>20070625T055652Z</DateTime> <ContentSize>5</ContentSize> </MessageInfo> <ContentData>Today  Today</ContentData> </SendMessage-Request> </TransactionContent> </Transaction> </Session> </WV-CSP-Message> */ static const char sendmsgreq1_wbxml[] = { 0x03, 0x10, 0x6a, 0x00, 0xc9, 0x08, 0x03, 0x31, 0x2e, 0x32, 0x00, 0x01, 0x6d, 0x6e, 0x70, 0x80, 0x11, 0x01, 0x6f, 0x03, 0x41, 0x41, 0x30, 0x42, 0x44, 0x37, 0x36, 0x32, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x31, 0x00, 0x01, 0x01, 0x72, 0x74, 0x76, 0x80, 0x20, 0x01, 0x75, 0x03, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x49, 0x64, 0x38, 0x00, 0x01, 0x01, 0xf3, 0x0a, 0x03, 0x31, 0x2e, 0x32, 0x00, 0x01, 0x00, 0x06, 0x57, 0x48, 0x80, 0x2c, 0x01, 0x53, 0x00, 0x00, 0x67, 0x79, 0x7a, 0x03, 0x77, 0x76, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x32, 0x00, 0x01, 0x01, 0x01, 0x6c, 0x79, 0x7a, 0x03, 0x77, 0x76, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x31, 0x00, 0x01, 0x01, 0x01, 0x51, 0x03, 0x32, 0x30, 0x30, 0x37, 0x30, 0x36, 0x32, 0x35, 0x54, 0x30, 0x35, 0x35, 0x36, 0x35, 0x32, 0x5a, 0x00, 0x01, 0x4f, 0xc3, 0x01, 0x05, 0x01, 0x01, 0x4d, 0x03, 0x54, 0x6f, 0x64, 0x61, 0x79, 0x20, 0x00, 0x02, 0x81, 0x20, 0x03, 0x54, 0x6f, 0x64, 0x61, 0x79, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }; /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.openmobilealliance.org/DTD/WV-CSP1.2"> <Session> <SessionDescriptor> <SessionType>Inband</SessionType> <SessionID>196FE717.00000000.test1</SessionID> </SessionDescriptor> <Transaction> <TransactionDescriptor> <TransactionMode>Request</TransactionMode> <TransactionID>transId2</TransactionID> </TransactionDescriptor> <TransactionContent xmlns="http://www.openmobilealliance.org/DTD/WV-TRC1.2"> <ClientCapability-Request> <CapabilityList> <ClientType>MOBILE_PHONE</ClientType> <ParserSize>32767</ParserSize> <MultiTrans>1</MultiTrans> <InitialDeliveryMethod>P</InitialDeliveryMethod> <ServerPollMin>2</ServerPollMin> <SupportedBearer>HTTP</SupportedBearer> <SupportedCIRMethod>STCP</SupportedCIRMethod> <SupportedCIRMethod>SHTTP</SupportedCIRMethod> <SupportedCIRMethod>SSMS</SupportedCIRMethod> </CapabilityList> </ClientCapability-Request> </TransactionContent> </Transaction> </Session> </WV-CSP-Message> */ static const char cap_request_wbxml[] = { 0x03, 0x11, 0x6a, 0x00, 0xc9, 0x08, 0x03, 0x31, 0x2e, 0x32, 0x00, 0x01, 0x6d, 0x6e, 0x70, 0x80, 0x11, 0x01, 0x6f, 0x03, 0x31, 0x39, 0x36, 0x46, 0x45, 0x37, 0x31, 0x37, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x31, 0x00, 0x01, 0x01, 0x72, 0x74, 0x76, 0x80, 0x20, 0x01, 0x75, 0x03, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x49, 0x64, 0x32, 0x00, 0x01, 0x01, 0xf3, 0x0a, 0x03, 0x31, 0x2e, 0x32, 0x00, 0x01, 0x00, 0x01, 0x4c, 0x4a, 0x00, 0x05, 0x4f, 0x80, 0x6f, 0x01, 0x00, 0x03, 0x4d, 0xc3, 0x02, 0x7f, 0xff, 0x01, 0x4c, 0xc3, 0x01, 0x01, 0x01, 0x4b, 0x80, 0x1f, 0x01, 0x4e, 0xc3, 0x01, 0x02, 0x01, 0x4f, 0x80, 0x42, 0x01, 0x50, 0x80, 0x44, 0x01, 0x50, 0x80, 0x81, 0x25, 0x01, 0x50, 0x80, 0x81, 0x24, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, }; /* <?xml version="1.0" encoding="UTF-8" ?> <WV-CSP-Message xmlns="http://www.wireless-village.org/CSP1.1"> <sometag> <Session> <someMoreTag/> </Session> </sometag> <metag attr="sometag"/> <tag movie="transformer"></tag> </WV-CSP-Message> */ static const char literal_wbxml[] = { 0x03, 0x10, 0x6a, 0x29, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x00, 0x73, 0x6f, 0x6d, 0x65, 0x4d, 0x6f, 0x72, 0x65, 0x54, 0x61, 0x67, 0x00, 0x6d, 0x65, 0x74, 0x61, 0x67, 0x00, 0x61, 0x74, 0x74, 0x72, 0x00, 0x74, 0x61, 0x67, 0x00, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x00, 0xc9, 0x05, 0x03, 0x31, 0x2e, 0x31, 0x00, 0x01, 0x44, 0x00, 0x6d, 0x04, 0x08, 0x01, 0x01, 0x84, 0x14, 0x04, 0x1a, 0x83, 0x00, 0x01, 0x84, 0x1f, 0x04, 0x23, 0x03, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x00, 0x01, 0x01 }; class SimpleTestHandler: public DefaultWbxmlContentHandler { public: void startElement(const char *name, const vector<Attribute> & attribs) { startElemName = name; this->attribs = attribs; } void endElement(const char *name) { endElemName = name; } string startElemName; string endElemName; vector<Attribute> attribs; }; struct DomElement { DomElement() { intVal = 0; } string name; vector<Attribute> attribs; vector<DomElement> children; string characters; uint32_t intVal; }; class DomTestHandler: public DefaultWbxmlContentHandler { public: DomTestHandler() { currentElement = NULL; } void startElement(const char *name, const vector<Attribute> & attribs) { if (!currentElement) { currentElement = &root; currentElement->name = name; currentElement->attribs = attribs; } else { DomElement child; child.name = name; child.attribs = attribs; currentElement->children.push_back(child); elemStack.push_back(currentElement); currentElement = &(currentElement->children.back()); } } void endElement(const char *name) { TEST_ASSERT_EQUAL_STRING(name, currentElement->name.c_str()); TEST_ASSERT((currentElement == &root) ? !elemStack.size() : elemStack.size() > 0); if (elemStack.size()) { currentElement = elemStack.back(); elemStack.pop_back(); } } void characters(const char * data, int len) { string s(data, len); currentElement->characters.append(data, len); } void opaque(const char * data, int len) { if (currentElement->name == "Code") { while (len--) { currentElement->intVal <<= 8; currentElement->intVal |= (unsigned char)*data; data++; } } } DomElement root; private: vector<DomElement *> elemStack; DomElement *currentElement; }; static void setUp(void) { } static void tearDown(void) { } static void testSimpleCspRet(void) { WbxmlParser parser(0); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(simple_wbxml, sizeof(simple_wbxml), true)); } static void testSimpleCspPublicId(void) { WbxmlParser parser(0); DefaultWbxmlContentHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(simple_wbxml, sizeof(simple_wbxml), true)); TEST_ASSERT_EQUAL_INT(0x10 /* WV CSP 1.1 */, handler.getPublicId()); } static void testSimpleCspStartElement(void) { WbxmlParser parser(0); SimpleTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(simple_wbxml, sizeof(simple_wbxml), true)); TEST_ASSERT_EQUAL_STRING("WV-CSP-Message", handler.startElemName.c_str()); } static void testSimpleCspStartElementAttr(void) { WbxmlParser parser(0); SimpleTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(simple_wbxml, sizeof(simple_wbxml), true)); TEST_ASSERT_EQUAL_STRING("WV-CSP-Message", handler.startElemName.c_str()); TEST_ASSERT_EQUAL_INT(1, handler.attribs.size()); TEST_ASSERT_EQUAL_STRING("xmlns", handler.attribs[0].name.c_str()); TEST_ASSERT_EQUAL_STRING("http://www.wireless-village.org/CSP1.1", handler.attribs[0].value.c_str()); } static void testSimpleCspEndElement(void) { WbxmlParser parser(0); SimpleTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(simple_wbxml, sizeof(simple_wbxml), true)); TEST_ASSERT_EQUAL_STRING("WV-CSP-Message", handler.endElemName.c_str()); } static void testSimpleCspNoContentTag(void) { WbxmlParser parser(0); SimpleTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(simple_nocontent_wbxml, sizeof(simple_nocontent_wbxml), true)); TEST_ASSERT_EQUAL_STRING("WV-CSP-Message", handler.startElemName.c_str()); TEST_ASSERT_EQUAL_STRING("WV-CSP-Message", handler.endElemName.c_str()); TEST_ASSERT_EQUAL_INT(1, handler.attribs.size()); TEST_ASSERT_EQUAL_STRING("xmlns", handler.attribs[0].name.c_str()); TEST_ASSERT_EQUAL_STRING("http://www.wireless-village.org/CSP1.1", handler.attribs[0].value.c_str()); } static void testSimpleCspLevel2(void) { WbxmlParser parser(0); DomTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(simple2_wbxml, sizeof(simple2_wbxml), true)); const DomElement &root = handler.root; TEST_ASSERT_EQUAL_STRING("WV-CSP-Message", root.name.c_str()); TEST_ASSERT_EQUAL_INT(1, root.attribs.size()); TEST_ASSERT_EQUAL_STRING("xmlns", root.attribs[0].name.c_str()); TEST_ASSERT_EQUAL_STRING("http://www.wireless-village.org/CSP1.1", root.attribs[0].value.c_str()); TEST_ASSERT_EQUAL_INT(1, root.children.size()); const DomElement &elem = root.children[0]; TEST_ASSERT_EQUAL_INT(0, elem.children.size()); TEST_ASSERT_EQUAL_STRING("Session", elem.name.c_str()); TEST_ASSERT_EQUAL_INT(0, elem.attribs.size()); } static void testSimpleCspLevel3Characters(void) { WbxmlParser parser(0); DomTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(simple3_wbxml, sizeof(simple3_wbxml), true)); const DomElement &root = handler.root; TEST_ASSERT_EQUAL_STRING("WV-CSP-Message", root.name.c_str()); TEST_ASSERT_EQUAL_INT(1, root.attribs.size()); TEST_ASSERT_EQUAL_STRING("xmlns", root.attribs[0].name.c_str()); TEST_ASSERT_EQUAL_STRING("http://www.wireless-village.org/CSP1.1", root.attribs[0].value.c_str()); TEST_ASSERT_EQUAL_INT(1, root.children.size()); const DomElement &session = root.children[0]; TEST_ASSERT_EQUAL_INT(1, session.children.size()); TEST_ASSERT_EQUAL_STRING("Session", session.name.c_str()); TEST_ASSERT_EQUAL_INT(0, session.attribs.size()); const DomElement &sessionDesc = session.children[0]; TEST_ASSERT_EQUAL_INT(1, sessionDesc.children.size()); TEST_ASSERT_EQUAL_STRING("SessionDescriptor", sessionDesc.name.c_str()); TEST_ASSERT_EQUAL_INT(0, sessionDesc.attribs.size()); const DomElement &sessionType = sessionDesc.children[0]; TEST_ASSERT_EQUAL_INT(0, sessionType.children.size()); TEST_ASSERT_EQUAL_STRING("SessionType", sessionType.name.c_str()); TEST_ASSERT_EQUAL_INT(0, sessionType.attribs.size()); TEST_ASSERT_EQUAL_STRING("Outband", sessionType.characters.c_str()); } /* String table, LITERAL* for tag, LITERAL for attribute, STR_T */ static void testLiteralAndStrTable(void) { WbxmlParser parser(0); DomTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(literal_wbxml, sizeof(literal_wbxml), true)); const DomElement &sometag = handler.root.children[0]; TEST_ASSERT_EQUAL_STRING("sometag", sometag.name.c_str()); TEST_ASSERT_EQUAL_INT(0, sometag.attribs.size()); TEST_ASSERT_EQUAL_INT(1, sometag.children.size()); const DomElement &someMoreTag = sometag.children[0].children[0]; TEST_ASSERT_EQUAL_STRING("someMoreTag", someMoreTag.name.c_str()); TEST_ASSERT_EQUAL_INT(0, someMoreTag.attribs.size()); TEST_ASSERT_EQUAL_INT(0, someMoreTag.children.size()); const DomElement &metag = handler.root.children[1]; TEST_ASSERT_EQUAL_STRING("metag", metag.name.c_str()); TEST_ASSERT_EQUAL_INT(1, metag.attribs.size()); TEST_ASSERT_EQUAL_STRING("attr", metag.attribs[0].name); TEST_ASSERT_EQUAL_STRING("sometag", metag.attribs[0].value); TEST_ASSERT_EQUAL_INT(0, metag.children.size()); const DomElement &tag = handler.root.children[2]; TEST_ASSERT_EQUAL_STRING("tag", tag.name.c_str()); TEST_ASSERT_EQUAL_INT(1, tag.attribs.size()); TEST_ASSERT_EQUAL_STRING("movie", tag.attribs[0].name); TEST_ASSERT_EQUAL_STRING("transformer", tag.attribs[0].value); TEST_ASSERT_EQUAL_INT(0, tag.children.size()); } /* SWITCH_PAGE */ static void testCspLoginResponse(void) { WbxmlParser parser(0); DomTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(loginresponse_wbxml, sizeof(loginresponse_wbxml), true)); const DomElement &root = handler.root; TEST_ASSERT_EQUAL_STRING("WV-CSP-Message", root.name.c_str()); TEST_ASSERT_EQUAL_INT(1, root.attribs.size()); TEST_ASSERT_EQUAL_STRING("xmlns", root.attribs[0].name.c_str()); TEST_ASSERT_EQUAL_STRING("http://www.wireless-village.org/CSP1.1", root.attribs[0].value.c_str()); const DomElement &transaction = root.children[0].children[1]; TEST_ASSERT_EQUAL_STRING("Transaction", transaction.name.c_str()); TEST_ASSERT_EQUAL_INT(0, transaction.attribs.size()); TEST_ASSERT_EQUAL_INT(2, transaction.children.size()); const DomElement &transactionContent = transaction.children[1]; TEST_ASSERT_EQUAL_STRING("TransactionContent", transactionContent.name.c_str()); TEST_ASSERT_EQUAL_INT(1, transactionContent.attribs.size()); TEST_ASSERT_EQUAL_STRING("xmlns", transactionContent.attribs[0].name.c_str()); TEST_ASSERT_EQUAL_STRING("http://www.wireless-village.org/TRC1.1", transactionContent.attribs[0].value.c_str()); TEST_ASSERT_EQUAL_INT(1, transactionContent.children.size()); const DomElement &clientID = transactionContent.children[0].children[0]; TEST_ASSERT_EQUAL_STRING("ClientID", clientID.name.c_str()); TEST_ASSERT_EQUAL_STRING("Esmertec112233", clientID.characters.c_str()); TEST_ASSERT_EQUAL_INT(0, clientID.attribs.size()); TEST_ASSERT_EQUAL_INT(0, clientID.children.size()); const DomElement &capReq = transactionContent.children[0].children[4]; TEST_ASSERT_EQUAL_STRING("CapabilityRequest", capReq.name.c_str()); TEST_ASSERT_EQUAL_STRING("F", capReq.characters.c_str()); TEST_ASSERT_EQUAL_INT(0, capReq.attribs.size()); TEST_ASSERT_EQUAL_INT(0, capReq.children.size()); } /* OPAQUE integer */ static void testCspStatusPrim(void) { WbxmlParser parser(0); DomTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(statusprim_wbxml, sizeof(statusprim_wbxml), true)); const DomElement &root = handler.root; TEST_ASSERT_EQUAL_STRING("WV-CSP-Message", root.name.c_str()); TEST_ASSERT_EQUAL_INT(1, root.attribs.size()); TEST_ASSERT_EQUAL_STRING("xmlns", root.attribs[0].name.c_str()); TEST_ASSERT_EQUAL_STRING("http://www.openmobilealliance.org/DTD/IMPS-CSP1.3", root.attribs[0].value.c_str()); const DomElement &transacContent = root.children[0].children[1].children[1]; TEST_ASSERT_EQUAL_STRING("TransactionContent", transacContent.name.c_str()); TEST_ASSERT_EQUAL_INT(1, transacContent.attribs.size()); TEST_ASSERT_EQUAL_STRING("xmlns", transacContent.attribs[0].name.c_str()); TEST_ASSERT_EQUAL_STRING("http://www.openmobilealliance.org/DTD/IMPS-TRC1.3", transacContent.attribs[0].value.c_str()); const DomElement &resultCode = transacContent.children[0].children[0].children[0]; TEST_ASSERT_EQUAL_STRING("Code", resultCode.name.c_str()); TEST_ASSERT_EQUAL_INT(0, resultCode.attribs.size()); TEST_ASSERT_EQUAL_INT(201, resultCode.intVal); const DomElement &detailedResultCode = transacContent.children[0].children[0].children[2].children[0]; TEST_ASSERT_EQUAL_STRING("Code", detailedResultCode.name.c_str()); TEST_ASSERT_EQUAL_INT(0, detailedResultCode.attribs.size()); TEST_ASSERT_EQUAL_INT(531, detailedResultCode.intVal); } /* SWITCH_PAGE, OPAQUE integer, ENTITY */ static void testCspSendMsg(void) { WbxmlParser parser(0); DomTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(sendmsgreq1_wbxml, sizeof(sendmsgreq1_wbxml), true)); const DomElement &root = handler.root; const DomElement &transacContent = root.children[0].children[1].children[1]; const DomElement &contentData = transacContent.children[0].children[2]; TEST_ASSERT_EQUAL_STRING("ContentData", contentData.name.c_str()); TEST_ASSERT_EQUAL_INT(0, contentData.attribs.size()); //   => U+00A0, UTF-8 0xC2 0xA0 TEST_ASSERT_EQUAL_STRING("Today \xc2\xa0Today", contentData.characters.c_str()); } /* Token values, EXT_0 + mbuint32 */ static void testCspCapRequest(void) { WbxmlParser parser(0); DomTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(cap_request_wbxml, sizeof(cap_request_wbxml), true)); const DomElement &root = handler.root; const DomElement &transacContent = root.children[0].children[1].children[1]; const DomElement &capList = transacContent.children[0].children[0]; TEST_ASSERT_EQUAL_STRING("CapabilityList", capList.name.c_str()); TEST_ASSERT_EQUAL_INT(0, capList.attribs.size()); TEST_ASSERT_EQUAL_INT(9, capList.children.size()); TEST_ASSERT_EQUAL_STRING("ClientType", capList.children[0].name.c_str()); TEST_ASSERT_EQUAL_STRING("MOBILE_PHONE", capList.children[0].characters.c_str()); TEST_ASSERT_EQUAL_STRING("SupportedBearer", capList.children[5].name.c_str()); TEST_ASSERT_EQUAL_STRING("HTTP", capList.children[5].characters.c_str()); TEST_ASSERT_EQUAL_STRING("SupportedCIRMethod", capList.children[7].name.c_str()); TEST_ASSERT_EQUAL_STRING("SHTTP", capList.children[7].characters.c_str()); TEST_ASSERT_EQUAL_STRING("SupportedCIRMethod", capList.children[8].name.c_str()); TEST_ASSERT_EQUAL_STRING("SSMS", capList.children[8].characters.c_str()); } static void testIncompleteInlineString(void) { WbxmlParser parser(0); ASSERT_EQUAL_INT(WBXML_STATUS_ERROR, parser.parse(incomplete_str_i_wbxml, sizeof(incomplete_str_i_wbxml), true)); } /* more ENTITY tests */ static void testBigEntity(void) { WbxmlParser parser(0); DomTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(big_entity_wbxml, sizeof(big_entity_wbxml), true)); const DomElement &sessionType = handler.root.children[0].children[0].children[0]; TEST_ASSERT_EQUAL_INT(0, sessionType.children.size()); TEST_ASSERT_EQUAL_STRING("SessionType", sessionType.name.c_str()); TEST_ASSERT_EQUAL_INT(0, sessionType.attribs.size()); TEST_ASSERT_EQUAL_STRING("\xf4\x8f\xbf\xbf", sessionType.characters.c_str()); } static void testInvalidEntity(void) { WbxmlParser parser(0); ASSERT_EQUAL_INT(WBXML_STATUS_ERROR, parser.parse(invalid_entity_wbxml, sizeof(invalid_entity_wbxml), true)); } static void testParseInChunk(void) { WbxmlParser parser(0); DomTestHandler handler; parser.setContentHandler(&handler); // wbxml version ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(sendmsgreq1_wbxml, 1, false)); // public id + charset ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(sendmsgreq1_wbxml + 1, 2, false)); // 0 byte long string table ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(sendmsgreq1_wbxml + 3, 1, false)); // first start tag ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(sendmsgreq1_wbxml + 4, 1, false)); // some data ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(sendmsgreq1_wbxml + 5, 5, false)); // some more data ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(sendmsgreq1_wbxml + 10, sizeof(sendmsgreq1_wbxml) - 1 - 2 - 1 - 1 - 5 - 4, false)); // last 4 bytes ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(sendmsgreq1_wbxml + sizeof(sendmsgreq1_wbxml) - 4, 4, true)); const DomElement &root = handler.root; TEST_ASSERT_EQUAL_STRING("WV-CSP-Message", root.name.c_str()); TEST_ASSERT_EQUAL_INT(1, root.attribs.size()); TEST_ASSERT_EQUAL_STRING("xmlns", root.attribs[0].name.c_str()); TEST_ASSERT_EQUAL_STRING("http://www.openmobilealliance.org/DTD/WV-CSP1.2", root.attribs[0].value.c_str()); } static void testParserReset(void) { WbxmlParser parser(0); // first some incomplete data ASSERT_EQUAL_INT(WBXML_STATUS_ERROR, parser.parse(sendmsgreq1_wbxml, 1, true)); parser.reset(); // now some correct data: wbxml version ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(sendmsgreq1_wbxml, 1, false)); // more correct data: public id + charset ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(sendmsgreq1_wbxml + 1, 2, false)); parser.reset(); // some wrong data again ASSERT_EQUAL_INT(WBXML_STATUS_ERROR, parser.parse(sendmsgreq1_wbxml + 3, 6, false)); parser.reset(); DomTestHandler handler; parser.setContentHandler(&handler); ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(big_entity_wbxml, sizeof(big_entity_wbxml), true)); const DomElement &sessionType = handler.root.children[0].children[0].children[0]; TEST_ASSERT_EQUAL_INT(0, sessionType.children.size()); TEST_ASSERT_EQUAL_STRING("SessionType", sessionType.name.c_str()); parser.reset(); handler.root.name.clear(); handler.root.children.clear(); // parse same document without setting a handler ASSERT_EQUAL_INT(WBXML_STATUS_OK, parser.parse(big_entity_wbxml, sizeof(big_entity_wbxml), true)); TEST_ASSERT_EQUAL_INT(0, handler.root.children.size()); TEST_ASSERT_EQUAL_INT(0, handler.root.name.size()); } static void testIncompleteData(void) { WbxmlParser parser(0); ASSERT_EQUAL_INT(WBXML_STATUS_ERROR, parser.parse(sendmsgreq1_wbxml, 1, true)); WbxmlParser parser1(0); ASSERT_EQUAL_INT(WBXML_STATUS_ERROR, parser1.parse(sendmsgreq1_wbxml, 3, true)); WbxmlParser parser2(0); ASSERT_EQUAL_INT(WBXML_STATUS_ERROR, parser2.parse(sendmsgreq1_wbxml, 4, true)); WbxmlParser parser3(0); ASSERT_EQUAL_INT(WBXML_STATUS_ERROR, parser3.parse(sendmsgreq1_wbxml, 5, true)); } extern "C" TestRef ImpsParserTest_tests(void) { EMB_UNIT_TESTFIXTURES(fixtures) { DEFINE_TEST(testSimpleCspRet), DEFINE_TEST(testSimpleCspPublicId), DEFINE_TEST(testSimpleCspStartElement), DEFINE_TEST(testSimpleCspStartElementAttr), DEFINE_TEST(testSimpleCspEndElement), DEFINE_TEST(testSimpleCspNoContentTag), DEFINE_TEST(testSimpleCspLevel2), DEFINE_TEST(testSimpleCspLevel3Characters), DEFINE_TEST(testLiteralAndStrTable), DEFINE_TEST(testCspLoginResponse), DEFINE_TEST(testCspStatusPrim), DEFINE_TEST(testCspSendMsg), DEFINE_TEST(testCspCapRequest), DEFINE_TEST(testIncompleteInlineString), DEFINE_TEST(testBigEntity), DEFINE_TEST(testInvalidEntity), DEFINE_TEST(testParseInChunk), DEFINE_TEST(testParserReset), DEFINE_TEST(testIncompleteData), }; EMB_UNIT_TESTCALLER(ImpsParserTest, "ImpsParserTest", setUp, tearDown, fixtures); // temporary work around for the linker/loader problem of the sooner build static TestCaller t = ImpsParserTest; t.isa = (TestImplement *)&TestCallerImplement; return (TestRef)&t; }