IOT-945: Fixing segmentation fault issue
authorMarkus Jung <markus.jung@samsung.com>
Wed, 9 Mar 2016 09:53:06 +0000 (18:53 +0900)
committerJungHo Kim <jhyo.kim@samsung.com>
Thu, 17 Mar 2016 05:30:08 +0000 (05:30 +0000)
- 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 <markus.jung@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/5661
Reviewed-by: Inga Stotland <inga.stotland@intel.com>
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: JungHo Kim <jhyo.kim@samsung.com>
(cherry picked from commit 6db3155bd07c9394a1e8409077d95aac709180aa)
Reviewed-on: https://gerrit.iotivity.org/gerrit/5707

service/resource-container/examples/ContainerSample.cpp
service/resource-container/src/BundleInfoInternal.cpp
service/resource-container/src/BundleInfoInternal.h
service/resource-container/src/ResourceContainerImpl.cpp
service/resource-container/src/ResourceContainerImpl.h
service/resource-container/unittests/ResourceContainerTest.cpp

index 2240510..cab08fa 100644 (file)
@@ -438,4 +438,4 @@ int main()
     g_pResourceContainer = nullptr;
 
     return 0;
-}
\ No newline at end of file
+}
index da45256..c6e7706 100644 (file)
@@ -219,9 +219,11 @@ namespace OIC
         }
 #endif
 
