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
This commit is contained in:
@@ -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
|
// The flattened message format in R5 only allows 1 byte
|
||||||
// for the length of field names
|
// 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;
|
status_t err = B_OK;
|
||||||
BMessageField* BMF = FindData(name, type, err);
|
BMessageField* BMF = FindData(name, type, err);
|
||||||
@@ -158,31 +158,33 @@ template<class T1>
|
|||||||
status_t BMessageBody::FindData(const char *name, int32 index, T1 *data,
|
status_t BMessageBody::FindData(const char *name, int32 index, T1 *data,
|
||||||
type_code type)
|
type_code type)
|
||||||
{
|
{
|
||||||
status_t err = B_OK;
|
if (!name)
|
||||||
|
{
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
if (index < 0)
|
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);
|
BMessageFieldImpl<T1>* RItem =
|
||||||
if (Item)
|
dynamic_cast<BMessageFieldImpl<T1>*>(Item);
|
||||||
|
if (!RItem)
|
||||||
{
|
{
|
||||||
BMessageFieldImpl<T1>* RItem =
|
debugger("\n\n\tyou \033[44;1;37mB\033[41;1;37me"
|
||||||
dynamic_cast<BMessageFieldImpl<T1>*>(Item);
|
"\033[m screwed\n\n");
|
||||||
if (!RItem)
|
}
|
||||||
{
|
if (index < RItem->CountItems())
|
||||||
debugger("\n\n\tyou \033[44;1;37mB\033[41;1;37me"
|
{
|
||||||
"\033[m screwed\n\n");
|
*data = RItem->Data()[index];
|
||||||
}
|
}
|
||||||
if (index < RItem->CountItems())
|
else
|
||||||
{
|
{
|
||||||
*data = RItem->Data()[index];
|
err = B_BAD_INDEX;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
err = B_BAD_INDEX;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,30 +195,32 @@ template<class T1>
|
|||||||
status_t BMessageBody::ReplaceData(const char *name, int32 index,
|
status_t BMessageBody::ReplaceData(const char *name, int32 index,
|
||||||
const T1 &data, type_code type)
|
const T1 &data, type_code type)
|
||||||
{
|
{
|
||||||
status_t err = B_OK;
|
if (!name)
|
||||||
|
{
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
if (index < 0)
|
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);
|
BMessageFieldImpl<T1>* RItem =
|
||||||
if (Item)
|
dynamic_cast<BMessageFieldImpl<T1>*>(Item);
|
||||||
|
if (!RItem)
|
||||||
{
|
{
|
||||||
BMessageFieldImpl<T1>* RItem =
|
debugger("\n\n\tyou \033[44;1;37mB\033[41;1;37me\033[m screwed\n\n");
|
||||||
dynamic_cast<BMessageFieldImpl<T1>*>(Item);
|
}
|
||||||
if (!RItem)
|
if (index < RItem->Data().Size())
|
||||||
{
|
{
|
||||||
debugger("\n\n\tyou \033[44;1;37mB\033[41;1;37me\033[m screwed\n\n");
|
RItem->Data()[index] = data;
|
||||||
}
|
}
|
||||||
if (index < RItem->Data().Size())
|
else
|
||||||
{
|
{
|
||||||
RItem->Data()[index] = data;
|
err = B_BAD_INDEX;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
err = B_BAD_INDEX;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -667,7 +667,7 @@ status_t BMessage::PopSpecifier()
|
|||||||
return fBody->FindData<TYPE>(name, index, p, TYPESPEC); \
|
return fBody->FindData<TYPE>(name, index, p, TYPESPEC); \
|
||||||
} \
|
} \
|
||||||
status_t BMessage::Replace ## fnName(const char* name, TYPE val) \
|
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) \
|
status_t BMessage::Replace ## fnName(const char *name, int32 index, TYPE val) \
|
||||||
{ return fBody->ReplaceData<TYPE>(name, index, val, TYPESPEC); } \
|
{ return fBody->ReplaceData<TYPE>(name, index, val, TYPESPEC); } \
|
||||||
bool BMessage::Has ## fnName(const char* name, int32 n) const \
|
bool BMessage::Has ## fnName(const char* name, int32 n) const \
|
||||||
|
|||||||
@@ -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
|
bool BMessageBody::HasData(const char* name, type_code t, int32 n) const
|
||||||
{
|
{
|
||||||
if (n < 0)
|
if (!name || n < 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -358,8 +358,13 @@ BMessageField* BMessageBody::FindData(const char* name, type_code type,
|
|||||||
status_t& err) const
|
status_t& err) const
|
||||||
{
|
{
|
||||||
BMessageField* Item = NULL;
|
BMessageField* Item = NULL;
|
||||||
err = B_OK;
|
if (!name)
|
||||||
|
{
|
||||||
|
err = B_BAD_VALUE;
|
||||||
|
return Item;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = B_OK;
|
||||||
TMsgDataMap::const_iterator i = fData.find(name);
|
TMsgDataMap::const_iterator i = fData.find(name);
|
||||||
if (i == fData.end())
|
if (i == fData.end())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -182,6 +182,8 @@ class TMessageItemTest : public TestCase, public TypePolicy<Type>
|
|||||||
void MessageItemTest6();
|
void MessageItemTest6();
|
||||||
void MessageItemTest7();
|
void MessageItemTest7();
|
||||||
void MessageItemTest8();
|
void MessageItemTest8();
|
||||||
|
void MessageItemTest9();
|
||||||
|
void MessageItemTest10();
|
||||||
|
|
||||||
static TestSuite* Suite();
|
static TestSuite* Suite();
|
||||||
|
|
||||||
@@ -229,7 +231,7 @@ template
|
|||||||
void
|
void
|
||||||
TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
|
TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
|
||||||
MessageItemTest2()
|
MessageItemTest2()
|
||||||
{debugger(__PRETTY_FUNCTION__);
|
{
|
||||||
BMessage msg;
|
BMessage msg;
|
||||||
Type in = InitPolicy::Test1();
|
Type in = InitPolicy::Test1();
|
||||||
Type out = InitPolicy::Zero();
|
Type out = InitPolicy::Zero();
|
||||||
@@ -464,6 +466,52 @@ template
|
|||||||
class AssertPolicy,
|
class AssertPolicy,
|
||||||
class ComparePolicy
|
class ComparePolicy
|
||||||
>
|
>
|
||||||
|
void
|
||||||
|
TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
|
||||||
|
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<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
|
||||||
|
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*
|
TestSuite*
|
||||||
TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
|
TMessageItemTest<Type, TypeCode, FuncPolicy, InitPolicy, AssertPolicy, ComparePolicy>::
|
||||||
Suite()
|
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, MessageItemTest6);
|
||||||
ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest7);
|
ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest7);
|
||||||
ADD_TEMPLATE_TEST(BMessage, suite, TMessageItemTest TEMPLATE_TEST_PARAMS, MessageItemTest8);
|
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;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,48 +1,48 @@
|
|||||||
#define __SGI_STL_INTERNAL_BVECTOR_H
|
#define __SGI_STL_INTERNAL_BVECTOR_H
|
||||||
//#include "MessageTest.h"
|
//#include "MessageTest.h"
|
||||||
#include "../common.h"
|
#include "../common.h"
|
||||||
//#include "MessageConstructTest.h"
|
#include "MessageConstructTest.h"
|
||||||
//#include "MessageOpAssignTest.h"
|
#include "MessageOpAssignTest.h"
|
||||||
//#include "MessageEasyFindTest.h"
|
#include "MessageEasyFindTest.h"
|
||||||
//#include "MessageBoolItemTest.h"
|
#include "MessageBoolItemTest.h"
|
||||||
//#include "MessageInt8ItemTest.h"
|
#include "MessageInt8ItemTest.h"
|
||||||
//#include "MessageInt16ItemTest.h"
|
#include "MessageInt16ItemTest.h"
|
||||||
//#include "MessageInt32ItemTest.h"
|
#include "MessageInt32ItemTest.h"
|
||||||
//#include "MessageInt64ItemTest.h"
|
#include "MessageInt64ItemTest.h"
|
||||||
//#include "MessageBRectItemTest.h"
|
#include "MessageBRectItemTest.h"
|
||||||
//#include "MessageBPointItemTest.h"
|
#include "MessageBPointItemTest.h"
|
||||||
//#include "MessageFloatItemTest.h"
|
#include "MessageFloatItemTest.h"
|
||||||
//#include "MessageDoubleItemTest.h"
|
#include "MessageDoubleItemTest.h"
|
||||||
//#include "MessageMessageItemTest.h"
|
#include "MessageMessageItemTest.h"
|
||||||
//#include "MessageRefItemTest.h"
|
#include "MessageRefItemTest.h"
|
||||||
//#include "MessageBStringItemTest.h"
|
#include "MessageBStringItemTest.h"
|
||||||
//#include "MessageCStringItemTest.h"
|
#include "MessageCStringItemTest.h"
|
||||||
//#include "MessageMessengerItemTest.h"
|
#include "MessageMessengerItemTest.h"
|
||||||
//#include "MessagePointerItemTest.h"
|
#include "MessagePointerItemTest.h"
|
||||||
#include "MessageFlattenableItemTest.h"
|
#include "MessageFlattenableItemTest.h"
|
||||||
|
|
||||||
Test* MessageTestSuite()
|
Test* MessageTestSuite()
|
||||||
{
|
{
|
||||||
TestSuite* tests = new TestSuite();
|
TestSuite* tests = new TestSuite();
|
||||||
|
|
||||||
// tests->addTest(TMessageConstructTest::Suite());
|
tests->addTest(TMessageConstructTest::Suite());
|
||||||
// tests->addTest(TMessageOpAssignTest::Suite());
|
tests->addTest(TMessageOpAssignTest::Suite());
|
||||||
// tests->addTest(TMessageEasyFindTest::Suite());
|
tests->addTest(TMessageEasyFindTest::Suite());
|
||||||
// tests->addTest(TMessageBoolItemTest::Suite());
|
tests->addTest(TMessageBoolItemTest::Suite());
|
||||||
// tests->addTest(TMessageInt8ItemTest::Suite());
|
tests->addTest(TMessageInt8ItemTest::Suite());
|
||||||
// tests->addTest(TMessageInt16ItemTest::Suite());
|
tests->addTest(TMessageInt16ItemTest::Suite());
|
||||||
// tests->addTest(TMessageInt32ItemTest::Suite());
|
tests->addTest(TMessageInt32ItemTest::Suite());
|
||||||
// tests->addTest(TMessageInt64ItemTest::Suite());
|
tests->addTest(TMessageInt64ItemTest::Suite());
|
||||||
// tests->addTest(TMessageBRectItemTest::Suite());
|
tests->addTest(TMessageBRectItemTest::Suite());
|
||||||
// tests->addTest(TMessageBPointItemTest::Suite());
|
tests->addTest(TMessageBPointItemTest::Suite());
|
||||||
// tests->addTest(TMessageFloatItemTest::Suite());
|
tests->addTest(TMessageFloatItemTest::Suite());
|
||||||
// tests->addTest(TMessageDoubleItemTest::Suite());
|
tests->addTest(TMessageDoubleItemTest::Suite());
|
||||||
// tests->addTest(TMessageMessageItemTest::Suite());
|
tests->addTest(TMessageMessageItemTest::Suite());
|
||||||
// tests->addTest(TMessageRefItemTest::Suite());
|
tests->addTest(TMessageRefItemTest::Suite());
|
||||||
// tests->addTest(TMessageBStringItemTest::Suite());
|
tests->addTest(TMessageBStringItemTest::Suite());
|
||||||
// tests->addTest(TMessageCStringItemTest::Suite());
|
tests->addTest(TMessageCStringItemTest::Suite());
|
||||||
// tests->addTest(TMessageMessengerItemTest::Suite());
|
tests->addTest(TMessageMessengerItemTest::Suite());
|
||||||
// tests->addTest(TMessagePointerItemTest::Suite());
|
tests->addTest(TMessagePointerItemTest::Suite());
|
||||||
tests->addTest(TMessageFlattenableItemTest::Suite());
|
tests->addTest(TMessageFlattenableItemTest::Suite());
|
||||||
|
|
||||||
return tests;
|
return tests;
|
||||||
|
|||||||
Reference in New Issue
Block a user