def test_fetch(self): """Test whether a list of builds is returned""" self.__configure_http_server() # Test fetch builds from jobs list jenkins = Jenkins(JENKINS_SERVER_URL) builds = [build for build in jenkins.fetch()] self.assertEqual(len(builds), 64) with open("data/jenkins_build.json") as build_json: first_build = json.load(build_json) self.assertDictEqual(builds[0]['data'], first_build['data']) # Test metadata expected = [ ('69fb6b0fe503c59d075d497e2ff37535ccac94b6', 1458874078.582), ('1145170a61c10d1bfc60c3c93c2d800587467b4a', 1458854340.139), ('2d3688b4cac6ad22d4c20223216facfcbc8abb5f', 1458842674.184), ('77a4b72563a212d0950fc48e81471bd03409ec39', 1458831639.674), ('c1110cd988722c124d60f4f234ad1d00ea168286', 1458764722.848), ('88bbd95bf4e07792531760f6ac17711f8e3ade90', 1458740779.456), ('fa6857e34c5fabd929cad0dd736971a676ed2804', 1458687074.485), ('b8d84ea6a2c67c4fccd5cf4473af45909c174731', 1458662464.685), ('c4f3c8c773e8e26eb87b7f5e014768b7977f82e3', 1458596193.695) ] for x in range(len(expected)): build = builds[x] self.assertEqual(build['origin'], 'http://example.com/ci') self.assertEqual(build['uuid'], expected[x][0]) self.assertEqual(build['updated_on'], expected[x][1]) self.assertEqual(build['category'], 'build') self.assertEqual(build['tag'], 'http://example.com/ci')
def test_fetch_no_job_builds(self): """Test whether a warning message is logged when no job builds exist""" configure_http_server(builds_job=False) # Test fetch builds from jobs list jenkins = Jenkins(SERVER_URL) with self.assertLogs(logger, level='DEBUG') as cm: builds = [build for build in jenkins.fetch()] self.assertRegex( cm.output[1], 'DEBUG:perceval.backends.core.jenkins:No builds for job.*') self.assertRegex( cm.output[2], 'DEBUG:perceval.backends.core.jenkins:No builds for job.*') self.assertEqual(builds, []) # Check request params expected = {'depth': ['1']} req = httpretty.last_request() self.assertEqual(req.method, 'GET') self.assertRegex(req.path, '/ci/job') self.assertDictEqual(req.querystring, expected)
def test_fetch_depth_1_blacklist(self): """Test whether blacklisted/wrong builds are not fetched from Jenkins""" configure_http_server() # Test fetch builds from jobs list jenkins = Jenkins(SERVER_URL, blacklist_ids=['apex-build-brahmaputra']) with self.assertLogs(logger, level='WARNING') as cm: builds = [build for build in jenkins.fetch()] self.assertEqual( cm.output[0], 'WARNING:perceval.backends.core.jenkins:Not getting blacklisted job: ' 'apex-build-brahmaputra') self.assertEqual( cm.output[1], 'WARNING:perceval.backends.core.jenkins:500 Server Error: ' 'Internal Server Error for url: ' 'http://example.com/ci/job/500-error-job/api/json?depth=1') self.assertEqual( cm.output[2], 'WARNING:perceval.backends.core.jenkins:Unable to fetch builds from job ' 'http://example.com/ci/job/500-error-job/; skipping') self.assertEqual( cm.output[3], 'WARNING:perceval.backends.core.jenkins:Unable to parse builds from job ' 'http://example.com/ci/job/invalid-json-job/; skipping') self.assertEqual(len(builds), 37) self.assertEqual(jenkins.summary.total, 40) self.assertEqual(jenkins.summary.fetched, 37) self.assertEqual(jenkins.summary.skipped, 3)
def test_fetch_blacklist_from_archive(self): """Test whether jobs in balcklist are not retrieved from archive""" blacklist = [JENKINS_JOB_BUILDS_1] configure_http_server() self.backend_write_archive = Jenkins(JENKINS_SERVER_URL, blacklist_jobs=blacklist, archive=self.archive) self.backend_read_archive = Jenkins(JENKINS_SERVER_URL, blacklist_jobs=blacklist, archive=self.archive) with self.assertLogs(logger, level='WARNING') as cm: self._test_fetch_from_archive() self.assertEqual(cm.output[0], 'WARNING:perceval.backends.core.jenkins:' 'Not getting blacklisted job: apex-build-brahmaputra') self.assertEqual(cm.output[1], 'WARNING:perceval.backends.core.jenkins:500 Server Error: ' 'Internal Server Error for url: ' 'http://example.com/ci/job/500-error-job/api/json?depth=1') self.assertEqual(cm.output[2], 'WARNING:perceval.backends.core.jenkins:Unable to fetch builds from job ' 'http://example.com/ci/job/500-error-job/; skipping') self.assertEqual(cm.output[3], 'WARNING:perceval.backends.core.jenkins:Unable to parse builds from job ' 'http://example.com/ci/job/invalid-json-job/; skipping') self.assertEqual(cm.output[4], 'WARNING:perceval.backends.core.jenkins:' 'Not getting blacklisted job: apex-build-brahmaputra') self.assertEqual(cm.output[5], 'WARNING:perceval.backends.core.jenkins:500 Server Error: ' 'Internal Server Error for url: ' 'http://example.com/ci/job/500-error-job/api/json?depth=1') self.assertEqual(cm.output[6], 'WARNING:perceval.backends.core.jenkins:Unable to fetch builds from job ' 'http://example.com/ci/job/500-error-job/; skipping') self.assertEqual(cm.output[7], 'WARNING:perceval.backends.core.jenkins:Unable to parse builds from job ' 'http://example.com/ci/job/invalid-json-job/; skipping')
def test_fetch_from_empty_cache(self): """Test if there are not any builds returned when the cache is empty""" cache = Cache(self.tmp_path) jenkins = Jenkins(JENKINS_SERVER_URL, cache=cache) cached_builds = [build for build in jenkins.fetch_from_cache()] self.assertEqual(len(cached_builds), 0)
def test_fetch_from_non_set_cache(self): """Test if a error is raised when the cache was not set""" jenkins = Jenkins(JENKINS_SERVER_URL) with self.assertRaises(CacheError): _ = [build for build in jenkins.fetch_from_cache()]
def test_initialization(self): """Test whether attributes are initializated""" jenkins = Jenkins(JENKINS_SERVER_URL, tag='test', sleep_time=60, detail_depth=2) self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.sleep_time, 60) self.assertEqual(jenkins.detail_depth, 2) self.assertEqual(jenkins.tag, 'test') self.assertIsNone(jenkins.client) # When tag is empty or None it will be set to # the value in url jenkins = Jenkins(JENKINS_SERVER_URL) self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.tag, JENKINS_SERVER_URL) self.assertEqual(jenkins.sleep_time, SLEEP_TIME) self.assertEqual(jenkins.detail_depth, DETAIL_DEPTH) jenkins = Jenkins(JENKINS_SERVER_URL, tag='') self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.tag, JENKINS_SERVER_URL)
def test_fetch_depth_2(self): """Test whether a list of builds is returned""" configure_http_server(depth=2) # Test fetch builds from jobs list jenkins = Jenkins(JENKINS_SERVER_URL, detail_depth=2) with self.assertLogs(logger, level='WARNING') as cm: builds = [build for build in jenkins.fetch()] self.assertEqual( cm.output[0], 'WARNING:perceval.backends.core.jenkins:500 Server Error: ' 'Internal Server Error for url: ' 'http://example.com/ci/job/500-error-job/api/json?depth=2') self.assertEqual( cm.output[1], 'WARNING:perceval.backends.core.jenkins:Unable to fetch builds from job ' 'http://example.com/ci/job/500-error-job/; skipping') self.assertEqual( cm.output[2], 'WARNING:perceval.backends.core.jenkins:Unable to parse builds from job ' 'http://example.com/ci/job/invalid-json-job/; skipping') self.assertEqual(len(builds), 64) with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "data/jenkins/jenkins_build.json")) \ as build_json: first_build = json.load(build_json) self.assertDictEqual(builds[0]['data'], first_build['data']) # Test metadata expected = [ ('69fb6b0fe503c59d075d497e2ff37535ccac94b6', 1458874078.582), ('1145170a61c10d1bfc60c3c93c2d800587467b4a', 1458854340.139), ('2d3688b4cac6ad22d4c20223216facfcbc8abb5f', 1458842674.184), ('77a4b72563a212d0950fc48e81471bd03409ec39', 1458831639.674), ('c1110cd988722c124d60f4f234ad1d00ea168286', 1458764722.848), ('88bbd95bf4e07792531760f6ac17711f8e3ade90', 1458740779.456), ('fa6857e34c5fabd929cad0dd736971a676ed2804', 1458687074.485), ('b8d84ea6a2c67c4fccd5cf4473af45909c174731', 1458662464.685), ('c4f3c8c773e8e26eb87b7f5e014768b7977f82e3', 1458596193.695) ] for x in range(len(expected)): build = builds[x] self.assertEqual(build['origin'], 'http://example.com/ci') self.assertEqual(build['uuid'], expected[x][0]) self.assertEqual(build['updated_on'], expected[x][1]) self.assertEqual(build['category'], 'build') self.assertEqual(build['tag'], 'http://example.com/ci') # Check request params expected = {'depth': ['2']} req = httpretty.last_request() self.assertEqual(req.method, 'GET') self.assertRegex(req.path, '/ci/job') self.assertDictEqual(req.querystring, expected)
def test_fetch_empty(self): """Test whether it works when no jobs are fetched""" body = '{"jobs":[]}' httpretty.register_uri(httpretty.GET, JOBS_URL, body=body, status=200) jenkins = Jenkins(SERVER_URL) builds = [build for build in jenkins.fetch()] self.assertEqual(len(builds), 0)
def test_initialization(self): """Test whether attributes are initializated""" jenkins = Jenkins(JENKINS_SERVER_URL, tag='test', sleep_time=60, detail_depth=2) self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertIsNone(jenkins.user) self.assertIsNone(jenkins.api_token) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.sleep_time, 60) self.assertEqual(jenkins.detail_depth, 2) self.assertEqual(jenkins.tag, 'test') self.assertIsNone(jenkins.client) self.assertIsNone(jenkins.blacklist_ids) # When tag is empty or None it will be set to # the value in url jenkins = Jenkins(JENKINS_SERVER_URL) self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.tag, JENKINS_SERVER_URL) self.assertEqual(jenkins.sleep_time, SLEEP_TIME) self.assertEqual(jenkins.detail_depth, DETAIL_DEPTH) self.assertIsNone(jenkins.blacklist_ids) jenkins = Jenkins(JENKINS_SERVER_URL, tag='') self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.tag, JENKINS_SERVER_URL) self.assertIsNone(jenkins.blacklist_ids) jenkins = Jenkins(JENKINS_SERVER_URL, user=JENKINS_USER, api_token=JENKINS_TOKEN) self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.tag, JENKINS_SERVER_URL) self.assertEqual(jenkins.user, JENKINS_USER) self.assertEqual(jenkins.api_token, JENKINS_TOKEN) self.assertIsNone(jenkins.blacklist_ids) jenkins = Jenkins(JENKINS_SERVER_URL, blacklist_ids=[JENKINS_JOB_BUILDS_1]) self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.tag, JENKINS_SERVER_URL) self.assertEqual(jenkins.sleep_time, SLEEP_TIME) self.assertEqual(jenkins.detail_depth, DETAIL_DEPTH) self.assertListEqual(jenkins.blacklist_ids, [JENKINS_JOB_BUILDS_1])
def test_initialization_error(self): """Test whether an exeception is thrown when the user and api_token are not initialized together""" with self.assertLogs(logger) as cm: with self.assertRaises(BackendError): _ = Jenkins(JENKINS_SERVER_URL, user=JENKINS_USER) self.assertEqual(cm.output[0], 'ERROR:perceval.backends.core.jenkins:' 'Authentication method requires user and api_token') with self.assertLogs(logger) as cm: with self.assertRaises(BackendError): _ = Jenkins(JENKINS_SERVER_URL, api_token=JENKINS_TOKEN) self.assertEqual(cm.output[0], 'ERROR:perceval.backends.core.jenkins:' 'Authentication method requires user and api_token')
def test_fetch_blacklist(self): """Test whether jobs in balcklist are not retrieved""" blacklist = [JENKINS_JOB_BUILDS_1] self.__configure_http_server() jenkins = Jenkins(JENKINS_SERVER_URL, blacklist_jobs=blacklist) nrequests = len(requests_http) builds = [build for build in jenkins.fetch()] # No HTTP calls at all must be done for JENKINS_JOB_BUILDS_1 # Just the first call for all jobs and one for each job, # including those jobs that raise errors self.assertEqual(len(requests_http) - nrequests, 4) # Builds just from JENKINS_JOB_BUILDS_2 self.assertEqual(len(builds), 32)
def test_initialization(self): """Test whether attributes are initializated""" jenkins = Jenkins(JENKINS_SERVER_URL, tag='test') self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.tag, 'test') self.assertIsInstance(jenkins.client, JenkinsClient) # When tag is empty or None it will be set to # the value in url jenkins = Jenkins(JENKINS_SERVER_URL) self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.tag, JENKINS_SERVER_URL) jenkins = Jenkins(JENKINS_SERVER_URL, tag='') self.assertEqual(jenkins.url, JENKINS_SERVER_URL) self.assertEqual(jenkins.origin, JENKINS_SERVER_URL) self.assertEqual(jenkins.tag, JENKINS_SERVER_URL)
def test_search_fields(self): """Test whether the search_fields is properly set""" configure_http_server() # Test fetch builds from jobs list jenkins = Jenkins(SERVER_URL) builds = [build for build in jenkins.fetch()] build = builds[0] self.assertEqual(jenkins.metadata_id(build['data']), build['search_fields']['item_id']) self.assertEqual(build['data']['number'], 107) self.assertEqual(build['data']['number'], build['search_fields']['number']) build = builds[1] self.assertEqual(jenkins.metadata_id(build['data']), build['search_fields']['item_id']) self.assertEqual(build['data']['number'], 106) self.assertEqual(build['data']['number'], build['search_fields']['number']) build = builds[2] self.assertEqual(jenkins.metadata_id(build['data']), build['search_fields']['item_id']) self.assertEqual(build['data']['number'], 105) self.assertEqual(build['data']['number'], build['search_fields']['number'])
def test_fetch_blacklist(self): """Test whether jobs in balcklist are not retrieved""" blacklist = [JENKINS_JOB_BUILDS_1] configure_http_server() jenkins = Jenkins(JENKINS_SERVER_URL, blacklist_jobs=blacklist) nrequests = len(requests_http) with self.assertLogs(logger, level='WARNING') as cm: builds = [build for build in jenkins.fetch()] self.assertEqual(cm.output[0], 'WARNING:perceval.backends.core.jenkins:' 'Not getting blacklisted job: apex-build-brahmaputra') # No HTTP calls at all must be done for JENKINS_JOB_BUILDS_1 # Just the first call for all jobs and one for each job, # including those jobs that raise errors self.assertEqual(len(requests_http) - nrequests, 4) # Builds just from JENKINS_JOB_BUILDS_2 self.assertEqual(len(builds), 32)
def test_has_resuming(self): """Test if it returns False when has_resuming is called""" self.assertEqual(Jenkins.has_resuming(), False)
def test_has_caching(self): """Test if it returns True when has_caching is called""" self.assertEqual(Jenkins.has_caching(), True)
def test_fetch_from_cache(self): """Test whether the cache works""" bodies_jobs = read_file('data/jenkins_jobs.json', mode='rb') bodies_builds_job = read_file('data/jenkins_job_builds.json') def request_callback(method, uri, headers): status = 200 if uri.startswith(JENKINS_JOBS_URL): body = bodies_jobs elif uri.startswith(JENKINS_JOB_BUILDS_URL_1) or \ uri.startswith(JENKINS_JOB_BUILDS_URL_2): body = bodies_builds_job elif uri.startswith(JENKINS_JOB_BUILDS_URL_500_ERROR): status = 500 body = '500 Internal Server Error' else: body = '{' return (status, headers, body) httpretty.register_uri(httpretty.GET, JENKINS_JOBS_URL, responses=[ httpretty.Response(body=request_callback) \ for _ in range(3) ]) httpretty.register_uri(httpretty.GET, JENKINS_JOB_BUILDS_URL_1, responses=[ httpretty.Response(body=request_callback) \ for _ in range(2) ]) httpretty.register_uri(httpretty.GET, JENKINS_JOB_BUILDS_URL_2, responses=[ httpretty.Response(body=request_callback) \ for _ in range(2) ]) httpretty.register_uri( httpretty.GET, JENKINS_JOB_BUILDS_URL_500_ERROR, responses=[httpretty.Response(body=request_callback)]) httpretty.register_uri( httpretty.GET, JENKINS_JOB_BUILDS_URL_JSON_ERROR, responses=[httpretty.Response(body=request_callback)]) # First, we fetch the builds from the server, storing them # in a cache cache = Cache(self.tmp_path) jenkins = Jenkins(JENKINS_SERVER_URL, cache=cache) builds = [build for build in jenkins.fetch()] # Now, we get the builds from the cache. # The contents should be the same and there won't be # any new request to the server cached_builds = [build for build in jenkins.fetch_from_cache()] self.assertEqual(len(cached_builds), len(builds)) with open("data/jenkins_build.json") as build_json: first_build = json.load(build_json) self.assertDictEqual(cached_builds[0]['data'], first_build['data'])
def setUp(self): super().setUp() self.backend_write_archive = Jenkins(JENKINS_SERVER_URL, archive=self.archive) self.backend_read_archive = Jenkins(JENKINS_SERVER_URL, archive=self.archive)
def setUp(self): super().setUp() self.backend = Jenkins(JENKINS_SERVER_URL, archive=self.archive)