def test_get_hash_stats_returns_updated_stats_4020(self): url = self.base_url + ':' + self.port + '/' + 'stats' response = get_hash_stats(url) self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') # validate reponse against the json schema jsonschema.validate(response.json(), self.stats_schema) job_count, avgTime = response.json()['TotalRequests'], response.json( )['AverageTime'] for i in range(3): password = gen_password() post_url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'password': password} post_hash(post_url, self.headers, payload) time.sleep(5) response = get_hash_stats(url) self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') # validate reponse against the json schema jsonschema.validate(response.json(), self.stats_schema) new_job_count, avgTime = response.json( )['TotalRequests'], response.json()['AverageTime'] self.assertEqual(new_job_count, job_count + 3, 'Invalid TotalRequests Returned') self.assertTrue(avgTime > 0, 'BUG: Invalid AverageTime Returned in Stats')
def test_new_post_rejected_during_pending_shutdown_6040(self): self._restart_app() url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'password': '******'} for i in range(5): response = post_hash(url, self.headers, payload, 1) payload = 'shutdown' response = post_shutdown(url, None, payload) # verify it shuts down gracefully when there are in-flight hashing self.assertEqual(response.status_code, codes.OK, 'Bug: INVALID Status Code') # Verify new post hash is not accepted when shutdown is in progress url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'password': '******'} response = post_hash(url, self.headers, payload, 1) print(response.text) self.assertEqual(response.status_code, codes.SERVICE_UNAVAILABLE, 'INVALID Status Code') self.assertEqual(response.text.strip(), 'Service Unavailable', 'Invalid Error Message') # verify stats reflects in-flight hashing before shutdown time.sleep(3) url = self.base_url + ':' + self.port + '/' + 'stats' response = get_hash_stats(url) job_count, avgTime = response.json()['TotalRequests'], response.json( )['AverageTime'] self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertTrue(job_count >= 4, 'Invalid TotalRequests')
def test_valid_post_increments_job_id_by_one_2030(self): url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'password': '******'} response = post_hash(url, self.headers, payload) id1 = int(response.text) self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertGreater(id1, 0, 'Invalid Job Id Returned') payload = {'password': '******'} response = post_hash(url, self.headers, payload) id2 = int(response.text) self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertGreater(id2, 0, 'Invalid Job Id Returned') self.assertEqual(id2 - id1, 1, 'Wrong Job Id increment')
def test_post_with_empty_password_2040(self): url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'password': ''} response = post_hash(url, self.headers, payload) id = int(response.text) self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertGreater(id, 0, 'Invalid Job Id Returned')
def test_post_without_password_2060(self): url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'something': 'else'} response = post_hash(url, self.headers, payload) self.assertEqual(response.status_code, codes.BAD_REQUEST, 'INVALID Status Code') self.assertEqual(response.text.strip(), 'Malformed Input', 'Invalid Error Message')
def test_post_with_invalid_payload_2110(self): invalid_payload = "{'password': }" url = self.base_url + ':' + self.port + '/' + 'hash' response = post_hash(url, self.headers, invalid_payload) self.assertEqual(response.status_code, codes.BAD_REQUEST, 'INVALID Status Code') self.assertEqual(response.text.strip(), 'Malformed Input', 'Invalid Error Message')
def test_post_password_in_other_language_2100(self): special_chars = 'パスワード' url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'password': special_chars} response = post_hash(url, self.headers, payload) id = int(response.text) self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertGreater(id, 0, 'Invalid Job Id Returned')
def test_post_password_with_special_chars_2090(self): special_chars = '! @#$%^&*()-_+=[{]}\|;:,./?' url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'password': special_chars} response = post_hash(url, self.headers, payload) id = int(response.text) self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertGreater(id, 0, 'Invalid Job Id Returned')
def test_post_with_non_string_password_2070(self): url = self.base_url + ':' + self.port + '/' + 'hash' payload = "{'password': abcd}" # abcd without quotes response = post_hash(url, self.headers, payload) self.assertEqual(response.status_code, codes.BAD_REQUEST, 'INVALID Status Code') self.assertEqual(response.text.strip(), 'Malformed Input', 'Invalid Error Message')
def test_first_post_returns_job_id_one_2020_1000_1020_1030(self): new_port = 9099 self._restart_app(9099) url = self.base_url + ':' + str(new_port) + '/' + 'hash' payload = {'password': '******'} response = post_hash(url, self.headers, payload) self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertEqual(int(response.text), 1, 'Invalid Job Id Returned')
def test_post_with_wrong_header_2130(self): payload = None url = self.base_url + ':' + self.port + '/' + 'hash' wrong_headers = {'Content-Type': 'multipart/form-data'} response = post_hash(url, wrong_headers, payload) self.assertEqual(response.status_code, codes.BAD_REQUEST, 'INVALID Status Code') self.assertEqual(response.text.strip(), 'Malformed Input', 'Invalid Error Message')
def test_valid_post_returns_id_immediately_2010(self): url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'password': '******'} before_post = datetime.now() response = post_hash(url, self.headers, payload) after_post = datetime.now() self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertGreater(int(response.text), 0, 'Invalid Job Id Returned') self.assertTrue((after_post - before_post).total_seconds() < 5, 'Job Id Did not Return Immediately')
def test_get_valid_job_id_returns_correct_hash_3020(self): url = self.base_url + ':' + self.port + '/' + 'hash' pwd = gen_password(12) payload = {'password': pwd} response = post_hash(url, self.headers, payload) job_id = response.text self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertGreater(int(job_id), 0, 'Invalid Job Id Returned') sha512_hash = get_sha512_hashing(pwd) base64_hash = get_base64_encoding(sha512_hash) response = get_hash_by_id(url, job_id) self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertEqual(response.text, base64_hash, 'Invalid Hash Returned')
def test_get_valid_job_id_works_5_seconds_after_hash_3010(self): url = self.base_url + ':' + self.port + '/' + 'hash' pwd = gen_password(12) payload = {'password': pwd} before_post = datetime.now() response = post_hash(url, self.headers, payload) job_id = response.text self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertGreater(int(job_id), 0, 'Invalid Job Id Returned') sha512_hash = get_sha512_hashing(pwd) base64_hash = get_base64_encoding(sha512_hash) response = get_hash_by_id(url, job_id) after_post = datetime.now() time_delta = (after_post - before_post).total_seconds() self.assertTrue(5 < time_delta < 6, 'Job Id Did not Return Immediately') self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertEqual(response.text, base64_hash, 'Invalid Hash Returned')
def test_post_shutdown_stops_app_gracefully_6010_6030(self): self._restart_app() url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'password': '******'} for i in range(5): response = post_hash(url, self.headers, payload, 1) payload = 'shutdown' response = post_shutdown(url, None, payload) # verify it shuts down gracefully when there are in-flight hashing self.assertEqual(response.status_code, codes.OK, 'Bug: INVALID Status Code') # verify stats reflects in-flight hashing before shutdown time.sleep(3) url = self.base_url + ':' + self.port + '/' + 'stats' response = get_hash_stats(url) job_count, avgTime = response.json()['TotalRequests'], response.json( )['AverageTime'] self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertTrue(job_count >= 4, 'Invalid TotalRequests')
def test_valid_post_2000(self): url = self.base_url + ':' + self.port + '/' + 'hash' payload = {'password': '******'} response = post_hash(url, self.headers, payload) self.assertEqual(response.status_code, codes.OK, 'INVALID Status Code') self.assertGreater(int(response.text), 0, 'Invalid Job Id Returned')