As the remote config is no longer optional for SLE and is utilized by openSUSE to the point were it is dangerous not to load the remote config it should be required. Currently only certain users call apply_remote() while this will make it built-in during construction and thus makes the usage consistent and no longer require StagingAPI.
301 lines
11 KiB
Python
301 lines
11 KiB
Python
# Copyright (C) 2015 SUSE Linux GmbH
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along
|
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
import sys
|
|
import unittest
|
|
import httpretty
|
|
|
|
from obs import APIURL
|
|
from obs import OBS
|
|
from osclib.conf import Config
|
|
from osclib.stagingapi import StagingAPI
|
|
|
|
|
|
PY3 = sys.version_info[0] == 3
|
|
|
|
if PY3:
|
|
string_types = str,
|
|
else:
|
|
string_types = basestring,
|
|
|
|
|
|
class TestApiCalls(unittest.TestCase):
|
|
"""
|
|
Tests for various api calls to ensure we return expected content
|
|
"""
|
|
|
|
def setUp(self):
|
|
"""
|
|
Initialize the configuration
|
|
"""
|
|
|
|
self.obs = OBS()
|
|
Config(APIURL, 'openSUSE:Factory')
|
|
self.api = StagingAPI(APIURL, 'openSUSE:Factory')
|
|
|
|
def tearDown(self):
|
|
"""Clean internal cache"""
|
|
if hasattr(self.api, '_invalidate_all'):
|
|
self.api._invalidate_all()
|
|
|
|
def test_ring_packages(self):
|
|
"""
|
|
Validate the creation of the rings.
|
|
"""
|
|
# our content in the XML files
|
|
# test content for listonly ie. list command
|
|
ring_packages = {
|
|
'apparmor': 'openSUSE:Factory:Rings:1-MinimalX',
|
|
'elem-ring-0': 'openSUSE:Factory:Rings:0-Bootstrap',
|
|
'elem-ring-1': 'openSUSE:Factory:Rings:0-Bootstrap',
|
|
'elem-ring-mini': 'openSUSE:Factory:Rings:0-Bootstrap',
|
|
'wine': 'openSUSE:Factory:Rings:1-MinimalX',
|
|
}
|
|
self.assertEqual(ring_packages, self.api.ring_packages_for_links)
|
|
|
|
# test content for real usage
|
|
ring_packages = {
|
|
'apparmor': 'openSUSE:Factory:Rings:1-MinimalX',
|
|
'elem-ring-0': 'openSUSE:Factory:Rings:0-Bootstrap',
|
|
'elem-ring-1': 'openSUSE:Factory:Rings:1-MinimalX',
|
|
'elem-ring-mini': 'openSUSE:Factory:Rings:0-Bootstrap',
|
|
'wine': 'openSUSE:Factory:Rings:1-MinimalX',
|
|
}
|
|
self.assertEqual(ring_packages, self.api.ring_packages)
|
|
|
|
@unittest.skip("no longer approving non-ring packages")
|
|
def test_dispatch_open_requests(self):
|
|
"""
|
|
Test dispatching and closure of non-ring packages
|
|
"""
|
|
|
|
# Get rid of open requests
|
|
self.api.dispatch_open_requests()
|
|
# Check that we tried to close it
|
|
self.assertEqual(httpretty.last_request().method, 'POST')
|
|
self.assertEqual(httpretty.last_request().querystring[u'cmd'], [u'changereviewstate'])
|
|
# Try it again
|
|
self.api.dispatch_open_requests()
|
|
# This time there should be nothing to close
|
|
self.assertEqual(httpretty.last_request().method, 'GET')
|
|
|
|
def test_pseudometa_get_prj(self):
|
|
"""
|
|
Test getting project metadata from YAML in project description
|
|
"""
|
|
|
|
# Try to get data from project that has no metadata
|
|
data = self.api.get_prj_pseudometa('openSUSE:Factory:Staging:A')
|
|
# Should be empty, but contain structure to work with
|
|
self.assertEqual(data, {'requests': []})
|
|
# Add some sample data
|
|
rq = {'id': '123', 'package': 'test-package'}
|
|
data['requests'].append(rq)
|
|
# Save them and read them back
|
|
self.api.set_prj_pseudometa('openSUSE:Factory:Staging:A', data)
|
|
test_data = self.api.get_prj_pseudometa('openSUSE:Factory:Staging:A')
|
|
# Verify that we got back the same data
|
|
self.assertEqual(data, test_data)
|
|
|
|
def test_list_projects(self):
|
|
"""
|
|
List projects and their content
|
|
"""
|
|
|
|
# Prepare expected results
|
|
data = []
|
|
for prj in self.obs.staging_project:
|
|
data.append('openSUSE:Factory:Staging:' + prj)
|
|
|
|
# Compare the results
|
|
self.assertEqual(data, self.api.get_staging_projects())
|
|
|
|
def test_open_requests(self):
|
|
"""
|
|
Test searching for open requests
|
|
"""
|
|
|
|
requests = []
|
|
|
|
# get the open requests
|
|
requests = self.api.get_open_requests()
|
|
|
|
# Compare the results, we only care now that we got 1 of them not the content
|
|
self.assertEqual(1, len(requests))
|
|
|
|
def test_get_package_information(self):
|
|
"""
|
|
Test if we get proper project, name and revision from the staging informations
|
|
"""
|
|
|
|
package_info = {
|
|
'dir_srcmd5': '751efeae52d6c99de48164088a33d855',
|
|
'project': 'home:Admin',
|
|
'rev': '7b98ac01b8071d63a402fa99dc79331c',
|
|
'srcmd5': '7b98ac01b8071d63a402fa99dc79331c',
|
|
'package': 'wine'
|
|
}
|
|
|
|
# Compare the results, we only care now that we got 2 of them not the content
|
|
self.assertEqual(
|
|
package_info,
|
|
self.api.get_package_information('openSUSE:Factory:Staging:B', 'wine'))
|
|
|
|
def test_request_id_package_mapping(self):
|
|
"""
|
|
Test whether we can get correct id for sr in staging project
|
|
"""
|
|
|
|
prj = 'openSUSE:Factory:Staging:B'
|
|
# Get rq
|
|
num = self.api.get_request_id_for_package(prj, 'wine')
|
|
self.assertEqual(333, num)
|
|
# Get package name
|
|
self.assertEqual('wine', self.api.get_package_for_request_id(prj, num))
|
|
|
|
def test_rm_from_prj(self):
|
|
prj = 'openSUSE:Factory:Staging:B'
|
|
pkg = 'wine'
|
|
|
|
full_name = prj + '/' + pkg
|
|
|
|
# Verify package is there
|
|
self.assertTrue(full_name in self.obs.links)
|
|
|
|
# Get rq number
|
|
num = self.api.get_request_id_for_package(prj, pkg)
|
|
|
|
# Delete the package
|
|
self.api.rm_from_prj(prj, package='wine')
|
|
|
|
# Verify package is not there
|
|
self.assertTrue(full_name not in self.obs.links)
|
|
|
|
# RQ is gone
|
|
self.assertEqual(None, self.api.get_request_id_for_package(prj, pkg))
|
|
self.assertEqual(None, self.api.get_package_for_request_id(prj, num))
|
|
|
|
# Verify that review is closed
|
|
self.assertEqual('accepted', self.obs.requests[str(num)]['review'])
|
|
self.assertEqual('new', self.obs.requests[str(num)]['request'])
|
|
|
|
def test_rm_from_prj_2(self):
|
|
# Try the same with request number
|
|
prj = 'openSUSE:Factory:Staging:B'
|
|
pkg = 'wine'
|
|
|
|
full_name = prj + '/' + pkg
|
|
|
|
# Get rq number
|
|
num = self.api.get_request_id_for_package(prj, pkg)
|
|
|
|
# Delete the package
|
|
self.api.rm_from_prj(prj, request_id=num)
|
|
|
|
# Verify package is not there
|
|
self.assertTrue(full_name not in self.obs.links)
|
|
|
|
# RQ is gone
|
|
self.assertEqual(None, self.api.get_request_id_for_package(prj, pkg))
|
|
self.assertEqual(None, self.api.get_package_for_request_id(prj, num))
|
|
|
|
# Verify that review is closed
|
|
self.assertEqual('accepted', self.obs.requests[str(num)]['review'])
|
|
self.assertEqual('new', self.obs.requests[str(num)]['request'])
|
|
|
|
def test_add_sr(self):
|
|
prj = 'openSUSE:Factory:Staging:A'
|
|
rq = '123'
|
|
|
|
# Running it twice shouldn't change anything
|
|
for i in range(2):
|
|
# Add rq to the project
|
|
self.api.rq_to_prj(rq, prj)
|
|
# Verify that review is there
|
|
self.assertEqual('new', self.obs.requests[rq]['review'])
|
|
self.assertEqual('review', self.obs.requests[rq]['request'])
|
|
self.assertEqual(self.api.get_prj_pseudometa('openSUSE:Factory:Staging:A'),
|
|
{'requests': [{'id': 123, 'package': 'gcc', 'author': 'Admin', 'type': 'submit'}]})
|
|
|
|
def test_create_package_container(self):
|
|
"""Test if the uploaded _meta is correct."""
|
|
|
|
self.api.create_package_container('openSUSE:Factory:Staging:B', 'wine')
|
|
self.assertEqual(httpretty.last_request().method, 'PUT')
|
|
self.assertEqual(httpretty.last_request().body, '<package name="wine"><title/><description/></package>')
|
|
self.assertEqual(httpretty.last_request().path, '/source/openSUSE:Factory:Staging:B/wine/_meta')
|
|
|
|
self.api.create_package_container('openSUSE:Factory:Staging:B', 'wine', disable_build=True)
|
|
self.assertEqual(httpretty.last_request().method, 'PUT')
|
|
self.assertEqual(httpretty.last_request().body, '<package name="wine"><title/><description/><build><disable/></build></package>')
|
|
self.assertEqual(httpretty.last_request().path, '/source/openSUSE:Factory:Staging:B/wine/_meta')
|
|
|
|
def test_review_handling(self):
|
|
"""Test whether accepting/creating reviews behaves correctly."""
|
|
|
|
# Add review
|
|
self.api.add_review('123', by_project='openSUSE:Factory:Staging:A')
|
|
self.assertEqual(httpretty.last_request().method, 'POST')
|
|
self.assertEqual(httpretty.last_request().querystring[u'cmd'], [u'addreview'])
|
|
# Try to readd, should do anything
|
|
self.api.add_review('123', by_project='openSUSE:Factory:Staging:A')
|
|
self.assertEqual(httpretty.last_request().method, 'GET')
|
|
# Accept review
|
|
self.api.set_review('123', 'openSUSE:Factory:Staging:A')
|
|
self.assertEqual(httpretty.last_request().method, 'POST')
|
|
self.assertEqual(httpretty.last_request().querystring[u'cmd'], [u'changereviewstate'])
|
|
# Try to accept it again should do anything
|
|
self.api.set_review('123', 'openSUSE:Factory:Staging:A')
|
|
self.assertEqual(httpretty.last_request().method, 'GET')
|
|
# But we should be able to reopen it
|
|
self.api.add_review('123', by_project='openSUSE:Factory:Staging:A')
|
|
self.assertEqual(httpretty.last_request().method, 'POST')
|
|
self.assertEqual(httpretty.last_request().querystring[u'cmd'], [u'addreview'])
|
|
|
|
def test_prj_from_letter(self):
|
|
|
|
# Verify it works
|
|
self.assertEqual(self.api.prj_from_letter('openSUSE:Factory'), 'openSUSE:Factory')
|
|
self.assertEqual(self.api.prj_from_letter('A'), 'openSUSE:Factory:Staging:A')
|
|
|
|
def test_frozen_mtime(self):
|
|
"""Test frozen mtime."""
|
|
|
|
# Testing frozen mtime
|
|
self.assertTrue(self.api.days_since_last_freeze('openSUSE:Factory:Staging:A') > 8)
|
|
self.assertTrue(self.api.days_since_last_freeze('openSUSE:Factory:Staging:B') < 1)
|
|
|
|
# U == unfrozen
|
|
self.assertTrue(self.api.days_since_last_freeze('openSUSE:Factory:Staging:U') > 1000)
|
|
|
|
def test_frozen_enough(self):
|
|
"""Test frozen enough."""
|
|
|
|
# Testing frozen mtime
|
|
self.assertEqual(self.api.prj_frozen_enough('openSUSE:Factory:Staging:B'), True)
|
|
self.assertEqual(self.api.prj_frozen_enough('openSUSE:Factory:Staging:A'), False)
|
|
|
|
# U == unfrozen
|
|
self.assertEqual(self.api.prj_frozen_enough('openSUSE:Factory:Staging:U'), False)
|
|
|
|
def test_move(self):
|
|
"""Test package movement."""
|
|
|
|
init_data = self.api.get_package_information('openSUSE:Factory:Staging:B', 'wine')
|
|
self.api.move_between_project('openSUSE:Factory:Staging:B', 333, 'openSUSE:Factory:Staging:A')
|
|
test_data = self.api.get_package_information('openSUSE:Factory:Staging:A', 'wine')
|
|
self.assertEqual(init_data, test_data)
|