From 6db3155bd07c9394a1e8409077d95aac709180aa Mon Sep 17 00:00:00 2001 From: Markus Jung Date: Wed, 9 Mar 2016 18:53:06 +0900 Subject: [PATCH] IOT-945: Fixing segmentation fault issue - Using smart pointers for managing bundles - Changing APIs to use smart pointers NOTE: this patch breaks backward compatibility with previous APIs Change-Id: Ibeb833c3a0381856ca96747404302ae4bc308a39 Signed-off-by: Markus Jung Reviewed-on: https://gerrit.iotivity.org/gerrit/5661 Reviewed-by: Inga Stotland Tested-by: jenkins-iotivity Reviewed-by: JungHo Kim --- .../examples/ContainerSample.cpp | 2 +- .../resource-container/src/BundleInfoInternal.cpp | 6 +- .../resource-container/src/BundleInfoInternal.h | 2 +- .../src/ResourceContainerImpl.cpp | 128 +++++++++------- .../resource-container/src/ResourceContainerImpl.h | 23 +-- .../unittests/ResourceContainerTest.cpp | 162 +-------------------- 6 files changed, 98 insertions(+), 225 deletions(-) diff --git a/service/resource-container/examples/ContainerSample.cpp b/service/resource-container/examples/ContainerSample.cpp index 2240510..cab08fa 100644 --- a/service/resource-container/examples/ContainerSample.cpp +++ b/service/resource-container/examples/ContainerSample.cpp @@ -438,4 +438,4 @@ int main() g_pResourceContainer = nullptr; return 0; -} \ No newline at end of file +} diff --git a/service/resource-container/src/BundleInfoInternal.cpp b/service/resource-container/src/BundleInfoInternal.cpp index da45256..c6e7706 100644 --- a/service/resource-container/src/BundleInfoInternal.cpp +++ b/service/resource-container/src/BundleInfoInternal.cpp @@ -219,9 +219,11 @@ namespace OIC } #endif - void BundleInfoInternal::setBundleInfo(RCSBundleInfo *bundleInfo) + void BundleInfoInternal::setBundleInfo(shared_ptr bundleInfo) { - BundleInfoInternal *source = (BundleInfoInternal *)bundleInfo; + shared_ptr source = + std::static_pointer_cast(bundleInfo); + m_ID = source->getID(); m_path = source->getPath(); m_version = source->getVersion(); diff --git a/service/resource-container/src/BundleInfoInternal.h b/service/resource-container/src/BundleInfoInternal.h index a899983..1dbe4fd 100644 --- a/service/resource-container/src/BundleInfoInternal.h +++ b/service/resource-container/src/BundleInfoInternal.h @@ -77,7 +77,7 @@ namespace OIC void setResourceDestroyer(resourceDestroyer_t *); resourceDestroyer_t *getResourceDestroyer(); - void setBundleInfo(RCSBundleInfo *bundleInfo); + void setBundleInfo(shared_ptr bundleInfo); void setBundleHandle(void *); void *getBundleHandle(); diff --git a/service/resource-container/src/ResourceContainerImpl.cpp b/service/resource-container/src/ResourceContainerImpl.cpp index c6a27d1..0217199 100644 --- a/service/resource-container/src/ResourceContainerImpl.cpp +++ b/service/resource-container/src/ResourceContainerImpl.cpp @@ -79,7 +79,7 @@ namespace OIC for (unsigned int i = 0; i < bundles.size(); i++) { - BundleInfoInternal *bundleInfo = new BundleInfoInternal(); + shared_ptr bundleInfo(new BundleInfoInternal); bundleInfo->setPath(bundles[i][BUNDLE_PATH]); bundleInfo->setVersion(bundles[i][BUNDLE_VERSION]); bundleInfo->setID(bundles[i][BUNDLE_ID]); @@ -87,9 +87,8 @@ namespace OIC { string activatorName = bundles[i][BUNDLE_ACTIVATOR]; std::replace(activatorName.begin(), activatorName.end(), '.', '/'); - ((BundleInfoInternal *) bundleInfo)->setActivatorName(activatorName); - ((BundleInfoInternal *) bundleInfo)->setLibraryPath( - bundles[i][BUNDLE_LIBRARY_PATH]); + bundleInfo->setActivatorName(activatorName); + bundleInfo->setLibraryPath(bundles[i][BUNDLE_LIBRARY_PATH]); } OIC_LOG_V(INFO, CONTAINER_TAG, "Init Bundle:(%s)", @@ -127,12 +126,11 @@ namespace OIC { OIC_LOG(INFO, CONTAINER_TAG, "Stopping resource container."); - for (std::map< std::string, BundleInfoInternal * >::iterator it = m_bundles.begin(); + for (std::map< std::string, shared_ptr >::iterator it = m_bundles.begin(); it != m_bundles.end(); ++it) { - BundleInfoInternal *bundleInfo = it->second; - deactivateBundle(bundleInfo); - unregisterBundle(bundleInfo); + deactivateBundle(it->second); + unregisterBundle(it->second); } if (!m_mapServers.empty()) @@ -152,10 +150,12 @@ namespace OIC delete m_config; } - void ResourceContainerImpl::activateBundle(RCSBundleInfo *bundleInfo) + void ResourceContainerImpl::activateBundle(shared_ptr bundleInfo) { activationLock.lock(); - BundleInfoInternal *bundleInfoInternal = (BundleInfoInternal *) bundleInfo; + + shared_ptr bundleInfoInternal = + std::static_pointer_cast(bundleInfo); if (bundleInfoInternal->isLoaded()) { @@ -164,11 +164,13 @@ namespace OIC activationLock.unlock(); } - void ResourceContainerImpl::deactivateBundle(RCSBundleInfo *bundleInfo) + void ResourceContainerImpl::deactivateBundle(shared_ptr bundleInfo) { - if (((BundleInfoInternal *) bundleInfo)->isActivated()) + shared_ptr bundleInfoInternal = + std::static_pointer_cast(bundleInfo); + if (bundleInfoInternal->isActivated()) { - deactivateBundle(bundleInfo->getID()); + deactivateBundle(bundleInfoInternal->getID()); } } @@ -201,41 +203,44 @@ namespace OIC } // loads the bundle - void ResourceContainerImpl::registerBundle(RCSBundleInfo *bundleInfo) + void ResourceContainerImpl::registerBundle(shared_ptr bundleInfo) { OIC_LOG_V(INFO, CONTAINER_TAG, "Registering bundle: (%s)", std::string(bundleInfo->getPath()).c_str()); + shared_ptr bundleInfoInternal = + std::static_pointer_cast(bundleInfo); if (has_suffix(bundleInfo->getPath(), ".jar")) { #if(JAVA_SUPPORT) - ((BundleInfoInternal *) bundleInfo)->setJavaBundle(true); - ((BundleInfoInternal *) bundleInfo)->setSoBundle(false); + bundleInfoInternal->setJavaBundle(true); + bundleInfoInternal->setSoBundle(false); registerJavaBundle(bundleInfo); #else // android .jar library - ((BundleInfoInternal *) bundleInfo)->setSoBundle(false); - ((BundleInfoInternal *) bundleInfo)->setJavaBundle(false); + bundleInfoInternal->setSoBundle(false); + bundleInfoInternal->setJavaBundle(false); registerExtBundle(bundleInfo); #endif } else if(has_suffix(bundleInfo->getPath(), ".so")) { - ((BundleInfoInternal *) bundleInfo)->setSoBundle(true); - ((BundleInfoInternal *) bundleInfo)->setJavaBundle(false); + bundleInfoInternal->setSoBundle(true); + bundleInfoInternal->setJavaBundle(false); registerSoBundle(bundleInfo); } // other cases might be for example .apk for android, which are loaded in the wrapper else{ - ((BundleInfoInternal *) bundleInfo)->setSoBundle(false); - ((BundleInfoInternal *) bundleInfo)->setJavaBundle(false); + bundleInfoInternal->setSoBundle(false); + bundleInfoInternal->setJavaBundle(false); registerExtBundle(bundleInfo); } } - void ResourceContainerImpl::unregisterBundle(RCSBundleInfo *bundleInfo) + void ResourceContainerImpl::unregisterBundle(shared_ptr bundleInfo) { - BundleInfoInternal *bundleInfoInternal = (BundleInfoInternal *) bundleInfo; + shared_ptr bundleInfoInternal = + std::static_pointer_cast(bundleInfo); if (bundleInfoInternal->isLoaded() && !bundleInfoInternal->isActivated()) { if (bundleInfoInternal->getSoBundle()) @@ -267,7 +272,6 @@ namespace OIC } else { - delete m_bundles[id]; m_bundles.erase(id); } } @@ -538,7 +542,7 @@ namespace OIC else { - BundleInfoInternal *bundleInfo = new BundleInfoInternal(); + shared_ptr bundleInfo = std::make_shared(); bundleInfo->setID(bundleId); bundleInfo->setPath(bundlePath); bundleInfo->setActivatorName(activator); @@ -546,8 +550,8 @@ namespace OIC { string activatorName = activator; // modify activator for Java bundle std::replace(activatorName.begin(), activatorName.end(), '.', '/'); - ((BundleInfoInternal *) bundleInfo)->setActivatorName(activatorName); - ((BundleInfoInternal *)bundleInfo)->setLibraryPath(params[BUNDLE_LIBRARY_PATH]); + bundleInfo->setActivatorName(activatorName); + bundleInfo->setLibraryPath(params[BUNDLE_LIBRARY_PATH]); } OIC_LOG_V(INFO, CONTAINER_TAG, "Add Bundle: (%s)", @@ -563,7 +567,7 @@ namespace OIC OIC_LOG_V(INFO, CONTAINER_TAG, "removeBundle %s",bundleId.c_str()); if (m_bundles.find(bundleId) != m_bundles.end()) { - BundleInfoInternal *bundleInfo = m_bundles[bundleId]; + shared_ptr bundleInfo = m_bundles[bundleId]; if (bundleInfo->isActivated()) deactivateBundle(bundleInfo); @@ -582,12 +586,12 @@ namespace OIC OIC_LOG_V(INFO, CONTAINER_TAG, "list bundles (%d)", m_bundles.size()); std::list > ret; - for (std::map< std::string, BundleInfoInternal * >::iterator it = m_bundles.begin(); + for (std::map< std::string, shared_ptr >::iterator it = m_bundles.begin(); it != m_bundles.end(); ++it) { { std::unique_ptr bundleInfo(new BundleInfoInternal); - (bundleInfo)->setBundleInfo(it->second); + bundleInfo->setBundleInfo(it->second); ret.push_back(std::move(bundleInfo)); } } @@ -624,7 +628,8 @@ namespace OIC void ResourceContainerImpl::removeResourceConfig(const std::string &bundleId, const std::string &resourceUri) { - OIC_LOG_V(INFO, CONTAINER_TAG, "removeResourceConfig %s, %s",bundleId.c_str(), resourceUri.c_str()); + OIC_LOG_V(INFO, CONTAINER_TAG, "removeResourceConfig %s, %s",bundleId.c_str(), + resourceUri.c_str()); if (m_bundles.find(bundleId) != m_bundles.end()) { if (m_bundles[bundleId]->getSoBundle()) @@ -653,7 +658,7 @@ namespace OIC } - void ResourceContainerImpl::registerSoBundle(RCSBundleInfo *bundleInfo) + void ResourceContainerImpl::registerSoBundle(shared_ptr bundleInfo) { OIC_LOG_V(DEBUG, CONTAINER_TAG, "Register SO bundle"); const char *error; @@ -662,7 +667,9 @@ namespace OIC deactivator_t *bundleDeactivator = NULL; resourceCreator_t *resourceCreator = NULL; resourceDestroyer_t *resourceDestroyer = NULL; - BundleInfoInternal *bundleInfoInternal = (BundleInfoInternal *) bundleInfo; + shared_ptr bundleInfoInternal = + std::static_pointer_cast(bundleInfo); + void *bundleHandle = NULL; bundleHandle = dlopen(bundleInfo->getPath().c_str(), RTLD_LAZY); if ((error = dlerror()) != NULL) @@ -672,7 +679,8 @@ namespace OIC if (bundleHandle != NULL) { - OIC_LOG_V(DEBUG, CONTAINER_TAG, "Activator name %s", bundleInfoInternal->getActivatorName().c_str()); + OIC_LOG_V(DEBUG, CONTAINER_TAG, "Activator name %s", + bundleInfoInternal->getActivatorName().c_str()); bundleActivator = (activator_t *) dlsym(bundleHandle, ("" + bundleInfoInternal->getActivatorName() @@ -682,7 +690,8 @@ namespace OIC OIC_LOG_V(ERROR, CONTAINER_TAG, "Error while loading .so bundle: (%s)", error); } else{ - OIC_LOG_V(DEBUG, CONTAINER_TAG, "Looked up %s", ("" + bundleInfoInternal->getActivatorName() + OIC_LOG_V(DEBUG, CONTAINER_TAG, "Looked up %s", ("" + + bundleInfoInternal->getActivatorName() + "_externalActivateBundle").c_str()); } bundleDeactivator = @@ -694,7 +703,8 @@ namespace OIC OIC_LOG_V(ERROR, CONTAINER_TAG, "Error while loading .so bundle: (%s)", error); } else{ - OIC_LOG_V(DEBUG, CONTAINER_TAG, "Looked up %s", ("" + bundleInfoInternal->getActivatorName() + OIC_LOG_V(DEBUG, CONTAINER_TAG, "Looked up %s", ("" + + bundleInfoInternal->getActivatorName() + "_externalDeactivateBundle").c_str()); } resourceCreator = @@ -706,7 +716,8 @@ namespace OIC OIC_LOG_V(ERROR, CONTAINER_TAG, "Error while loading .so bundle: (%s)", error); } else{ - OIC_LOG_V(DEBUG, CONTAINER_TAG, "Looked up %s", ("" + bundleInfoInternal->getActivatorName() + OIC_LOG_V(DEBUG, CONTAINER_TAG, "Looked up %s", ("" + + bundleInfoInternal->getActivatorName() + "_externalCreateResource").c_str()); } resourceDestroyer = @@ -718,7 +729,8 @@ namespace OIC OIC_LOG_V(ERROR, CONTAINER_TAG, "Error while loading .so bundle: (%s)", error); } else{ - OIC_LOG_V(DEBUG, CONTAINER_TAG, "Looked up %s", ("" + bundleInfoInternal->getActivatorName() + OIC_LOG_V(DEBUG, CONTAINER_TAG, "Looked up %s", ("" + + bundleInfoInternal->getActivatorName() + "_externalDestroyResource").c_str()); } @@ -729,14 +741,14 @@ namespace OIC } else { - ((BundleInfoInternal *) bundleInfo)->setBundleActivator(bundleActivator); - ((BundleInfoInternal *) bundleInfo)->setBundleDeactivator(bundleDeactivator); - ((BundleInfoInternal *) bundleInfo)->setResourceCreator(resourceCreator); - ((BundleInfoInternal *) bundleInfo)->setResourceDestroyer(resourceDestroyer); - ((BundleInfoInternal *) bundleInfo)->setLoaded(true); - ((BundleInfoInternal *) bundleInfo)->setBundleHandle(bundleHandle); - - m_bundles[bundleInfo->getID()] = ((BundleInfoInternal *) bundleInfo); + bundleInfoInternal->setBundleActivator(bundleActivator); + bundleInfoInternal->setBundleDeactivator(bundleDeactivator); + bundleInfoInternal->setResourceCreator(resourceCreator); + bundleInfoInternal->setResourceDestroyer(resourceDestroyer); + bundleInfoInternal->setLoaded(true); + bundleInfoInternal->setBundleHandle(bundleHandle); + + m_bundles[bundleInfo->getID()] = bundleInfoInternal; } } else @@ -749,13 +761,16 @@ namespace OIC OIC_LOG_V(DEBUG, CONTAINER_TAG, "Register SO bundle finished"); } - void ResourceContainerImpl::registerExtBundle(RCSBundleInfo *bundleInfo){ + void ResourceContainerImpl::registerExtBundle(shared_ptr bundleInfo){ OIC_LOG_V(INFO, CONTAINER_TAG, "Registering ext bundle (%s)", std::string(bundleInfo->getID()).c_str()); OIC_LOG_V(INFO, CONTAINER_TAG, "Activator name (%s)", std::string(bundleInfo->getActivatorName()).c_str()); - m_bundles[bundleInfo->getID()] = ((BundleInfoInternal *)bundleInfo); + shared_ptr bundleInfoInternal = + std::static_pointer_cast(bundleInfo); + + m_bundles[bundleInfo->getID()] = bundleInfoInternal; // in this case at least the resource configuration needs to be loaded // in order to mark potential input resources for soft sensors std::vector< resourceInfo > temp; @@ -782,7 +797,7 @@ namespace OIC OIC_LOG(ERROR, CONTAINER_TAG, "Activation unsuccessful."); } - BundleInfoInternal *bundleInfoInternal = (BundleInfoInternal *) m_bundles[bundleId]; + shared_ptr bundleInfoInternal = m_bundles[bundleId]; bundleInfoInternal->setActivated(true); } @@ -954,7 +969,7 @@ namespace OIC return m_bundleVM[bundleId]; } - void ResourceContainerImpl::registerJavaBundle(RCSBundleInfo *bundleInfo) + void ResourceContainerImpl::registerJavaBundle(shared_ptr bundleInfo) { OIC_LOG_V(INFO, CONTAINER_TAG, "Registering Java bundle (%s)", std::string(bundleInfo->getID()).c_str()); @@ -963,7 +978,9 @@ namespace OIC JavaVMInitArgs vm_args; JavaVMOption options[3]; - BundleInfoInternal *bundleInfoInternal = (BundleInfoInternal *) bundleInfo; + shared_ptr bundleInfoInternal = + std::static_pointer_cast(bundleInfo); + if (FILE *file = fopen(bundleInfo->getPath().c_str(), "r")) { @@ -1074,7 +1091,7 @@ namespace OIC bundleInfoInternal->setLoaded(true); - m_bundles[bundleInfo->getID()] = ((BundleInfoInternal *)bundleInfo); + m_bundles[bundleInfo->getID()] = bundleInfoInternal; OIC_LOG(INFO, CONTAINER_TAG, "Bundle registered"); @@ -1087,7 +1104,7 @@ namespace OIC OIC_LOG(INFO, CONTAINER_TAG, "Activating java bundle"); JavaVM *vm = getJavaVM(bundleId); - BundleInfoInternal *bundleInfoInternal = (BundleInfoInternal *) m_bundles[bundleId]; + bundleInfoInternal = m_bundles[bundleId]; JNIEnv *env; int envStat = vm->GetEnv((void **) &env, JNI_VERSION_1_4); @@ -1114,7 +1131,7 @@ namespace OIC OIC_LOG(INFO, CONTAINER_TAG, "Deactivating java bundle"); JavaVM *vm = getJavaVM(bundleId); - BundleInfoInternal *bundleInfoInternal = (BundleInfoInternal *) m_bundles[bundleId]; + shared_ptrbundleInfoInternal = m_bundles[bundleId]; JNIEnv *env; int envStat = vm->GetEnv((void **) &env, JNI_VERSION_1_4); @@ -1145,7 +1162,6 @@ namespace OIC m_bundleVM[id]->DestroyJavaVM(); - delete m_bundles[id]; m_bundles.erase(id); } #endif diff --git a/service/resource-container/src/ResourceContainerImpl.h b/service/resource-container/src/ResourceContainerImpl.h index 979c600..1428514 100644 --- a/service/resource-container/src/ResourceContainerImpl.h +++ b/service/resource-container/src/ResourceContainerImpl.h @@ -56,13 +56,6 @@ namespace OIC // methods from ResourceContainer void startContainer(const std::string &configFile); void stopContainer(); - void activateBundle(RCSBundleInfo *bundleInfo); - void deactivateBundle(RCSBundleInfo *bundleInfo); - void activateBundle(const std::string &bundleId); - void deactivateBundle(const std::string &bundleId); - void registerBundle(RCSBundleInfo *bundleinfo); - void unregisterBundle(RCSBundleInfo *bundleinfo); - void unregisterBundleSo(const std::string &id); // methods from ResourceContainerBundleAPI int registerResource(BundleResource::Ptr resource); @@ -105,7 +98,7 @@ namespace OIC #endif private: - map< std::string, BundleInfoInternal * > m_bundles; // + map< std::string, shared_ptr> m_bundles; // map< std::string, RCSResourceObject::Ptr > m_mapServers; // map< std::string, BundleResource::Ptr > m_mapResources; // map< std::string, list< string > > m_mapBundleResources; //> @@ -134,16 +127,24 @@ namespace OIC void addSoBundleResource(const std::string &bundleId, resourceInfo newResourceInfo); void removeSoBundleResource(const std::string &bundleId, const std::string &resourceUri); - void registerSoBundle(RCSBundleInfo *bundleInfo); - void registerExtBundle(RCSBundleInfo *bundleInfo); + void registerSoBundle(shared_ptr bundleInfo); + void registerExtBundle(shared_ptr bundleInfo); void discoverInputResource(const std::string &outputResourceUri); void undiscoverInputResource(const std::string &outputResourceUri); void activateBundleThread(const std::string &bundleId); + void activateBundle(shared_ptr bundleInfo); + void deactivateBundle(shared_ptr bundleInfo); + void activateBundle(const std::string &bundleId); + void deactivateBundle(const std::string &bundleId); + void registerBundle(shared_ptr bundleInfo); + void unregisterBundle(shared_ptr bundleInfo); + void unregisterBundleSo(const std::string &id); + #if(JAVA_SUPPORT) map m_bundleVM; - void registerJavaBundle(RCSBundleInfo *bundleInfo); + void registerJavaBundle(shared_ptr bundleInfo); void activateJavaBundle(string bundleId); void deactivateJavaBundle(string bundleId); diff --git a/service/resource-container/unittests/ResourceContainerTest.cpp b/service/resource-container/unittests/ResourceContainerTest.cpp index fe5ca74..7d00a9b 100644 --- a/service/resource-container/unittests/ResourceContainerTest.cpp +++ b/service/resource-container/unittests/ResourceContainerTest.cpp @@ -252,7 +252,7 @@ TEST_F(ResourceContainerTest, BundleLoadedWhenContainerStartedWithValidConfigFil EXPECT_GT(m_pResourceContainer->listBundles().size(), (unsigned int) 0); unique_ptr first = std::move(*m_pResourceContainer->listBundles().begin()); - unique_ptr firstInternal(static_cast(first.release())); + unique_ptr firstInternal((BundleInfoInternal*)first.release()); EXPECT_TRUE( firstInternal->isLoaded() ); EXPECT_NE(nullptr, firstInternal->getBundleHandle()); @@ -266,7 +266,7 @@ TEST_F(ResourceContainerTest, BundleActivatedWhenContainerStartedWithValidConfig EXPECT_GT(m_pResourceContainer->listBundles().size(), (unsigned int) 0); unique_ptr first = std::move(*m_pResourceContainer->listBundles().begin()); - unique_ptr firstInternal(static_cast(first.release())); + unique_ptr firstInternal((BundleInfoInternal*)first.release()); EXPECT_TRUE(firstInternal->isActivated()); EXPECT_NE(nullptr,firstInternal->getBundleActivator()); @@ -301,7 +301,7 @@ TEST_F(ResourceContainerTest, BundleStoppedWithStartBundleAPI) m_pResourceContainer->stopBundle("oic.bundle.test"); unique_ptr first = std::move(*m_pResourceContainer->listBundles().begin()); - unique_ptr firstInternal(static_cast(first.release())); + unique_ptr firstInternal((BundleInfoInternal*)first.release()); EXPECT_FALSE(firstInternal->isActivated()); m_pResourceContainer->stopContainer(); @@ -313,7 +313,7 @@ TEST_F(ResourceContainerTest, BundleStartedWithStartBundleAPI) m_pResourceContainer->stopBundle("oic.bundle.test"); m_pResourceContainer->startBundle("oic.bundle.test"); unique_ptr first = std::move(*m_pResourceContainer->listBundles().begin()); - unique_ptr firstInternal(static_cast(first.release())); + unique_ptr firstInternal((BundleInfoInternal*)first.release()); EXPECT_TRUE(firstInternal->isActivated()); m_pResourceContainer->stopContainer(); @@ -329,7 +329,7 @@ TEST_F(ResourceContainerTest, AddNewSoBundleToContainer) EXPECT_EQ(bundles.size() + 1, m_pResourceContainer->listBundles().size()); unique_ptr first = std::move(*m_pResourceContainer->listBundles().begin()); - unique_ptr firstInternal(static_cast(first.release())); + unique_ptr firstInternal((BundleInfoInternal*)first.release()); EXPECT_TRUE(firstInternal->isLoaded()); } @@ -516,168 +516,22 @@ class ResourceContainerImplTest: public TestWithMock public: ResourceContainerImpl *m_pResourceContainer; - BundleInfoInternal *m_pBundleInfo; + shared_ptr m_pBundleInfo; protected: void SetUp() { TestWithMock::SetUp(); m_pResourceContainer = ResourceContainerImpl::getImplInstance(); - m_pBundleInfo = new BundleInfoInternal(); + m_pBundleInfo = std::make_shared(); } void TearDown() { - delete m_pBundleInfo; + m_pBundleInfo.reset(); } }; -TEST_F(ResourceContainerImplTest, SoBundleLoadedWhenRegisteredWithRegisterBundleAPI) -{ - m_pBundleInfo->setPath("libTestBundle.so"); - m_pBundleInfo->setActivatorName("test"); - m_pBundleInfo->setVersion("1.0"); - m_pBundleInfo->setLibraryPath("."); - m_pBundleInfo->setID("oic.bundle.test"); - - m_pResourceContainer->registerBundle(m_pBundleInfo); - - EXPECT_NE(nullptr, ((BundleInfoInternal *)m_pBundleInfo)->getBundleHandle()); -} - -#if (JAVA_SUPPORT_TEST) -TEST_F(ResourceContainerImplTest, JavaBundleLoadedWhenRegisteredWithRegisterBundleAPIWrongPath) -{ - m_pBundleInfo->setPath("wrong_path.jar"); - m_pBundleInfo->setActivatorName("org/iotivity/bundle/hue/HueBundleActivator"); - m_pBundleInfo->setLibraryPath("../."); - m_pBundleInfo->setVersion("1.0"); - m_pBundleInfo->setID("oic.bundle.java.test"); - - m_pResourceContainer->registerBundle(m_pBundleInfo); - EXPECT_FALSE(((BundleInfoInternal *)m_pBundleInfo)->isLoaded()); -} - -TEST_F(ResourceContainerImplTest, JavaBundleTest) -{ - m_pBundleInfo->setPath("TestBundleJava/hue-0.1-jar-with-dependencies.jar"); - m_pBundleInfo->setActivatorName("org/iotivity/bundle/hue/HueBundleActivator"); - m_pBundleInfo->setLibraryPath("../."); - m_pBundleInfo->setVersion("1.0"); - m_pBundleInfo->setID("oic.bundle.java.test"); - - m_pResourceContainer->registerBundle(m_pBundleInfo); - EXPECT_TRUE(((BundleInfoInternal *)m_pBundleInfo)->isLoaded()); - - m_pResourceContainer->activateBundle(m_pBundleInfo); - EXPECT_TRUE(((BundleInfoInternal *) m_pBundleInfo)->isActivated()); - - m_pResourceContainer->deactivateBundle(m_pBundleInfo); - EXPECT_FALSE(((BundleInfoInternal *) m_pBundleInfo)->isActivated()); -} -#endif - -TEST_F(ResourceContainerImplTest, BundleNotRegisteredIfBundlePathIsInvalid) -{ - m_pBundleInfo->setPath(""); - m_pBundleInfo->setVersion("1.0"); - m_pBundleInfo->setLibraryPath("../."); - m_pBundleInfo->setID("oic.bundle.test"); - - m_pResourceContainer->registerBundle(m_pBundleInfo); - - EXPECT_EQ(nullptr, ((BundleInfoInternal *)m_pBundleInfo)->getBundleHandle()); - -} - -TEST_F(ResourceContainerImplTest, SoBundleActivatedWithValidBundleInfo) -{ - m_pBundleInfo->setPath("libTestBundle.so"); - m_pBundleInfo->setVersion("1.0"); - m_pBundleInfo->setActivatorName("test"); - m_pBundleInfo->setLibraryPath("../."); - m_pBundleInfo->setID("oic.bundle.test"); - - m_pResourceContainer->registerBundle(m_pBundleInfo); - m_pResourceContainer->activateBundle(m_pBundleInfo); - - EXPECT_NE(nullptr, ((BundleInfoInternal *)m_pBundleInfo)->getBundleActivator()); -} - -TEST_F(ResourceContainerImplTest, BundleNotActivatedWhenNotRegistered) -{ - m_pBundleInfo->setPath("libTestBundle.so"); - m_pBundleInfo->setActivatorName("test"); - m_pBundleInfo->setVersion("1.0"); - m_pBundleInfo->setLibraryPath("../."); - m_pBundleInfo->setID("oic.bundle.test"); - - m_pResourceContainer->activateBundle(m_pBundleInfo); - - EXPECT_EQ(nullptr, ((BundleInfoInternal *)m_pBundleInfo)->getBundleActivator()); -} - -TEST_F(ResourceContainerImplTest, SoBundleActivatedWithBundleID) -{ - m_pBundleInfo->setPath("libTestBundle.so"); - m_pBundleInfo->setVersion("1.0"); - m_pBundleInfo->setLibraryPath("../."); - m_pBundleInfo->setActivatorName("test"); - m_pBundleInfo->setID("oic.bundle.test"); - - m_pResourceContainer->registerBundle(m_pBundleInfo); - m_pResourceContainer->activateBundle(m_pBundleInfo->getID()); - - EXPECT_NE(nullptr, ((BundleInfoInternal *)m_pBundleInfo)->getBundleActivator()); - EXPECT_TRUE(((BundleInfoInternal *)m_pBundleInfo)->isActivated()); -} - -TEST_F(ResourceContainerImplTest, BundleDeactivatedWithBundleInfo) -{ - m_pBundleInfo->setPath("libTestBundle.so"); - m_pBundleInfo->setVersion("1.0"); - m_pBundleInfo->setLibraryPath("../."); - m_pBundleInfo->setActivatorName("test"); - m_pBundleInfo->setID("oic.bundle.test"); - - m_pResourceContainer->registerBundle(m_pBundleInfo); - m_pResourceContainer->activateBundle(m_pBundleInfo); - m_pResourceContainer->deactivateBundle(m_pBundleInfo); - - EXPECT_NE(nullptr, ((BundleInfoInternal *)m_pBundleInfo)->getBundleDeactivator()); - EXPECT_FALSE(((BundleInfoInternal *)m_pBundleInfo)->isActivated()); -} - -TEST_F(ResourceContainerImplTest, BundleDeactivatedWithBundleInfoJava) -{ - m_pBundleInfo->setPath("TestBundle/hue-0.1-jar-with-dependencies.jar"); - m_pBundleInfo->setActivatorName("org/iotivity/bundle/hue/HueBundleActivator"); - m_pBundleInfo->setLibraryPath("../."); - m_pBundleInfo->setVersion("1.0"); - m_pBundleInfo->setID("oic.bundle.java.test"); - - m_pResourceContainer->registerBundle(m_pBundleInfo); - m_pResourceContainer->activateBundle(m_pBundleInfo); - m_pResourceContainer->deactivateBundle(m_pBundleInfo); - EXPECT_FALSE(((BundleInfoInternal *) m_pBundleInfo)->isActivated()); -} - -TEST_F(ResourceContainerImplTest, SoBundleDeactivatedWithBundleID) -{ - m_pBundleInfo->setPath("libTestBundle.so"); - m_pBundleInfo->setVersion("1.0"); - m_pBundleInfo->setLibraryPath("../."); - m_pBundleInfo->setActivatorName("test"); - m_pBundleInfo->setID("oic.bundle.test"); - - m_pResourceContainer->registerBundle(m_pBundleInfo); - m_pResourceContainer->activateBundle(m_pBundleInfo); - - m_pResourceContainer->deactivateBundle(m_pBundleInfo->getID()); - - EXPECT_FALSE(((BundleInfoInternal *)m_pBundleInfo)->isActivated()); -} - /* Test for Configuration */ TEST(ConfigurationTest, ConfigFileLoadedWithValidPath) -- 2.7.4