From 0cc48ce6f908a17b367c5c76fd3bd6ac3b76b461 Mon Sep 17 00:00:00 2001 From: ejakowatz Date: Tue, 3 Jun 2003 23:22:08 +0000 Subject: [PATCH] Unit tests to ensure robust handling of bogus params to convenience funcs plus fixes for the bugs they exposes. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3416 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/app/MessageBody.h | 84 ++++++++++--------- src/kits/app/Message.cpp | 2 +- src/kits/app/MessageBody.cpp | 9 +- src/tests/kits/app/bmessage/MessageItemTest.h | 54 +++++++++++- src/tests/kits/app/bmessage/MessageTest.cpp | 72 ++++++++-------- 5 files changed, 141 insertions(+), 80 deletions(-) diff --git a/headers/private/app/MessageBody.h b/headers/private/app/MessageBody.h index 5fc8c8bbc0..b44df4a0ea 100644 --- a/headers/private/app/MessageBody.h +++ b/headers/private/app/MessageBody.h @@ -119,7 +119,7 @@ status_t BMessageBody::AddData(const char *name, const T1 &data, type_code type) { // The flattened message format in R5 only allows 1 byte // for the length of field names - if (strlen(name) > 255) return B_BAD_VALUE; + if (!name || (strlen(name) > 255)) return B_BAD_VALUE; status_t err = B_OK; BMessageField* BMF = FindData(name, type, err); @@ -158,31 +158,33 @@ template status_t BMessageBody::FindData(const char *name, int32 index, T1 *data, type_code type) { - status_t err = B_OK; + if (!name) + { + return B_BAD_VALUE; + } if (index < 0) { - err = B_BAD_INDEX; + return B_BAD_INDEX; } - else + + status_t err = B_OK; + BMessageField* Item = FindData(name, type, err); + if (Item) { - BMessageField* Item = FindData(name, type, err); - if (Item) + BMessageFieldImpl* RItem = + dynamic_cast*>(Item); + if (!RItem) { - BMessageFieldImpl* RItem = - dynamic_cast*>(Item); - if (!RItem) - { - debugger("\n\n\tyou \033[44;1;37mB\033[41;1;37me" - "\033[m screwed\n\n"); - } - if (index < RItem->CountItems()) - { - *data = RItem->Data()[index]; - } - else - { - err = B_BAD_INDEX; - } + debugger("\n\n\tyou \033[44;1;37mB\033[41;1;37me" + "\033[m screwed\n\n"); + } + if (index < RItem->CountItems()) + { + *data = RItem->Data()[index]; + } + else + { + err = B_BAD_INDEX; } } @@ -193,30 +195,32 @@ template status_t BMessageBody::ReplaceData(const char *name, int32 index, const T1 &data, type_code type) { - status_t err = B_OK; + if (!name) + { + return B_BAD_VALUE; + } if (index < 0) { - err = B_BAD_INDEX; + return B_BAD_INDEX; } - else + + status_t err = B_OK; + BMessageField* Item = FindData(name, type, err); + if (Item) { - BMessageField* Item = FindData(name, type, err); - if (Item) + BMessageFieldImpl* RItem = + dynamic_cast*>(Item); + if (!RItem) { - BMessageFieldImpl* RItem = - dynamic_cast*>(Item); - if (!RItem) - { - debugger("\n\n\tyou \033[44;1;37mB\033[41;1;37me\033[m screwed\n\n"); - } - if (index < RItem->Data().Size()) - { - RItem->Data()[index] = data; - } - else - { - err = B_BAD_INDEX; - } + debugger("\n\n\tyou \033[44;1;37mB\033[41;1;37me\033[m screwed\n\n"); + } + if (index < RItem->Data().Size()) + { + RItem->Data()[index] = data; + } + else + { + err = B_BAD_INDEX; } } diff --git a/src/kits/app/Message.cpp b/src/kits/app/Message.cpp index a98a169ee8..ae797e1af6 100644 --- a/src/kits/app/Message.cpp +++ b/src/kits/app/Message.cpp @@ -667,7 +667,7 @@ status_t BMessage::PopSpecifier() return fBody->FindData(name, index, p, TYPESPEC); \ } \ status_t BMessage::Replace ## fnName(const char* name, TYPE val) \ - { return ReplaceData(name, TYPESPEC, 0, &val, sizeof(TYPE)); } \ + { return Replace ## fnName(name, 0, val); } \ status_t BMessage::Replace ## fnName(const char *name, int32 index, TYPE val) \ { return fBody->ReplaceData(name, index, val, TYPESPEC); } \ bool BMessage::Has ## fnName(const char* name, int32 n) const \ diff --git a/src/kits/app/MessageBody.cpp b/src/kits/app/MessageBody.cpp index 6836a53479..1e998950c9 100644 --- a/src/kits/app/MessageBody.cpp +++ b/src/kits/app/MessageBody.cpp @@ -315,7 +315,7 @@ void BMessageBody::operator delete(void* ptr, size_t size) //------------------------------------------------------------------------------ bool BMessageBody::HasData(const char* name, type_code t, int32 n) const { - if (n < 0) + if (!name || n < 0) { return false; } @@ -358,8 +358,13 @@ BMessageField* BMessageBody::FindData(const char* name, type_code type, status_t& err) const { BMessageField* Item = NULL; - err = B_OK; + if (!name) + { + err = B_BAD_VALUE; + return Item; + } + err = B_OK; TMsgDataMap::const_iterator i = fData.find(name); if (i == fData.end()) { diff --git a/src/tests/kits/app/bmessage/MessageItemTest.h b/src/tests/kits/app/bmessage/MessageItemTest.h index 8e662ff152..3599c30f70 100644 --- a/src/tests/kits/app/bmessage/MessageItemTest.h +++ b/src/tests/kits/app/bmessage/MessageItemTest.h @@ -182,6 +182,8 @@ class TMessageItemTest : public TestCase, public TypePolicy void MessageItemTest6(); void MessageItemTest7(); void MessageItemTest8(); + void MessageItemTest9(); + void MessageItemTest10(); static TestSuite* Suite(); @@ -229,7 +231,7 @@ template void TMessageItemTest:: MessageItemTest2() -{debugger(__PRETTY_FUNCTION__); +{ BMessage msg; Type in = InitPolicy::Test1(); Type out = InitPolicy::Zero(); @@ -464,6 +466,52 @@ template class AssertPolicy, class ComparePolicy > +void +TMessageItemTest:: +MessageItemTest9() +{ + BMessage msg; + Type in = InitPolicy::Test1(); + CPPUNIT_ASSERT(FuncPolicy::Add(msg, NULL, in) == B_BAD_VALUE); +} +//------------------------------------------------------------------------------ +template +< + class Type, + type_code TypeCode, + class FuncPolicy, + class InitPolicy, + class AssertPolicy, + class ComparePolicy +> +void +TMessageItemTest:: +MessageItemTest10() +{ + BMessage msg; + Type in = InitPolicy::Test1(); + Type out = InitPolicy::Zero(); + CPPUNIT_ASSERT(FuncPolicy::Add(msg, "item", in) == B_OK); + CPPUNIT_ASSERT(FuncPolicy::Has(msg, NULL, 0) == false); + CPPUNIT_ASSERT(ComparePolicy::Compare(FuncPolicy::QuickFind(msg, NULL, 0), + AssertPolicy::Invalid())); + CPPUNIT_ASSERT(FuncPolicy::Find(msg, NULL, 0, &out) == B_BAD_VALUE); + TypePtr pout = NULL; + ssize_t size; + status_t err = FuncPolicy::FindData(msg, NULL, TypeCode, 0, + (const void**)&pout, &size); + CPPUNIT_ASSERT(err = B_BAD_VALUE); +} +//------------------------------------------------------------------------------ +template +< + class Type, + type_code TypeCode, + class FuncPolicy, + class InitPolicy, + class AssertPolicy, + class ComparePolicy +> TestSuite* TMessageItemTest:: Suite() @@ -478,6 +526,10 @@ Suite() ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest6); ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest7); ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest8); +#ifndef TEST_R5 + ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest9); + ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest10); +#endif return suite; } diff --git a/src/tests/kits/app/bmessage/MessageTest.cpp b/src/tests/kits/app/bmessage/MessageTest.cpp index 1a8aeee4ea..3380a4d730 100644 --- a/src/tests/kits/app/bmessage/MessageTest.cpp +++ b/src/tests/kits/app/bmessage/MessageTest.cpp @@ -1,48 +1,48 @@ #define __SGI_STL_INTERNAL_BVECTOR_H //#include "MessageTest.h" #include "../common.h" -//#include "MessageConstructTest.h" -//#include "MessageOpAssignTest.h" -//#include "MessageEasyFindTest.h" -//#include "MessageBoolItemTest.h" -//#include "MessageInt8ItemTest.h" -//#include "MessageInt16ItemTest.h" -//#include "MessageInt32ItemTest.h" -//#include "MessageInt64ItemTest.h" -//#include "MessageBRectItemTest.h" -//#include "MessageBPointItemTest.h" -//#include "MessageFloatItemTest.h" -//#include "MessageDoubleItemTest.h" -//#include "MessageMessageItemTest.h" -//#include "MessageRefItemTest.h" -//#include "MessageBStringItemTest.h" -//#include "MessageCStringItemTest.h" -//#include "MessageMessengerItemTest.h" -//#include "MessagePointerItemTest.h" +#include "MessageConstructTest.h" +#include "MessageOpAssignTest.h" +#include "MessageEasyFindTest.h" +#include "MessageBoolItemTest.h" +#include "MessageInt8ItemTest.h" +#include "MessageInt16ItemTest.h" +#include "MessageInt32ItemTest.h" +#include "MessageInt64ItemTest.h" +#include "MessageBRectItemTest.h" +#include "MessageBPointItemTest.h" +#include "MessageFloatItemTest.h" +#include "MessageDoubleItemTest.h" +#include "MessageMessageItemTest.h" +#include "MessageRefItemTest.h" +#include "MessageBStringItemTest.h" +#include "MessageCStringItemTest.h" +#include "MessageMessengerItemTest.h" +#include "MessagePointerItemTest.h" #include "MessageFlattenableItemTest.h" Test* MessageTestSuite() { TestSuite* tests = new TestSuite(); -// tests->addTest(TMessageConstructTest::Suite()); -// tests->addTest(TMessageOpAssignTest::Suite()); -// tests->addTest(TMessageEasyFindTest::Suite()); -// tests->addTest(TMessageBoolItemTest::Suite()); -// tests->addTest(TMessageInt8ItemTest::Suite()); -// tests->addTest(TMessageInt16ItemTest::Suite()); -// tests->addTest(TMessageInt32ItemTest::Suite()); -// tests->addTest(TMessageInt64ItemTest::Suite()); -// tests->addTest(TMessageBRectItemTest::Suite()); -// tests->addTest(TMessageBPointItemTest::Suite()); -// tests->addTest(TMessageFloatItemTest::Suite()); -// tests->addTest(TMessageDoubleItemTest::Suite()); -// tests->addTest(TMessageMessageItemTest::Suite()); -// tests->addTest(TMessageRefItemTest::Suite()); -// tests->addTest(TMessageBStringItemTest::Suite()); -// tests->addTest(TMessageCStringItemTest::Suite()); -// tests->addTest(TMessageMessengerItemTest::Suite()); -// tests->addTest(TMessagePointerItemTest::Suite()); + tests->addTest(TMessageConstructTest::Suite()); + tests->addTest(TMessageOpAssignTest::Suite()); + tests->addTest(TMessageEasyFindTest::Suite()); + tests->addTest(TMessageBoolItemTest::Suite()); + tests->addTest(TMessageInt8ItemTest::Suite()); + tests->addTest(TMessageInt16ItemTest::Suite()); + tests->addTest(TMessageInt32ItemTest::Suite()); + tests->addTest(TMessageInt64ItemTest::Suite()); + tests->addTest(TMessageBRectItemTest::Suite()); + tests->addTest(TMessageBPointItemTest::Suite()); + tests->addTest(TMessageFloatItemTest::Suite()); + tests->addTest(TMessageDoubleItemTest::Suite()); + tests->addTest(TMessageMessageItemTest::Suite()); + tests->addTest(TMessageRefItemTest::Suite()); + tests->addTest(TMessageBStringItemTest::Suite()); + tests->addTest(TMessageCStringItemTest::Suite()); + tests->addTest(TMessageMessengerItemTest::Suite()); + tests->addTest(TMessagePointerItemTest::Suite()); tests->addTest(TMessageFlattenableItemTest::Suite()); return tests;