|  |  | @ -29,7 +29,7 @@ def seed_athena_server(host, port): | 
			
		
	
		
		
			
				
					
					|  |  |  |   with Timeout(2, 'HTTP Server seeding failed'): |  |  |  |   with Timeout(2, 'HTTP Server seeding failed'): | 
			
		
	
		
		
			
				
					
					|  |  |  |     while True: |  |  |  |     while True: | 
			
		
	
		
		
			
				
					
					|  |  |  |       try: |  |  |  |       try: | 
			
		
	
		
		
			
				
					
					|  |  |  |         requests.put(f'http://{host}:{port}/qlog.bz2', data='', timeout=10) |  |  |  |         requests.put(f'http://{host}:{port}/qlog.zst', data='', timeout=10) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         break |  |  |  |         break | 
			
		
	
		
		
			
				
					
					|  |  |  |       except requests.exceptions.ConnectionError: |  |  |  |       except requests.exceptions.ConnectionError: | 
			
		
	
		
		
			
				
					
					|  |  |  |         time.sleep(0.1) |  |  |  |         time.sleep(0.1) | 
			
		
	
	
		
		
			
				
					|  |  | @ -174,54 +174,59 @@ class TestAthenadMethods: | 
			
		
	
		
		
			
				
					
					|  |  |  |     assert resp, 'list empty!' |  |  |  |     assert resp, 'list empty!' | 
			
		
	
		
		
			
				
					
					|  |  |  |     assert len(resp) == len(expected) |  |  |  |     assert len(resp) == len(expected) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_strip_bz2_extension(self): |  |  |  |   def test_strip_extension(self): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     # any requested log file with an invalid extension won't return as existing | 
			
		
	
		
		
			
				
					
					|  |  |  |     fn = self._create_file('qlog.bz2') |  |  |  |     fn = self._create_file('qlog.bz2') | 
			
		
	
		
		
			
				
					
					|  |  |  |     if fn.endswith('.bz2'): |  |  |  |     if fn.endswith('.bz2'): | 
			
		
	
		
		
			
				
					
					|  |  |  |       assert athenad.strip_bz2_extension(fn) == fn[:-4] |  |  |  |       assert athenad.strip_zst_extension(fn) == fn | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     fn = self._create_file('qlog.zst') | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if fn.endswith('.zst'): | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       assert athenad.strip_zst_extension(fn) == fn[:-4] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   @pytest.mark.parametrize("compress", [True, False]) |  |  |  |   @pytest.mark.parametrize("compress", [True, False]) | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_do_upload(self, host, compress): |  |  |  |   def test_do_upload(self, host, compress): | 
			
		
	
		
		
			
				
					
					|  |  |  |     # random bytes to ensure rather large object post-compression |  |  |  |     # random bytes to ensure rather large object post-compression | 
			
		
	
		
		
			
				
					
					|  |  |  |     fn = self._create_file('qlog', data=os.urandom(10000 * 1024)) |  |  |  |     fn = self._create_file('qlog', data=os.urandom(10000 * 1024)) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     upload_fn = fn + ('.bz2' if compress else '') |  |  |  |     upload_fn = fn + ('.zst' if compress else '') | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     item = athenad.UploadItem(path=upload_fn, url="http://localhost:1238", headers={}, created_at=int(time.time()*1000), id='') |  |  |  |     item = athenad.UploadItem(path=upload_fn, url="http://localhost:1238", headers={}, created_at=int(time.time()*1000), id='') | 
			
		
	
		
		
			
				
					
					|  |  |  |     with pytest.raises(requests.exceptions.ConnectionError): |  |  |  |     with pytest.raises(requests.exceptions.ConnectionError): | 
			
		
	
		
		
			
				
					
					|  |  |  |       athenad._do_upload(item) |  |  |  |       athenad._do_upload(item) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     item = athenad.UploadItem(path=upload_fn, url=f"{host}/qlog.bz2", headers={}, created_at=int(time.time()*1000), id='') |  |  |  |     item = athenad.UploadItem(path=upload_fn, url=f"{host}/qlog.zst", headers={}, created_at=int(time.time()*1000), id='') | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     resp = athenad._do_upload(item) |  |  |  |     resp = athenad._do_upload(item) | 
			
		
	
		
		
			
				
					
					|  |  |  |     assert resp.status_code == 201 |  |  |  |     assert resp.status_code == 201 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_upload_file_to_url(self, host): |  |  |  |   def test_upload_file_to_url(self, host): | 
			
		
	
		
		
			
				
					
					|  |  |  |     fn = self._create_file('qlog.bz2') |  |  |  |     fn = self._create_file('qlog.zst') | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     resp = dispatcher["uploadFileToUrl"]("qlog.bz2", f"{host}/qlog.bz2", {}) |  |  |  |     resp = dispatcher["uploadFileToUrl"]("qlog.zst", f"{host}/qlog.zst", {}) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     assert resp['enqueued'] == 1 |  |  |  |     assert resp['enqueued'] == 1 | 
			
		
	
		
		
			
				
					
					|  |  |  |     assert 'failed' not in resp |  |  |  |     assert 'failed' not in resp | 
			
		
	
		
		
			
				
					
					|  |  |  |     assert {"path": fn, "url": f"{host}/qlog.bz2", "headers": {}}.items() <= resp['items'][0].items() |  |  |  |     assert {"path": fn, "url": f"{host}/qlog.zst", "headers": {}}.items() <= resp['items'][0].items() | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     assert resp['items'][0].get('id') is not None |  |  |  |     assert resp['items'][0].get('id') is not None | 
			
		
	
		
		
			
				
					
					|  |  |  |     assert athenad.upload_queue.qsize() == 1 |  |  |  |     assert athenad.upload_queue.qsize() == 1 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_upload_file_to_url_duplicate(self, host): |  |  |  |   def test_upload_file_to_url_duplicate(self, host): | 
			
		
	
		
		
			
				
					
					|  |  |  |     self._create_file('qlog.bz2') |  |  |  |     self._create_file('qlog.zst') | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     url1 = f"{host}/qlog.bz2?sig=sig1" |  |  |  |     url1 = f"{host}/qlog.zst?sig=sig1" | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     dispatcher["uploadFileToUrl"]("qlog.bz2", url1, {}) |  |  |  |     dispatcher["uploadFileToUrl"]("qlog.zst", url1, {}) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     # Upload same file again, but with different signature |  |  |  |     # Upload same file again, but with different signature | 
			
		
	
		
		
			
				
					
					|  |  |  |     url2 = f"{host}/qlog.bz2?sig=sig2" |  |  |  |     url2 = f"{host}/qlog.zst?sig=sig2" | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     resp = dispatcher["uploadFileToUrl"]("qlog.bz2", url2, {}) |  |  |  |     resp = dispatcher["uploadFileToUrl"]("qlog.zst", url2, {}) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     assert resp == {'enqueued': 0, 'items': []} |  |  |  |     assert resp == {'enqueued': 0, 'items': []} | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_upload_file_to_url_does_not_exist(self, host): |  |  |  |   def test_upload_file_to_url_does_not_exist(self, host): | 
			
		
	
		
		
			
				
					
					|  |  |  |     not_exists_resp = dispatcher["uploadFileToUrl"]("does_not_exist.bz2", "http://localhost:1238", {}) |  |  |  |     not_exists_resp = dispatcher["uploadFileToUrl"]("does_not_exist.zst", "http://localhost:1238", {}) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     assert not_exists_resp == {'enqueued': 0, 'items': [], 'failed': ['does_not_exist.bz2']} |  |  |  |     assert not_exists_resp == {'enqueued': 0, 'items': [], 'failed': ['does_not_exist.zst']} | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   @with_upload_handler |  |  |  |   @with_upload_handler | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_upload_handler(self, host): |  |  |  |   def test_upload_handler(self, host): | 
			
		
	
		
		
			
				
					
					|  |  |  |     fn = self._create_file('qlog.bz2') |  |  |  |     fn = self._create_file('qlog.zst') | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     item = athenad.UploadItem(path=fn, url=f"{host}/qlog.bz2", headers={}, created_at=int(time.time()*1000), id='', allow_cellular=True) |  |  |  |     item = athenad.UploadItem(path=fn, url=f"{host}/qlog.zst", headers={}, created_at=int(time.time()*1000), id='', allow_cellular=True) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     athenad.upload_queue.put_nowait(item) |  |  |  |     athenad.upload_queue.put_nowait(item) | 
			
		
	
		
		
			
				
					
					|  |  |  |     self._wait_for_upload() |  |  |  |     self._wait_for_upload() | 
			
		
	
	
		
		
			
				
					|  |  | @ -236,8 +241,8 @@ class TestAthenadMethods: | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_upload_handler_retry(self, mocker, host, status, retry): |  |  |  |   def test_upload_handler_retry(self, mocker, host, status, retry): | 
			
		
	
		
		
			
				
					
					|  |  |  |     mock_put = mocker.patch('requests.put') |  |  |  |     mock_put = mocker.patch('requests.put') | 
			
		
	
		
		
			
				
					
					|  |  |  |     mock_put.return_value.status_code = status |  |  |  |     mock_put.return_value.status_code = status | 
			
		
	
		
		
			
				
					
					|  |  |  |     fn = self._create_file('qlog.bz2') |  |  |  |     fn = self._create_file('qlog.zst') | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     item = athenad.UploadItem(path=fn, url=f"{host}/qlog.bz2", headers={}, created_at=int(time.time()*1000), id='', allow_cellular=True) |  |  |  |     item = athenad.UploadItem(path=fn, url=f"{host}/qlog.zst", headers={}, created_at=int(time.time()*1000), id='', allow_cellular=True) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     athenad.upload_queue.put_nowait(item) |  |  |  |     athenad.upload_queue.put_nowait(item) | 
			
		
	
		
		
			
				
					
					|  |  |  |     self._wait_for_upload() |  |  |  |     self._wait_for_upload() | 
			
		
	
	
		
		
			
				
					|  |  | @ -251,8 +256,8 @@ class TestAthenadMethods: | 
			
		
	
		
		
			
				
					
					|  |  |  |   @with_upload_handler |  |  |  |   @with_upload_handler | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_upload_handler_timeout(self): |  |  |  |   def test_upload_handler_timeout(self): | 
			
		
	
		
		
			
				
					
					|  |  |  |     """When an upload times out or fails to connect it should be placed back in the queue""" |  |  |  |     """When an upload times out or fails to connect it should be placed back in the queue""" | 
			
		
	
		
		
			
				
					
					|  |  |  |     fn = self._create_file('qlog.bz2') |  |  |  |     fn = self._create_file('qlog.zst') | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     item = athenad.UploadItem(path=fn, url="http://localhost:44444/qlog.bz2", headers={}, created_at=int(time.time()*1000), id='', allow_cellular=True) |  |  |  |     item = athenad.UploadItem(path=fn, url="http://localhost:44444/qlog.zst", headers={}, created_at=int(time.time()*1000), id='', allow_cellular=True) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     item_no_retry = replace(item, retry_count=MAX_RETRY_COUNT) |  |  |  |     item_no_retry = replace(item, retry_count=MAX_RETRY_COUNT) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     athenad.upload_queue.put_nowait(item_no_retry) |  |  |  |     athenad.upload_queue.put_nowait(item_no_retry) | 
			
		
	
	
		
		
			
				
					|  |  | @ -272,7 +277,7 @@ class TestAthenadMethods: | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   @with_upload_handler |  |  |  |   @with_upload_handler | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_cancel_upload(self): |  |  |  |   def test_cancel_upload(self): | 
			
		
	
		
		
			
				
					
					|  |  |  |     item = athenad.UploadItem(path="qlog.bz2", url="http://localhost:44444/qlog.bz2", headers={}, |  |  |  |     item = athenad.UploadItem(path="qlog.zst", url="http://localhost:44444/qlog.zst", headers={}, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                               created_at=int(time.time()*1000), id='id', allow_cellular=True) |  |  |  |                               created_at=int(time.time()*1000), id='id', allow_cellular=True) | 
			
		
	
		
		
			
				
					
					|  |  |  |     athenad.upload_queue.put_nowait(item) |  |  |  |     athenad.upload_queue.put_nowait(item) | 
			
		
	
		
		
			
				
					
					|  |  |  |     dispatcher["cancelUpload"](item.id) |  |  |  |     dispatcher["cancelUpload"](item.id) | 
			
		
	
	
		
		
			
				
					|  |  | @ -291,8 +296,8 @@ class TestAthenadMethods: | 
			
		
	
		
		
			
				
					
					|  |  |  |     ts = int(t_future.strftime("%s")) * 1000 |  |  |  |     ts = int(t_future.strftime("%s")) * 1000 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     # Item that would time out if actually uploaded |  |  |  |     # Item that would time out if actually uploaded | 
			
		
	
		
		
			
				
					
					|  |  |  |     fn = self._create_file('qlog.bz2') |  |  |  |     fn = self._create_file('qlog.zst') | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     item = athenad.UploadItem(path=fn, url="http://localhost:44444/qlog.bz2", headers={}, created_at=ts, id='', allow_cellular=True) |  |  |  |     item = athenad.UploadItem(path=fn, url="http://localhost:44444/qlog.zst", headers={}, created_at=ts, id='', allow_cellular=True) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     athenad.upload_queue.put_nowait(item) |  |  |  |     athenad.upload_queue.put_nowait(item) | 
			
		
	
		
		
			
				
					
					|  |  |  |     self._wait_for_upload() |  |  |  |     self._wait_for_upload() | 
			
		
	
	
		
		
			
				
					|  |  | @ -306,8 +311,8 @@ class TestAthenadMethods: | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   @with_upload_handler |  |  |  |   @with_upload_handler | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_list_upload_queue_current(self, host: str): |  |  |  |   def test_list_upload_queue_current(self, host: str): | 
			
		
	
		
		
			
				
					
					|  |  |  |     fn = self._create_file('qlog.bz2') |  |  |  |     fn = self._create_file('qlog.zst') | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     item = athenad.UploadItem(path=fn, url=f"{host}/qlog.bz2", headers={}, created_at=int(time.time()*1000), id='', allow_cellular=True) |  |  |  |     item = athenad.UploadItem(path=fn, url=f"{host}/qlog.zst", headers={}, created_at=int(time.time()*1000), id='', allow_cellular=True) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     athenad.upload_queue.put_nowait(item) |  |  |  |     athenad.upload_queue.put_nowait(item) | 
			
		
	
		
		
			
				
					
					|  |  |  |     self._wait_for_upload() |  |  |  |     self._wait_for_upload() | 
			
		
	
	
		
		
			
				
					|  |  | @ -317,7 +322,7 @@ class TestAthenadMethods: | 
			
		
	
		
		
			
				
					
					|  |  |  |     assert items[0]['current'] |  |  |  |     assert items[0]['current'] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def test_list_upload_queue(self): |  |  |  |   def test_list_upload_queue(self): | 
			
		
	
		
		
			
				
					
					|  |  |  |     item = athenad.UploadItem(path="qlog.bz2", url="http://localhost:44444/qlog.bz2", headers={}, |  |  |  |     item = athenad.UploadItem(path="qlog.zst", url="http://localhost:44444/qlog.zst", headers={}, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                               created_at=int(time.time()*1000), id='id', allow_cellular=True) |  |  |  |                               created_at=int(time.time()*1000), id='id', allow_cellular=True) | 
			
		
	
		
		
			
				
					
					|  |  |  |     athenad.upload_queue.put_nowait(item) |  |  |  |     athenad.upload_queue.put_nowait(item) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |