Ejemplo n.º 1
0
    def test_deploy_raise_no_package_above_revision3(self):
        """
        if package doesn't contain package.json, raise exception(no package.json) above revision 3
        """
        zip_list = ['nodir_nopackage.zip', 'normal_nopackage.zip']

        for zip_item in zip_list:
            address: 'Address' = create_address(AddressPrefix.CONTRACT)
            self.archive_path = os.path.join(DIRECTORY_PATH, 'sample',
                                             zip_item)
            tx_hash1 = create_tx_hash()
            score_deploy_path: str = get_score_deploy_path(
                self.score_root_path, address, tx_hash1)

            with self.assertRaises(BaseException) as e:
                IconScoreDeployer.deploy(
                    score_deploy_path,
                    self.read_zipfile_as_byte(self.archive_path),
                    Revision.THREE.value)
            self.assertEqual(e.exception.code, ExceptionCode.INVALID_PACKAGE)
            self.assertEqual(e.exception.message, "package.json not found")
            self.assertTrue(os.path.exists(score_deploy_path))

            score_path: str = get_score_path(self.score_root_path, address)
            remove_path(score_path)
Ejemplo n.º 2
0
    def test_deploy_when_score_depth_is_different(self):
        """
        Reads all files from the depth lower than where the file 'package.json' is
        and test deploying successfully.
        """
        zip_list = ['score_registry.zip', 'fakedir.zip', 'nodir.zip']

        for zip_item in zip_list:
            address: 'Address' = create_address(AddressPrefix.CONTRACT)
            self.archive_path = os.path.join(DIRECTORY_PATH, 'sample',
                                             zip_item)
            tx_hash1 = create_tx_hash()
            score_deploy_path: str = get_score_deploy_path(
                self.score_root_path, address, tx_hash1)

            IconScoreDeployer.deploy(
                score_deploy_path,
                self.read_zipfile_as_byte(self.archive_path))
            self.assertEqual(True, os.path.exists(score_deploy_path))

            zip_file_info_gen = IconScoreDeployer._extract_files_gen(
                self.read_zipfile_as_byte(self.archive_path))
            file_path_list = [
                name for name, info, parent_dir in zip_file_info_gen
            ]

            installed_contents = self.get_installed_files(score_deploy_path)
            self.assertTrue(
                self.check_package_json_validity(installed_contents))
            installed_contents.sort()
            file_path_list.sort()
            self.assertEqual(installed_contents, file_path_list)

            score_path: str = get_score_path(self.score_root_path, address)
            remove_path(score_path)
Ejemplo n.º 3
0
    def test_deploy_when_score_depth_is_different_above_revision3(self):
        """
        Reads all files from the depth lower than where the file 'package.json' is
        and test deploying successfully.
        """
        zip_list = [('score_registry.zip', [
            'interfaces/__init__.py', 'interfaces/abc_owned.py',
            'interfaces/abc_score_registry.py', 'package.json',
            'score_registry/__init__.py', 'score_registry/score_registry.py',
            'utility/__init__.py', 'utility/owned.py', 'utility/utils.py'
        ]), ('fakedir.zip', ['__init__.py', 'call_class1.py', 'package.json']),
                    ('nodir.zip',
                     ['__init__.py', 'package.json', 'sample_token.py'])]

        for zip_file, expected_list in zip_list:
            address: 'Address' = create_address(AddressPrefix.CONTRACT)
            self.archive_path = os.path.join(DIRECTORY_PATH, 'sample',
                                             zip_file)
            tx_hash1 = create_tx_hash()
            score_deploy_path: str = get_score_deploy_path(
                self.score_root_path, address, tx_hash1)

            IconScoreDeployer.deploy(
                score_deploy_path,
                self.read_zipfile_as_byte(self.archive_path),
                Revision.THREE.value)
            self.assertEqual(True, os.path.exists(score_deploy_path))

            installed_files = self.get_installed_files(score_deploy_path)
            installed_files.sort()
            self.assertEqual(installed_files, expected_list)

            score_path: str = get_score_path(self.score_root_path, address)
            remove_path(score_path)
 def setUp(self):
     self.deployer = IconScoreDeployer('./')
     self.address = create_address(AddressPrefix.CONTRACT)
     self.archive_path = os.path.join(DIRECTORY_PATH, 'sample','valid.zip')
     self.archive_path2 = os.path.join(DIRECTORY_PATH, 'sample', 'invalid.zip')
     self.archive_path3 = os.path.join(DIRECTORY_PATH, 'sample', 'valid.zip')
     self.score_root_path = os.path.join(self.deployer.score_root_path, str(self.address.to_bytes().hex()))
     self.deployer2 = IconScoreDeployer('/')
Ejemplo n.º 5
0
    def tearDown(self):
        self.engine = None
        self.icx_storage.close(self._context)
        self.factory.destroy(self._context)
        ContextDatabaseFactory.close()

        remove_path = os.path.join(TEST_ROOT_PATH, self._ROOT_SCORE_PATH)
        IconScoreDeployer.remove_existing_score(remove_path)
        remove_path = os.path.join(TEST_ROOT_PATH, self._TEST_DB_PATH)
        IconScoreDeployer.remove_existing_score(remove_path)
Ejemplo n.º 6
0
    def test_remove_existing_score(self):
        tx_hash: bytes = create_tx_hash()
        score_deploy_path: str = get_score_deploy_path(self.score_root_path,
                                                       self.address, tx_hash)

        self.normal_score_path = os.path.join(DIRECTORY_PATH, 'sample',
                                              'normal_score.zip')
        IconScoreDeployer.deploy(
            score_deploy_path,
            self.read_zipfile_as_byte(self.normal_score_path))
        remove_path(score_deploy_path)
        self.assertFalse(os.path.exists(score_deploy_path))
Ejemplo n.º 7
0
    def test_install(self):
        self.normal_score_path = os.path.join(DIRECTORY_PATH, 'sample',
                                              'normal_score.zip')
        self.bad_zip_file_path = os.path.join(DIRECTORY_PATH, 'sample',
                                              'badzipfile.zip')
        self.inner_dir_path = os.path.join(DIRECTORY_PATH, 'sample',
                                           'innerdir.zip')

        # Case when the user install SCORE first time.
        tx_hash1 = create_tx_hash()
        score_deploy_path: str = get_score_deploy_path(self.score_root_path,
                                                       self.address, tx_hash1)

        IconScoreDeployer.deploy(
            score_deploy_path,
            self.read_zipfile_as_byte(self.normal_score_path))
        self.assertEqual(True, os.path.exists(score_deploy_path))

        zip_file_info_gen = IconScoreDeployer._extract_files_gen(
            self.read_zipfile_as_byte(self.normal_score_path))
        file_path_list = [name for name, info, parent_dir in zip_file_info_gen]

        installed_contents = self.get_installed_files(score_deploy_path)
        self.assertTrue(self.check_package_json_validity(installed_contents))
        installed_contents.sort()
        file_path_list.sort()
        self.assertEqual(installed_contents, file_path_list)

        # Case when installing SCORE with bad-zip-file Data.
        tx_hash2 = create_tx_hash()
        score_deploy_path: str = get_score_deploy_path(self.score_root_path,
                                                       self.address, tx_hash2)

        with self.assertRaises(BaseException) as e:
            IconScoreDeployer.deploy(
                score_deploy_path,
                self.read_zipfile_as_byte(self.bad_zip_file_path))
        self.assertEqual(e.exception.code, ExceptionCode.INVALID_PACKAGE)
        self.assertTrue(os.path.exists(score_deploy_path))

        # Case when the user specifies an installation path that does not have permission.
        score_deploy_path: str = get_score_deploy_path('/', self.address,
                                                       tx_hash1)
        with self.assertRaises(BaseException) as e:
            IconScoreDeployer.deploy(
                score_deploy_path,
                self.read_zipfile_as_byte(self.normal_score_path))
        # On MacOS OSError is raised which is different from Linux
        # self.assertIsInstance(e.exception, PermissionError)

        # Case when the user try to install scores inner directories.
        tx_hash3 = create_tx_hash()
        score_deploy_path: str = get_score_deploy_path(self.score_root_path,
                                                       self.address, tx_hash3)
        IconScoreDeployer.deploy(
            score_deploy_path, self.read_zipfile_as_byte(self.inner_dir_path))
        self.assertEqual(True, os.path.exists(score_deploy_path))
Ejemplo n.º 8
0
    def test_deploy_bug_IS_355(self):
        zip_list = [
            (Revision.TWO.value, [
                '__init__.py', 'interfaces/__init__.py',
                'interfaces/abc_owned.py', 'interfaces/abc_score_registry.py',
                'package.json', 'score_registry.py', 'utility/__init__.py',
                'utility/owned.py', 'utility/utils.py'
            ]),
            (Revision.THREE.value, [
                'interfaces/__init__.py', 'interfaces/abc_owned.py',
                'interfaces/abc_score_registry.py', 'package.json',
                'score_registry/__init__.py',
                'score_registry/score_registry.py', 'utility/__init__.py',
                'utility/owned.py', 'utility/utils.py'
            ])
        ]

        for revision, expected_list in zip_list:
            address: 'Address' = create_address(AddressPrefix.CONTRACT)
            self.archive_path = os.path.join(DIRECTORY_PATH, 'sample',
                                             'score_registry.zip')

            zip_file_info_gen = IconScoreDeployer._extract_files_gen(
                self.read_zipfile_as_byte(self.archive_path), revision)
            file_path_list = [
                name for name, info, parent_dir in zip_file_info_gen
            ]
            file_path_list.sort()
            self.assertEqual(expected_list, file_path_list)
