You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
# Copyright (c) Jupyter Development Team.
 | 
						|
# Distributed under the terms of the Modified BSD License.
 | 
						|
 | 
						|
"""Test the kernels service API."""
 | 
						|
 | 
						|
import asyncio
 | 
						|
import json
 | 
						|
import os
 | 
						|
from tempfile import TemporaryDirectory
 | 
						|
 | 
						|
import pytest
 | 
						|
import tornado
 | 
						|
 | 
						|
 | 
						|
def expected_http_error(error, expected_code, expected_message=None):
 | 
						|
    """Check that the error matches the expected output error."""
 | 
						|
    e = error.value
 | 
						|
    if isinstance(e, tornado.web.HTTPError):
 | 
						|
        if expected_code != e.status_code:
 | 
						|
            return False
 | 
						|
        return expected_message is None or expected_message == str(e)
 | 
						|
    elif any(
 | 
						|
        [
 | 
						|
            isinstance(e, tornado.httpclient.HTTPClientError),
 | 
						|
            isinstance(e, tornado.httpclient.HTTPError),
 | 
						|
        ]
 | 
						|
    ):
 | 
						|
        if expected_code != e.code:
 | 
						|
            return False
 | 
						|
        if expected_message:
 | 
						|
            message = json.loads(e.response.body.decode())["message"]
 | 
						|
            if expected_message != message:
 | 
						|
                return False
 | 
						|
        return True
 | 
						|
 | 
						|
 | 
						|
@pytest.fixture
 | 
						|
def build_api_tester(jp_serverapp, labapp, fetch_long):
 | 
						|
    return BuildAPITester(labapp, fetch_long)
 | 
						|
 | 
						|
 | 
						|
class BuildAPITester:
 | 
						|
    """Wrapper for build REST API requests"""
 | 
						|
 | 
						|
    url = "lab/api/build"
 | 
						|
 | 
						|
    def __init__(self, labapp, fetch_long):
 | 
						|
        self.labapp = labapp
 | 
						|
        self.fetch = fetch_long
 | 
						|
 | 
						|
    async def _req(self, verb, path, body=None):
 | 
						|
        return await self.fetch(self.url + path, method=verb, body=body)
 | 
						|
 | 
						|
    async def getStatus(self):
 | 
						|
        return await self._req("GET", "")
 | 
						|
 | 
						|
    async def build(self):
 | 
						|
        return await self._req("POST", "", json.dumps({}))
 | 
						|
 | 
						|
    async def clear(self):
 | 
						|
        return await self._req("DELETE", "")
 | 
						|
 | 
						|
 | 
						|
@pytest.mark.slow
 | 
						|
class TestBuildAPI:
 | 
						|
    def tempdir(self):
 | 
						|
        td = TemporaryDirectory()
 | 
						|
        self.tempdirs.append(td)
 | 
						|
        return td.name
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        # Any TemporaryDirectory objects appended to this list will be cleaned
 | 
						|
        # up at the end of the test run.
 | 
						|
        self.tempdirs = []
 | 
						|
 | 
						|
        # TODO(@echarles) Move the cleanup in the fixture.
 | 
						|
        @self.addCleanup
 | 
						|
        def cleanup_tempdirs():
 | 
						|
            for d in self.tempdirs:
 | 
						|
                d.cleanup()
 | 
						|
 | 
						|
    #    @pytest.mark.timeout(timeout=30)
 | 
						|
    #    @pytest.mark.gen_test(timeout=30)
 | 
						|
    async def test_get_status(self, build_api_tester):
 | 
						|
        """Make sure there are no kernels running at the start"""
 | 
						|
        r = await build_api_tester.getStatus()
 | 
						|
        res = r.body.decode()
 | 
						|
        resp = json.loads(res)
 | 
						|
        assert "status" in resp
 | 
						|
        assert "message" in resp
 | 
						|
 | 
						|
    #    @pytest.mark.gen_test(timeout=30)
 | 
						|
    # FIXME
 | 
						|
    @pytest.mark.skipif(os.name == "nt", reason="Currently failing on windows")
 | 
						|
    async def test_build(self, build_api_tester):
 | 
						|
        r = await build_api_tester.build()
 | 
						|
        assert r.code == 200
 | 
						|
 | 
						|
    #    @pytest.mark.gen_test(timeout=30)
 | 
						|
    # FIXME
 | 
						|
    @pytest.mark.skipif(os.name == "nt", reason="Currently failing on windows")
 | 
						|
    async def test_clear(self, build_api_tester):
 | 
						|
        with pytest.raises(tornado.httpclient.HTTPClientError) as e:
 | 
						|
            r = await build_api_tester.clear()
 | 
						|
            res = r.body.decode()
 | 
						|
        assert expected_http_error(e, 500)
 | 
						|
 | 
						|
        loop = asyncio.get_event_loop()
 | 
						|
        asyncio.ensure_future(build_api_tester.build(), loop=loop)  # noqa RUF006
 | 
						|
 | 
						|
        while True:
 | 
						|
            r = await build_api_tester.getStatus()
 | 
						|
            res = r.body.decode()
 | 
						|
            resp = json.loads(res)
 | 
						|
            if resp["status"] == "building":
 | 
						|
                break
 | 
						|
 | 
						|
        r = await build_api_tester.clear()
 | 
						|
        assert r.code == 204
 |