Refactor tests

* Use pytest-aiohttp
* Use the async def / await syntax.
* Fix tests to run with Python 3.8
This commit is contained in:
grossmj committed 2020-06-16 13:59:03 +09:30
1 parent f498ab06b4
commit d3ea67da24
87 files changed
+3697 -3528

No files matched your search

@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
# Copyright (C) 2016 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -16,9 +16,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
def test_appliances_list(http_controller, controller, async_run):
async def test_appliances_list(controller_api):
controller.appliance_manager.load_appliances()
response = http_controller.get("/appliances", example=True)
response = await controller_api.get("/appliances")
assert response.status == 200
assert len(response.json) > 0
+48 -41
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
# Copyright (C) 2016 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -19,27 +19,26 @@ import unittest
from tests.utils import asyncio_patch
def test_compute_create_without_id(http_controller, controller):
async def test_compute_create_without_id(controller_api, controller):
params = {
"protocol": "http",
"host": "localhost",
"port": 84,
"user": "julien",
"password": "secure"
}
response = http_controller.post("/computes", params, example=True)
"password": "secure"}
response = await controller_api.post("/computes", params)
assert response.status == 201
assert response.route == "/computes"
assert response.json["user"] == "julien"
assert response.json["compute_id"] is not None
assert "password" not in response.json
assert len(controller.computes) == 1
assert controller.computes[response.json["compute_id"]].host == "localhost"
def test_compute_create_with_id(http_controller, controller):
async def test_compute_create_with_id(controller_api, controller):
params = {
"compute_id": "my_compute_id",
@@ -47,9 +46,9 @@ def test_compute_create_with_id(http_controller, controller):
"host": "localhost",
"port": 84,
"user": "julien",
"password": "secure"
}
response = http_controller.post("/computes", params, example=True)
"password": "secure"}
response = await controller_api.post("/computes", params)
assert response.status == 201
assert response.route == "/computes"
assert response.json["user"] == "julien"
@@ -59,7 +58,7 @@ def test_compute_create_with_id(http_controller, controller):
assert controller.computes["my_compute_id"].host == "localhost"
def test_compute_get(http_controller, controller):
async def test_compute_get(controller_api):
params = {
"compute_id": "my_compute_id",
@@ -69,15 +68,16 @@ def test_compute_get(http_controller, controller):
"user": "julien",
"password": "secure"
}
response = http_controller.post("/computes", params)
response = await controller_api.post("/computes", params)
assert response.status == 201
response = http_controller.get("/computes/my_compute_id", example=True)
response = await controller_api.get("/computes/my_compute_id")
assert response.status == 200
assert response.json["protocol"] == "http"
def test_compute_update(http_controller, controller):
async def test_compute_update(controller_api):
params = {
"compute_id": "my_compute_id",
@@ -87,21 +87,22 @@ def test_compute_update(http_controller, controller):
"user": "julien",
"password": "secure"
}
response = http_controller.post("/computes", params)
response = await controller_api.post("/computes", params)
assert response.status == 201
response = http_controller.get("/computes/my_compute_id")
response = await controller_api.get("/computes/my_compute_id")
assert response.status == 200
assert response.json["protocol"] == "http"
params["protocol"] = "https"
response = http_controller.put("/computes/my_compute_id", params, example=True)
response = await controller_api.put("/computes/my_compute_id", params)
assert response.status == 200
assert response.json["protocol"] == "https"
def test_compute_list(http_controller, controller):
async def test_compute_list(controller_api):
params = {
"compute_id": "my_compute_id",
@@ -112,13 +113,14 @@ def test_compute_list(http_controller, controller):
"password": "secure",
"name": "My super server"
}
response = http_controller.post("/computes", params)
response = await controller_api.post("/computes", params)
assert response.status == 201
assert response.route == "/computes"
assert response.json["user"] == "julien"
assert "password" not in response.json
response = http_controller.get("/computes", example=True)
response = await controller_api.get("/computes")
for compute in response.json:
if compute['compute_id'] != 'local':
assert compute == {
@@ -139,7 +141,7 @@ def test_compute_list(http_controller, controller):
}
def test_compute_delete(http_controller, controller):
async def test_compute_delete(controller_api):
params = {
"compute_id": "my_compute_id",
@@ -149,20 +151,20 @@ def test_compute_delete(http_controller, controller):
"user": "julien",
"password": "secure"
}
response = http_controller.post("/computes", params)
response = await controller_api.post("/computes", params)
assert response.status == 201
response = http_controller.get("/computes")
response = await controller_api.get("/computes")
assert len(response.json) == 1
response = http_controller.delete("/computes/my_compute_id", example=True)
response = await controller_api.delete("/computes/my_compute_id")
assert response.status == 204
response = http_controller.get("/computes")
response = await controller_api.get("/computes")
assert len(response.json) == 0
def test_compute_list_images(http_controller, controller):
async def test_compute_list_images(controller_api):
params = {
"compute_id": "my_compute",
@@ -172,16 +174,16 @@ def test_compute_list_images(http_controller, controller):
"user": "julien",
"password": "secure"
}
response = http_controller.post("/computes", params)
response = await controller_api.post("/computes", params)
assert response.status == 201
with asyncio_patch("gns3server.controller.compute.Compute.images", return_value=[{"filename": "linux.qcow2"}, {"filename": "asav.qcow2"}]) as mock:
response = http_controller.get("/computes/my_compute/qemu/images", example=True)
response = await controller_api.get("/computes/my_compute/qemu/images")
assert response.json == [{"filename": "linux.qcow2"}, {"filename": "asav.qcow2"}]
mock.assert_called_with("qemu")
def test_compute_list_vms(http_controller, controller):
async def test_compute_list_vms(controller_api):
params = {
"compute_id": "my_compute",
@@ -191,16 +193,16 @@ def test_compute_list_vms(http_controller, controller):
"user": "julien",
"password": "secure"
}
response = http_controller.post("/computes", params)
response = await controller_api.post("/computes", params)
assert response.status == 201
with asyncio_patch("gns3server.controller.compute.Compute.forward", return_value=[]) as mock:
response = http_controller.get("/computes/my_compute/virtualbox/vms", example=True)
response = await controller_api.get("/computes/my_compute/virtualbox/vms")
assert response.json == []
mock.assert_called_with("GET", "virtualbox", "vms")
def test_compute_create_img(http_controller, controller):
async def test_compute_create_img(controller_api):
params = {
"compute_id": "my_compute",
@@ -210,16 +212,18 @@ def test_compute_create_img(http_controller, controller):
"user": "julien",
"password": "secure"
}
response = http_controller.post("/computes", params)
response = await controller_api.post("/computes", params)
assert response.status == 201
params = {"path": "/test"}
with asyncio_patch("gns3server.controller.compute.Compute.forward", return_value=[]) as mock:
response = http_controller.post("/computes/my_compute/qemu/img", params, example=True)
response = await controller_api.post("/computes/my_compute/qemu/img", params)
assert response.json == []
mock.assert_called_with("POST", "qemu", "img", data=unittest.mock.ANY)
def test_compute_autoidlepc(http_controller, controller):
async def test_compute_autoidlepc(controller_api):
params = {
"compute_id": "my_compute_id",
@@ -229,20 +233,23 @@ def test_compute_autoidlepc(http_controller, controller):
"user": "julien",
"password": "secure"
}
response = http_controller.post("/computes", params, example=False)
await controller_api.post("/computes", params)
params = {
"platform": "c7200",
"image": "test.bin",
"ram": 512
}
with asyncio_patch("gns3server.controller.Controller.autoidlepc", return_value={"idlepc": "0x606de20c"}) as mock:
response = http_controller.post("/computes/my_compute_id/auto_idlepc", params, example=True)
response = await controller_api.post("/computes/my_compute_id/auto_idlepc", params)
assert mock.called
assert response.status == 200
def test_compute_endpoint(http_controller, controller):
async def test_compute_endpoint(controller_api):
params = {
"compute_id": "my_compute",
"protocol": "http",
@@ -251,10 +258,10 @@ def test_compute_endpoint(http_controller, controller):
"user": "julien",
"password": "secure"
}
response = http_controller.post("/computes", params)
response = await controller_api.post("/computes", params)
assert response.status == 201
response = http_controller.get("/computes/endpoint/my_compute/virtualbox/images")
response = await controller_api.get("/computes/endpoint/my_compute/virtualbox/images")
assert response.status == 200
assert response.json['endpoint'] == 'http://localhost:84/v2/compute/virtualbox/images'
+28 -40
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -15,85 +15,73 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
This test suite check /project endpoint
"""
import uuid
import os
import asyncio
import aiohttp
import pytest
from tests.utils import asyncio_patch
from gns3server.handlers.api.controller.project_handler import ProjectHandler
from gns3server.controller import Controller
from gns3server.controller.drawing import Drawing
@pytest.fixture
def project(http_controller, async_run):
return async_run(Controller.instance().add_project(name="Test"))
async def test_create_drawing(controller_api, project):
def test_create_drawing(http_controller, tmpdir, project, async_run):
response = http_controller.post("/projects/{}/drawings".format(project.id), {
params = {
"svg": '<svg height="210" width="500"><line x1="0" y1="0" x2="200" y2="200" style="stroke:rgb(255,0,0);stroke-width:2" /></svg>',
"x": 10,
"y": 20,
"z": 0
}, example=True)
}
response = await controller_api.post("/projects/{}/drawings".format(project.id), params)
assert response.status == 201
assert response.json["drawing_id"] is not None
def test_get_drawing(http_controller, tmpdir, project, async_run):
async def test_get_drawing(controller_api, project):
response = http_controller.post("/projects/{}/drawings".format(project.id), {
params = {
"svg": '<svg height="210" width="500"><line x1="0" y1="0" x2="200" y2="200" style="stroke:rgb(255,0,0);stroke-width:2" /></svg>',
"x": 10,
"y": 20,
"z": 0
},)
response = http_controller.get("/projects/{}/drawings/{}".format(project.id, response.json["drawing_id"]), example=True)
}
response = await controller_api.post("/projects/{}/drawings".format(project.id), params)
response = await controller_api.get("/projects/{}/drawings/{}".format(project.id, response.json["drawing_id"]))
assert response.status == 200
assert response.json["x"] == 10
def test_update_drawing(http_controller, tmpdir, project, async_run):
async def test_update_drawing(controller_api, project):
response = http_controller.post("/projects/{}/drawings".format(project.id), {
params = {
"svg": '<svg height="210" width="500"><line x1="0" y1="0" x2="200" y2="200" style="stroke:rgb(255,0,0);stroke-width:2" /></svg>',
"x": 10,
"y": 20,
"z": 0
},)
response = http_controller.put("/projects/{}/drawings/{}".format(project.id, response.json["drawing_id"]), {
"x": 42,
}, example=True)
}
response = await controller_api.post("/projects/{}/drawings".format(project.id), params)
response = await controller_api.put("/projects/{}/drawings/{}".format(project.id, response.json["drawing_id"]), {"x": 42})
assert response.status == 201
assert response.json["x"] == 42
def test_list_drawing(http_controller, tmpdir, project, async_run):
response = http_controller.post("/projects/{}/drawings".format(project.id), {
async def test_list_drawing(controller_api, project):
params = {
"svg": '<svg height="210" width="500"><line x1="0" y1="0" x2="200" y2="200" style="stroke:rgb(255,0,0);stroke-width:2" /></svg>',
"x": 10,
"y": 20,
"z": 0
}, example=False)
response = http_controller.get("/projects/{}/drawings".format(project.id), example=True)
}
await controller_api.post("/projects/{}/drawings".format(project.id), params)
response = await controller_api.get("/projects/{}/drawings".format(project.id))
assert response.status == 200
assert len(response.json) == 1
def test_delete_drawing(http_controller, tmpdir, project, async_run):
async def test_delete_drawing(controller_api, project):
drawing = Drawing(project)
project._drawings = {drawing.id: drawing}
response = http_controller.delete("/projects/{}/drawings/{}".format(project.id, drawing.id), example=True)
response = await controller_api.delete("/projects/{}/drawings/{}".format(project.id, drawing.id))
assert response.status == 204
assert drawing.id not in project._drawings
assert drawing.id not in project.drawings
+12 -11
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2016 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -18,9 +18,10 @@
from tests.utils import asyncio_patch
def test_list_vms(http_controller):
async def test_list_vms(controller_api):
with asyncio_patch("gns3server.controller.gns3vm.vmware_gns3_vm.VMwareGNS3VM.list", return_value=[{"vmname": "test"}]):
response = http_controller.get('/gns3vm/engines/vmware/vms', example=True)
response = await controller_api.get('/gns3vm/engines/vmware/vms')
assert response.status == 200
assert response.json == [
{
@@ -29,20 +30,20 @@ def test_list_vms(http_controller):
]
def test_engines(http_controller):
response = http_controller.get('/gns3vm/engines', example=True)
async def test_engines(controller_api):
response = await controller_api.get('/gns3vm/engines')
assert response.status == 200
assert len(response.json) > 0
def test_put_gns3vm(http_controller):
response = http_controller.put('/gns3vm', {
"vmname": "TEST VM"
}, example=True)
async def test_put_gns3vm(controller_api):
response = await controller_api.put('/gns3vm', {"vmname": "TEST VM"})
assert response.status == 201
assert response.json["vmname"] == "TEST VM"
def test_get_gns3vm(http_controller):
response = http_controller.get('/gns3vm', example=True)
async def test_get_gns3vm(controller_api):
response = await controller_api.get('/gns3vm')
assert response.status == 200
+87 -110
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -15,45 +15,32 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
This test suite check /project endpoint
"""
import asyncio
import aiohttp
import pytest
from unittest.mock import patch, MagicMock
from tests.utils import asyncio_patch, AsyncioMagicMock
from gns3server.controller import Controller
from gns3server.controller.ports.ethernet_port import EthernetPort
from gns3server.controller.link import Link, FILTERS
@pytest.fixture
def compute(http_controller, async_run):
compute = MagicMock()
compute.id = "example.com"
Controller.instance()._computes = {"example.com": compute}
return compute
async def nodes(compute, project):
@pytest.fixture
def project(http_controller, async_run):
return async_run(Controller.instance().add_project(name="Test"))
def test_create_link(http_controller, tmpdir, project, compute, async_run):
response = MagicMock()
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
node1 = async_run(project.add_node(compute, "node1", None, node_type="qemu"))
node1 = await project.add_node(compute, "node1", None, node_type="qemu")
node1._ports = [EthernetPort("E0", 0, 0, 3)]
node2 = async_run(project.add_node(compute, "node2", None, node_type="qemu"))
node2 = await project.add_node(compute, "node2", None, node_type="qemu")
node2._ports = [EthernetPort("E0", 0, 2, 4)]
return node1, node2
async def test_create_link(controller_api, project, nodes):
node1, node2 = nodes
filters = {
"latency": [10],
@@ -61,7 +48,7 @@ def test_create_link(http_controller, tmpdir, project, compute, async_run):
}
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create") as mock:
response = http_controller.post("/projects/{}/links".format(project.id), {
response = await controller_api.post("/projects/{}/links".format(project.id), {
"nodes": [
{
"node_id": node1.id,
@@ -80,7 +67,8 @@ def test_create_link(http_controller, tmpdir, project, compute, async_run):
}
],
"filters": filters
}, example=True)
})
assert mock.called
assert response.status == 201
assert response.json["link_id"] is not None
@@ -90,56 +78,49 @@ def test_create_link(http_controller, tmpdir, project, compute, async_run):
assert list(project.links.values())[0].filters == filters
def test_create_link_failure(http_controller, tmpdir, project, compute, async_run):
async def test_create_link_failure(controller_api, compute, project):
"""
Make sure the link is deleted if we failed to create the link.
Make sure the link is deleted if we failed to create it.
The failure is trigger by connecting the link to himself
The failure is triggered by connecting the link to itself
"""
response = MagicMock()
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
node1 = async_run(project.add_node(compute, "node1", None, node_type="qemu"))
node1 = await project.add_node(compute, "node1", None, node_type="qemu")
node1._ports = [EthernetPort("E0", 0, 0, 3), EthernetPort("E0", 0, 0, 4)]
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create"):
response = http_controller.post("/projects/{}/links".format(project.id), {
"nodes": [
{
"node_id": node1.id,
"adapter_number": 0,
"port_number": 3,
"label": {
"text": "Text",
"x": 42,
"y": 0
}
},
{
"node_id": node1.id,
"adapter_number": 0,
"port_number": 4
response = await controller_api.post("/projects/{}/links".format(project.id), {
"nodes": [
{
"node_id": node1.id,
"adapter_number": 0,
"port_number": 3,
"label": {
"text": "Text",
"x": 42,
"y": 0
}
]
}, example=True)
#assert mock.called
},
{
"node_id": node1.id,
"adapter_number": 0,
"port_number": 4
}
]
})
assert response.status == 409
assert len(project.links) == 0
def test_get_link(http_controller, tmpdir, project, compute, async_run):
response = MagicMock()
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
async def test_get_link(controller_api, project, nodes):
node1 = async_run(project.add_node(compute, "node1", None, node_type="qemu"))
node1._ports = [EthernetPort("E0", 0, 0, 3)]
node2 = async_run(project.add_node(compute, "node2", None, node_type="qemu"))
node2._ports = [EthernetPort("E0", 0, 2, 4)]
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create"):
response = http_controller.post("/projects/{}/links".format(project.id), {
node1, node2 = nodes
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create") as mock:
response = await controller_api.post("/projects/{}/links".format(project.id), {
"nodes": [
{
"node_id": node1.id,
@@ -158,25 +139,20 @@ def test_get_link(http_controller, tmpdir, project, compute, async_run):
}
]
})
assert mock.called
link_id = response.json["link_id"]
assert response.json["nodes"][0]["label"]["x"] == 42
response = http_controller.get("/projects/{}/links/{}".format(project.id, link_id), example=True)
response = await controller_api.get("/projects/{}/links/{}".format(project.id, link_id))
assert response.status == 200
assert response.json["nodes"][0]["label"]["x"] == 42
def test_update_link_suspend(http_controller, tmpdir, project, compute, async_run):
response = MagicMock()
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
async def test_update_link_suspend(controller_api, project, nodes):
node1 = async_run(project.add_node(compute, "node1", None, node_type="qemu"))
node1._ports = [EthernetPort("E0", 0, 0, 3)]
node2 = async_run(project.add_node(compute, "node2", None, node_type="qemu"))
node2._ports = [EthernetPort("E0", 0, 2, 4)]
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create"):
response = http_controller.post("/projects/{}/links".format(project.id), {
node1, node2 = nodes
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create") as mock:
response = await controller_api.post("/projects/{}/links".format(project.id), {
"nodes": [
{
"node_id": node1.id,
@@ -195,9 +171,12 @@ def test_update_link_suspend(http_controller, tmpdir, project, compute, async_ru
}
]
})
assert mock.called
link_id = response.json["link_id"]
assert response.json["nodes"][0]["label"]["x"] == 42
response = http_controller.put("/projects/{}/links/{}".format(project.id, link_id), {
response = await controller_api.put("/projects/{}/links/{}".format(project.id, link_id), {
"nodes": [
{
"node_id": node1.id,
@@ -217,29 +196,23 @@ def test_update_link_suspend(http_controller, tmpdir, project, compute, async_ru
],
"suspend": True
})
assert response.status == 201
assert response.json["nodes"][0]["label"]["x"] == 64
assert response.json["suspend"]
assert response.json["filters"] == {}
def test_update_link(http_controller, tmpdir, project, compute, async_run):
response = MagicMock()
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
node1 = async_run(project.add_node(compute, "node1", None, node_type="qemu"))
node1._ports = [EthernetPort("E0", 0, 0, 3)]
node2 = async_run(project.add_node(compute, "node2", None, node_type="qemu"))
node2._ports = [EthernetPort("E0", 0, 2, 4)]
async def test_update_link(controller_api, project, nodes):
filters = {
"latency": [10],
"frequency_drop": [50]
}
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create"):
response = http_controller.post("/projects/{}/links".format(project.id), {
node1, node2 = nodes
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create") as mock:
response = await controller_api.post("/projects/{}/links".format(project.id), {
"nodes": [
{
"node_id": node1.id,
@@ -258,9 +231,12 @@ def test_update_link(http_controller, tmpdir, project, compute, async_run):
}
]
})
assert mock.called
link_id = response.json["link_id"]
assert response.json["nodes"][0]["label"]["x"] == 42
response = http_controller.put("/projects/{}/links/{}".format(project.id, link_id), {
response = await controller_api.put("/projects/{}/links/{}".format(project.id, link_id), {
"nodes": [
{
"node_id": node1.id,
@@ -279,26 +255,21 @@ def test_update_link(http_controller, tmpdir, project, compute, async_run):
}
],
"filters": filters
}, example=True)
})
assert response.status == 201
assert response.json["nodes"][0]["label"]["x"] == 64
assert list(project.links.values())[0].filters == filters
def test_list_link(http_controller, tmpdir, project, compute, async_run):
response = MagicMock()
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
node1 = async_run(project.add_node(compute, "node1", None, node_type="qemu"))
node1._ports = [EthernetPort("E0", 0, 0, 3)]
node2 = async_run(project.add_node(compute, "node2", None, node_type="qemu"))
node2._ports = [EthernetPort("E0", 0, 2, 4)]
async def test_list_link(controller_api, project, nodes):
filters = {
"latency": [10],
"frequency_drop": [50]
}
node1, node2 = nodes
nodes = [
{
"node_id": node1.id,
@@ -311,40 +282,45 @@ def test_list_link(http_controller, tmpdir, project, compute, async_run):
"port_number": 4
}
]
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create"):
response = http_controller.post("/projects/{}/links".format(project.id), {
with asyncio_patch("gns3server.controller.udp_link.UDPLink.create") as mock:
await controller_api.post("/projects/{}/links".format(project.id), {
"nodes": nodes,
"filters": filters
})
response = http_controller.get("/projects/{}/links".format(project.id), example=True)
assert mock.called
response = await controller_api.get("/projects/{}/links".format(project.id))
assert response.status == 200
assert len(response.json) == 1
assert response.json[0]["filters"] == filters
def test_start_capture(http_controller, tmpdir, project, compute, async_run):
async def test_start_capture(controller_api, project):
link = Link(project)
project._links = {link.id: link}
with asyncio_patch("gns3server.controller.link.Link.start_capture") as mock:
response = http_controller.post("/projects/{}/links/{}/start_capture".format(project.id, link.id), example=True)
response = await controller_api.post("/projects/{}/links/{}/start_capture".format(project.id, link.id))
assert mock.called
assert response.status == 201
def test_stop_capture(http_controller, tmpdir, project, compute, async_run):
async def test_stop_capture(controller_api, project):
link = Link(project)
project._links = {link.id: link}
with asyncio_patch("gns3server.controller.link.Link.stop_capture") as mock:
response = http_controller.post("/projects/{}/links/{}/stop_capture".format(project.id, link.id), example=True)
response = await controller_api.post("/projects/{}/links/{}/stop_capture".format(project.id, link.id))
assert mock.called
assert response.status == 201
# def test_pcap(http_controller, tmpdir, project, compute, async_run):
# async def test_pcap(controller_api, http_client, project):
#
# async def go():
# async with aiohttp.request("GET", http_controller.get_url("/projects/{}/links/{}/pcap".format(project.id, link.id))) as response:
# async def pcap_capture():
# async with http_client.get(controller_api.get_url("/projects/{}/links/{}/pcap".format(project.id, link.id))) as response:
# response.body = await response.content.read(5)
# print("READ", response.body)
# return response
#
# with asyncio_patch("gns3server.controller.link.Link.capture_node") as mock:
@@ -354,27 +330,28 @@ def test_stop_capture(http_controller, tmpdir, project, compute, async_run):
# with open(link.capture_file_path, "w+") as f:
# f.write("hello")
# project._links = {link.id: link}
# response = async_run(asyncio.ensure_future(go()))
# response = await pcap_capture()
# assert mock.called
# assert response.status == 200
# assert b'hello' == response.body
def test_delete_link(http_controller, tmpdir, project, compute, async_run):
async def test_delete_link(controller_api, project):
link = Link(project)
project._links = {link.id: link}
with asyncio_patch("gns3server.controller.link.Link.delete") as mock:
response = http_controller.delete("/projects/{}/links/{}".format(project.id, link.id), example=True)
response = await controller_api.delete("/projects/{}/links/{}".format(project.id, link.id))
assert mock.called
assert response.status == 204
def test_list_filters(http_controller, tmpdir, project, async_run):
async def test_list_filters(controller_api, project):
link = Link(project)
project._links = {link.id: link}
with patch("gns3server.controller.link.Link.available_filters", return_value=FILTERS) as mock:
response = http_controller.get("/projects/{}/links/{}/available_filters".format(project.id, link.id), example=True)
response = await controller_api.get("/projects/{}/links/{}/available_filters".format(project.id, link.id))
assert mock.called
assert response.status == 200
assert response.json == FILTERS
+76 -93
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -15,70 +15,50 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
This test suite check /project endpoint
"""
import uuid
import os
import asyncio
import aiohttp
import pytest
from unittest.mock import MagicMock
from tests.utils import AsyncioMagicMock
from unittest.mock import patch, MagicMock
from tests.utils import asyncio_patch, AsyncioMagicMock
from gns3server.handlers.api.controller.project_handler import ProjectHandler
from gns3server.controller import Controller
from gns3server.controller.node import Node
@pytest.fixture
def compute(http_controller, async_run):
compute = MagicMock()
compute.id = "example.com"
compute.host = "example.org"
Controller.instance()._computes = {"example.com": compute}
return compute
def node(project, compute):
@pytest.fixture
def project(http_controller, async_run):
return async_run(Controller.instance().add_project(name="Test"))
@pytest.fixture
def node(project, compute, async_run):
node = Node(project, compute, "test", node_type="vpcs")
project._nodes[node.id] = node
return node
def test_create_node(http_controller, tmpdir, project, compute):
async def test_create_node(controller_api, project, compute):
response = MagicMock()
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
response = http_controller.post("/projects/{}/nodes".format(project.id), {
response = await controller_api.post("/projects/{}/nodes".format(project.id), {
"name": "test",
"node_type": "vpcs",
"compute_id": "example.com",
"properties": {
"startup_script": "echo test"
}
}, example=True)
})
assert response.status == 201
assert response.json["name"] == "test"
assert "name" not in response.json["properties"]
def test_list_node(http_controller, tmpdir, project, compute):
async def test_list_node(controller_api, project, compute):
response = MagicMock()
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
response = http_controller.post("/projects/{}/nodes".format(project.id), {
await controller_api.post("/projects/{}/nodes".format(project.id), {
"name": "test",
"node_type": "vpcs",
"compute_id": "example.com",
@@ -86,17 +66,19 @@ def test_list_node(http_controller, tmpdir, project, compute):
"startup_script": "echo test"
}
})
response = http_controller.get("/projects/{}/nodes".format(project.id), example=True)
response = await controller_api.get("/projects/{}/nodes".format(project.id))
assert response.status == 200
assert response.json[0]["name"] == "test"
def test_get_node(http_controller, tmpdir, project, compute):
async def test_get_node(controller_api, project, compute):
response = MagicMock()
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
response = http_controller.post("/projects/{}/nodes".format(project.id), {
response = await controller_api.post("/projects/{}/nodes".format(project.id), {
"name": "test",
"node_type": "vpcs",
"compute_id": "example.com",
@@ -104,174 +86,175 @@ def test_get_node(http_controller, tmpdir, project, compute):
"startup_script": "echo test"
}
})
response = http_controller.get("/projects/{}/nodes/{}".format(project.id, response.json["node_id"]), example=True)
response = await controller_api.get("/projects/{}/nodes/{}".format(project.id, response.json["node_id"]))
assert response.status == 200
assert response.json["name"] == "test"
def test_update_node(http_controller, tmpdir, project, compute, node):
async def test_update_node(controller_api, project, compute, node):
response = MagicMock()
response.json = {"console": 2048}
compute.put = AsyncioMagicMock(return_value=response)
response = http_controller.put("/projects/{}/nodes/{}".format(project.id, node.id), {
response = await controller_api.put("/projects/{}/nodes/{}".format(project.id, node.id), {
"name": "test",
"node_type": "vpcs",
"compute_id": "example.com",
"properties": {
"startup_script": "echo test"
}
}, example=True)
})
assert response.status == 200
assert response.json["name"] == "test"
assert "name" not in response.json["properties"]
def test_start_all_nodes(http_controller, tmpdir, project, compute):
response = MagicMock()
compute.post = AsyncioMagicMock()
async def test_start_all_nodes(controller_api, project, compute):
response = http_controller.post("/projects/{}/nodes/start".format(project.id), example=True)
compute.post = AsyncioMagicMock()
response = await controller_api.post("/projects/{}/nodes/start".format(project.id))
assert response.status == 204
def test_stop_all_nodes(http_controller, tmpdir, project, compute):
response = MagicMock()
compute.post = AsyncioMagicMock()
async def test_stop_all_nodes(controller_api, project, compute):
response = http_controller.post("/projects/{}/nodes/stop".format(project.id), example=True)
compute.post = AsyncioMagicMock()
response = await controller_api.post("/projects/{}/nodes/stop".format(project.id))
assert response.status == 204
def test_suspend_all_nodes(http_controller, tmpdir, project, compute):
response = MagicMock()
compute.post = AsyncioMagicMock()
async def test_suspend_all_nodes(controller_api, project, compute):
response = http_controller.post("/projects/{}/nodes/suspend".format(project.id), example=True)
compute.post = AsyncioMagicMock()
response = await controller_api.post("/projects/{}/nodes/suspend".format(project.id))
assert response.status == 204
def test_reload_all_nodes(http_controller, tmpdir, project, compute):
response = MagicMock()
compute.post = AsyncioMagicMock()
async def test_reload_all_nodes(controller_api, project, compute):
response = http_controller.post("/projects/{}/nodes/reload".format(project.id), example=True)
compute.post = AsyncioMagicMock()
response = await controller_api.post("/projects/{}/nodes/reload".format(project.id))
assert response.status == 204
def test_start_node(http_controller, tmpdir, project, compute, node):
response = MagicMock()
compute.post = AsyncioMagicMock()
async def test_start_node(controller_api, project, node, compute):
response = http_controller.post("/projects/{}/nodes/{}/start".format(project.id, node.id), example=True)
compute.post = AsyncioMagicMock()
response = await controller_api.post("/projects/{}/nodes/{}/start".format(project.id, node.id))
assert response.status == 200
assert response.json == node.__json__()
def test_stop_node(http_controller, tmpdir, project, compute, node):
response = MagicMock()
compute.post = AsyncioMagicMock()
async def test_stop_node(controller_api, project, node, compute):
response = http_controller.post("/projects/{}/nodes/{}/stop".format(project.id, node.id), example=True)
compute.post = AsyncioMagicMock()
response = await controller_api.post("/projects/{}/nodes/{}/stop".format(project.id, node.id))
assert response.status == 200
assert response.json == node.__json__()
def test_suspend_node(http_controller, tmpdir, project, compute, node):
response = MagicMock()
compute.post = AsyncioMagicMock()
async def test_suspend_node(controller_api, project, node, compute):
response = http_controller.post("/projects/{}/nodes/{}/suspend".format(project.id, node.id), example=True)
compute.post = AsyncioMagicMock()
response = await controller_api.post("/projects/{}/nodes/{}/suspend".format(project.id, node.id))
assert response.status == 200
assert response.json == node.__json__()
def test_reload_node(http_controller, tmpdir, project, compute, node):
response = MagicMock()
compute.post = AsyncioMagicMock()
async def test_reload_node(controller_api, project, node, compute):
response = http_controller.post("/projects/{}/nodes/{}/reload".format(project.id, node.id), example=True)
compute.post = AsyncioMagicMock()
response = await controller_api.post("/projects/{}/nodes/{}/reload".format(project.id, node.id))
assert response.status == 200
assert response.json == node.__json__()
def test_duplicate_node(http_controller, tmpdir, project, compute, node):
async def test_duplicate_node(controller_api, project, compute, node):
response = MagicMock()
response.json({"console": 2035})
compute.post = AsyncioMagicMock(return_value=response)
response = http_controller.post("/projects/{}/nodes/{}/duplicate".format(
project.id, node.id),
{"x": 10, "y": 5, "z": 0},
example=True)
response = await controller_api.post("/projects/{}/nodes/{}/duplicate".format(project.id, node.id),
{"x": 10,
"y": 5,
"z": 0})
assert response.status == 201, response.body.decode()
def test_delete_node(http_controller, tmpdir, project, compute, node):
response = MagicMock()
compute.post = AsyncioMagicMock()
async def test_delete_node(controller_api, project, node, compute):
response = http_controller.delete("/projects/{}/nodes/{}".format(project.id, node.id), example=True)
compute.post = AsyncioMagicMock()
response = await controller_api.delete("/projects/{}/nodes/{}".format(project.id, node.id))
assert response.status == 204
def test_dynamips_idle_pc(http_controller, tmpdir, project, compute, node):
async def test_dynamips_idle_pc(controller_api, project, compute, node):
response = MagicMock()
response.json = {"idlepc": "0x60606f54"}
compute.get = AsyncioMagicMock(return_value=response)
response = http_controller.get("/projects/{}/nodes/{}/dynamips/auto_idlepc".format(project.id, node.id), example=True)
response = await controller_api.get("/projects/{}/nodes/{}/dynamips/auto_idlepc".format(project.id, node.id))
assert response.status == 200
assert response.json["idlepc"] == "0x60606f54"
def test_dynamips_idlepc_proposals(http_controller, tmpdir, project, compute, node):
async def test_dynamips_idlepc_proposals(controller_api, project, compute, node):
response = MagicMock()
response.json = ["0x60606f54", "0x33805a22"]
compute.get = AsyncioMagicMock(return_value=response)
response = http_controller.get("/projects/{}/nodes/{}/dynamips/idlepc_proposals".format(project.id, node.id), example=True)
response = await controller_api.get("/projects/{}/nodes/{}/dynamips/idlepc_proposals".format(project.id, node.id))
assert response.status == 200
assert response.json == ["0x60606f54", "0x33805a22"]
def test_get_file(http_controller, tmpdir, project, node, compute):
async def test_get_file(controller_api, project, node, compute):
response = MagicMock()
response.body = b"world"
compute.http_query = AsyncioMagicMock(return_value=response)
response = http_controller.get("/projects/{project_id}/nodes/{node_id}/files/hello".format(project_id=project.id, node_id=node.id), raw=True)
response = await controller_api.get("/projects/{project_id}/nodes/{node_id}/files/hello".format(project_id=project.id, node_id=node.id))
assert response.status == 200
assert response.body == b'world'
compute.http_query.assert_called_with("GET", "/projects/{project_id}/files/project-files/vpcs/{node_id}/hello".format(project_id=project.id, node_id=node.id), timeout=None, raw=True)
response = http_controller.get("/projects/{project_id}/nodes/{node_id}/files/../hello".format(project_id=project.id, node_id=node.id), raw=True)
response = await controller_api.get("/projects/{project_id}/nodes/{node_id}/files/../hello".format(project_id=project.id, node_id=node.id))
assert response.status == 404
def test_post_file(http_controller, tmpdir, project, node, compute):
async def test_post_file(controller_api, project, node, compute):
compute.http_query = AsyncioMagicMock()
response = http_controller.post("/projects/{project_id}/nodes/{node_id}/files/hello".format(project_id=project.id, node_id=node.id), body=b"hello", raw=True)
response = await controller_api.post("/projects/{project_id}/nodes/{node_id}/files/hello".format(project_id=project.id, node_id=node.id), body=b"hello", raw=True)
assert response.status == 201
compute.http_query.assert_called_with("POST", "/projects/{project_id}/files/project-files/vpcs/{node_id}/hello".format(project_id=project.id, node_id=node.id), data=b'hello', timeout=None, raw=True)
response = http_controller.get("/projects/{project_id}/nodes/{node_id}/files/../hello".format(project_id=project.id, node_id=node.id), raw=True)
response = await controller_api.get("/projects/{project_id}/nodes/{node_id}/files/../hello".format(project_id=project.id, node_id=node.id))
assert response.status == 404
def test_get_and_post_with_nested_paths_normalization(http_controller, tmpdir, project, node, compute):
async def test_get_and_post_with_nested_paths_normalization(controller_api, project, node, compute):
response = MagicMock()
response.body = b"world"
compute.http_query = AsyncioMagicMock(return_value=response)
response = http_controller.get("/projects/{project_id}/nodes/{node_id}/files/hello\\nested".format(project_id=project.id, node_id=node.id), raw=True)
response = await controller_api.get("/projects/{project_id}/nodes/{node_id}/files/hello\\nested".format(project_id=project.id, node_id=node.id))
assert response.status == 200
assert response.body == b'world'
compute.http_query.assert_called_with("GET", "/projects/{project_id}/files/project-files/vpcs/{node_id}/hello/nested".format(project_id=project.id, node_id=node.id), timeout=None, raw=True)
compute.http_query = AsyncioMagicMock()
response = http_controller.post("/projects/{project_id}/nodes/{node_id}/files/hello\\nested".format(project_id=project.id, node_id=node.id), body=b"hello", raw=True)
response = await controller_api.post("/projects/{project_id}/nodes/{node_id}/files/hello\\nested".format(project_id=project.id, node_id=node.id), body=b"hello", raw=True)
assert response.status == 201
compute.http_query.assert_called_with("POST", "/projects/{project_id}/files/project-files/vpcs/{node_id}/hello/nested".format(project_id=project.id, node_id=node.id), data=b'hello', timeout=None, raw=True)
+107 -101
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -15,202 +15,206 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
This test suite check /project endpoint
"""
import uuid
import os
import asyncio
import aiohttp
import pytest
import zipfile
import json
from unittest.mock import patch, MagicMock
from tests.utils import asyncio_patch
from gns3server.handlers.api.controller.project_handler import ProjectHandler
from gns3server.controller import Controller
@pytest.fixture
def project(http_controller, controller):
async def project(controller_api, controller):
u = str(uuid.uuid4())
query = {"name": "test", "project_id": u}
response = http_controller.post("/projects", query)
params = {"name": "test", "project_id": u}
await controller_api.post("/projects", params)
return controller.get_project(u)
def test_create_project_with_path(http_controller, tmpdir):
response = http_controller.post("/projects", {"name": "test", "path": str(tmpdir), "project_id": "00010203-0405-0607-0809-0a0b0c0d0e0f"})
async def test_create_project_with_path(controller_api, tmpdir):
response = await controller_api.post("/projects", {"name": "test", "path": str(tmpdir), "project_id": "00010203-0405-0607-0809-0a0b0c0d0e0f"})
assert response.status == 201
assert response.json["name"] == "test"
assert response.json["project_id"] == "00010203-0405-0607-0809-0a0b0c0d0e0f"
assert response.json["status"] == "opened"
def test_create_project_without_dir(http_controller):
query = {"name": "test", "project_id": "10010203-0405-0607-0809-0a0b0c0d0e0f"}
response = http_controller.post("/projects", query, example=True)
async def test_create_project_without_dir(controller_api):
params = {"name": "test", "project_id": "10010203-0405-0607-0809-0a0b0c0d0e0f"}
response = await controller_api.post("/projects", params)
assert response.status == 201
assert response.json["project_id"] == "10010203-0405-0607-0809-0a0b0c0d0e0f"
assert response.json["name"] == "test"
def test_create_project_with_uuid(http_controller):
query = {"name": "test", "project_id": "30010203-0405-0607-0809-0a0b0c0d0e0f"}
response = http_controller.post("/projects", query)
async def test_create_project_with_uuid(controller_api):
params = {"name": "test", "project_id": "30010203-0405-0607-0809-0a0b0c0d0e0f"}
response = await controller_api.post("/projects", params)
assert response.status == 201
assert response.json["project_id"] == "30010203-0405-0607-0809-0a0b0c0d0e0f"
assert response.json["name"] == "test"
def test_create_project_with_variables(http_controller):
async def test_create_project_with_variables(controller_api):
variables = [
{"name": "TEST1"},
{"name": "TEST2", "value": "value1"}
]
query = {"name": "test", "project_id": "30010203-0405-0607-0809-0a0b0c0d0e0f", "variables": variables}
response = http_controller.post("/projects", query)
params = {"name": "test", "project_id": "30010203-0405-0607-0809-0a0b0c0d0e0f", "variables": variables}
response = await controller_api.post("/projects", params)
assert response.status == 201
assert response.json["variables"] == [
assert response.json["variables"] == [
{"name": "TEST1"},
{"name": "TEST2", "value": "value1"}
]
def test_create_project_with_supplier(http_controller):
async def test_create_project_with_supplier(controller_api):
supplier = {
'logo': 'logo.png',
'url': 'http://example.com'
}
query = {"name": "test", "project_id": "30010203-0405-0607-0809-0a0b0c0d0e0f", "supplier": supplier}
response = http_controller.post("/projects", query)
params = {"name": "test", "project_id": "30010203-0405-0607-0809-0a0b0c0d0e0f", "supplier": supplier}
response = await controller_api.post("/projects", params)
assert response.status == 201
assert response.json["supplier"] == supplier
def test_update_project(http_controller):
query = {"name": "test", "project_id": "10010203-0405-0607-0809-0a0b0c0d0e0f"}
response = http_controller.post("/projects", query)
async def test_update_project(controller_api):
params = {"name": "test", "project_id": "10010203-0405-0607-0809-0a0b0c0d0e0f"}
response = await controller_api.post("/projects", params)
assert response.status == 201
assert response.json["project_id"] == "10010203-0405-0607-0809-0a0b0c0d0e0f"
assert response.json["name"] == "test"
query = {"name": "test2"}
response = http_controller.put("/projects/10010203-0405-0607-0809-0a0b0c0d0e0f", query, example=True)
params = {"name": "test2"}
response = await controller_api.put("/projects/10010203-0405-0607-0809-0a0b0c0d0e0f", params)
assert response.status == 200
assert response.json["name"] == "test2"
def test_update_project_with_variables(http_controller):
async def test_update_project_with_variables(controller_api):
variables = [
{"name": "TEST1"},
{"name": "TEST2", "value": "value1"}
]
query = {"name": "test", "project_id": "10010203-0405-0607-0809-0a0b0c0d0e0f", "variables": variables}
response = http_controller.post("/projects", query)
params = {"name": "test", "project_id": "10010203-0405-0607-0809-0a0b0c0d0e0f", "variables": variables}
response = await controller_api.post("/projects", params)
assert response.status == 201
query = {"name": "test2"}
response = http_controller.put("/projects/10010203-0405-0607-0809-0a0b0c0d0e0f", query, example=True)
params = {"name": "test2"}
response = await controller_api.put("/projects/10010203-0405-0607-0809-0a0b0c0d0e0f", params)
assert response.status == 200
assert response.json["variables"] == variables
def test_list_projects(http_controller, tmpdir):
http_controller.post("/projects", {"name": "test", "path": str(tmpdir), "project_id": "00010203-0405-0607-0809-0a0b0c0d0e0f"})
response = http_controller.get("/projects", example=True)
async def test_list_projects(controller_api, tmpdir):
await controller_api.post("/projects", {"name": "test", "path": str(tmpdir), "project_id": "00010203-0405-0607-0809-0a0b0c0d0e0f"})
response = await controller_api.get("/projects")
assert response.status == 200
projects = response.json
assert projects[0]["name"] == "test"
def test_get_project(http_controller, project):
response = http_controller.get("/projects/{project_id}".format(project_id=project.id), example=True)
async def test_get_project(controller_api, project):
response = await controller_api.get("/projects/{project_id}".format(project_id=project.id))
assert response.status == 200
assert response.json["name"] == "test"
def test_delete_project(http_controller, project):
async def test_delete_project(controller_api, project, controller):
with asyncio_patch("gns3server.controller.project.Project.delete", return_value=True) as mock:
response = http_controller.delete("/projects/{project_id}".format(project_id=project.id), example=True)
response = await controller_api.delete("/projects/{project_id}".format(project_id=project.id))
assert response.status == 204
assert mock.called
assert project not in Controller.instance().projects
assert project not in controller.projects
def test_delete_project_invalid_uuid(http_controller):
response = http_controller.delete("/projects/{project_id}".format(project_id=uuid.uuid4()))
async def test_delete_project_invalid_uuid(controller_api):
response = await controller_api.delete("/projects/{project_id}".format(project_id=uuid.uuid4()))
assert response.status == 404
def test_close_project(http_controller, project):
async def test_close_project(controller_api, project):
with asyncio_patch("gns3server.controller.project.Project.close", return_value=True) as mock:
response = http_controller.post("/projects/{project_id}/close".format(project_id=project.id), example=True)
response = await controller_api.post("/projects/{project_id}/close".format(project_id=project.id))
assert response.status == 204
assert mock.called
def test_open_project(http_controller, project):
async def test_open_project(controller_api, project):
with asyncio_patch("gns3server.controller.project.Project.open", return_value=True) as mock:
response = http_controller.post("/projects/{project_id}/open".format(project_id=project.id), example=True)
response = await controller_api.post("/projects/{project_id}/open".format(project_id=project.id))
assert response.status == 201
assert mock.called
def test_load_project(http_controller, project, config):
async def test_load_project(controller_api, project, config):
config.set("Server", "local", "true")
with asyncio_patch("gns3server.controller.Controller.load_project", return_value=project) as mock:
response = http_controller.post("/projects/load".format(project_id=project.id), {"path": "/tmp/test.gns3"}, example=True)
response = await controller_api.post("/projects/load".format(project_id=project.id), {"path": "/tmp/test.gns3"})
assert response.status == 201
mock.assert_called_with("/tmp/test.gns3")
assert response.json["project_id"] == project.id
def test_notification(http_controller, project, controller, loop, async_run):
async def test_notification(controller_api, http_client, project, controller):
async def go():
connector = aiohttp.TCPConnector()
async with aiohttp.request("GET", http_controller.get_url("/projects/{project_id}/notifications".format(project_id=project.id)), connector=connector) as response:
response.body = await response.content.read(200)
controller.notification.project_emit("node.created", {"a": "b"})
response.body += await response.content.readany()
return response
response = async_run(asyncio.ensure_future(go()))
assert response.status == 200
assert b'"action": "ping"' in response.body
assert b'"cpu_usage_percent"' in response.body
assert b'{"action": "node.created", "event": {"a": "b"}}\n' in response.body
assert project.status == "opened"
async with http_client.get(controller_api.get_url("/projects/{project_id}/notifications".format(project_id=project.id))) as response:
response.body = await response.content.read(200)
controller.notification.project_emit("node.created", {"a": "b"})
response.body += await response.content.readany()
assert response.status == 200
assert b'"action": "ping"' in response.body
assert b'"cpu_usage_percent"' in response.body
assert b'{"action": "node.created", "event": {"a": "b"}}\n' in response.body
assert project.status == "opened"
def test_notification_invalid_id(http_controller):
response = http_controller.get("/projects/{project_id}/notifications".format(project_id=uuid.uuid4()))
async def test_notification_invalid_id(controller_api):
response = await controller_api.get("/projects/{project_id}/notifications".format(project_id=uuid.uuid4()))
assert response.status == 404
def test_notification_ws(http_controller, controller, project, async_run):
ws = http_controller.websocket("/projects/{project_id}/notifications/ws".format(project_id=project.id))
answer = async_run(ws.receive())
async def test_notification_ws(controller_api, http_client, controller, project):
ws = await http_client.ws_connect(controller_api.get_url("/projects/{project_id}/notifications/ws".format(project_id=project.id)))
answer = await ws.receive()
answer = json.loads(answer.data)
assert answer["action"] == "ping"
controller.notification.project_emit("test", {})
answer = async_run(ws.receive())
answer = await ws.receive()
answer = json.loads(answer.data)
assert answer["action"] == "test"
async_run(http_controller.close())
async_run(ws.close())
if not ws.closed:
await ws.close()
assert project.status == "opened"
def test_export_with_images(http_controller, tmpdir, loop, project):
project.dump = MagicMock()
async def test_export_with_images(controller_api, tmpdir, project):
project.dump = MagicMock()
os.makedirs(project.path, exist_ok=True)
with open(os.path.join(project.path, 'a'), 'w+') as f:
f.write('hello')
@@ -234,8 +238,8 @@ def test_export_with_images(http_controller, tmpdir, loop, project):
with open(os.path.join(project.path, "test.gns3"), 'w+') as f:
json.dump(topology, f)
with patch("gns3server.compute.Dynamips.get_images_directory", return_value=str(tmpdir / "IOS"),):
response = http_controller.get("/projects/{project_id}/export?include_images=yes".format(project_id=project.id), raw=True)
with patch("gns3server.compute.Dynamips.get_images_directory", return_value=str(tmpdir / "IOS")):
response = await controller_api.get("/projects/{project_id}/export?include_images=yes".format(project_id=project.id))
assert response.status == 200
assert response.headers['CONTENT-TYPE'] == 'application/gns3project'
assert response.headers['CONTENT-DISPOSITION'] == 'attachment; filename="{}.gns3project"'.format(project.name)
@@ -250,9 +254,9 @@ def test_export_with_images(http_controller, tmpdir, loop, project):
myzip.getinfo("images/IOS/test.image")
def test_export_without_images(http_controller, tmpdir, loop, project):
project.dump = MagicMock()
async def test_export_without_images(controller_api, tmpdir, project):
project.dump = MagicMock()
os.makedirs(project.path, exist_ok=True)
with open(os.path.join(project.path, 'a'), 'w+') as f:
f.write('hello')
@@ -277,7 +281,7 @@ def test_export_without_images(http_controller, tmpdir, loop, project):
json.dump(topology, f)
with patch("gns3server.compute.Dynamips.get_images_directory", return_value=str(tmpdir / "IOS"),):
response = http_controller.get("/projects/{project_id}/export?include_images=0".format(project_id=project.id), raw=True)
response = await controller_api.get("/projects/{project_id}/export?include_images=0".format(project_id=project.id))
assert response.status == 200
assert response.headers['CONTENT-TYPE'] == 'application/gns3project'
assert response.headers['CONTENT-DISPOSITION'] == 'attachment; filename="{}.gns3project"'.format(project.name)
@@ -294,52 +298,54 @@ def test_export_without_images(http_controller, tmpdir, loop, project):
myzip.getinfo("images/IOS/test.image")
def test_get_file(http_controller, tmpdir, loop, project):
async def test_get_file(controller_api, project):
os.makedirs(project.path, exist_ok=True)
with open(os.path.join(project.path, 'hello'), 'w+') as f:
f.write('world')
response = http_controller.get("/projects/{project_id}/files/hello".format(project_id=project.id), raw=True)
response = await controller_api.get("/projects/{project_id}/files/hello".format(project_id=project.id))
assert response.status == 200
assert response.body == b"world"
response = http_controller.get("/projects/{project_id}/files/false".format(project_id=project.id), raw=True)
response = await controller_api.get("/projects/{project_id}/files/false".format(project_id=project.id))
assert response.status == 404
response = http_controller.get("/projects/{project_id}/files/../hello".format(project_id=project.id), raw=True)
response = await controller_api.get("/projects/{project_id}/files/../hello".format(project_id=project.id))
assert response.status == 404
def test_write_file(http_controller, tmpdir, project):
response = http_controller.post("/projects/{project_id}/files/hello".format(project_id=project.id), body="world", raw=True)
async def test_write_file(controller_api, project):
response = await controller_api.post("/projects/{project_id}/files/hello".format(project_id=project.id), body="world", raw=True)
assert response.status == 200
with open(os.path.join(project.path, "hello")) as f:
assert f.read() == "world"
response = http_controller.post("/projects/{project_id}/files/../hello".format(project_id=project.id), raw=True)
response = await controller_api.post("/projects/{project_id}/files/../hello".format(project_id=project.id), raw=True)
assert response.status == 404
def test_write_and_get_file_with_leading_slashes_in_filename(http_controller, tmpdir, loop, project):
response = http_controller.post("/projects/{project_id}/files//hello".format(project_id=project.id), body="world", raw=True)
async def test_write_and_get_file_with_leading_slashes_in_filename(controller_api, project):
response = await controller_api.post("/projects/{project_id}/files//hello".format(project_id=project.id), body="world", raw=True)
assert response.status == 200
response = http_controller.get("/projects/{project_id}/files//hello".format(project_id=project.id), raw=True)
response = await controller_api.get("/projects/{project_id}/files//hello".format(project_id=project.id), raw=True)
assert response.status == 200
assert response.body == b"world"
def test_import(http_controller, tmpdir, controller):
async def test_import(controller_api, tmpdir, controller):
with zipfile.ZipFile(str(tmpdir / "test.zip"), 'w') as myzip:
myzip.writestr("project.gns3", b'{"project_id": "c6992992-ac72-47dc-833b-54aa334bcd05", "version": "2.0.0", "name": "test"}')
myzip.writestr("demo", b"hello")
project_id = str(uuid.uuid4())
with open(str(tmpdir / "test.zip"), "rb") as f:
response = http_controller.post("/projects/{project_id}/import".format(project_id=project_id), body=f.read(), raw=True)
response = await controller_api.post("/projects/{project_id}/import".format(project_id=project_id), body=f.read(), raw=True)
assert response.status == 201
project = controller.get_project(project_id)
@@ -348,8 +354,8 @@ def test_import(http_controller, tmpdir, controller):
assert content == "hello"
def test_duplicate(http_controller, tmpdir, loop, project):
async def test_duplicate(controller_api, project):
response = http_controller.post("/projects/{project_id}/duplicate".format(project_id=project.id), {"name": "hello"}, example=True)
response = await controller_api.post("/projects/{project_id}/duplicate".format(project_id=project.id), {"name": "hello"})
assert response.status == 201
assert response.json["name"] == "hello"
+18 -19
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
# Copyright (C) 2016 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -17,61 +17,60 @@
import os
import pytest
import asyncio
from unittest.mock import MagicMock, patch
from unittest.mock import MagicMock
from gns3server.web.web_server import WebServer
@pytest.yield_fixture
@pytest.fixture
def web_server():
WebServer._instance = MagicMock()
yield WebServer._instance
WebServer._instance = None
def test_shutdown_local(http_controller, web_server, config):
async def test_shutdown_local(controller_api, web_server, config):
async def hello():
return 0
web_server.shutdown_server.return_value = hello()
config.set("Server", "local", True)
response = http_controller.post('/shutdown', example=True)
response = await controller_api.post('/shutdown')
assert response.status == 201
assert web_server.shutdown_server.called
def test_shutdown_non_local(http_controller, web_server, config):
"""
Disallow shutdown of a non local GNS3 server
"""
async def test_shutdown_non_local(controller_api, web_server, config):
WebServer._instance = MagicMock()
config.set("Server", "local", False)
response = http_controller.post('/shutdown')
response = await controller_api.post('/shutdown')
assert response.status == 403
assert not web_server.shutdown_server.called
def test_debug(http_controller, config, tmpdir):
config._main_config_file = str(tmpdir / "test.conf")
async def test_debug(controller_api, config, tmpdir):
config._main_config_file = str(tmpdir / "test.conf")
config.set("Server", "local", True)
response = http_controller.post('/debug')
response = await controller_api.post('/debug')
assert response.status == 201
debug_dir = os.path.join(config.config_dir, "debug")
assert os.path.exists(debug_dir)
assert os.path.exists(os.path.join(debug_dir, "controller.txt"))
def test_debug_non_local(http_controller, config, tmpdir):
config._main_config_file = str(tmpdir / "test.conf")
async def test_debug_non_local(controller_api, config, tmpdir):
config._main_config_file = str(tmpdir / "test.conf")
config.set("Server", "local", False)
response = http_controller.post('/debug')
response = await controller_api.post('/debug')
assert response.status == 403
def test_statistics_output(http_controller):
response = http_controller.get('/statistics')
async def test_statistics_output(controller_api):
response = await controller_api.get('/statistics')
assert response.status == 200
+22 -16
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
# Copyright (C) 2016 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -21,40 +21,46 @@ import pytest
@pytest.fixture
def project(http_controller, controller):
u = str(uuid.uuid4())
query = {"name": "test", "project_id": u}
response = http_controller.post("/projects", query)
project = controller.get_project(u)
async def project(controller_api, controller):
u = str(uuid.uuid4())
params = {"name": "test", "project_id": u}
await controller_api.post("/projects", params)
project = controller.get_project(u)
return project
@pytest.fixture
def snapshot(project, async_run):
snapshot = async_run(project.snapshot("test"))
async def snapshot(project):
snapshot = await project.snapshot("test")
return snapshot
def test_list_snapshots(http_controller, project, snapshot):
response = http_controller.get("/projects/{}/snapshots".format(project.id), example=True)
async def test_list_snapshots(controller_api, project, snapshot):
assert snapshot.name == "test"
response = await controller_api.get("/projects/{}/snapshots".format(project.id))
assert response.status == 200
assert len(response.json) == 1
def test_delete_snapshot(http_controller, project, snapshot):
response = http_controller.delete("/projects/{}/snapshots/{}".format(project.id, snapshot.id), example=True)
async def test_delete_snapshot(controller_api, project, snapshot):
response = await controller_api.delete("/projects/{}/snapshots/{}".format(project.id, snapshot.id))
assert response.status == 204
assert not os.path.exists(snapshot.path)
def test_restore_snapshot(http_controller, project, snapshot):
response = http_controller.post("/projects/{}/snapshots/{}/restore".format(project.id, snapshot.id), example=True)
async def test_restore_snapshot(controller_api, project, snapshot):
response = await controller_api.post("/projects/{}/snapshots/{}/restore".format(project.id, snapshot.id))
assert response.status == 201
assert response.json["name"] == project.name
def test_create_snapshot(http_controller, project):
response = http_controller.post("/projects/{}/snapshots".format(project.id), {"name": "snap1"}, example=True)
async def test_create_snapshot(controller_api, project):
response = await controller_api.post("/projects/{}/snapshots".format(project.id), {"name": "snap1"})
assert response.status == 201
assert len(os.listdir(os.path.join(project.path, "snapshots"))) == 1
+13 -12
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -16,14 +16,13 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import sys
import urllib.parse
from gns3server.config import Config
async def test_symbols(controller_api):
response = await controller_api.get('/symbols')
def test_symbols(http_controller):
response = http_controller.get('/symbols', example=True)
assert response.status == 200
assert {
'symbol_id': ':/symbols/classic/firewall.svg',
@@ -33,25 +32,27 @@ def test_symbols(http_controller):
} in response.json
def test_get(http_controller, controller):
async def test_get(controller_api, controller):
controller.symbols.theme = "Classic"
response = http_controller.get('/symbols/' + urllib.parse.quote(':/symbols/classic/firewall.svg') + '/raw')
response = await controller_api.get('/symbols/' + urllib.parse.quote(':/symbols/classic/firewall.svg') + '/raw')
assert response.status == 200
assert response.headers['CONTENT-TYPE'] == 'image/svg+xml'
assert response.headers['CONTENT-LENGTH'] == '9381'
assert '</svg>' in response.html
# Reply by the default symbol
response = http_controller.get('/symbols/404.png/raw')
# Reply with the default symbol
response = await controller_api.get('/symbols/404.png/raw')
assert response.status == 200
def test_upload(http_controller, symbols_dir):
response = http_controller.post("/symbols/test2/raw", body="TEST", raw=True)
async def test_upload(controller_api, symbols_dir):
response = await controller_api.post("/symbols/test2/raw", body="TEST", raw=True)
assert response.status == 204
with open(os.path.join(symbols_dir, "test2")) as f:
assert f.read() == "TEST"
response = http_controller.get('/symbols/test2/raw')
response = await controller_api.get('/symbols/test2/raw')
assert response.status == 200
+75 -89
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
# Copyright (C) 2016 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -17,15 +17,13 @@
import uuid
import pytest
from unittest.mock import MagicMock
from tests.utils import asyncio_patch
from gns3server.controller import Controller
from gns3server.controller.template import Template
def test_template_list(http_controller, controller):
async def test_template_list(controller_api, controller):
id = str(uuid.uuid4())
controller.template_manager.load_templates()
@@ -37,13 +35,13 @@ def test_template_list(http_controller, controller):
"default_name_format": "{name}-{0}",
"compute_id": "local"
})
response = http_controller.get("/templates", example=True)
response = await controller_api.get("/templates")
assert response.status == 200
assert response.route == "/templates"
assert len(response.json) > 0
def test_template_create_without_id(http_controller, controller):
async def test_template_create_without_id(controller_api, controller):
params = {"base_script_file": "vpcs_base_config.txt",
"category": "guest",
@@ -55,14 +53,14 @@ def test_template_create_without_id(http_controller, controller):
"symbol": ":/symbols/vpcs_guest.svg",
"template_type": "vpcs"}
response = http_controller.post("/templates", params, example=True)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.route == "/templates"
assert response.json["template_id"] is not None
assert len(controller.template_manager._templates) == 1
assert len(controller.template_manager.templates) == 1
def test_template_create_with_id(http_controller, controller):
async def test_template_create_with_id(controller_api, controller):
params = {"template_id": str(uuid.uuid4()),
"base_script_file": "vpcs_base_config.txt",
@@ -75,14 +73,14 @@ def test_template_create_with_id(http_controller, controller):
"symbol": ":/symbols/vpcs_guest.svg",
"template_type": "vpcs"}
response = http_controller.post("/templates", params, example=True)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.route == "/templates"
assert response.json["template_id"] is not None
assert len(controller.template_manager._templates) == 1
assert len(controller.template_manager.templates) == 1
def test_template_create_wrong_type(http_controller, controller):
async def test_template_create_wrong_type(controller_api, controller):
params = {"template_id": str(uuid.uuid4()),
"base_script_file": "vpcs_base_config.txt",
@@ -95,12 +93,12 @@ def test_template_create_wrong_type(http_controller, controller):
"symbol": ":/symbols/vpcs_guest.svg",
"template_type": "invalid_template_type"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 400
assert len(controller.template_manager._templates) == 0
assert len(controller.template_manager.templates) == 0
def test_template_get(http_controller, controller):
async def test_template_get(controller_api):
template_id = str(uuid.uuid4())
params = {"template_id": template_id,
@@ -114,15 +112,15 @@ def test_template_get(http_controller, controller):
"symbol": ":/symbols/vpcs_guest.svg",
"template_type": "vpcs"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
response = http_controller.get("/templates/{}".format(template_id), example=True)
response = await controller_api.get("/templates/{}".format(template_id))
assert response.status == 200
assert response.json["template_id"] == template_id
def test_template_update(http_controller, controller):
async def test_template_update(controller_api):
template_id = str(uuid.uuid4())
params = {"template_id": template_id,
@@ -136,21 +134,21 @@ def test_template_update(http_controller, controller):
"symbol": ":/symbols/vpcs_guest.svg",
"template_type": "vpcs"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
response = http_controller.get("/templates/{}".format(template_id))
response = await controller_api.get("/templates/{}".format(template_id))
assert response.status == 200
assert response.json["template_id"] == template_id
params["name"] = "VPCS_TEST_RENAMED"
response = http_controller.put("/templates/{}".format(template_id), params, example=True)
response = await controller_api.put("/templates/{}".format(template_id), params)
assert response.status == 200
assert response.json["name"] == "VPCS_TEST_RENAMED"
def test_template_delete(http_controller, controller):
async def test_template_delete(controller_api, controller):
template_id = str(uuid.uuid4())
params = {"template_id": template_id,
@@ -164,22 +162,22 @@ def test_template_delete(http_controller, controller):
"symbol": ":/symbols/vpcs_guest.svg",
"template_type": "vpcs"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
response = http_controller.get("/templates")
response = await controller_api.get("/templates")
assert len(response.json) == 1
assert len(controller.template_manager._templates) == 1
response = http_controller.delete("/templates/{}".format(template_id), example=True)
response = await controller_api.delete("/templates/{}".format(template_id))
assert response.status == 204
response = http_controller.get("/templates")
response = await controller_api.get("/templates")
assert len(response.json) == 0
assert len(controller.template_manager._templates) == 0
assert len(controller.template_manager.templates) == 0
def test_template_duplicate(http_controller, controller):
async def test_template_duplicate(controller_api, controller):
template_id = str(uuid.uuid4())
params = {"template_id": template_id,
@@ -193,22 +191,22 @@ def test_template_duplicate(http_controller, controller):
"symbol": ":/symbols/vpcs_guest.svg",
"template_type": "vpcs"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
response = http_controller.post("/templates/{}/duplicate".format(template_id), example=True)
response = await controller_api.post("/templates/{}/duplicate".format(template_id))
assert response.status == 201
assert response.json["template_id"] != template_id
params.pop("template_id")
for param, value in params.items():
assert response.json[param] == value
response = http_controller.get("/templates")
response = await controller_api.get("/templates")
assert len(response.json) == 2
assert len(controller.template_manager._templates) == 2
assert len(controller.template_manager.templates) == 2
def test_c7200_dynamips_template_create(http_controller):
async def test_c7200_dynamips_template_create(controller_api):
params = {"name": "Cisco c7200 template",
"platform": "c7200",
@@ -216,7 +214,7 @@ def test_c7200_dynamips_template_create(http_controller):
"image": "c7200-adventerprisek9-mz.124-24.T5.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -253,7 +251,7 @@ def test_c7200_dynamips_template_create(http_controller):
assert response.json.get(item) == value
def test_c3745_dynamips_template_create(http_controller):
async def test_c3745_dynamips_template_create(controller_api):
params = {"name": "Cisco c3745 template",
"platform": "c3745",
@@ -261,7 +259,7 @@ def test_c3745_dynamips_template_create(http_controller):
"image": "c3745-adventerprisek9-mz.124-25d.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -297,7 +295,7 @@ def test_c3745_dynamips_template_create(http_controller):
assert response.json.get(item) == value
def test_c3725_dynamips_template_create(http_controller):
async def test_c3725_dynamips_template_create(controller_api):
params = {"name": "Cisco c3725 template",
"platform": "c3725",
@@ -305,7 +303,7 @@ def test_c3725_dynamips_template_create(http_controller):
"image": "c3725-adventerprisek9-mz.124-25d.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -341,7 +339,7 @@ def test_c3725_dynamips_template_create(http_controller):
assert response.json.get(item) == value
def test_c3600_dynamips_template_create(http_controller):
async def test_c3600_dynamips_template_create(controller_api):
params = {"name": "Cisco c3600 template",
"platform": "c3600",
@@ -350,7 +348,7 @@ def test_c3600_dynamips_template_create(http_controller):
"image": "c3660-a3jk9s-mz.124-25d.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -387,7 +385,7 @@ def test_c3600_dynamips_template_create(http_controller):
assert response.json.get(item) == value
def test_c3600_dynamips_template_create_wrong_chassis(http_controller):
async def test_c3600_dynamips_template_create_wrong_chassis(controller_api):
params = {"name": "Cisco c3600 template",
"platform": "c3600",
@@ -396,11 +394,11 @@ def test_c3600_dynamips_template_create_wrong_chassis(http_controller):
"image": "c3660-a3jk9s-mz.124-25d.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 400
def test_c2691_dynamips_template_create(http_controller):
async def test_c2691_dynamips_template_create(controller_api):
params = {"name": "Cisco c2691 template",
"platform": "c2691",
@@ -408,7 +406,7 @@ def test_c2691_dynamips_template_create(http_controller):
"image": "c2691-adventerprisek9-mz.124-25d.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -444,7 +442,7 @@ def test_c2691_dynamips_template_create(http_controller):
assert response.json.get(item) == value
def test_c2600_dynamips_template_create(http_controller):
async def test_c2600_dynamips_template_create(controller_api):
params = {"name": "Cisco c2600 template",
"platform": "c2600",
@@ -453,7 +451,7 @@ def test_c2600_dynamips_template_create(http_controller):
"image": "c2600-adventerprisek9-mz.124-25d.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -490,7 +488,7 @@ def test_c2600_dynamips_template_create(http_controller):
assert response.json.get(item) == value
def test_c2600_dynamips_template_create_wrong_chassis(http_controller):
async def test_c2600_dynamips_template_create_wrong_chassis(controller_api):
params = {"name": "Cisco c2600 template",
"platform": "c2600",
@@ -499,11 +497,11 @@ def test_c2600_dynamips_template_create_wrong_chassis(http_controller):
"image": "c2600-adventerprisek9-mz.124-25d.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 400
def test_c1700_dynamips_template_create(http_controller):
async def test_c1700_dynamips_template_create(controller_api):
params = {"name": "Cisco c1700 template",
"platform": "c1700",
@@ -512,7 +510,7 @@ def test_c1700_dynamips_template_create(http_controller):
"image": "c1700-adventerprisek9-mz.124-25d.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -549,7 +547,7 @@ def test_c1700_dynamips_template_create(http_controller):
assert response.json.get(item) == value
def test_c1700_dynamips_template_create_wrong_chassis(http_controller):
async def test_c1700_dynamips_template_create_wrong_chassis(controller_api):
params = {"name": "Cisco c1700 template",
"platform": "c1700",
@@ -558,11 +556,11 @@ def test_c1700_dynamips_template_create_wrong_chassis(http_controller):
"image": "c1700-adventerprisek9-mz.124-25d.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 400
def test_dynamips_template_create_wrong_platform(http_controller):
async def test_dynamips_template_create_wrong_platform(controller_api):
params = {"name": "Cisco c3900 template",
"platform": "c3900",
@@ -570,18 +568,18 @@ def test_dynamips_template_create_wrong_platform(http_controller):
"image": "c3900-test.124-25d.image",
"template_type": "dynamips"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 400
def test_iou_template_create(http_controller):
async def test_iou_template_create(controller_api):
params = {"name": "IOU template",
"compute_id": "local",
"path": "/path/to/i86bi_linux-ipbase-ms-12.4.bin",
"template_type": "iou"}
response = http_controller.post("/templates", params, example=True)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -608,14 +606,14 @@ def test_iou_template_create(http_controller):
assert response.json.get(item) == value
def test_docker_template_create(http_controller):
async def test_docker_template_create(controller_api):
params = {"name": "Docker template",
"compute_id": "local",
"image": "gns3/endhost:latest",
"template_type": "docker"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -642,7 +640,7 @@ def test_docker_template_create(http_controller):
assert response.json.get(item) == value
def test_qemu_template_create(http_controller):
async def test_qemu_template_create(controller_api):
params = {"name": "Qemu template",
"compute_id": "local",
@@ -651,7 +649,7 @@ def test_qemu_template_create(http_controller):
"ram": 512,
"template_type": "qemu"}
response = http_controller.post("/templates", params, example=True)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -701,14 +699,14 @@ def test_qemu_template_create(http_controller):
assert response.json.get(item) == value
def test_vmware_template_create(http_controller):
async def test_vmware_template_create(controller_api):
params = {"name": "VMware template",
"compute_id": "local",
"template_type": "vmware",
"vmx_path": "/path/to/vm.vmx"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -737,14 +735,14 @@ def test_vmware_template_create(http_controller):
assert response.json.get(item) == value
def test_virtualbox_template_create(http_controller):
async def test_virtualbox_template_create(controller_api):
params = {"name": "VirtualBox template",
"compute_id": "local",
"template_type": "virtualbox",
"vmname": "My VirtualBox VM"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -773,13 +771,14 @@ def test_virtualbox_template_create(http_controller):
for item, value in expected_response.items():
assert response.json.get(item) == value
def test_vpcs_template_create(http_controller):
async def test_vpcs_template_create(controller_api):
params = {"name": "VPCS template",
"compute_id": "local",
"template_type": "vpcs"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -797,13 +796,14 @@ def test_vpcs_template_create(http_controller):
for item, value in expected_response.items():
assert response.json.get(item) == value
def test_ethernet_switch_template_create(http_controller):
async def test_ethernet_switch_template_create(controller_api):
params = {"name": "Ethernet switch template",
"compute_id": "local",
"template_type": "ethernet_switch"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -868,13 +868,13 @@ def test_ethernet_switch_template_create(http_controller):
assert response.json.get(item) == value
def test_cloud_template_create(http_controller):
async def test_cloud_template_create(controller_api):
params = {"name": "Cloud template",
"compute_id": "local",
"template_type": "cloud"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -890,13 +890,13 @@ def test_cloud_template_create(http_controller):
assert response.json.get(item) == value
def test_ethernet_hub_template_create(http_controller):
async def test_ethernet_hub_template_create(controller_api):
params = {"name": "Ethernet hub template",
"compute_id": "local",
"template_type": "ethernet_hub"}
response = http_controller.post("/templates", params)
response = await controller_api.post("/templates", params)
assert response.status == 201
assert response.json["template_id"] is not None
@@ -936,21 +936,7 @@ def test_ethernet_hub_template_create(http_controller):
assert response.json.get(item) == value
@pytest.fixture
def compute(http_controller, async_run):
compute = MagicMock()
compute.id = "example.com"
compute.host = "example.org"
Controller.instance()._computes = {"example.com": compute}
return compute
@pytest.fixture
def project(http_controller, async_run):
return async_run(Controller.instance().add_project(name="Test"))
def test_create_node_from_template(http_controller, controller, project, compute):
async def test_create_node_from_template(controller_api, controller, project):
id = str(uuid.uuid4())
controller.template_manager._templates = {id: Template(id, {
@@ -962,7 +948,7 @@ def test_create_node_from_template(http_controller, controller, project, compute
"compute_id": "example.com"
})}
with asyncio_patch("gns3server.controller.project.Project.add_node_from_template", return_value={"name": "test", "node_type": "qemu", "compute_id": "example.com"}) as mock:
response = http_controller.post("/projects/{}/templates/{}".format(project.id, id), {
response = await controller_api.post("/projects/{}/templates/{}".format(project.id, id), {
"x": 42,
"y": 12
})
+20 -24
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015 GNS3 Technologies Inc.
# Copyright (C) 2020 GNS3 Technologies Inc.
#
# 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
@@ -15,48 +15,44 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
This test suite check /version endpoint
It's also used for unittest the HTTP implementation.
"""
from gns3server.config import Config
from gns3server.version import __version__
def test_version_output(http_controller):
config = Config.instance()
config.set("Server", "local", "true")
async def test_version_output(controller_api, config):
response = http_controller.get('/version', example=True)
config.set("Server", "local", "true")
response = await controller_api.get('/version')
assert response.status == 200
assert response.json == {'local': True, 'version': __version__}
def test_version_input(http_controller):
query = {'version': __version__}
response = http_controller.post('/version', query, example=True)
async def test_version_input(controller_api):
params = {'version': __version__}
response = await controller_api.post('/version', params)
assert response.status == 200
assert response.json == {'version': __version__}
def test_version_invalid_input(http_controller):
query = {'version': "0.4.2"}
response = http_controller.post('/version', query)
assert response.status == 409
async def test_version_invalid_input(controller_api):
params = {'version': "0.4.2"}
response = await controller_api.post('/version', params)
assert response.status == 409
assert response.json == {'message': 'Client version 0.4.2 is not the same as server version {}'.format(__version__),
'status': 409}
def test_version_invalid_input_schema(http_controller):
query = {'version': "0.4.2", "bla": "blu"}
response = http_controller.post('/version', query)
async def test_version_invalid_input_schema(controller_api):
params = {'version': "0.4.2", "bla": "blu"}
response = await controller_api.post('/version', params)
assert response.status == 400
def test_version_invalid_json(http_controller):
query = "BOUM"
response = http_controller.post('/version', query, raw=True)
async def test_version_invalid_json(controller_api):
params = "BOUM"
response = await controller_api.post('/version', params, raw=True)
assert response.status == 400