Ejemplo n.º 9
0
 def __unpack_zip_file(install_path: str, data: bytes):
     file_info_generator = IconScoreDeployer._extract_files_gen(data)
     for name, file_info, parent_directory in file_info_generator:
         if not os.path.exists(os.path.join(install_path, parent_directory)):
             os.makedirs(os.path.join(install_path, parent_directory))
         with file_info as file_info_context,\
                 open(os.path.join(install_path, name), 'wb') as dest:
             contents = file_info_context.read()
             dest.write(contents)
     return True
    def test_deploy_when_score_depth_is_different(self):
        """
        Reads all files from the depth lower than where the file 'package.json' is
        and test deploying successfully.
        """
        zip_list = [
            "valid.zip", "sample_token.zip", "sample_token01.zip",
            'test_score01.zip', 'test_score02.zip', 'test_score02_2.zip'
        ]
        for zip in zip_list:
            self.deployer = IconScoreDeployer('./')
            self.address = create_address(AddressPrefix.CONTRACT)
            self.archive_path = os.path.join(DIRECTORY_PATH, 'sample', zip)
            self.score_root_path = os.path.join(
                self.deployer.score_root_path,
                str(self.address.to_bytes().hex()))
            tx_hash1 = create_tx_hash()
            self.deployer.deploy(self.address,
                                 self.read_zipfile_as_byte(self.archive_path),
                                 tx_hash1)
            converted_tx_hash = f'0x{bytes.hex(tx_hash1)}'
            install_path = os.path.join(self.score_root_path,
                                        converted_tx_hash)
            zip_file_info_gen = self.deployer._extract_files_gen(
                self.read_zipfile_as_byte(self.archive_path))
            file_path_list = [
                name for name, info, parent_dir in zip_file_info_gen
            ]

            installed_contents = []
            for directory, dirs, filename in os.walk(install_path):
                parent_directory_index = directory.rfind('/')
                parent_dir_name = directory[parent_directory_index + 1:]
                for file in filename:
                    if parent_dir_name == f'0x{bytes.hex(tx_hash1)}':
                        installed_contents.append(file)
                    else:
                        installed_contents.append(f'{parent_dir_name}/{file}')
            self.assertEqual(True, os.path.exists(install_path))
            self.assertTrue(installed_contents.sort() == file_path_list.sort())
            IconScoreDeployer.remove_existing_score(self.score_root_path)
Ejemplo n.º 11
0
    def tearDown(self):
        self._engine = None
        ContextContainer._pop_context()
        self._icon_score_mapper.close()
        self._factory.destroy(self._context)

        remove_path = os.path.join(TEST_ROOT_PATH, 'tests')
        IconScoreDeployer.remove_existing_score(remove_path)
        remove_path = os.path.join(TEST_ROOT_PATH, self._TEST_DB_PATH)
        IconScoreDeployer.remove_existing_score(remove_path)
        remove_path = os.path.join(
            TEST_ROOT_PATH, self.sample_token_address.to_bytes().hex())
        IconScoreDeployer.remove_existing_score(remove_path)
