Export Smoke Utils
[platform/core/appfw/wgt-backend.git] / src / unit_tests / smoke_test.cc
index 3f18a52..f446f8a 100644 (file)
 // Use of this source code is governed by an apache-2.0 license that can be
 // found in the LICENSE file.
 
-#include <boost/filesystem/operations.hpp>
-#include <boost/filesystem/path.hpp>
-#include <boost/range/iterator_range.hpp>
-#include <boost/system/error_code.hpp>
-
-#include <common/paths.h>
-#include <common/pkgmgr_interface.h>
-#include <common/pkgmgr_query.h>
-#include <common/request.h>
-#include <common/step/configuration/step_fail.h>
-#include <common/tzip_interface.h>
-#include <common/utils/file_util.h>
 #include <common/utils/subprocess.h>
-#include <common/utils/user_util.h>
+
+#include <common/utils/file_util.h>
 
 #include <gtest/gtest.h>
 #include <gtest/gtest-death-test.h>
-#include <pkgmgr-info.h>
-#include <signal.h>
-#include <unistd.h>
-#include <tzplatform_config.h>
-#include <vconf.h>
-#include <vconf-internal-keys.h>
-
-#include <array>
-#include <cstdio>
-#include <cstdlib>
-#include <vector>
-
-#include "hybrid/hybrid_installer.h"
-#include "wgt/wgt_app_query_interface.h"
-#include "wgt/wgt_installer.h"
-
-#define SIZEOFARRAY(ARR)                                                       \
-  sizeof(ARR) / sizeof(ARR[0])                                                 \
-
-namespace bf = boost::filesystem;
-namespace bs = boost::system;
-namespace ci = common_installer;
-
-namespace {
-
-const uid_t kGlobalUserUid = tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
-const uid_t kGlobalUserGid = tzplatform_getgid(TZ_SYS_GLOBALAPP_USER);
-const uid_t kDefaultUserUid = tzplatform_getuid(TZ_SYS_DEFAULT_USER);
-const uid_t kTestUserId = kGlobalUserUid;
-const gid_t kTestGroupId = kGlobalUserGid;
-const char kSystemShareGroupName[] = "system_share";
-const std::string& kTestUserIdStr =
-    std::to_string(kTestUserId);
-const std::string& kDefaultUserIdStr = std::to_string(kDefaultUserUid);
-const char kLegacyExtImageDir[] = "legacy_extimage_dir";
-const char kMigrateTestDBName[] = "app2sd_migrate.db";
-
-const bf::path kSmokePackagesDirectory =
-    "/usr/share/wgt-backend-ut/test_samples/smoke/";
-
-// common entries
-const std::vector<std::string> kDBEntries = {
-  {".pkgmgr_parser.db"},
-  {".pkgmgr_parser.db-journal"},
-  {".pkgmgr_cert.db"},
-  {".pkgmgr_cert.db-journal"},
-  {".app2sd.db"},
-  {".app2sd.db-journal"},
-};
-// globaluser entries
-const char kGlobalManifestDir[] = "/opt/share/packages";
-const char kSkelDir[] = "/etc/skel/apps_rw";
-const char kPreloadApps[] = "/usr/apps";
-const char kPreloadManifestDir[] = "/usr/share/packages";
-const char kPreloadIcons[] = "/usr/share/icons";
-
-enum class RequestResult {
-  NORMAL,
-  FAIL
-};
-
-class ScopedTzipInterface {
- public:
-  explicit ScopedTzipInterface(const std::string& pkgid)
-      : pkg_path_(bf::path(ci::GetRootAppPath(false,
-            kTestUserId)) / pkgid),
-        interface_(ci::GetMountLocation(pkg_path_)),
-        mounted_(true) {
-    interface_.MountZip(ci::GetZipPackageLocation(pkg_path_, pkgid));
-  }
-
-  void Release() {
-    if (mounted_) {
-      interface_.UnmountZip();
-      mounted_ = false;
-    }
-  }
-
-  ~ScopedTzipInterface() {
-    Release();
-  }
-
- private:
-  bf::path pkg_path_;
-  ci::TzipInterface interface_;
-  bool mounted_;
-};
-
-class TestPkgmgrInstaller : public ci::PkgmgrInstallerInterface {
- public:
-  bool CreatePkgMgrInstaller(pkgmgr_installer** installer,
-                             ci::InstallationMode* mode) {
-    *installer = pkgmgr_installer_offline_new();
-    if (!*installer)
-      return false;
-    *mode = ci::InstallationMode::ONLINE;
-    return true;
-  }
-
-  bool ShouldCreateSignal() const {
-    return false;
-  }
-};
-
-enum class PackageType {
-  WGT,
-  HYBRID
-};
-
-bool TouchFile(const bf::path& path) {
-  FILE* f = fopen(path.c_str(), "w+");
-  if (!f)
-    return false;
-  fclose(f);
-  return true;
-}
-
-void RemoveAllRecoveryFiles() {
-  bf::path root_path = ci::GetRootAppPath(false,
-      kTestUserId);
-  if (!bf::exists(root_path))
-    return;
-  for (auto& dir_entry : boost::make_iterator_range(
-         bf::directory_iterator(root_path), bf::directory_iterator())) {
-    if (bf::is_regular_file(dir_entry)) {
-      if (dir_entry.path().string().find("/recovery") != std::string::npos) {
-        bs::error_code error;
-        bf::remove(dir_entry.path(), error);
-      }
-    }
-  }
-}
-
-bf::path FindRecoveryFile() {
-  bf::path root_path = ci::GetRootAppPath(false,
-      kTestUserId);
-  for (auto& dir_entry : boost::make_iterator_range(
-         bf::directory_iterator(root_path), bf::directory_iterator())) {
-    if (bf::is_regular_file(dir_entry)) {
-      if (dir_entry.path().string().find("/recovery") != std::string::npos) {
-        return dir_entry.path();
-      }
-    }
-  }
-  return {};
-}
-
-bf::path GetPackageRoot(const std::string& pkgid, uid_t uid) {
-  bf::path root_path = ci::GetRootAppPath(false, uid);
-  return root_path / pkgid;
-}
-
-bool ValidateFileContentInPackage(const std::string& pkgid,
-                                  const std::string& relative,
-                                  const std::string& expected,
-                                  bool is_readonly = false) {
-  bf::path file_path = ci::GetRootAppPath(is_readonly, kTestUserId);
-  file_path = file_path / pkgid / relative;
-  if (!bf::exists(file_path)) {
-    LOG(ERROR) << file_path << " doesn't exist";
-    return false;
-  }
-  FILE* handle = fopen(file_path.c_str(), "r");
-  if (!handle) {
-    LOG(ERROR) << file_path << " cannot  be open";
-    return false;
-  }
-  std::string content;
-  std::array<char, 200> buffer;
-  while (fgets(buffer.data(), buffer.size(), handle)) {
-    content += buffer.data();
-  }
-  fclose(handle);
-  return content == expected;
-}
-
-void AddDataFiles(const std::string& pkgid, uid_t uid) {
-  if (uid == kGlobalUserUid) {
-    ci::UserList list = ci::GetUserList();
-    for (auto l : list) {
-      auto pkg_path = GetPackageRoot(pkgid, std::get<0>(l));
-      ASSERT_TRUE(TouchFile(pkg_path / "data" / "file1.txt"));
-      ASSERT_TRUE(TouchFile(pkg_path / "data" / "file2.txt"));
-    }
-  } else {
-    auto pkg_path = GetPackageRoot(pkgid, uid);
-    ASSERT_TRUE(TouchFile(pkg_path / "data" / "file1.txt"));
-    ASSERT_TRUE(TouchFile(pkg_path / "data" / "file2.txt"));
-  }
-}
-
-void ValidateDataFiles(const std::string& pkgid, uid_t uid) {
-  if (uid == kGlobalUserUid) {
-    ci::UserList list = ci::GetUserList();
-    for (auto l : list) {
-      auto pkg_path = GetPackageRoot(pkgid, std::get<0>(l));
-      ASSERT_TRUE(bf::exists(pkg_path / "data" / "file1.txt"));
-      ASSERT_TRUE(bf::exists(pkg_path / "data" / "file2.txt"));
-    }
-  } else {
-    auto pkg_path = GetPackageRoot(pkgid, uid);
-    ASSERT_TRUE(bf::exists(pkg_path / "data" / "file1.txt"));
-    ASSERT_TRUE(bf::exists(pkg_path / "data" / "file2.txt"));
-  }
-}
-
-void ValidatePackageRWFS(const std::string& pkgid, uid_t uid) {
-  bf::path root_path = ci::GetRootAppPath(false, uid);
-  bf::path package_path = root_path / pkgid;
-  bf::path data_path = package_path / "data";
-  bf::path cache_path = package_path / "cache";
-  bf::path shared_data_path = package_path / "shared" / "data";
-
-  ASSERT_TRUE(bf::exists(data_path));
-  ASSERT_TRUE(bf::exists(cache_path));
-
-  struct stat stats;
-  stat(data_path.c_str(), &stats);
-  // gid of RW dirs should be system_share
-  boost::optional<gid_t> system_share =
-    ci::GetGidByGroupName(kSystemShareGroupName);
-  ASSERT_EQ(uid, stats.st_uid) << "Invalid gid: " << data_path;
-  ASSERT_EQ(*system_share, stats.st_gid) << "Invalid gid: " << data_path;
-  if (bf::exists(shared_data_path)) {
-    stat(shared_data_path.c_str(), &stats);
-    ASSERT_EQ(uid, stats.st_uid) << "Invalid gid: " << shared_data_path;
-    ASSERT_EQ(*system_share, stats.st_gid) << "Invalid gid: "
-      << shared_data_path;
-  }
-
-  stat(cache_path.c_str(), &stats);
-  ASSERT_EQ(uid, stats.st_uid) << "Invalid gid: " << cache_path;
-  ASSERT_EQ(*system_share, stats.st_gid) << "Invalid gid: " << cache_path;
-}
-
-void ValidatePackageFS(const std::string& pkgid,
-                       const std::vector<std::string>& appids,
-                       uid_t uid, gid_t gid, bool is_readonly) {
-  bf::path root_path = ci::GetRootAppPath(is_readonly, uid);
-  bf::path package_path = root_path / pkgid;
-  bf::path shared_path = package_path / "shared";
-  ASSERT_TRUE(bf::exists(root_path));
-  ASSERT_TRUE(bf::exists(package_path));
-  ASSERT_TRUE(bf::exists(shared_path));
-
-  bf::path manifest_path =
-      bf::path(getUserManifestPath(uid, is_readonly)) / (pkgid + ".xml");
-  ASSERT_TRUE(bf::exists(manifest_path));
-
-  for (auto& appid : appids) {
-    bf::path binary_path = package_path / "bin" / appid;
-    ASSERT_TRUE(bf::exists(binary_path));
-  }
-
-  bf::path widget_root_path = package_path / "res" / "wgt";
-  bf::path config_path = widget_root_path / "config.xml";
-  ASSERT_TRUE(bf::exists(widget_root_path));
-  ASSERT_TRUE(bf::exists(config_path));
-
-  bf::path private_tmp_path = package_path / "tmp";
-  ASSERT_TRUE(bf::exists(private_tmp_path));
-
-  // backups should not exist
-  bf::path package_backup = ci::GetBackupPathForPackagePath(package_path);
-  bf::path manifest_backup = ci::GetBackupPathForManifestFile(manifest_path);
-  ASSERT_FALSE(bf::exists(package_backup));
-  ASSERT_FALSE(bf::exists(manifest_backup));
-
-  for (bf::recursive_directory_iterator iter(package_path);
-      iter != bf::recursive_directory_iterator(); ++iter) {
-    if (bf::is_symlink(symlink_status(iter->path())))
-      continue;
-    if (iter->path().filename() == "data" ||
-        iter->path().filename() == ".mmc")
-      continue;
-    struct stat stats;
-    stat(iter->path().c_str(), &stats);
-    ASSERT_EQ(uid, stats.st_uid) << "Invalid uid: " << iter->path();
-    ASSERT_EQ(gid, stats.st_gid) << "Invalid gid: " << iter->path();
-  }
-}
-
-void PackageCheckCleanup(const std::string& pkgid,
-    const std::vector<std::string>&, bool is_readonly = false) {
-  bf::path root_path = ci::GetRootAppPath(is_readonly, kTestUserId);
-  bf::path package_path = root_path / pkgid;
-  ASSERT_FALSE(bf::exists(package_path));
-
-  bf::path manifest_path = bf::path(getUserManifestPath(kTestUserId,
-      is_readonly)) / (pkgid + ".xml");
-  ASSERT_FALSE(bf::exists(manifest_path));
-
-  // backups should not exist
-  bf::path package_backup = ci::GetBackupPathForPackagePath(package_path);
-  bf::path manifest_backup = ci::GetBackupPathForManifestFile(manifest_path);
-  ASSERT_FALSE(bf::exists(package_backup));
-  ASSERT_FALSE(bf::exists(manifest_backup));
-}
-
-void ValidatePackage(const std::string& pkgid,
-    const std::vector<std::string>& appids, bool is_readonly = false) {
-  ASSERT_TRUE(ci::QueryIsPackageInstalled(
-      pkgid, ci::GetRequestMode(kTestUserId), kTestUserId));
-  ValidatePackageFS(pkgid, appids, kTestUserId, kTestGroupId, is_readonly);
-  if (kTestUserId == kGlobalUserUid) {
-    ci::UserList list = ci::GetUserList();
-    for (auto& l : list)
-      ValidatePackageRWFS(pkgid, std::get<0>(l));
-  } else {
-    ValidatePackageRWFS(pkgid, kTestUserId);
-  }
-}
-
-void ValidateExternalPackageFS(const std::string& pkgid,
-                               const std::vector<std::string>& appids,
-                               uid_t uid, gid_t gid) {
-  ASSERT_EQ(app2ext_usr_enable_external_pkg(pkgid.c_str(), uid), 0);
-  bf::path root_path = ci::GetRootAppPath(false, uid);
-  ASSERT_TRUE(bf::exists(root_path / pkgid / ".mmc" / "res"));
-  ValidatePackageFS(pkgid, appids, uid, gid, false);
-  ASSERT_EQ(app2ext_usr_disable_external_pkg(pkgid.c_str(), uid), 0);
-}
-
-void ValidateExternalPackage(const std::string& pkgid,
-                             const std::vector<std::string>& appids) {
-  ASSERT_TRUE(ci::QueryIsPackageInstalled(
-      pkgid, ci::GetRequestMode(kTestUserId),
-      kTestUserId));
-  std::string storage = ci::QueryStorageForPkgId(pkgid, kTestUserId);
-  bf::path ext_mount_path = ci::GetExternalCardPath();
-  if (bf::is_empty(ext_mount_path)) {
-    LOG(INFO) << "Sdcard not exists!";
-    ASSERT_EQ(storage, "installed_internal");
-  } else {
-    ASSERT_EQ(storage, "installed_external");
-  }
-  ValidateExternalPackageFS(pkgid, appids, kTestUserId, kTestGroupId);
-  if (kTestUserId == kGlobalUserUid) {
-    ci::UserList list = ci::GetUserList();
-    for (auto& l : list)
-      ValidatePackageRWFS(pkgid, std::get<0>(l));
-  } else {
-    ValidatePackageRWFS(pkgid, kTestUserId);
-  }
-}
-
-void CheckPackageNonExistance(const std::string& pkgid,
-                              const std::vector<std::string>& appids) {
-  ASSERT_FALSE(ci::QueryIsPackageInstalled(
-      pkgid, ci::GetRequestMode(kTestUserId),
-      kTestUserId));
-  PackageCheckCleanup(pkgid, appids);
-}
-
-void CheckPackageReadonlyNonExistance(const std::string& pkgid,
-                                      const std::vector<std::string>& appids) {
-  ASSERT_FALSE(ci::QueryIsPackageInstalled(
-      pkgid, ci::GetRequestMode(kTestUserId), kTestUserId));
-  PackageCheckCleanup(pkgid, appids, true);
-}
-
-std::unique_ptr<ci::AppQueryInterface> CreateQueryInterface() {
-  std::unique_ptr<ci::AppQueryInterface> query_interface(
-      new wgt::WgtAppQueryInterface());
-  return query_interface;
-}
-
-std::unique_ptr<ci::AppInstaller> CreateInstaller(ci::PkgMgrPtr pkgmgr,
-                                                  PackageType type) {
-  switch (type) {
-    case PackageType::WGT:
-      return std::unique_ptr<ci::AppInstaller>(new wgt::WgtInstaller(pkgmgr));
-    case PackageType::HYBRID:
-      return std::unique_ptr<ci::AppInstaller>(
-          new hybrid::HybridInstaller(pkgmgr));
-    default:
-      LOG(ERROR) << "Unknown installer type";
-      return nullptr;
-  }
-}
-
-ci::AppInstaller::Result RunInstallerWithPkgrmgr(ci::PkgMgrPtr pkgmgr,
-                                                 PackageType type,
-                                                 RequestResult mode) {
-  std::unique_ptr<ci::AppInstaller> installer = CreateInstaller(pkgmgr, type);
-  switch (mode) {
-  case RequestResult::FAIL:
-    installer->AddStep<ci::configuration::StepFail>();
-    break;
-  default:
-    break;
-  }
-  return installer->Run();
-}
-ci::AppInstaller::Result CallBackend(int argc,
-                                     const char* argv[],
-                                     PackageType type,
-                                     RequestResult mode = RequestResult::NORMAL
-                                     ) {
-  TestPkgmgrInstaller pkgmgr_installer;
-  std::unique_ptr<ci::AppQueryInterface> query_interface =
-      CreateQueryInterface();
-  auto pkgmgr =
-      ci::PkgMgrInterface::Create(argc, const_cast<char**>(argv),
-                                  &pkgmgr_installer, query_interface.get());
-  if (!pkgmgr) {
-    LOG(ERROR) << "Failed to initialize pkgmgr interface";
-    return ci::AppInstaller::Result::UNKNOWN;
-  }
-  return RunInstallerWithPkgrmgr(pkgmgr, type, mode);
-}
-
-ci::AppInstaller::Result Install(const bf::path& path,
-                                 PackageType type,
-                                 RequestResult mode = RequestResult::NORMAL) {
-  const char* argv[] = {"", "-i", path.c_str(), "-u", kTestUserIdStr.c_str()};
-  return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-}
 
-ci::AppInstaller::Result InstallPreload(const bf::path& path, PackageType type,
-    RequestResult mode = RequestResult::NORMAL) {
-  const char* argv[] = {"", "-i", path.c_str(), "--preload"};
-  return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-}
-
-bool CheckAvailableExternalPath() {
-  bf::path ext_mount_path = ci::GetExternalCardPath();
-  LOG(DEBUG) << "ext_mount_path :" << ext_mount_path;
-  if (ext_mount_path.empty()) {
-    LOG(ERROR) << "Sdcard not exists!";
-    return false;
-  }
-  return true;
-}
-
-ci::AppInstaller::Result InstallExternal(const bf::path& path,
-                                 PackageType type,
-                                 RequestResult mode = RequestResult::NORMAL) {
-  int default_storage = 0;
-  vconf_get_int(VCONFKEY_SETAPPL_DEFAULT_MEM_INSTALL_APPLICATIONS_INT,
-                &default_storage);
-  vconf_set_int(VCONFKEY_SETAPPL_DEFAULT_MEM_INSTALL_APPLICATIONS_INT, 1);
-
-  const char* argv[] = {"", "-i", path.c_str(), "-u", kTestUserIdStr.c_str()};
-  ci::AppInstaller::Result result =
-                          CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-
-  vconf_set_int(VCONFKEY_SETAPPL_DEFAULT_MEM_INSTALL_APPLICATIONS_INT,
-                default_storage);
-  return result;
-}
-
-ci::AppInstaller::Result MigrateLegacyExternalImage(const std::string& pkgid,
-                                 const bf::path& path,
-                                 const bf::path& legacy_path,
-                                 PackageType type,
-                                 RequestResult mode = RequestResult::NORMAL) {
-  if (InstallExternal(path, type) != ci::AppInstaller::Result::OK) {
-    LOG(ERROR) << "Failed to install application. Cannot perform Migrate";
-    return ci::AppInstaller::Result::ERROR;
-  }
-
-  bf::path ext_mount_path = ci::GetExternalCardPath();
-  if (bf::is_empty(ext_mount_path)) {
-    LOG(ERROR) << "Sdcard not exists!";
-    return ci::AppInstaller::Result::ERROR;
-  }
-  bf::path app2sd_path = ext_mount_path / "app2sd";
-
-  char* image_name = app2ext_usr_getname_image(pkgid.c_str(),
-                     kGlobalUserUid);
-  if (!image_name) {
-    LOG(ERROR) << "Failed to get external image name";
-    return ci::AppInstaller::Result::ERROR;
-  }
-  bf::path org_image = app2sd_path / image_name;
-  free(image_name);
-
-  bs::error_code error;
-  bf::remove(org_image, error);
-  if (error) {
-    LOG(ERROR) << "Failed to remove org image";
-    return ci::AppInstaller::Result::ERROR;
-  }
-
-  bf::path db_path = tzplatform_getenv(TZ_SYS_DB);
-  bf::path app2sd_db = db_path / ".app2sd.db";
-  bf::path app2sd_db_journal = db_path / ".app2sd.db-journal";
-  bf::remove(app2sd_db, error);
-  if (error) {
-    LOG(ERROR) << "Failed to remove app2sd db";
-    return ci::AppInstaller::Result::ERROR;
-  }
-  bf::remove(app2sd_db_journal, error);
-  if (error) {
-    LOG(ERROR) << "Failed to remove app2sd journal db";
-    return ci::AppInstaller::Result::ERROR;
-  }
-
-  bf::path app2sd_migrate_db = legacy_path / kMigrateTestDBName;
-  if (!ci::CopyFile(app2sd_migrate_db, app2sd_db)) {
-    LOG(ERROR) << "Failed to copy test db";
-    return ci::AppInstaller::Result::ERROR;
-  }
-
-  bf::path legacy_src = legacy_path / pkgid;
-  bf::path legacy_dst = app2sd_path / pkgid;
-  if (!ci::CopyFile(legacy_src, legacy_dst)) {
-    LOG(ERROR) << "Failed to copy test image";
-    return ci::AppInstaller::Result::ERROR;
-  }
-  const char* argv[] = {"", "--migrate-extimg", pkgid.c_str(),
-                       "-u", kDefaultUserIdStr.c_str()};
-  return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-}
+#include "unit_tests/smoke_utils.h"
 
-ci::AppInstaller::Result MountInstall(const bf::path& path,
-    PackageType type, RequestResult mode = RequestResult::NORMAL) {
-  const char* argv[] = {"", "-w", path.c_str(), "-u", kTestUserIdStr.c_str()};
-  return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-}
-
-ci::AppInstaller::Result Uninstall(const std::string& pkgid,
-                                   PackageType type,
-                                   bool is_preload,
-                                   RequestResult mode = RequestResult::NORMAL) {
-  if (is_preload) {
-    const char* argv[] = {"", "-d", pkgid.c_str(), "--preload",
-        "--force-remove"};
-    return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-  } else {
-    const char* argv[] = {"", "-d", pkgid.c_str(), "-u",
-        kTestUserIdStr.c_str()};
-    return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-  }
-}
-
-ci::AppInstaller::Result RDSUpdate(const bf::path& path,
-                                   const std::string& pkgid,
-                                   PackageType type,
-                                   RequestResult mode = RequestResult::NORMAL) {
-  if (Install(path, type) != ci::AppInstaller::Result::OK) {
-    LOG(ERROR) << "Failed to install application. Cannot perform RDS";
-    return ci::AppInstaller::Result::UNKNOWN;
-  }
-  const char* argv[] = {"", "-r", pkgid.c_str(), "-u",
-                        kTestUserIdStr.c_str()};
-  return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-}
-
-ci::AppInstaller::Result DeltaInstall(const bf::path& path,
-    const bf::path& delta_package, PackageType type) {
-  if (Install(path, type) != ci::AppInstaller::Result::OK) {
-    LOG(ERROR) << "Failed to install application. Cannot perform delta update";
-    return ci::AppInstaller::Result::UNKNOWN;
-  }
-  return Install(delta_package, type);
-}
-
-ci::AppInstaller::Result EnablePackage(const std::string& pkgid,
-                                  PackageType type,
-                                  RequestResult mode = RequestResult::NORMAL) {
-  const char* argv[] = {"", "-A", pkgid.c_str(), "-u", kTestUserIdStr.c_str()};
-  return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-}
-
-ci::AppInstaller::Result DisablePackage(const std::string& pkgid,
-                                  PackageType type,
-                                  RequestResult mode = RequestResult::NORMAL) {
-  const char* argv[] = {"", "-D", pkgid.c_str(), "-u", kTestUserIdStr.c_str()};
-  return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-}
-
-ci::AppInstaller::Result Recover(const bf::path& recovery_file,
-                                 PackageType type,
-                                 RequestResult mode = RequestResult::NORMAL) {
-  const char* argv[] = {"", "-b", recovery_file.c_str(), "-u",
-                        kTestUserIdStr.c_str()};
-  return CallBackend(SIZEOFARRAY(argv), argv, type, mode);
-}
-
-void BackupPath(const bf::path& path) {
-  bf::path backup_path = path.string() + ".bck";
-  std::cout << "Backup path: " << path << " to " << backup_path << std::endl;
-  bs::error_code error;
-  bf::remove_all(backup_path, error);
-  if (error)
-    LOG(ERROR) << "Remove failed: " << backup_path
-               << " (" << error.message() << ")";
-  if (bf::exists(path)) {
-    bf::rename(path, backup_path, error);
-    if (error)
-      LOG(ERROR) << "Failed to setup test environment. Does some previous"
-                 << " test crashed? Path: "
-                 << backup_path << " should not exist.";
-    assert(!error);
-  }
-}
-
-void RestorePath(const bf::path& path) {
-  bf::path backup_path = path.string() + ".bck";
-  std::cout << "Restore path: " << path << " from " << backup_path << std::endl;
-  bs::error_code error;
-  bf::remove_all(path, error);
-  if (error)
-    LOG(ERROR) << "Remove failed: " << path
-               << " (" << error.message() << ")";
-  if (bf::exists(backup_path)) {
-    bf::rename(backup_path, path, error);
-    if (error)
-      LOG(ERROR) << "Failed to restore backup path: " << backup_path
-                 << " (" << error.message() << ")";
-  }
-}
-
-std::vector<bf::path> SetupBackupDirectories(uid_t uid) {
-  std::vector<bf::path> entries;
-  bf::path db_dir = bf::path(tzplatform_getenv(TZ_SYS_DB));
-  if (uid != kGlobalUserUid)
-    db_dir = db_dir / "user" / std::to_string(uid);
-  for (auto e : kDBEntries) {
-    bf::path path = db_dir / e;
-    entries.emplace_back(path);
-  }
-
-  if (getuid() == 0) {
-    entries.emplace_back(kPreloadApps);
-    entries.emplace_back(kPreloadManifestDir);
-    entries.emplace_back(kPreloadIcons);
-  }
-
-  if (uid == kGlobalUserUid) {
-    entries.emplace_back(kSkelDir);
-    entries.emplace_back(kGlobalManifestDir);
-    ci::UserList list = ci::GetUserList();
-    for (auto l : list) {
-      bf::path apps = std::get<2>(l) / "apps_rw";
-      entries.emplace_back(apps);
-    }
-  } else {
-    tzplatform_set_user(uid);
-    bf::path approot = tzplatform_getenv(TZ_USER_APPROOT);
-    tzplatform_reset_user();
-    entries.emplace_back(approot);
-  }
-
-  bf::path apps_rw = ci::GetRootAppPath(false, uid);
-  entries.emplace_back(apps_rw);
-
-  return entries;
-}
-
-void UninstallAllAppsInDirectory(bf::path dir, bool is_preload) {
-  if(bf::exists(dir)) {
-    for (auto& dir_entry : boost::make_iterator_range(
-        bf::directory_iterator(dir), bf::directory_iterator())) {
-      if (dir_entry.path().string().find("smoke") != std::string::npos &&
-          bf::is_directory(dir_entry)) {
-        if(Uninstall(dir_entry.path().filename().string(), PackageType::WGT,
-            is_preload, RequestResult::NORMAL) !=
-            ci::AppInstaller::Result::OK) {
-          LOG(ERROR) << "Cannot uninstall smoke test app: "
-              << dir_entry.path().filename().string();
-        }
-      }
-    }
-  }
-}
-
-void UninstallAllSmokeApps(uid_t uid) {
-  if (getuid() == 0) {
-    bf::path root_path = kPreloadApps;
-    UninstallAllAppsInDirectory(root_path, true);
-  }
-  bf::path apps_rw = ci::GetRootAppPath(false, uid);
-  UninstallAllAppsInDirectory(apps_rw, false);
-}
-
-}  // namespace
 
 namespace common_installer {
 
 class SmokeEnvironment : public testing::Environment {
  public:
-  explicit SmokeEnvironment(uid_t uid) : uid_(uid) {
+  explicit SmokeEnvironment(ci::RequestMode mode) {\
+    request_mode_ = mode;
   }
   void SetUp() override {
-    backups_ = SetupBackupDirectories(uid_);
+    if (request_mode_ == ci::RequestMode::USER) {
+      ASSERT_TRUE(AddTestUser(kNormalUserName));
+    } else {
+      kTestUserId = kGlobalUserUid;
+      kTestGroupId = kGlobalUserGid;
+      kTestUserIdStr = std::to_string(kTestUserId);
+    }
+    backups_ = SetupBackupDirectories();
     for (auto& path : backups_)
       BackupPath(path);
   }
   void TearDown() override {
-    UninstallAllSmokeApps(uid_);
+    ASSERT_TRUE(request_mode_ == ci::RequestMode::GLOBAL ||
+                (request_mode_ == ci::RequestMode::USER &&
+                kGlobalUserUid != kTestUserId));
+    UninstallAllSmokeApps(request_mode_);
     for (auto& path : backups_)
       RestorePath(path);
+    if (request_mode_ == ci::RequestMode::USER)
+      ASSERT_TRUE(DeleteTestUser(kNormalUserName));
   }
 
  private:
-  uid_t uid_;
+  ci::RequestMode request_mode_;
   std::vector<bf::path> backups_;
 };
 
 class SmokeTest : public testing::Test {
 };
 
-// TODO(b.kunikowski): New smoke app pkgid name convention.
-//    Change all smokeapp pkgids to smokewgt, because now there
-//    may be some smoke app pkgid identical as in tpk smoke tests, and this may
-//    cause bad results of some smoke tests.
+class PreloadSmokeTest : public testing::Test {
+  void SetUp() override {
+    ASSERT_EQ(kGlobalUserUid, kTestUserId);
+  }
+};
 
 TEST_F(SmokeTest, InstallationMode) {
   bf::path path = kSmokePackagesDirectory / "InstallationMode.wgt";
-  std::string pkgid = "smokeapp03";
-  std::string appid = "smokeapp03.InstallationMode";
+  std::string pkgid = "smokewgt03";
+  std::string appid = "smokewgt03.InstallationMode";
   ASSERT_EQ(Install(path, PackageType::WGT), ci::AppInstaller::Result::OK);
   ValidatePackage(pkgid, {appid});
 }
@@ -740,8 +67,8 @@ TEST_F(SmokeTest, InstallationMode) {
 TEST_F(SmokeTest, UpdateMode) {
   bf::path path_old = kSmokePackagesDirectory / "UpdateMode.wgt";
   bf::path path_new = kSmokePackagesDirectory / "UpdateMode_2.wgt";
-  std::string pkgid = "smokeapp04";
-  std::string appid = "smokeapp04.UpdateMode";
+  std::string pkgid = "smokewgt04";
+  std::string appid = "smokewgt04.UpdateMode";
   ASSERT_EQ(Install(path_old, PackageType::WGT), ci::AppInstaller::Result::OK);
   AddDataFiles(pkgid, kTestUserId);
   ASSERT_EQ(Install(path_new, PackageType::WGT), ci::AppInstaller::Result::OK);
@@ -753,8 +80,8 @@ TEST_F(SmokeTest, UpdateMode) {
 
 TEST_F(SmokeTest, DeinstallationMode) {
   bf::path path = kSmokePackagesDirectory / "DeinstallationMode.wgt";
-  std::string pkgid = "smokeapp05";
-  std::string appid = "smokeapp05.DeinstallationMode";
+  std::string pkgid = "smokewgt05";
+  std::string appid = "smokewgt05.DeinstallationMode";
   ASSERT_EQ(Install(path, PackageType::WGT),
             ci::AppInstaller::Result::OK);
   ASSERT_EQ(Uninstall(pkgid, PackageType::WGT, false),
@@ -764,8 +91,8 @@ TEST_F(SmokeTest, DeinstallationMode) {
 
 TEST_F(SmokeTest, RDSMode) {
   bf::path path = kSmokePackagesDirectory / "RDSMode.wgt";
-  std::string pkgid = "smokeapp11";
-  std::string appid = "smokeapp11.RDSMode";
+  std::string pkgid = "smokewgt11";
+  std::string appid = "smokewgt11.RDSMode";
   bf::path delta_directory = kSmokePackagesDirectory / "delta_dir/";
   bf::path sdk_expected_directory =
       bf::path(ci::GetRootAppPath(false, kTestUserId)) / "tmp" / pkgid;
@@ -787,7 +114,7 @@ TEST_F(SmokeTest, RDSMode) {
 
 TEST_F(SmokeTest, EnablePkg) {
   bf::path path = kSmokePackagesDirectory / "EnablePkg.wgt";
-  std::string pkgid = "smokeapp22";
+  std::string pkgid = "smokewgt22";
   ASSERT_EQ(Install(path, PackageType::WGT),
             ci::AppInstaller::Result::OK);
   ASSERT_EQ(DisablePackage(pkgid, PackageType::WGT),
@@ -802,8 +129,8 @@ TEST_F(SmokeTest, EnablePkg) {
 
 TEST_F(SmokeTest, DisablePkg) {
   bf::path path = kSmokePackagesDirectory / "DisablePkg.wgt";
-  std::string pkgid = "smokeapp21";
-  std::string appid = "smokeapp21.DisablePkg";
+  std::string pkgid = "smokewgt21";
+  std::string appid = "smokewgt21.DisablePkg";
   ASSERT_EQ(Install(path, PackageType::WGT),
             ci::AppInstaller::Result::OK);
   ASSERT_EQ(DisablePackage(pkgid, PackageType::WGT),
@@ -815,8 +142,8 @@ TEST_F(SmokeTest, DisablePkg) {
 TEST_F(SmokeTest, DeltaMode) {
   bf::path path = kSmokePackagesDirectory / "DeltaMode.wgt";
   bf::path delta_package = kSmokePackagesDirectory / "DeltaMode.delta";
-  std::string pkgid = "smokeapp17";
-  std::string appid = "smokeapp17.DeltaMode";
+  std::string pkgid = "smokewgt17";
+  std::string appid = "smokewgt17.DeltaMode";
   ASSERT_EQ(DeltaInstall(path, delta_package, PackageType::WGT),
             ci::AppInstaller::Result::OK);
   ValidatePackage(pkgid, {appid});
@@ -842,8 +169,8 @@ TEST_F(SmokeTest, RecoveryMode_ForInstallation) {
   backend_crash.Run("-i", path.string(), "-u", kTestUserIdStr.c_str());
   ASSERT_NE(backend_crash.Wait(), 0);
 
-  std::string pkgid = "smokeapp09";
-  std::string appid = "smokeapp09.RecoveryModeForInstallation";
+  std::string pkgid = "smokewgt09";
+  std::string appid = "smokewgt09.RecoveryModeForInstallation";
   bf::path recovery_file = FindRecoveryFile();
   ASSERT_FALSE(recovery_file.empty());
   ASSERT_EQ(Recover(recovery_file, PackageType::WGT),
@@ -856,8 +183,8 @@ TEST_F(SmokeTest, RecoveryMode_ForUpdate) {
   bf::path path_new = kSmokePackagesDirectory / "RecoveryMode_ForUpdate_2.wgt";
   RemoveAllRecoveryFiles();
   ASSERT_EQ(Install(path_old, PackageType::WGT), ci::AppInstaller::Result::OK);
-  std::string pkgid = "smokeapp10";
-  std::string appid = "smokeapp10.RecoveryModeForUpdate";
+  std::string pkgid = "smokewgt10";
+  std::string appid = "smokewgt10.RecoveryModeForUpdate";
   AddDataFiles(pkgid, kTestUserId);
   Subprocess backend_crash("/usr/bin/wgt-backend-ut/smoke-test-helper");
   backend_crash.Run("-i", path_new.string(), "-u", kTestUserIdStr.c_str());
@@ -882,8 +209,8 @@ TEST_F(SmokeTest, RecoveryMode_ForDelta) {
   backend_crash.Run("-i", path_new.string(), "-u", kTestUserIdStr.c_str());
   ASSERT_NE(backend_crash.Wait(), 0);
 
-  std::string pkgid = "smokeapp30";
-  std::string appid = "smokeapp30.RecoveryModeForDelta";
+  std::string pkgid = "smokewgt30";
+  std::string appid = "smokewgt30.RecoveryModeForDelta";
   bf::path recovery_file = FindRecoveryFile();
   ASSERT_FALSE(recovery_file.empty());
   ASSERT_EQ(Recover(recovery_file, PackageType::WGT),
@@ -900,8 +227,8 @@ TEST_F(SmokeTest, RecoveryMode_ForMountInstall) {
   backend_crash.Run("-w", path.string(), "-u", kTestUserIdStr.c_str());
   ASSERT_NE(backend_crash.Wait(), 0);
 
-  std::string pkgid = "smokeapp31";
-  std::string appid = "smokeapp31.RecoveryModeForMountInstall";
+  std::string pkgid = "smokewgt31";
+  std::string appid = "smokewgt31.RecoveryModeForMountInstall";
   bf::path recovery_file = FindRecoveryFile();
   ASSERT_FALSE(recovery_file.empty());
   ASSERT_EQ(Recover(recovery_file, PackageType::WGT),
@@ -914,8 +241,8 @@ TEST_F(SmokeTest, RecoveryMode_ForMountUpdate) {
       kSmokePackagesDirectory / "RecoveryMode_ForMountUpdate.wgt";
   bf::path path_new =
       kSmokePackagesDirectory / "RecoveryMode_ForMountUpdate_2.wgt";
-  std::string pkgid = "smokeapp32";
-  std::string appid = "smokeapp32.RecoveryModeForMountUpdate";
+  std::string pkgid = "smokewgt32";
+  std::string appid = "smokewgt32.RecoveryModeForMountUpdate";
   RemoveAllRecoveryFiles();
   ASSERT_EQ(MountInstall(path_old, PackageType::WGT),
             ci::AppInstaller::Result::OK);
@@ -940,19 +267,21 @@ TEST_F(SmokeTest, RecoveryMode_ForMountUpdate) {
 }
 
 TEST_F(SmokeTest, InstallationMode_GoodSignature) {
+  // pkgid: smokewgt08
   bf::path path = kSmokePackagesDirectory / "InstallationMode_GoodSignature.wgt";  // NOLINT
   ASSERT_EQ(Install(path, PackageType::WGT), ci::AppInstaller::Result::OK);
 }
 
 TEST_F(SmokeTest, InstallationMode_WrongSignature) {
+  // pkgid: smokewgt12
   bf::path path = kSmokePackagesDirectory / "InstallationMode_WrongSignature.wgt";  // NOLINT
   ASSERT_EQ(Install(path, PackageType::WGT), ci::AppInstaller::Result::ERROR);
 }
 
 TEST_F(SmokeTest, InstallationMode_Rollback) {
   bf::path path = kSmokePackagesDirectory / "InstallationMode_Rollback.wgt";
-  std::string pkgid = "smokeapp06";
-  std::string appid = "smokeapp06.InstallationModeRollback";
+  std::string pkgid = "smokewgt06";
+  std::string appid = "smokewgt06.InstallationModeRollback";
   ASSERT_EQ(Install(path, PackageType::WGT, RequestResult::FAIL),
             ci::AppInstaller::Result::ERROR);
   CheckPackageNonExistance(pkgid, {appid});
@@ -961,8 +290,8 @@ TEST_F(SmokeTest, InstallationMode_Rollback) {
 TEST_F(SmokeTest, UpdateMode_Rollback) {
   bf::path path_old = kSmokePackagesDirectory / "UpdateMode_Rollback.wgt";
   bf::path path_new = kSmokePackagesDirectory / "UpdateMode_Rollback_2.wgt";
-  std::string pkgid = "smokeapp07";
-  std::string appid = "smokeapp07.UpdateModeRollback";
+  std::string pkgid = "smokewgt07";
+  std::string appid = "smokewgt07.UpdateModeRollback";
   ASSERT_EQ(Install(path_old, PackageType::WGT), ci::AppInstaller::Result::OK);
   AddDataFiles(pkgid, kTestUserId);
   ASSERT_EQ(Install(path_new, PackageType::WGT, RequestResult::FAIL),
@@ -1168,8 +497,8 @@ TEST_F(SmokeTest, MountUpdateMode_Rollback_Hybrid) {
 
 TEST_F(SmokeTest, MountInstallationMode) {
   bf::path path = kSmokePackagesDirectory / "MountInstallationMode.wgt";
-  std::string pkgid = "smokeapp28";
-  std::string appid = "smokeapp28.InstallationMode";
+  std::string pkgid = "smokewgt28";
+  std::string appid = "smokewgt28.InstallationMode";
   ASSERT_EQ(MountInstall(path, PackageType::WGT), ci::AppInstaller::Result::OK);
   ScopedTzipInterface interface(pkgid);
   ValidatePackage(pkgid, {appid});
@@ -1178,8 +507,8 @@ TEST_F(SmokeTest, MountInstallationMode) {
 TEST_F(SmokeTest, MountUpdateMode) {
   bf::path path_old = kSmokePackagesDirectory / "MountUpdateMode.wgt";
   bf::path path_new = kSmokePackagesDirectory / "MountUpdateMode_2.wgt";
-  std::string pkgid = "smokeapp29";
-  std::string appid = "smokeapp29.UpdateMode";
+  std::string pkgid = "smokewgt29";
+  std::string appid = "smokewgt29.UpdateMode";
   ASSERT_EQ(MountInstall(path_old, PackageType::WGT),
             ci::AppInstaller::Result::OK);
   AddDataFiles(pkgid, kTestUserId);
@@ -1195,8 +524,8 @@ TEST_F(SmokeTest, MountUpdateMode) {
 TEST_F(SmokeTest, MountInstallationMode_Rollback) {
   bf::path path =
       kSmokePackagesDirectory / "MountInstallationMode_Rollback.wgt";
-  std::string pkgid = "smokeapp33";
-  std::string appid = "smokeapp33.web";
+  std::string pkgid = "smokewgt33";
+  std::string appid = "smokewgt33.web";
   ASSERT_EQ(MountInstall(path, PackageType::WGT, RequestResult::FAIL),
             ci::AppInstaller::Result::ERROR);
   ScopedTzipInterface interface(pkgid);
@@ -1207,8 +536,8 @@ TEST_F(SmokeTest, MountUpdateMode_Rollback) {
   bf::path path_old = kSmokePackagesDirectory / "MountUpdateMode_Rollback.wgt";
   bf::path path_new =
       kSmokePackagesDirectory / "MountUpdateMode_Rollback_2.wgt";
-  std::string pkgid = "smokeapp34";
-  std::string appid = "smokeapp34.web";
+  std::string pkgid = "smokewgt34";
+  std::string appid = "smokewgt34.web";
   ASSERT_EQ(MountInstall(path_old, PackageType::WGT),
             ci::AppInstaller::Result::OK);
   AddDataFiles(pkgid, kTestUserId);
@@ -1242,8 +571,8 @@ TEST_F(SmokeTest, UserDefinedPlugins) {
 TEST_F(SmokeTest, InstallExternalMode) {
   ASSERT_TRUE(CheckAvailableExternalPath());
   bf::path path = kSmokePackagesDirectory / "InstallExternalMode.wgt";
-  std::string pkgid = "smokeapp35";
-  std::string appid = "smokeapp35.web";
+  std::string pkgid = "smokewgt35";
+  std::string appid = "smokewgt35.web";
   ASSERT_EQ(InstallExternal(path, PackageType::WGT),
       ci::AppInstaller::Result::OK);
   ValidateExternalPackage(pkgid, {appid});
@@ -1253,30 +582,30 @@ TEST_F(SmokeTest, MigrateLegacyExternalImageMode) {
   ASSERT_TRUE(CheckAvailableExternalPath());
   bf::path path =
       kSmokePackagesDirectory / "MigrateLegacyExternalImageMode.wgt";
-  std::string pkgid = "smokeapp36";
-  std::string appid = "smokeapp36.web";
+  std::string pkgid = "smokewgt36";
+  std::string appid = "smokewgt36.web";
   bf::path legacy_path = kSmokePackagesDirectory / kLegacyExtImageDir;
   ASSERT_EQ(MigrateLegacyExternalImage(pkgid, path, legacy_path,
       PackageType::WGT), ci::AppInstaller::Result::OK);
   ValidateExternalPackage(pkgid, {appid});
 }
 
-TEST_F(SmokeTest, InstallationMode_Preload) {
+TEST_F(PreloadSmokeTest, InstallationMode_Preload) {
   ASSERT_EQ(getuid(), 0) << "Test cannot be run by normal user";
   bf::path path = kSmokePackagesDirectory / "InstallationMode_Preload.wgt";
-  std::string pkgid = "smokeapp37";
-  std::string appid = "smokeapp37.InstallationModePreload";
+  std::string pkgid = "smokewgt37";
+  std::string appid = "smokewgt37.InstallationModePreload";
   ASSERT_EQ(InstallPreload(path, PackageType::WGT),
             ci::AppInstaller::Result::OK);
   ValidatePackage(pkgid, {appid}, true);
 }
 
-TEST_F(SmokeTest, UpdateMode_Preload) {
+TEST_F(PreloadSmokeTest, UpdateMode_Preload) {
   ASSERT_EQ(getuid(), 0) << "Test cannot be run by normal user";
   bf::path path_old = kSmokePackagesDirectory / "UpdateMode_Preload.wgt";
   bf::path path_new = kSmokePackagesDirectory / "UpdateMode_Preload2.wgt";
-  std::string pkgid = "smokeapp38";
-  std::string appid = "smokeapp38.UpdateModePreload";
+  std::string pkgid = "smokewgt38";
+  std::string appid = "smokewgt38.UpdateModePreload";
   ASSERT_EQ(InstallPreload(path_old, PackageType::WGT),
             ci::AppInstaller::Result::OK);
   AddDataFiles(pkgid, kTestUserId);
@@ -1289,11 +618,11 @@ TEST_F(SmokeTest, UpdateMode_Preload) {
   ValidateDataFiles(pkgid, kTestUserId);
 }
 
-TEST_F(SmokeTest, DeinstallationMode_Preload) {
+TEST_F(PreloadSmokeTest, DeinstallationMode_Preload) {
   ASSERT_EQ(getuid(), 0) << "Test cannot be run by normal user";
   bf::path path = kSmokePackagesDirectory / "DeinstallationMode_Preload.wgt";
-  std::string pkgid = "smokeapp39";
-  std::string appid = "smokeapp39.DeinstallationModePreload";
+  std::string pkgid = "smokewgt39";
+  std::string appid = "smokewgt39.DeinstallationModePreload";
   ASSERT_EQ(InstallPreload(path, PackageType::WGT),
             ci::AppInstaller::Result::OK);
   ASSERT_EQ(Uninstall(pkgid, PackageType::WGT, true),
@@ -1301,11 +630,88 @@ TEST_F(SmokeTest, DeinstallationMode_Preload) {
   CheckPackageReadonlyNonExistance(pkgid, {appid});
 }
 
+TEST_F(SmokeTest, SharedRes24) {
+  bf::path path = kSmokePackagesDirectory / "SharedRes24.wgt";
+  std::string pkgid = "smokeSh2xx";
+  std::string appid = "smokeSh2xx.SharedRes24";
+  ASSERT_EQ(Install(path, PackageType::WGT), ci::AppInstaller::Result::OK);
+  ValidatePackage(pkgid, {appid});
+  bf::path root_path = ci::GetRootAppPath(false, kTestUserId);
+  ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "NOT-SHARED-WGT"));  // NOLINT
+  ASSERT_FALSE(bf::exists(root_path / pkgid / "shared" / "res" / "NOT-SHARED-WGT"));  // NOLINT
+}
+
+TEST_F(SmokeTest, SharedRes30) {
+  bf::path path = kSmokePackagesDirectory / "SharedRes30.wgt";
+  std::string pkgid = "smokeSh3xx";
+  std::string appid = "smokeSh3xx.SharedRes30";
+  ASSERT_EQ(Install(path, PackageType::WGT), ci::AppInstaller::Result::OK);
+  ValidatePackage(pkgid, {appid});
+  bf::path root_path = ci::GetRootAppPath(false, kTestUserId);
+  ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT"));  // NOLINT
+  ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "shared" / "res" / "SHARED-WGT"));  // NOLINT
+}
+
+TEST_F(SmokeTest, SharedRes30Delta) {
+  bf::path path = kSmokePackagesDirectory / "SharedRes30Delta.wgt";
+  bf::path delta_package = kSmokePackagesDirectory / "SharedRes30Delta.delta";
+  std::string pkgid = "smokeSh3De";
+  std::string appid = "smokeSh3De.SharedRes30Delta";
+  ASSERT_EQ(DeltaInstall(path, delta_package, PackageType::WGT),
+            ci::AppInstaller::Result::OK);
+  ValidatePackage(pkgid, {appid});
+  // Check delta modifications
+  bf::path root_path = ci::GetRootAppPath(false, kTestUserId);
+  ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT-2"));  // NOLINT
+  ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "shared" / "res" / "SHARED-WGT-2"));  // NOLINT
+  ASSERT_FALSE(bf::exists(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT-1"));  // NOLINT
+  ASSERT_FALSE(bf::exists(root_path / pkgid / "shared" / "res" / "SHARED-WGT-1"));  // NOLINT
+}
+
+TEST_F(SmokeTest, SharedRes30Hybrid) {
+  bf::path path = kSmokePackagesDirectory / "SharedRes30Hybrid.wgt";
+  std::string pkgid = "smokeSh3Hy";
+  std::string appid1 = "smokeSh3Hy.SharedRes30Hybrid";
+  std::string appid2 = "sharedres30hybridserivce";
+  ASSERT_EQ(Install(path, PackageType::HYBRID), ci::AppInstaller::Result::OK);
+  ValidatePackage(pkgid, {appid1, appid2});
+  bf::path root_path = ci::GetRootAppPath(false, kTestUserId);
+  ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT"));  // NOLINT
+  ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "shared" / "res" / "SHARED-WGT"));  // NOLINT
+  ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "shared" / "res" / "SHARED-TPK"));  // NOLINT
+  ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-TPK"));  // NOLINT
+}
+
+TEST_F(SmokeTest, SharedRes30HybridDelta) {
+  bf::path path = kSmokePackagesDirectory / "SharedRes30HybridDelta.wgt";
+  bf::path delta_package = kSmokePackagesDirectory /
+      "SharedRes30HybridDelta.delta";
+  std::string pkgid = "smokeSh3HD";
+  std::string appid1 = "smokeSh3HD.SharedRes30HybridDelta";
+  std::string appid2 = "sharedres30hybriddeltaserivce";
+  ASSERT_EQ(DeltaInstall(path, delta_package, PackageType::HYBRID),
+            ci::AppInstaller::Result::OK);
+  ValidatePackage(pkgid, {appid1, appid2});
+  // Check delta modifications
+  bf::path root_path = ci::GetRootAppPath(false, kTestUserId);
+  ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT-2"));  // NOLINT
+  ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "shared" / "res" / "SHARED-WGT-2"));  // NOLINT
+  ASSERT_TRUE(bf::is_regular_file(root_path / pkgid / "shared" / "res" / "SHARED-TPK-2"));  // NOLINT
+  ASSERT_TRUE(bf::is_symlink(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-TPK-2"));  // NOLINT
+  ASSERT_FALSE(bf::exists(root_path / pkgid / "res" / "wgt" / "shared" / "res" / "SHARED-WGT-1"));  // NOLINT
+  ASSERT_FALSE(bf::exists(root_path / pkgid / "shared" / "res" / "SHARED-WGT-1"));  // NOLINT
+}
+
 }  // namespace common_installer
 
 int main(int argc,  char** argv) {
+  ci::RequestMode request_mode = ParseRequestMode(argc, argv);
+  if (getuid() != 0 || request_mode != ci::RequestMode::GLOBAL) {
+    std::cout << "Skip tests for preload request" << std::endl;
+    ::testing::GTEST_FLAG(filter) = "SmokeTest.*";
+  }
   testing::InitGoogleTest(&argc, argv);
-  testing::AddGlobalTestEnvironment(
-      new common_installer::SmokeEnvironment(kGlobalUserUid));
+  testing::Environment *env = testing::AddGlobalTestEnvironment(
+      new common_installer::SmokeEnvironment(request_mode));
   return RUN_ALL_TESTS();
 }