InstantiateObjectTester.cpp revision 52a38012
152a38012Sejakowatz//------------------------------------------------------------------------------
252a38012Sejakowatz//	InstantiateObjectTester.cpp
352a38012Sejakowatz//
452a38012Sejakowatz/**
552a38012Sejakowatz	Testing of instantiate_object(BMessage* archive, image_id* id)
652a38012Sejakowatz	@note	No cases are currently defined for NULL 'id' parameter, since NULL
752a38012Sejakowatz			is a valid value for it.  Perhaps there should be to ensure that the
852a38012Sejakowatz			instantiate_object is, in fact, dealing with that case correctly.
952a38012Sejakowatz			There are also no tests against instantiate_object(BMessage*) as it
1052a38012Sejakowatz			simply calls instantiate_object(BMessage*, image_id*) with NULL for
1152a38012Sejakowatz			the image_id parameter.
1252a38012Sejakowatz */
1352a38012Sejakowatz//------------------------------------------------------------------------------
1452a38012Sejakowatz
1552a38012Sejakowatz// Standard Includes -----------------------------------------------------------
1652a38012Sejakowatz#include <errno.h>
1752a38012Sejakowatz#include <stdexcept>
1852a38012Sejakowatz
1952a38012Sejakowatz// System Includes -------------------------------------------------------------
2052a38012Sejakowatz#include <be/app/Roster.h>
2152a38012Sejakowatz#include <be/storage/Entry.h>
2252a38012Sejakowatz#include <be/storage/Path.h>
2352a38012Sejakowatz
2452a38012Sejakowatz// Project Includes ------------------------------------------------------------
2552a38012Sejakowatz
2652a38012Sejakowatz// Local Includes --------------------------------------------------------------
2752a38012Sejakowatz#include "framework/estring.h"
2852a38012Sejakowatz#include "RemoteObjectDef/RemoteTestObject.h"
2952a38012Sejakowatz#include "InstantiateObjectTester.h"
3052a38012Sejakowatz#include "LocalTestObject.h"
3152a38012Sejakowatz
3252a38012Sejakowatz// Local Defines ---------------------------------------------------------------
3352a38012Sejakowatz#define FORMAT_AND_THROW(MSG, ERR)	\
3452a38012Sejakowatz	FormatAndThrow(__LINE__, __FILE__, MSG, ERR)
3552a38012Sejakowatz
3652a38012Sejakowatz// Globals ---------------------------------------------------------------------
3752a38012Sejakowatzconst char* gInvalidClassName	= "TInvalidClassName";
3852a38012Sejakowatzconst char* gInvalidSig			= "application/x-vnd.InvalidSignature";
3952a38012Sejakowatzconst char* gLocalClassName		= "TIOTest";
4052a38012Sejakowatzconst char* gLocalSig			= "application/x-vnd.LocalSignature";
4152a38012Sejakowatzconst char* gRemoteClassName	= "TRemoteTestObject";
4252a38012Sejakowatzconst char* gRemoteSig			= "application/x-vnd.RemoteObjectDef";
4352a38012Sejakowatzconst char* gValidSig			= gRemoteSig;
4452a38012Sejakowatz
4552a38012Sejakowatz
4652a38012Sejakowatzvoid FormatAndThrow(int line, const char* file, const char* msg, int err);
4752a38012Sejakowatz
4852a38012Sejakowatz//------------------------------------------------------------------------------
4952a38012SejakowatzTInstantiateObjectTester::TInstantiateObjectTester(string name)
5052a38012Sejakowatz	:	TestCase(name), fAddonId(B_ERROR)
5152a38012Sejakowatz{
5252a38012Sejakowatz	;
5352a38012Sejakowatz}
5452a38012Sejakowatz//------------------------------------------------------------------------------
5552a38012Sejakowatz/**
5652a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
5752a38012Sejakowatz	@case			Invalid archive
5852a38012Sejakowatz	@param archive	NULL
5952a38012Sejakowatz	@param id		Valid image_id pointer
6052a38012Sejakowatz	@results		Returns NULL.
6152a38012Sejakowatz					*id is set to B_BAD_VALUE.
6252a38012Sejakowatz					errno is set to B_BAD_VALUE.
6352a38012Sejakowatz */
6452a38012Sejakowatzvoid TInstantiateObjectTester::Case1()
6552a38012Sejakowatz{
6652a38012Sejakowatz	errno = B_OK;
6752a38012Sejakowatz	image_id id = B_OK;
6852a38012Sejakowatz	TIOTest* Test = (TIOTest*)instantiate_object(NULL, &id);
6952a38012Sejakowatz	assert(Test == NULL);
7052a38012Sejakowatz	assert(id == B_BAD_VALUE);
7152a38012Sejakowatz	assert(errno == B_BAD_VALUE);
7252a38012Sejakowatz}
7352a38012Sejakowatz//------------------------------------------------------------------------------
7452a38012Sejakowatz/**
7552a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
7652a38012Sejakowatz	@case			No class name
7752a38012Sejakowatz	@param archive	Valid BMessage pointer without string field "class"
7852a38012Sejakowatz	@param id		Valid image_id pointer
7952a38012Sejakowatz	@results		Returns NULL.
8052a38012Sejakowatz					*id is set to B_BAD_VALUE.
8152a38012Sejakowatz					errno is set to B_OK.
8252a38012Sejakowatz */
8352a38012Sejakowatzvoid TInstantiateObjectTester::Case2()
8452a38012Sejakowatz{
8552a38012Sejakowatz	errno = B_OK;
8652a38012Sejakowatz	BMessage Archive;
8752a38012Sejakowatz	image_id id = B_OK;
8852a38012Sejakowatz	TIOTest* Test = (TIOTest*)instantiate_object(&Archive, &id);
8952a38012Sejakowatz	assert(Test == NULL);
9052a38012Sejakowatz	assert(id == B_BAD_VALUE);
9152a38012Sejakowatz	assert(errno == B_OK);
9252a38012Sejakowatz}
9352a38012Sejakowatz//------------------------------------------------------------------------------
9452a38012Sejakowatz
9552a38012Sejakowatz//------------------------------------------------------------------------------
9652a38012Sejakowatz//	Invalid class name tests
9752a38012Sejakowatz//------------------------------------------------------------------------------
9852a38012Sejakowatz/**
9952a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
10052a38012Sejakowatz	@case			Invalid class name
10152a38012Sejakowatz	@param archive	Valid BMessage pointer, with string field labeled "class"
10252a38012Sejakowatz					containing an invalid class name
10352a38012Sejakowatz	@param id		Valid image_id pointer
10452a38012Sejakowatz	@results		Returns NULL.
10552a38012Sejakowatz					*id is set to B_BAD_VALUE.
10652a38012Sejakowatz					errno is set to B_BAD_VALUE.
10752a38012Sejakowatz */
10852a38012Sejakowatzvoid TInstantiateObjectTester::Case3()
10952a38012Sejakowatz{
11052a38012Sejakowatz	errno = B_OK;
11152a38012Sejakowatz	BMessage Archive;
11252a38012Sejakowatz	Archive.AddString("class", gInvalidClassName);
11352a38012Sejakowatz	image_id id = B_OK;
11452a38012Sejakowatz	TIOTest* Test = (TIOTest*)instantiate_object(&Archive, &id);
11552a38012Sejakowatz	assert(Test == NULL);
11652a38012Sejakowatz	assert(id == B_BAD_VALUE);
11752a38012Sejakowatz	assert(errno == B_BAD_VALUE);
11852a38012Sejakowatz}
11952a38012Sejakowatz//------------------------------------------------------------------------------
12052a38012Sejakowatz/**
12152a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
12252a38012Sejakowatz	@case			Invalid class name and signature
12352a38012Sejakowatz	@param archive	Valid BMessage pointer, with string fields labeled "class"
12452a38012Sejakowatz					and "add_on", containing invalid class name and signature,
12552a38012Sejakowatz					respectively
12652a38012Sejakowatz	@param id		Valid image_id pointer
12752a38012Sejakowatz	@results		Returns NULL.
12852a38012Sejakowatz					*id is set to B_BAD_VALUE.
12952a38012Sejakowatz					errno is set to B_LAUNCH_FAILED_APP_NOT_FOUND.
13052a38012Sejakowatz */
13152a38012Sejakowatzvoid TInstantiateObjectTester::Case4()
13252a38012Sejakowatz{
13352a38012Sejakowatz	errno = B_OK;
13452a38012Sejakowatz	BMessage Archive;
13552a38012Sejakowatz	Archive.AddString("class", gInvalidClassName);
13652a38012Sejakowatz	Archive.AddString("add_on", gInvalidSig);
13752a38012Sejakowatz	image_id id = B_OK;
13852a38012Sejakowatz	TIOTest* Test = (TIOTest*)instantiate_object(&Archive, &id);
13952a38012Sejakowatz	assert(Test == NULL);
14052a38012Sejakowatz	assert(id == B_BAD_VALUE);
14152a38012Sejakowatz	assert(errno == B_LAUNCH_FAILED_APP_NOT_FOUND);
14252a38012Sejakowatz}
14352a38012Sejakowatz//------------------------------------------------------------------------------
14452a38012Sejakowatz/**
14552a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
14652a38012Sejakowatz	@case			Invalid class name, valid signature
14752a38012Sejakowatz	@param archive	Valid BMessage pointer with string fields labeled "class"
14852a38012Sejakowatz					and "add_on", containing invalid class name and valid
14952a38012Sejakowatz					signature, respectively
15052a38012Sejakowatz	@param id		Valid image_id pointer
15152a38012Sejakowatz	@requires		RemoteObjectDef add-on must be built and accessible
15252a38012Sejakowatz	@results		Returns NULL.
15352a38012Sejakowatz					*id is > 0 (add-on was loaded)
15452a38012Sejakowatz					errno is set to B_BAD_VALUE.
15552a38012Sejakowatz */
15652a38012Sejakowatzvoid TInstantiateObjectTester::Case5()
15752a38012Sejakowatz{
15852a38012Sejakowatz	errno = B_OK;
15952a38012Sejakowatz	BMessage Archive;
16052a38012Sejakowatz	Archive.AddString("class", gInvalidClassName);
16152a38012Sejakowatz	Archive.AddString("add_on", gValidSig);
16252a38012Sejakowatz	image_id id = B_OK;
16352a38012Sejakowatz	TIOTest* Test = (TIOTest*)instantiate_object(&Archive, &id);
16452a38012Sejakowatz	assert(Test == NULL);
16552a38012Sejakowatz	// The system implementation returns the image_id of the last addon searched
16652a38012Sejakowatz	// Implies the addon is not unloaded.  How to verify this behaviour?  Should
16752a38012Sejakowatz	// the addon be unloaded if it doesn't contain our function?  Addons do,
16852a38012Sejakowatz	// after all, eat into our allowable memory.
16952a38012Sejakowatz
17052a38012Sejakowatz	// Verified that addon is *not* unloaded in the Be implementation.  If Case8
17152a38012Sejakowatz	// runs after this case without explicitely unloaded the addon here, it
17252a38012Sejakowatz	// fails because it depends on the addon image not being available within
17352a38012Sejakowatz	// the team.
17452a38012Sejakowatz	assert(id > 0);
17552a38012Sejakowatz	unload_add_on(id);
17652a38012Sejakowatz	assert(errno == B_BAD_VALUE);
17752a38012Sejakowatz}
17852a38012Sejakowatz//------------------------------------------------------------------------------
17952a38012Sejakowatz
18052a38012Sejakowatz
18152a38012Sejakowatz//------------------------------------------------------------------------------
18252a38012Sejakowatz//	Valid class name tests
18352a38012Sejakowatz//------------------------------------------------------------------------------
18452a38012Sejakowatz/**
18552a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
18652a38012Sejakowatz	@case			Valid archive of class defined in local image
18752a38012Sejakowatz	@param archive	Valid BMessage pointer with string field "class" containing
18852a38012Sejakowatz					name of locally defined class which can be instantiated via
18952a38012Sejakowatz					archiving mechanism
19052a38012Sejakowatz	@param id		Valid image_id pointer
19152a38012Sejakowatz	@requires		locally defined class which can be instantiated via
19252a38012Sejakowatz					archiving mechanism
19352a38012Sejakowatz	@results		Returns valid TIOTest instance.
19452a38012Sejakowatz					*id is set to B_BAD_VALUE (no image was loaded).
19552a38012Sejakowatz					errno is set to B_OK.
19652a38012Sejakowatz */
19752a38012Sejakowatz//	No sig
19852a38012Sejakowatz//		Local app -- local class
19952a38012Sejakowatzvoid TInstantiateObjectTester::Case6()
20052a38012Sejakowatz{
20152a38012Sejakowatz	errno = B_OK;
20252a38012Sejakowatz	BMessage Archive;
20352a38012Sejakowatz	Archive.AddString("class", gLocalClassName);
20452a38012Sejakowatz	image_id id = B_OK;
20552a38012Sejakowatz	TIOTest* Test = (TIOTest*)instantiate_object(&Archive, &id);
20652a38012Sejakowatz	assert(Test != NULL);
20752a38012Sejakowatz	assert(id == B_BAD_VALUE);
20852a38012Sejakowatz	assert(errno == B_OK);
20952a38012Sejakowatz}
21052a38012Sejakowatz//------------------------------------------------------------------------------
21152a38012Sejakowatz/**
21252a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
21352a38012Sejakowatz	@case			Valid archive of class defined in add-on explicitely loaded
21452a38012Sejakowatz					by this team
21552a38012Sejakowatz	@param archive	Valid BMessage pointer with string field "class" containing
21652a38012Sejakowatz					name of remotely defined class which can be instantiated via
21752a38012Sejakowatz					archiving mechanism
21852a38012Sejakowatz	@param id		Valid image_id pointer
21952a38012Sejakowatz	@requires		RemoteObjectDef add-on must be built and accessible
22052a38012Sejakowatz	@results		Returns valid TRemoteTestObject instance.
22152a38012Sejakowatz					*id is set to B_BAD_VALUE (no image was loaded).
22252a38012Sejakowatz					errno is set to B_OK.
22352a38012Sejakowatz */
22452a38012Sejakowatzvoid TInstantiateObjectTester::Case7()
22552a38012Sejakowatz{
22652a38012Sejakowatz	errno = B_OK;
22752a38012Sejakowatz	LoadAddon();
22852a38012Sejakowatz
22952a38012Sejakowatz	BMessage Archive;
23052a38012Sejakowatz	Archive.AddString("class", gRemoteClassName);
23152a38012Sejakowatz	image_id id = B_OK;
23252a38012Sejakowatz	TRemoteTestObject* Test = (TRemoteTestObject*)instantiate_object(&Archive,
23352a38012Sejakowatz																	 &id);
23452a38012Sejakowatz	assert(Test != NULL);
23552a38012Sejakowatz	assert(id == B_BAD_VALUE);
23652a38012Sejakowatz	assert(errno == B_OK);
23752a38012Sejakowatz
23852a38012Sejakowatz	UnloadAddon();
23952a38012Sejakowatz}
24052a38012Sejakowatz//------------------------------------------------------------------------------
24152a38012Sejakowatz/**
24252a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
24352a38012Sejakowatz	@case			Valid archive of remotely-defined class, without required
24452a38012Sejakowatz					signature of the defining add-on
24552a38012Sejakowatz	@param archive	Valid BMessage pointer with string field "class" containing
24652a38012Sejakowatz					name of remotely-defined class; no "add-on" field
24752a38012Sejakowatz	@param id		Valid image_id pointer
24852a38012Sejakowatz	@results		Returns NULL.
24952a38012Sejakowatz					*id is set to B_BAD_VALUE (no image loaded).
25052a38012Sejakowatz					errno is set to B_BAD_VALUE.
25152a38012Sejakowatz */
25252a38012Sejakowatzvoid TInstantiateObjectTester::Case8()
25352a38012Sejakowatz{
25452a38012Sejakowatz	errno = B_OK;
25552a38012Sejakowatz	BMessage Archive;
25652a38012Sejakowatz	Archive.AddString("class", gRemoteClassName);
25752a38012Sejakowatz	image_id id = B_OK;
25852a38012Sejakowatz	TRemoteTestObject* Test = (TRemoteTestObject*)instantiate_object(&Archive,
25952a38012Sejakowatz																	 &id);
26052a38012Sejakowatz	assert(Test == NULL);
26152a38012Sejakowatz	assert(id == B_BAD_VALUE);
26252a38012Sejakowatz	assert(errno == B_BAD_VALUE);
26352a38012Sejakowatz}
26452a38012Sejakowatz//------------------------------------------------------------------------------
26552a38012Sejakowatz/**
26652a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
26752a38012Sejakowatz	@case			Valid archive naming locally defined class with invalid
26852a38012Sejakowatz					signature
26952a38012Sejakowatz	@param archive	Valid BMessage pointer with string field "class" containing
27052a38012Sejakowatz					name of locally defined class and string field "add_on"
27152a38012Sejakowatz					containing invalid signature
27252a38012Sejakowatz	@param id		Valid image_id pointer
27352a38012Sejakowatz	@results		Returns NULL.
27452a38012Sejakowatz					*id is set to B_BAD_VALUE (no image loaded).
27552a38012Sejakowatz					errno is set to B_LAUNCH_FAILED_APP_NOT_FOUND.
27652a38012Sejakowatz */
27752a38012Sejakowatzvoid TInstantiateObjectTester::Case9()
27852a38012Sejakowatz{
27952a38012Sejakowatz	errno = B_OK;
28052a38012Sejakowatz	BMessage Archive;
28152a38012Sejakowatz	Archive.AddString("class", gLocalClassName);
28252a38012Sejakowatz	Archive.AddString("add_on", gInvalidSig);
28352a38012Sejakowatz	image_id id = B_OK;
28452a38012Sejakowatz	TIOTest* Test = (TIOTest*)instantiate_object(&Archive, &id);
28552a38012Sejakowatz	assert(Test == NULL);
28652a38012Sejakowatz	assert(id == B_BAD_VALUE);
28752a38012Sejakowatz	assert(errno == B_LAUNCH_FAILED_APP_NOT_FOUND);
28852a38012Sejakowatz}
28952a38012Sejakowatz//------------------------------------------------------------------------------
29052a38012Sejakowatz/**
29152a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
29252a38012Sejakowatz	@case			Valid archive of class defined in add-on explicitely loaded
29352a38012Sejakowatz					by this team, but with an invalid signature
29452a38012Sejakowatz	@param archive	Valid BMessage pointer with string field "class" containing
29552a38012Sejakowatz					name of remotely-defined class and string field "add_on"
29652a38012Sejakowatz					containing invalid signature
29752a38012Sejakowatz	@param id		Valid image_id pointer
29852a38012Sejakowatz	@requires		RemoteObjectDef add-on must be built and accessible
29952a38012Sejakowatz	@results		Returns NULL.
30052a38012Sejakowatz					*id is set to B_BAD_VALUE (no image loaded).
30152a38012Sejakowatz					errno is set to B_LAUNCH_FAILED_APP_NOT_FOUND.
30252a38012Sejakowatz */
30352a38012Sejakowatzvoid TInstantiateObjectTester::Case10()
30452a38012Sejakowatz{
30552a38012Sejakowatz	errno = B_OK;
30652a38012Sejakowatz	LoadAddon();
30752a38012Sejakowatz
30852a38012Sejakowatz	BMessage Archive;
30952a38012Sejakowatz	Archive.AddString("class", gRemoteClassName);
31052a38012Sejakowatz	Archive.AddString("add_on", gInvalidSig);
31152a38012Sejakowatz	image_id id = B_OK;
31252a38012Sejakowatz	TIOTest* Test = (TIOTest*)instantiate_object(&Archive, &id);
31352a38012Sejakowatz	assert(Test == NULL);
31452a38012Sejakowatz	assert(id == B_BAD_VALUE);
31552a38012Sejakowatz	assert(errno == B_LAUNCH_FAILED_APP_NOT_FOUND);
31652a38012Sejakowatz
31752a38012Sejakowatz	UnloadAddon();
31852a38012Sejakowatz}
31952a38012Sejakowatz//------------------------------------------------------------------------------
32052a38012Sejakowatz/**
32152a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
32252a38012Sejakowatz	@case			Valid archive of remotely-defined class, with invalid
32352a38012Sejakowatz					signature
32452a38012Sejakowatz	@param archive	Valid BMessage pointer with string field "class" containing
32552a38012Sejakowatz					name of remotely-defined class and string field add-on
32652a38012Sejakowatz					containing invalid signature
32752a38012Sejakowatz	@param id		Valid image_id pointer
32852a38012Sejakowatz	@results		Returns NULL.
32952a38012Sejakowatz					*id is set to B_BAD_VALUE.
33052a38012Sejakowatz					errno is set to B_LAUNCH_FAILED_APP_NOT_FOUND
33152a38012Sejakowatz */
33252a38012Sejakowatzvoid TInstantiateObjectTester::Case11()
33352a38012Sejakowatz{
33452a38012Sejakowatz	errno = B_OK;
33552a38012Sejakowatz	BMessage Archive;
33652a38012Sejakowatz	Archive.AddString("class", gRemoteClassName);
33752a38012Sejakowatz	Archive.AddString("add_on", gInvalidSig);
33852a38012Sejakowatz	image_id id = B_OK;
33952a38012Sejakowatz	TIOTest* Test = (TIOTest*)instantiate_object(&Archive, &id);
34052a38012Sejakowatz	assert(Test == NULL);
34152a38012Sejakowatz	assert(id == B_BAD_VALUE);
34252a38012Sejakowatz	assert(errno == B_LAUNCH_FAILED_APP_NOT_FOUND);
34352a38012Sejakowatz}
34452a38012Sejakowatz//------------------------------------------------------------------------------
34552a38012Sejakowatz/**
34652a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
34752a38012Sejakowatz	@case			Valid archive of locally-defined class with correct
34852a38012Sejakowatz					signature
34952a38012Sejakowatz	@param archive	Valid BMessage pointer with string field "class" containing
35052a38012Sejakowatz					name of locally-defined class and string field "add_on"
35152a38012Sejakowatz					containing signature of current team
35252a38012Sejakowatz	@param id		Valid image_id pointer
35352a38012Sejakowatz	@requires		locally defined class which can be instantiated via
35452a38012Sejakowatz					archiving mechanism
35552a38012Sejakowatz	@results		Returns valid TIOTest instance.
35652a38012Sejakowatz					*id is set to B_BAD_VALUE (no image loaded).
35752a38012Sejakowatz					errno is set to B_OK.
35852a38012Sejakowatz	@note			This test is not currently used; GetLocalSignature() doesn't
35952a38012Sejakowatz					seem to work without a BApplication instance constructed.
36052a38012Sejakowatz					See GetLocalSignature() for more info.
36152a38012Sejakowatz */
36252a38012Sejakowatzvoid TInstantiateObjectTester::Case12()
36352a38012Sejakowatz{
36452a38012Sejakowatz	errno = B_OK;
36552a38012Sejakowatz	BMessage Archive;
36652a38012Sejakowatz	Archive.AddString("class", gLocalClassName);
36752a38012Sejakowatz	Archive.AddString("add_on", GetLocalSignature().c_str());
36852a38012Sejakowatz	image_id id = B_OK;
36952a38012Sejakowatz	TIOTest* Test = (TIOTest*)instantiate_object(&Archive, &id);
37052a38012Sejakowatz	assert(Test != NULL);
37152a38012Sejakowatz	assert(id == B_BAD_VALUE);
37252a38012Sejakowatz	assert(errno == B_OK);
37352a38012Sejakowatz}
37452a38012Sejakowatz//------------------------------------------------------------------------------
37552a38012Sejakowatz/**
37652a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
37752a38012Sejakowatz	@case			Valid archive of class defined in add-on explicitely loaded
37852a38012Sejakowatz					by this team with signature of add-on
37952a38012Sejakowatz	@param archive	Valid BMessage pointer with string field "class" containing
38052a38012Sejakowatz					name of remotely-defined class and string field "add_on"
38152a38012Sejakowatz					containing signature of loaded add-on
38252a38012Sejakowatz	@param id		Valid image_id pointer
38352a38012Sejakowatz	@requires		RemoteObjectDef add-on must be built and accessible
38452a38012Sejakowatz	@results		Returns valid instance of TRemoteTestObject.
38552a38012Sejakowatz					*id is set to B_BAD_VALUE (image load not necessary).
38652a38012Sejakowatz					errno is set to B_OK.
38752a38012Sejakowatz */
38852a38012Sejakowatzvoid TInstantiateObjectTester::Case13()
38952a38012Sejakowatz{
39052a38012Sejakowatz	errno = B_OK;
39152a38012Sejakowatz	LoadAddon();
39252a38012Sejakowatz
39352a38012Sejakowatz	BMessage Archive;
39452a38012Sejakowatz	Archive.AddString("class", gRemoteClassName);
39552a38012Sejakowatz	Archive.AddString("add_on", gRemoteSig);
39652a38012Sejakowatz	image_id id = B_OK;
39752a38012Sejakowatz	TRemoteTestObject* Test = (TRemoteTestObject*)instantiate_object(&Archive, &id);
39852a38012Sejakowatz	assert(Test != NULL);
39952a38012Sejakowatz	assert(id == B_BAD_VALUE);
40052a38012Sejakowatz	assert(errno == B_OK);
40152a38012Sejakowatz
40252a38012Sejakowatz	UnloadAddon();
40352a38012Sejakowatz}
40452a38012Sejakowatz//------------------------------------------------------------------------------
40552a38012Sejakowatz/**
40652a38012Sejakowatz	instantiate_object(BMessage* archive, image_id* id)
40752a38012Sejakowatz	@case			Valid archive of remotely-defined class with correct
40852a38012Sejakowatz					signature
40952a38012Sejakowatz	@param archive	Valid BMessage pointer with string field "class" containing
41052a38012Sejakowatz					name of remotely-defined class and string field "add_on"
41152a38012Sejakowatz					containing signature of defining add-on
41252a38012Sejakowatz	@param id		Valid image_id pointer
41352a38012Sejakowatz	@requires		RemoteObjectDef must be built and accessible
41452a38012Sejakowatz	@results		Returns valid instance of TRemoteTestObject.
41552a38012Sejakowatz					*id > 0 (image was loaded).
41652a38012Sejakowatz					errno is set to B_OK.
41752a38012Sejakowatz */
41852a38012Sejakowatzvoid TInstantiateObjectTester::Case14()
41952a38012Sejakowatz{
42052a38012Sejakowatz	errno = B_OK;
42152a38012Sejakowatz	BMessage Archive;
42252a38012Sejakowatz	Archive.AddString("class", gRemoteClassName);
42352a38012Sejakowatz	Archive.AddString("add_on", gRemoteSig);
42452a38012Sejakowatz	image_id id = B_OK;
42552a38012Sejakowatz	TRemoteTestObject* Test = (TRemoteTestObject*)instantiate_object(&Archive, &id);
42652a38012Sejakowatz	assert(Test != NULL);
42752a38012Sejakowatz	assert(id > 0);
42852a38012Sejakowatz	unload_add_on(id);
42952a38012Sejakowatz	assert(errno == B_OK);
43052a38012Sejakowatz}
43152a38012Sejakowatz//------------------------------------------------------------------------------
43252a38012SejakowatzTest* TInstantiateObjectTester::Suite()
43352a38012Sejakowatz{
43452a38012Sejakowatz	TestSuite* SuiteOfTests = new TestSuite;
43552a38012Sejakowatz
43652a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case1);
43752a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case2);
43852a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case3);
43952a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case4);
44052a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case5);
44152a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case6);
44252a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case7);
44352a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case8);
44452a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case9);
44552a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case10);
44652a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case11);
44752a38012Sejakowatz//	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case12);
44852a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case13);
44952a38012Sejakowatz	ADD_TEST(SuiteOfTests, TInstantiateObjectTester, Case14);
45052a38012Sejakowatz
45152a38012Sejakowatz	return SuiteOfTests;
45252a38012Sejakowatz}
45352a38012Sejakowatz//------------------------------------------------------------------------------
45452a38012Sejakowatzvoid TInstantiateObjectTester::LoadAddon()
45552a38012Sejakowatz{
45652a38012Sejakowatz	if (fAddonId > 0)
45752a38012Sejakowatz		return;
45852a38012Sejakowatz
45952a38012Sejakowatz	BRoster Roster;
46052a38012Sejakowatz	entry_ref ref;
46152a38012Sejakowatz	status_t err = Roster.FindApp(gRemoteSig, &ref);
46252a38012Sejakowatz
46352a38012Sejakowatz	if (err)
46452a38012Sejakowatz	{
46552a38012Sejakowatz		FORMAT_AND_THROW(" failed to find app: ", err);
46652a38012Sejakowatz	}
46752a38012Sejakowatz
46852a38012Sejakowatz	BPath Path(&ref);
46952a38012Sejakowatz	fAddonId = load_add_on(Path.Path());
47052a38012Sejakowatz	if (fAddonId <= 0)
47152a38012Sejakowatz	{
47252a38012Sejakowatz		FORMAT_AND_THROW(" failed to load addon: ", fAddonId);
47352a38012Sejakowatz	}
47452a38012Sejakowatz}
47552a38012Sejakowatz//------------------------------------------------------------------------------
47652a38012Sejakowatzvoid TInstantiateObjectTester::UnloadAddon()
47752a38012Sejakowatz{
47852a38012Sejakowatz	if (fAddonId > 0)
47952a38012Sejakowatz	{
48052a38012Sejakowatz		status_t err = unload_add_on(fAddonId);
48152a38012Sejakowatz		fAddonId = B_ERROR;
48252a38012Sejakowatz		if (err)
48352a38012Sejakowatz		{
48452a38012Sejakowatz			FORMAT_AND_THROW(" failed to unload addon: ", err);
48552a38012Sejakowatz		}
48652a38012Sejakowatz	}
48752a38012Sejakowatz}
48852a38012Sejakowatz//------------------------------------------------------------------------------
48952a38012Sejakowatzstd::string TInstantiateObjectTester::GetLocalSignature()
49052a38012Sejakowatz{
49152a38012Sejakowatz	BRoster Roster;
49252a38012Sejakowatz	app_info ai;
49352a38012Sejakowatz	team_id team;
49452a38012Sejakowatz
49552a38012Sejakowatz	// Get the team_id of this app
49652a38012Sejakowatz	thread_id tid = find_thread(NULL);
49752a38012Sejakowatz	thread_info ti;
49852a38012Sejakowatz	status_t err = get_thread_info(tid, &ti);
49952a38012Sejakowatz	if (err)
50052a38012Sejakowatz	{
50152a38012Sejakowatz		FORMAT_AND_THROW(" failed to get thread_info: ", err);
50252a38012Sejakowatz	}
50352a38012Sejakowatz
50452a38012Sejakowatz	// Get the app_info via the team_id
50552a38012Sejakowatz	team = ti.team;
50652a38012Sejakowatz	team_info info;
50752a38012Sejakowatz	err = get_team_info(team, &info);
50852a38012Sejakowatz	if (err)
50952a38012Sejakowatz	{
51052a38012Sejakowatz		FORMAT_AND_THROW(" failed to get team_info: ", err);
51152a38012Sejakowatz	}
51252a38012Sejakowatz
51352a38012Sejakowatz	team = info.team;
51452a38012Sejakowatz
51552a38012Sejakowatz	// It seems that this call to GetRunningAppInfo() is not working because we
51652a38012Sejakowatz	// don't have an instance of BApplication somewhere -- the roster, therefore,
51752a38012Sejakowatz	// doesn't know about us.
51852a38012Sejakowatz	err = Roster.GetRunningAppInfo(team, &ai);
51952a38012Sejakowatz	if (err)
52052a38012Sejakowatz	{
52152a38012Sejakowatz		FORMAT_AND_THROW(" failed to get app_info: ", err);
52252a38012Sejakowatz	}
52352a38012Sejakowatz
52452a38012Sejakowatz	// Return the signature from the app_info
52552a38012Sejakowatz	return ai.signature;
52652a38012Sejakowatz}
52752a38012Sejakowatz//------------------------------------------------------------------------------
52852a38012Sejakowatz
52952a38012Sejakowatz//------------------------------------------------------------------------------
53052a38012Sejakowatzvoid FormatAndThrow(int line, const char *file, const char *msg, int err)
53152a38012Sejakowatz{
53252a38012Sejakowatz	string s("line: ");
53352a38012Sejakowatz	s += estring(line);
53452a38012Sejakowatz	s += " ";
53552a38012Sejakowatz	s += file;
53652a38012Sejakowatz	s += msg;
53752a38012Sejakowatz	s += strerror(err);
53852a38012Sejakowatz	s += "(";
53952a38012Sejakowatz	s += estring(err);
54052a38012Sejakowatz	s += ")";
54152a38012Sejakowatz	std::runtime_error re(s.c_str());
54252a38012Sejakowatz	throw re;
54352a38012Sejakowatz}
54452a38012Sejakowatz//------------------------------------------------------------------------------
54552a38012Sejakowatz
54652a38012Sejakowatz/*
54752a38012Sejakowatz * $Log $
54852a38012Sejakowatz *
54952a38012Sejakowatz * $Id  $
55052a38012Sejakowatz *
55152a38012Sejakowatz */
55252a38012Sejakowatz
553