configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/unittest_content_copy_empty_dirs.py
changeset 3 e7e0ae78773e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/unittest_content_copy_empty_dirs.py	Tue Aug 10 14:29:28 2010 +0300
@@ -0,0 +1,175 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, shutil
+import unittest
+
+from cone.public import plugin, api
+from testautomation.base_testcase import BaseTestCase
+from testautomation.unzip_file import unzip_file
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+TESTDATA_DIR  = os.path.join(ROOT_PATH, 'testdata')
+TEMP_DIR = os.path.join(ROOT_PATH, 'temp/emptydircopy')
+
+class TestContentCopyEmptyDirs(BaseTestCase):
+    
+    def _get_project_and_config(self, workdir, storage_type):
+        # Create the working directory for the test
+        self.remove_if_exists(workdir)
+        os.makedirs(workdir)
+        
+        # Unpack or copy the project into the working directory
+        project_source_zip = os.path.join(TESTDATA_DIR, 'emptydircopy/project.zip')
+        if storage_type == 'fs':
+            project_location = os.path.join(workdir, 'project')
+            unzip_file(project_source_zip, project_location)
+        elif storage_type == 'zs':
+            project_location = os.path.join(workdir, 'project.zip')
+            shutil.copy(project_source_zip, project_location)
+        else:
+            raise ValueError('Invalid storage type %r' % storage_type)
+        
+        # Copy the external content directory
+        unzip_file(os.path.join(TESTDATA_DIR, 'emptydircopy/external_content.zip'),
+                   os.path.join(workdir, 'external_content'))
+        
+        project = api.Project(api.Storage.open(project_location, 'r'))
+        config = project.get_configuration('root.confml')
+        return project, config
+    
+    def test_get_copy_list(self):
+        workdir = os.path.join(TEMP_DIR, 'get_copy_list')
+        proj, conf = self._get_project_and_config(workdir, 'fs')
+        proj.close()
+        impls = plugin.get_impl_set(conf)
+        
+        orig_dir = os.getcwd()
+        os.chdir(workdir)
+        try:
+            self.assertEquals(1, len(impls))
+            impl = iter(impls).next()
+            self.assertEquals(8, len(impl.impls))
+            
+            # Normal inputs
+            # -------------
+            def check(impl_index, expected):
+                self.assertEquals(sorted(impl.impls[impl_index].get_full_copy_list()),
+                                  sorted(expected))
+            check(0, [
+                ('layer2/content/foobar/layer2_emptydir',       'foobar_out/layer2_emptydir', False),
+                ('layer1/content/foobar/layer1_emptydir',       'foobar_out/layer1_emptydir', False),
+                ('layer1/content/foobar/layer1_emptydir2/foo',  'foobar_out/layer1_emptydir2/foo', False),
+                ('layer2/content/foobar/layer2.txt',            'foobar_out/layer2.txt', False),
+                ('layer1/content/foobar/layer1.txt',            'foobar_out/layer1.txt', False)
+            ])
+            check(1, [
+                #('layer2/content/foobar_filtered/layer2_filtered_emptydir', 'foobar_out/layer2_filtered_emptydir', False),
+                #('layer1/content/foobar_filtered/layer1_filtered_emptydir', 'foobar_out/layer1_filtered_emptydir', False),
+                ('layer1/content/foobar_filtered/bar.txt', 'foobar_out_filtered/bar.txt', False),
+            ])
+            check(2, [('layer1/content/empty', 'empty_out', False)])
+            check(3, [])
+            
+            
+            # External inputs
+            # ---------------
+            def check(impl_index, expected):
+                expected = [(os.path.abspath(src).replace('\\', '/'), tgt, ext) for src, tgt, ext in expected]
+                self.assertEquals(sorted(impl.impls[impl_index].get_full_copy_list()),
+                                  sorted(expected))
+            check(4, [
+                ('external_content/foobar/emptydir',       'ext_out/foobar_out/emptydir', True),
+                ('external_content/foobar/emptydir2/foo',  'ext_out/foobar_out/emptydir2/foo', True),
+                ('external_content/foobar/x.txt',          'ext_out/foobar_out/x.txt', True)
+            ])
+            check(5, [
+                #('external_content/foobar_filtered/layer1_filtered_emptydir', 'ext_out/foobar_out/layer1_filtered_emptydir', False),
+                ('external_content/foobar_filtered/bar.txt', 'ext_out/foobar_out_filtered/bar.txt', True),
+            ])
+            check(6, [('external_content/empty', 'ext_out/empty_out', True)])
+            check(7, [])
+        finally:
+            os.chdir(orig_dir)
+            self.remove_if_exists(workdir)
+    
+    def test_copy_empty_dirs_filestorage(self):
+        workdir = os.path.join(TEMP_DIR, 'filestorage')
+        proj, conf = self._get_project_and_config(workdir, 'fs')
+        
+        orig_dir = os.getcwd()
+        os.chdir(workdir)
+        try:
+            self._run_test_copy_empty_dirs(workdir, conf)
+        finally:
+            os.chdir(orig_dir)
+            proj.close()
+            self.remove_if_exists(workdir)
+    
+    def test_copy_empty_dirs_zipstorage(self):
+        workdir = os.path.join(TEMP_DIR, 'zipstorage')
+        proj, conf = self._get_project_and_config(workdir, 'zs')
+        
+        orig_dir = os.getcwd()
+        os.chdir(workdir)
+        try:
+            self._run_test_copy_empty_dirs(workdir, conf)
+        finally:
+            os.chdir(orig_dir)
+            proj.close()
+            self.remove_if_exists(workdir)
+    
+    def _run_test_copy_empty_dirs(self, workdir, config):
+        output_dir = os.path.join(workdir, 'output')
+        context = plugin.GenerationContext(configuration=config, output=output_dir)
+        impl_set = plugin.get_impl_set(config)
+        impl_set.generate(context)
+        
+        created_dirs = []
+        created_files = []
+        def strip(path):
+            return path[len(output_dir):].replace('\\', '/').strip('/')
+        for root, dirs, files in os.walk(output_dir):
+            for d in dirs:  created_dirs.append(strip(os.path.join(root, d)))
+            for f in files: created_files.append(strip(os.path.join(root, f)))
+        
+        self.assertEquals(sorted(created_dirs), sorted(
+            ['empty_out',
+             'ext_out',
+             'ext_out/empty_out',
+             'ext_out/foobar_out',
+             'ext_out/foobar_out/emptydir',
+             'ext_out/foobar_out/emptydir2',
+             'ext_out/foobar_out/emptydir2/foo',
+             'ext_out/foobar_out_filtered',
+             'foobar_out',
+             'foobar_out/layer1_emptydir',
+             'foobar_out/layer1_emptydir2',
+             'foobar_out/layer1_emptydir2/foo',
+             'foobar_out/layer2_emptydir',
+             'foobar_out_filtered'
+             #'foobar_out_filtered/layer1_emptydir',
+             #'foobar_out_filtered/layer2_emptydir',
+             ]))
+        self.assertEquals(sorted(created_files), sorted(
+            ['ext_out/foobar_out/x.txt',
+             'ext_out/foobar_out_filtered/bar.txt',
+             'foobar_out/layer1.txt',
+             'foobar_out/layer2.txt',
+             'foobar_out_filtered/bar.txt']))
+
+if __name__ == '__main__':
+    unittest.main()