class TestIconScoreDeployer(unittest.TestCase):
    def setUp(self):
        self.deployer = IconScoreDeployer('./')
        self.address = create_address(AddressPrefix.CONTRACT)
        self.archive_path = os.path.join(DIRECTORY_PATH, 'sample', 'valid.zip')
        self.archive_path2 = os.path.join(DIRECTORY_PATH, 'sample',
                                          'invalid.zip')
        self.archive_path3 = os.path.join(DIRECTORY_PATH, 'sample',
                                          'valid.zip')
        self.score_root_path = os.path.join(self.deployer.score_root_path,
                                            str(self.address.to_bytes().hex()))
        self.deployer2 = IconScoreDeployer('/')

    @staticmethod
    def read_zipfile_as_byte(archive_path: str) -> bytes:
        with open(archive_path, 'rb') as f:
            byte_data = f.read()
            return byte_data

    def test_install(self):
        # Case when the user install SCORE first time.
        tx_hash1 = create_tx_hash()
        self.deployer.deploy(self.address,
                             self.read_zipfile_as_byte(self.archive_path),
                             tx_hash1)
        converted_tx_hash = f'0x{bytes.hex(tx_hash1)}'
        install_path = os.path.join(self.score_root_path, converted_tx_hash)
        zip_file_info_gen = self.deployer._extract_files_gen(
            self.read_zipfile_as_byte(self.archive_path))
        file_path_list = [name for name, info, parent_dir in zip_file_info_gen]

        installed_contents = []
        for directory, dirs, filename in os.walk(install_path):
            parent_directory_index = directory.rfind('/')
            parent_dir_name = directory[parent_directory_index + 1:]
            for file in filename:
                if parent_dir_name == f'0x{bytes.hex(tx_hash1)}':
                    installed_contents.append(file)
                else:
                    installed_contents.append(f'{parent_dir_name}/{file}')
        self.assertEqual(True, os.path.exists(install_path))
        self.assertTrue(installed_contents.sort() == file_path_list.sort())

        # Case when the user install SCORE second time.
        with self.assertRaises(BaseException) as e:
            self.deployer.deploy(self.address,
                                 self.read_zipfile_as_byte(self.archive_path),
                                 tx_hash1)
        self.assertEqual(e.exception.code, ExceptionCode.INVALID_PARAMS)

        # Case when installing SCORE with badzipfile Data.
        tx_hash2 = create_tx_hash()
        with self.assertRaises(BaseException) as e:
            self.deployer.deploy(self.address,
                                 self.read_zipfile_as_byte(self.archive_path2),
                                 tx_hash2)
        self.assertEqual(e.exception.code, ExceptionCode.INVALID_PARAMS)
        converted_tx_hash = f'0x{bytes.hex(tx_hash2)}'
        install_path2 = os.path.join(self.score_root_path, converted_tx_hash)
        self.assertFalse(os.path.exists(install_path2))

        # Case when The user specifies an installation path that does not have permission.
        with self.assertRaises(BaseException) as e:
            self.deployer2.deploy(self.address,
                                  self.read_zipfile_as_byte(self.archive_path),
                                  tx_hash1)
        self.assertIsInstance(e.exception, PermissionError)

        # Case when the user try to install scores without directories.
        tx_hash3 = create_tx_hash()
        converted_tx_hash = f'0x{bytes.hex(tx_hash3)}'
        self.deployer.deploy(self.address,
                             self.read_zipfile_as_byte(self.archive_path3),
                             tx_hash3)
        install_path3 = os.path.join(self.score_root_path, converted_tx_hash)
        self.assertEqual(True, os.path.exists(install_path3))

    def test_remove_existing_score(self):
        tx_hash = create_tx_hash()
        converted_tx_hash = f'0x{bytes.hex(tx_hash)}'
        install_path = os.path.join(self.score_root_path, converted_tx_hash)
        self.deployer.deploy(self.address,
                             self.read_zipfile_as_byte(self.archive_path),
                             tx_hash)
        self.deployer.remove_existing_score(install_path)
        self.assertFalse(os.path.exists(install_path))

    def test_deploy_when_score_depth_is_different(self):
        """
        Reads all files from the depth lower than where the file 'package.json' is
        and test deploying successfully.
        """
        zip_list = [
            "valid.zip", "sample_token.zip", "sample_token01.zip",
            'test_score01.zip', 'test_score02.zip', 'test_score02_2.zip'
        ]
        for zip in zip_list:
            self.deployer = IconScoreDeployer('./')
            self.address = create_address(AddressPrefix.CONTRACT)
            self.archive_path = os.path.join(DIRECTORY_PATH, 'sample', zip)
            self.score_root_path = os.path.join(
                self.deployer.score_root_path,
                str(self.address.to_bytes().hex()))
            tx_hash1 = create_tx_hash()
            self.deployer.deploy(self.address,
                                 self.read_zipfile_as_byte(self.archive_path),
                                 tx_hash1)
            converted_tx_hash = f'0x{bytes.hex(tx_hash1)}'
            install_path = os.path.join(self.score_root_path,
                                        converted_tx_hash)
            zip_file_info_gen = self.deployer._extract_files_gen(
                self.read_zipfile_as_byte(self.archive_path))
            file_path_list = [
                name for name, info, parent_dir in zip_file_info_gen
            ]

            installed_contents = []
            for directory, dirs, filename in os.walk(install_path):
                parent_directory_index = directory.rfind('/')
                parent_dir_name = directory[parent_directory_index + 1:]
                for file in filename:
                    if parent_dir_name == f'0x{bytes.hex(tx_hash1)}':
                        installed_contents.append(file)
                    else:
                        installed_contents.append(f'{parent_dir_name}/{file}')
            self.assertEqual(True, os.path.exists(install_path))
            self.assertTrue(installed_contents.sort() == file_path_list.sort())
            IconScoreDeployer.remove_existing_score(self.score_root_path)

    def tearDown(self):
        IconScoreDeployer.remove_existing_score(self.score_root_path)
 def tearDown(self):
     IconScoreDeployer.remove_existing_score(self.score_root_path)