-        void BundleInfoInternal::setBundleInfo(RCSBundleInfo *bundleInfo)
+        void BundleInfoInternal::setBundleInfo(shared_ptr<RCSBundleInfo> bundleInfo)
         {
-            BundleInfoInternal *source = (BundleInfoInternal *)bundleInfo;
+            shared_ptr<BundleInfoInternal> source =
+                                std::static_pointer_cast<BundleInfoInternal>(bundleInfo);
+
             m_ID = source->getID();
             m_path = source->getPath();
             m_version = source->getVersion();
index a899983..1dbe4fd 100644 (file)
@@ -77,7 +77,7 @@ namespace OIC
                 void setResourceDestroyer(resourceDestroyer_t *);
                 resourceDestroyer_t *getResourceDestroyer();
 
-                void setBundleInfo(RCSBundleInfo *bundleInfo);
+                void setBundleInfo(shared_ptr<RCSBundleInfo> bundleInfo);
 
                 void setBundleHandle(void *);
                 void *getBundleHandle();
index c6a27d1..0217199 100644 (file)
@@ -79,7 +79,7 @@ namespace OIC
 
                     for (unsigned int i = 0; i < bundles.size(); i++)
                     {
-                        BundleInfoInternal *bundleInfo = new BundleInfoInternal();
+                        shared_ptr<BundleInfoInternal> 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<BundleInfoInternal> >::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<RCSBundleInfo> bundleInfo)
         {
             activationLock.lock();
-            BundleInfoInternal *bundleInfoInternal = (BundleInfoInternal *) bundleInfo;
+
+            shared_ptr<BundleInfoInternal> bundleInfoInternal =
+                    std::static_pointer_cast<BundleInfoInternal>(bundleInfo);
 
             if (bundleInfoInternal->isLoaded())
             {
@@ -164,11 +164,13 @@ namespace OIC
             activationLock.unlock();
         }
 
-        void ResourceContainerImpl::deactivateBundle(RCSBundleInfo *bundleInfo)
+        void ResourceContainerImpl::deactivateBundle(shared_ptr<RCSBundleInfo> bundleInfo)
         {
-            if (((BundleInfoInternal *) bundleInfo)->isActivated())
+            shared_ptr<BundleInfoInternal> bundleInfoInternal =
+                                std::static_pointer_cast<BundleInfoInternal>(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<RCSBundleInfo> bundleInfo)
         {
             OIC_LOG_V(INFO, CONTAINER_TAG, "Registering bundle: (%s)",
                      std::string(bundleInfo->getPath()).c_str());
+            shared_ptr<BundleInfoInternal> bundleInfoInternal =
+                                          std::static_pointer_cast<BundleInfoInternal>(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<RCSBundleInfo> bundleInfo)
         {
-            BundleInfoInternal *bundleInfoInternal = (BundleInfoInternal *) bundleInfo;
+            shared_ptr<BundleInfoInternal> bundleInfoInternal =
+                                          std::static_pointer_cast<BundleInfoInternal>(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<BundleInfoInternal> bundleInfo = std::make_shared<BundleInfoInternal>();
                 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<BundleInfoInternal> 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<std::unique_ptr<RCSBundleInfo> > ret;
-            for (std::map< std::string, BundleInfoInternal * >::iterator it = m_bundles.begin();
+            for (std::map< std::string, shared_ptr<BundleInfoInternal> >::iterator it = m_bundles.begin();
                  it != m_bundles.end(); ++it)
             {
                 {
                     std::unique_ptr<BundleInfoInternal> 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<RCSBundleInfo> 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> bundleInfoInternal =
+                                std::static_pointer_cast<BundleInfoInternal>(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<RCSBundleInfo> 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> bundleInfoInternal =
+                                std::static_pointer_cast<BundleInfoInternal>(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> 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<RCSBundleInfo> 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> bundleInfoInternal =
+                                std::static_pointer_cast<BundleInfoInternal>(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_ptr<BundleInfoInternal>bundleInfoInternal = 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
index 979c600..1428514 100644 (file)
@@ -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; // <bundleID, bundleInfo>
+                map< std::string, shared_ptr<BundleInfoInternal>> m_bundles; // <bundleID, bundleInfo>
                 map< std::string, RCSResourceObject::Ptr > m_mapServers; //<uri, serverPtr>
                 map< std::string, BundleResource::Ptr > m_mapResources; //<uri, resourcePtr>
                 map< std::string, list< string > > m_mapBundleResources; //<bundleID, vector<uri>>
@@ -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<RCSBundleInfo> bundleInfo);
+                void registerExtBundle(shared_ptr<RCSBundleInfo> bundleInfo);
                 void discoverInputResource(const std::string &outputResourceUri);
                 void undiscoverInputResource(const std::string &outputResourceUri);
                 void activateBundleThread(const std::string &bundleId);
 
+                void activateBundle(shared_ptr<RCSBundleInfo> bundleInfo);
+                void deactivateBundle(shared_ptr<RCSBundleInfo> bundleInfo);
+                void activateBundle(const std::string &bundleId);
+                void deactivateBundle(const std::string &bundleId);
+                void registerBundle(shared_ptr<RCSBundleInfo> bundleInfo);
+                void unregisterBundle(shared_ptr<RCSBundleInfo> bundleInfo);
+                void unregisterBundleSo(const std::string &id);
+
 #if(JAVA_SUPPORT)
                 map<string, JavaVM *> m_bundleVM;
 
-                void registerJavaBundle(RCSBundleInfo *bundleInfo);
+                void registerJavaBundle(shared_ptr<RCSBundleInfo> bundleInfo);
                 void activateJavaBundle(string bundleId);
                 void deactivateJavaBundle(string bundleId);
 
index fe5ca74..7d00a9b 100644 (file)
@@ -252,7 +252,7 @@ TEST_F(ResourceContainerTest, BundleLoadedWhenContainerStartedWithValidConfigFil
 
     EXPECT_GT(m_pResourceContainer->listBundles().size(), (unsigned int) 0);
     unique_ptr<RCSBundleInfo> first = std::move(*m_pResourceContainer->listBundles().begin());
-    unique_ptr<BundleInfoInternal> firstInternal(static_cast<BundleInfoInternal*>(first.release()));
+    unique_ptr<BundleInfoInternal> 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<RCSBundleInfo> first = std::move(*m_pResourceContainer->listBundles().begin());
-    unique_ptr<BundleInfoInternal> firstInternal(static_cast<BundleInfoInternal*>(first.release()));
+    unique_ptr<BundleInfoInternal> 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<RCSBundleInfo> first = std::move(*m_pResourceContainer->listBundles().begin());
-    unique_ptr<BundleInfoInternal> firstInternal(static_cast<BundleInfoInternal*>(first.release()));
+    unique_ptr<BundleInfoInternal> 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<RCSBundleInfo> first = std::move(*m_pResourceContainer->listBundles().begin());
-    unique_ptr<BundleInfoInternal> firstInternal(static_cast<BundleInfoInternal*>(first.release()));
+    unique_ptr<BundleInfoInternal> 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<RCSBundleInfo> first = std::move(*m_pResourceContainer->listBundles().begin());
-    unique_ptr<BundleInfoInternal> firstInternal(static_cast<BundleInfoInternal*>(first.release()));
+    unique_ptr<BundleInfoInternal> 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<BundleInfoInternal> m_pBundleInfo;
 
     protected:
         void SetUp()
         {
             TestWithMock::SetUp();
             m_pResourceContainer = ResourceContainerImpl::getImplInstance();
-            m_pBundleInfo = new BundleInfoInternal();
+            m_pBundleInfo = std::make_shared<BundleInfoInternal>();
         }
 
         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)