2014-02-13 14:15:14 +01:00
|
|
|
import sys
|
2014-02-04 11:23:23 +01:00
|
|
|
import unittest
|
2019-04-21 12:00:26 +02:00
|
|
|
import re
|
|
|
|
|
|
|
|
import osc.core
|
2019-05-02 20:34:21 +02:00
|
|
|
|
2015-02-19 10:57:55 +01:00
|
|
|
from osclib.conf import Config
|
2014-06-23 15:03:16 +02:00
|
|
|
from osclib.stagingapi import StagingAPI
|
2019-11-20 12:00:14 +01:00
|
|
|
from lxml import etree as ET
|
2019-04-21 12:00:26 +02:00
|
|
|
from mock import MagicMock
|
2019-05-02 08:14:44 +02:00
|
|
|
from . import OBSLocal
|
2014-06-03 18:05:05 +02:00
|
|
|
|
2019-05-02 08:14:44 +02:00
|
|
|
class TestApiCalls(OBSLocal.TestCase):
|
2014-02-24 15:52:30 +01:00
|
|
|
"""
|
|
|
|
Tests for various api calls to ensure we return expected content
|
|
|
|
"""
|
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
def setUp(self):
|
|
|
|
super(TestApiCalls, self).setUp()
|
|
|
|
self.wf = OBSLocal.StagingWorkflow()
|
|
|
|
self.wf.setup_rings()
|
|
|
|
self.staging_b = self.wf.create_staging('B')
|
|
|
|
prj = self.staging_b.name
|
|
|
|
|
|
|
|
self.winerq = self.wf.create_submit_request('devel:wine', 'wine')
|
|
|
|
self.wf.api.rq_to_prj(self.winerq.reqid, prj)
|
|
|
|
|
|
|
|
# Get rq number
|
|
|
|
num = self.wf.api.get_request_id_for_package(prj, 'wine')
|
|
|
|
self.assertEqual(str(num), self.winerq.reqid)
|
|
|
|
self.assertIsNotNone(num)
|
|
|
|
self.assertTrue(self.wf.api.item_exists(prj, 'wine'))
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
del self.wf
|
|
|
|
super(TestApiCalls, self).tearDown()
|
|
|
|
|
2019-04-21 12:00:26 +02:00
|
|
|
def test_ring_packages(self):
|
2014-02-04 14:04:46 +01:00
|
|
|
"""
|
2019-04-21 12:00:26 +02:00
|
|
|
Validate the creation of the rings.
|
2014-02-04 14:04:46 +01:00
|
|
|
"""
|
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
curl = self.wf.create_package('target', 'curl')
|
2019-04-21 12:00:26 +02:00
|
|
|
curl.create_file('curl.spec')
|
|
|
|
curl.create_file('curl-mini.spec')
|
2019-05-11 10:26:35 +02:00
|
|
|
cmini = self.wf.create_link(curl, target_project=self.wf.projects['target'], target_package='curl-mini')
|
|
|
|
cring1 = self.wf.create_link(curl, target_project=self.wf.projects['ring1'], target_package='curl')
|
|
|
|
cring0 = self.wf.create_link(cring1, target_project=self.wf.projects['ring0'], target_package='curl-mini')
|
2015-08-03 13:21:12 +02:00
|
|
|
|
2016-06-13 16:55:05 +08:00
|
|
|
# test content for listonly ie. list command
|
|
|
|
ring_packages = {
|
2019-04-21 12:00:26 +02:00
|
|
|
'curl': 'openSUSE:Factory:Rings:0-Bootstrap',
|
|
|
|
'curl-mini': 'openSUSE:Factory:Rings:0-Bootstrap',
|
2016-06-13 16:55:05 +08:00
|
|
|
'wine': 'openSUSE:Factory:Rings:1-MinimalX',
|
|
|
|
}
|
2019-05-11 10:26:35 +02:00
|
|
|
self.assertEqual(ring_packages, self.wf.api.ring_packages_for_links)
|
2016-06-13 16:55:05 +08:00
|
|
|
|
|
|
|
# test content for real usage
|
2014-02-12 13:15:49 +01:00
|
|
|
ring_packages = {
|
2019-04-21 12:00:26 +02:00
|
|
|
'curl': 'openSUSE:Factory:Rings:1-MinimalX',
|
|
|
|
'curl-mini': 'openSUSE:Factory:Rings:0-Bootstrap',
|
2014-03-04 15:45:59 +01:00
|
|
|
'wine': 'openSUSE:Factory:Rings:1-MinimalX',
|
2014-02-12 13:15:49 +01:00
|
|
|
}
|
2019-05-11 10:26:35 +02:00
|
|
|
self.assertEqual(ring_packages, self.wf.api.ring_packages)
|
2014-02-10 13:24:49 +01:00
|
|
|
|
2014-02-04 11:23:23 +01:00
|
|
|
def test_list_projects(self):
|
|
|
|
"""
|
|
|
|
List projects and their content
|
|
|
|
"""
|
2014-02-10 13:58:59 +01:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
staging_a = self.wf.create_staging('A')
|
2019-04-21 12:00:26 +02:00
|
|
|
|
2014-02-25 13:12:10 +01:00
|
|
|
# Prepare expected results
|
2019-04-21 12:00:26 +02:00
|
|
|
data = [staging_a.name, self.staging_b.name]
|
2014-02-10 13:24:49 +01:00
|
|
|
|
|
|
|
# Compare the results
|
2019-05-11 10:26:35 +02:00
|
|
|
self.assertEqual(data, self.wf.api.get_staging_projects())
|
2014-02-10 13:24:49 +01:00
|
|
|
|
|
|
|
def test_open_requests(self):
|
|
|
|
"""
|
2014-02-12 14:27:49 +01:00
|
|
|
Test searching for open requests
|
2014-02-10 13:24:49 +01:00
|
|
|
"""
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.create_submit_request('devel:wine', 'wine2')
|
2014-02-10 13:24:49 +01:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
requests = self.wf.api.get_open_requests()
|
2014-02-24 17:20:48 +01:00
|
|
|
# Compare the results, we only care now that we got 1 of them not the content
|
|
|
|
self.assertEqual(1, len(requests))
|
2014-02-10 13:24:49 +01:00
|
|
|
|
2014-02-26 10:04:21 +01:00
|
|
|
def test_request_id_package_mapping(self):
|
2014-02-26 09:51:30 +01:00
|
|
|
"""
|
|
|
|
Test whether we can get correct id for sr in staging project
|
|
|
|
"""
|
2019-04-21 12:00:26 +02:00
|
|
|
prj = self.staging_b.name
|
|
|
|
|
2014-02-26 10:04:21 +01:00
|
|
|
# Get rq
|
2019-05-11 10:26:35 +02:00
|
|
|
num = self.wf.api.get_request_id_for_package(prj, 'wine')
|
2019-04-21 12:00:26 +02:00
|
|
|
self.assertEqual(str(num), self.winerq.reqid)
|
2014-02-26 10:04:21 +01:00
|
|
|
# Get package name
|
2019-05-11 10:26:35 +02:00
|
|
|
self.assertEqual('wine', self.wf.api.get_package_for_request_id(prj, num))
|
2014-06-03 18:05:05 +02:00
|
|
|
|
2019-04-21 12:00:26 +02:00
|
|
|
def test_rm_from_prj(self):
|
|
|
|
# Delete the package
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.api.rm_from_prj(self.staging_b.name, package='wine')
|
|
|
|
self.verify_wine_is_gone()
|
2014-02-26 10:59:41 +01:00
|
|
|
|
2014-06-03 18:05:05 +02:00
|
|
|
def test_rm_from_prj_2(self):
|
2019-04-21 12:00:26 +02:00
|
|
|
# Try the same with request number
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.api.rm_from_prj(self.staging_b.name, request_id=self.winerq.reqid)
|
|
|
|
self.verify_wine_is_gone()
|
2014-06-03 18:05:05 +02:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
def verify_wine_is_gone(self):
|
2019-04-21 12:00:26 +02:00
|
|
|
prj = self.staging_b.name
|
|
|
|
pkg = 'wine'
|
|
|
|
num = self.winerq.reqid
|
2014-06-03 18:05:05 +02:00
|
|
|
|
2014-02-27 15:54:13 +01:00
|
|
|
# Verify package is not there
|
2019-05-11 10:26:35 +02:00
|
|
|
self.assertFalse(self.wf.api.item_exists(prj, pkg))
|
2014-06-03 18:05:05 +02:00
|
|
|
|
2014-02-27 15:54:13 +01:00
|
|
|
# RQ is gone
|
2019-05-11 10:26:35 +02:00
|
|
|
self.assertIsNone(self.wf.api.get_request_id_for_package(prj, pkg))
|
|
|
|
self.assertIsNone(self.wf.api.get_package_for_request_id(prj, num))
|
2014-06-03 18:05:05 +02:00
|
|
|
|
2014-02-27 15:54:13 +01:00
|
|
|
# Verify that review is closed
|
2019-04-21 12:00:26 +02:00
|
|
|
rq = self.winerq.xml()
|
2019-11-20 12:00:14 +01:00
|
|
|
xpath = "//review[@name='new' and @by_project='{}']".format(self.staging_b.name)
|
|
|
|
self.assertIsNotNone(rq.xpath(xpath))
|
2014-02-27 15:54:13 +01:00
|
|
|
|
2014-02-26 15:24:25 +01:00
|
|
|
def test_add_sr(self):
|
2019-11-20 12:05:47 +01:00
|
|
|
# setup is already adding the request, we just verify
|
2019-04-21 12:00:26 +02:00
|
|
|
prj = self.staging_b.name
|
|
|
|
pkg = 'wine'
|
|
|
|
num = self.winerq.reqid
|
2014-02-26 15:24:25 +01:00
|
|
|
|
2019-11-20 12:05:47 +01:00
|
|
|
# Verify that review is there
|
|
|
|
reviews = [{'by_group': 'factory-staging', 'state': 'accepted'},
|
|
|
|
{'by_project': 'openSUSE:Factory:Staging:B', 'state': 'new'}]
|
|
|
|
self.assertEqual(self.winerq.reviews(), reviews)
|
|
|
|
self.assertEqual(self.wf.api.packages_staged,
|
|
|
|
{'wine': {'prj': 'openSUSE:Factory:Staging:B', 'rq_id': num}})
|
2014-02-26 15:24:25 +01:00
|
|
|
|
2014-02-13 14:15:14 +01:00
|
|
|
def test_create_package_container(self):
|
2014-06-03 18:05:05 +02:00
|
|
|
"""Test if the uploaded _meta is correct."""
|
2014-02-13 14:15:14 +01:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.create_staging('B')
|
|
|
|
self.wf.api.create_package_container('openSUSE:Factory:Staging:B', 'wine')
|
2019-04-21 12:00:26 +02:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
url = self.wf.api.makeurl(['source', 'openSUSE:Factory:Staging:B', 'wine', '_meta'])
|
2019-05-02 20:34:21 +02:00
|
|
|
self.assertEqual(osc.core.http_GET(url).read().decode('utf-8'), '<package name="wine" project="openSUSE:Factory:Staging:B">\n <title/>\n <description/>\n</package>\n')
|
2014-02-10 13:24:49 +01:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.api.create_package_container('openSUSE:Factory:Staging:B', 'wine', disable_build=True)
|
2019-04-21 12:00:26 +02:00
|
|
|
m = '<package name="wine" project="openSUSE:Factory:Staging:B">\n <title/>\n <description/>\n <build>\n <disable/>\n </build>\n</package>\n'
|
2019-05-02 20:34:21 +02:00
|
|
|
self.assertEqual(osc.core.http_GET(url).read().decode('utf-8'), m)
|
2014-02-13 14:18:16 +01:00
|
|
|
|
2014-02-18 23:35:45 +01:00
|
|
|
def test_review_handling(self):
|
2014-06-03 18:05:05 +02:00
|
|
|
"""Test whether accepting/creating reviews behaves correctly."""
|
2014-02-17 15:12:18 +01:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
request = self.wf.create_submit_request('devel:wine', 'winetools')
|
2019-04-21 12:00:26 +02:00
|
|
|
reviews = [{'state': 'new', 'by_group': 'factory-staging'}]
|
|
|
|
self.assertEqual(request.reviews(), reviews)
|
|
|
|
num = request.reqid
|
|
|
|
|
2014-02-18 23:35:45 +01:00
|
|
|
# Add review
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.api.add_review(num, by_project='openSUSE:Factory:Staging:B')
|
2019-04-21 12:00:26 +02:00
|
|
|
reviews.append({'by_project': 'openSUSE:Factory:Staging:B', 'state': 'new'})
|
|
|
|
self.assertEqual(request.reviews(), reviews)
|
|
|
|
|
|
|
|
# Try to readd, should not do anything
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.api.add_review(num, by_project='openSUSE:Factory:Staging:B')
|
2019-04-21 12:00:26 +02:00
|
|
|
self.assertEqual(request.reviews(), reviews)
|
|
|
|
|
2014-02-18 23:35:45 +01:00
|
|
|
# Accept review
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.api.set_review(num, 'openSUSE:Factory:Staging:B')
|
2019-04-21 12:00:26 +02:00
|
|
|
reviews[1]['state'] = 'accepted'
|
|
|
|
self.assertEqual(request.reviews(), reviews)
|
|
|
|
|
2014-02-18 23:35:45 +01:00
|
|
|
# Try to accept it again should do anything
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.api.set_review(num, 'openSUSE:Factory:Staging:B')
|
2019-04-21 12:00:26 +02:00
|
|
|
self.assertEqual(request.reviews(), reviews)
|
|
|
|
|
2014-02-18 23:35:45 +01:00
|
|
|
# But we should be able to reopen it
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.api.add_review(num, by_project='openSUSE:Factory:Staging:B')
|
2019-04-21 12:00:26 +02:00
|
|
|
reviews.append({'by_project': 'openSUSE:Factory:Staging:B', 'state': 'new'})
|
|
|
|
self.assertEqual(request.reviews(), reviews)
|
2014-02-18 23:35:45 +01:00
|
|
|
|
2014-02-26 16:11:32 +01:00
|
|
|
def test_prj_from_letter(self):
|
|
|
|
|
|
|
|
# Verify it works
|
2019-05-11 10:26:35 +02:00
|
|
|
self.assertEqual(self.wf.api.prj_from_letter('openSUSE:Factory'), 'openSUSE:Factory')
|
|
|
|
self.assertEqual(self.wf.api.prj_from_letter('A'), 'openSUSE:Factory:Staging:A')
|
2014-02-17 15:12:18 +01:00
|
|
|
|
2014-03-04 12:43:58 +01:00
|
|
|
def test_frozen_mtime(self):
|
2014-06-03 18:05:05 +02:00
|
|
|
"""Test frozen mtime."""
|
2014-03-03 14:54:27 +01:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.create_staging('A')
|
2019-04-21 12:00:26 +02:00
|
|
|
|
|
|
|
# unfrozen
|
2019-05-11 10:26:35 +02:00
|
|
|
self.assertTrue(self.wf.api.days_since_last_freeze('openSUSE:Factory:Staging:A') > 1000)
|
2014-03-03 14:54:27 +01:00
|
|
|
|
2019-04-21 12:00:26 +02:00
|
|
|
# Testing frozen mtime
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.create_staging('B', freeze=True, rings=1)
|
|
|
|
self.assertLess(self.wf.api.days_since_last_freeze('openSUSE:Factory:Staging:B'), 1)
|
|
|
|
|
|
|
|
self.mock_project_meta()
|
|
|
|
self.assertGreater(self.wf.api.days_since_last_freeze('openSUSE:Factory:Staging:B'), 8)
|
2014-03-04 10:55:55 +01:00
|
|
|
|
2014-03-04 16:32:15 +01:00
|
|
|
def test_frozen_enough(self):
|
2014-06-03 18:05:05 +02:00
|
|
|
"""Test frozen enough."""
|
2014-03-04 16:32:15 +01:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
# already has requests
|
|
|
|
self.assertEqual(self.wf.api.prj_frozen_enough('openSUSE:Factory:Staging:B'), True)
|
|
|
|
|
|
|
|
self.wf.create_staging('A')
|
2019-04-21 12:00:26 +02:00
|
|
|
|
|
|
|
# Unfrozen
|
2019-05-11 10:26:35 +02:00
|
|
|
self.assertEqual(self.wf.api.prj_frozen_enough('openSUSE:Factory:Staging:A'), False)
|
2019-04-21 12:00:26 +02:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.create_staging('C', freeze=True, rings=1)
|
|
|
|
self.assertEqual(self.wf.api.prj_frozen_enough('openSUSE:Factory:Staging:C'), True)
|
2014-03-04 16:32:15 +01:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
self.mock_project_meta()
|
|
|
|
self.assertEqual(self.wf.api.prj_frozen_enough('openSUSE:Factory:Staging:C'), False)
|
2019-04-21 12:00:26 +02:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
def mock_project_meta(self):
|
2019-04-21 12:00:26 +02:00
|
|
|
body = """<directory name="_project" rev="3" vrev="" srcmd5="9dd1ec5b77a9e953662eb32955e9066a">
|
|
|
|
<entry name="_frozenlinks" md5="64127b7a5dabbca0ec2bf04cd04c9195" size="16" mtime="1555000000"/>
|
|
|
|
<entry name="_meta" md5="cf6fb1eac1a676d6c3707303ae2571ad" size="162" mtime="1555945413"/>
|
|
|
|
</directory>"""
|
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
self.wf.api._fetch_project_meta = MagicMock(return_value=body)
|
2014-03-04 16:32:15 +01:00
|
|
|
|
2014-03-05 10:45:35 +01:00
|
|
|
def test_move(self):
|
2014-06-03 18:05:05 +02:00
|
|
|
"""Test package movement."""
|
2014-03-05 10:45:35 +01:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
staging_a = self.wf.create_staging('A')
|
2019-04-21 12:00:26 +02:00
|
|
|
|
2019-05-11 10:26:35 +02:00
|
|
|
self.assertTrue(self.wf.api.item_exists('openSUSE:Factory:Staging:B', 'wine'))
|
|
|
|
self.assertFalse(self.wf.api.item_exists('openSUSE:Factory:Staging:A', 'wine'))
|
|
|
|
self.wf.api.move_between_project('openSUSE:Factory:Staging:B', self.winerq.reqid, 'openSUSE:Factory:Staging:A')
|
|
|
|
self.assertTrue(self.wf.api.item_exists('openSUSE:Factory:Staging:A', 'wine'))
|
|
|
|
self.assertFalse(self.wf.api.item_exists('openSUSE:Factory:Staging:B', 'wine'))
|