| |
@@ -18,27 +18,26 @@
|
| |
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| |
# SOFTWARE.
|
| |
|
| |
+ import koji
|
| |
+ import mock
|
| |
+ import module_build_service.scheduler.handlers.components
|
| |
+ import module_build_service.scm
|
| |
+ import module_build_service.utils
|
| |
+ import pytest
|
| |
import tempfile
|
| |
- from os import path, mkdir
|
| |
- from shutil import copyfile, rmtree
|
| |
+
|
| |
from datetime import datetime
|
| |
- from werkzeug.datastructures import FileStorage
|
| |
from mock import patch
|
| |
- import module_build_service.utils
|
| |
- import module_build_service.scm
|
| |
- from module_build_service import models, conf
|
| |
- from module_build_service.errors import ProgrammingError, ValidationError, UnprocessableEntity
|
| |
- from tests import (
|
| |
- reuse_component_init_data, db, reuse_shared_userspace_init_data, clean_database, init_data,
|
| |
- scheduler_init_data)
|
| |
- import mock
|
| |
- import koji
|
| |
- import pytest
|
| |
- import module_build_service.scheduler.handlers.components
|
| |
from module_build_service.builder.base import GenericBuilder
|
| |
from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder
|
| |
- from module_build_service import glib, Modulemd
|
| |
- from tests import app
|
| |
+ from module_build_service.errors import ProgrammingError, ValidationError, UnprocessableEntity
|
| |
+ from module_build_service import glib, Modulemd, utils, models, conf
|
| |
+ from os import path, mkdir
|
| |
+ from shutil import copyfile, rmtree
|
| |
+ from werkzeug.datastructures import FileStorage
|
| |
+ from tests import (
|
| |
+ app, db, reuse_component_init_data, reuse_shared_userspace_init_data,
|
| |
+ clean_database, init_data, scheduler_init_data, make_module)
|
| |
|
| |
BASE_DIR = path.abspath(path.dirname(__file__))
|
| |
|
| |
@@ -1081,3 +1080,61 @@
|
| |
assert len(local_modules) == 1
|
| |
assert local_modules[0].koji_tag.endswith(
|
| |
"/module-platform-f28-3/results")
|
| |
+
|
| |
+
|
| |
+ class TestCheckTransitiveStreamCollision:
|
| |
+ """Test submit.check_transitive_stream_collision"""
|
| |
+
|
| |
+ def setup_method(self, test_method):
|
| |
+ clean_database()
|
| |
+
|
| |
+ def teardown_method(self, test_method):
|
| |
+ clean_database()
|
| |
+
|
| |
+ @staticmethod
|
| |
+ def _generate_collision_modules():
|
| |
+ """Generate test modules
|
| |
+
|
| |
+ gtk:1 requires bar:1 which requires platform:f29
|
| |
+ foo:1 requires bar:2 which requires platform:f29
|
| |
+ """
|
| |
+ make_module('gtk:1:1:c2', {'bar': ['1']}, {})
|
| |
+ make_module('foo:1:1:c2', {'bar': ['2']}, {})
|
| |
+ make_module('bar:1:0:c2', {'platform': ['f29']}, {})
|
| |
+ make_module('bar:2:0:c2', {'platform': ['f29']}, {})
|
| |
+ make_module('platform:f29:0:c11', {}, {})
|
| |
+
|
| |
+ @staticmethod
|
| |
+ def _generate_modules_without_colliison():
|
| |
+ """Generate test modules
|
| |
+
|
| |
+ gtk:1 requires bar:1 which requires platform:f29
|
| |
+ foo:1 requires baz:2 which requires platform:f29
|
| |
+ """
|
| |
+ make_module('gtk:1:1:c2', {'bar': ['1']}, {})
|
| |
+ make_module('foo:1:1:c2', {'baz': ['2']}, {})
|
| |
+ make_module('bar:1:0:c2', {'platform': ['f29']}, {})
|
| |
+ make_module('baz:2:0:c2', {'platform': ['f29']}, {})
|
| |
+ make_module('platform:f29:0:c11', {}, {})
|
| |
+
|
| |
+ @staticmethod
|
| |
+ def _get_mmds_required_by_module_recursively(module_build):
|
| |
+ mmd = module_build.mmd()
|
| |
+ utils.mse.expand_mse_streams(db.session, mmd)
|
| |
+ return utils.mse.get_mmds_required_by_module_recursively(mmd)
|
| |
+
|
| |
+ def test_raise_error_when_there_is_collision(self):
|
| |
+ # app:1 buildrequires gtk:1 and foo:1
|
| |
+ module_build = make_module("app:1:0:c1", {}, {'gtk': '1', 'foo': '1'})
|
| |
+ self._generate_collision_modules()
|
| |
+ modules = self._get_mmds_required_by_module_recursively(module_build)
|
| |
+ with pytest.raises(utils.submit.TransitiveStreamCollision) as excinfo:
|
| |
+ utils.submit.check_transitive_stream_collision(modules)
|
| |
+ assert 'bar:1 and bar:2' in str(excinfo.value)
|
| |
+
|
| |
+ def test_no_error_raised_when_no_collision(self):
|
| |
+ # app:1 buildrequires gtk:1 and foo:1
|
| |
+ module_build = make_module("app:1:0:c1", {}, {'gtk': '1', 'foo': '1'})
|
| |
+ self._generate_modules_without_colliison()
|
| |
+ modules = self._get_mmds_required_by_module_recursively(module_build)
|
| |
+ utils.submit.check_transitive_stream_collision(modules)
|
| |
modulea
=> module "a"`