This repository has been archived on 2024-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
devicehub-teal/tests/test_workbench.py

356 lines
13 KiB
Python
Raw Permalink Normal View History

"""Tests that emulates the behaviour of a WorkbenchServer."""
import json
2022-07-19 10:27:10 +00:00
import math
import pathlib
2018-06-19 16:38:42 +00:00
import pytest
2018-06-10 16:47:49 +00:00
from ereuse_devicehub.client import UserClient
from ereuse_devicehub.resources.action import models as em
2022-07-19 10:27:10 +00:00
from ereuse_devicehub.resources.action.models import (
BenchmarkProcessor,
BenchmarkRamSysbench,
RateComputer,
)
from ereuse_devicehub.resources.device.exceptions import NeedsId
2018-06-10 16:47:49 +00:00
from ereuse_devicehub.resources.device.models import Device
2018-06-19 16:38:42 +00:00
from ereuse_devicehub.resources.tag.model import Tag
2022-09-02 10:42:26 +00:00
from tests import conftest
2022-12-19 19:03:34 +00:00
from tests.conftest import file, file_workbench, json_encode, yaml2json
2018-06-10 16:47:49 +00:00
@pytest.mark.mvp
2022-09-02 10:42:26 +00:00
@pytest.mark.usefixtures(conftest.app_context.__name__)
2018-06-19 16:38:42 +00:00
def test_workbench_server_condensed(user: UserClient):
"""As :def:`.test_workbench_server_phases` but all the actions
2018-06-19 16:38:42 +00:00
condensed in only one big ``Snapshot`` file, as described
in the docs.
"""
2021-07-02 15:40:20 +00:00
s = yaml2json('workbench-server-1.snapshot')
s['device']['actions'].append(yaml2json('workbench-server-2.stress-test'))
2022-07-19 10:27:10 +00:00
s['components'][4]['actions'].extend(
(yaml2json('workbench-server-3.erase'), yaml2json('workbench-server-4.install'))
)
2021-07-02 15:40:20 +00:00
s['components'][5]['actions'].append(yaml2json('workbench-server-3.erase'))
2018-06-19 16:38:42 +00:00
# Create tags
2018-09-20 07:28:52 +00:00
for t in s['device']['tags']:
user.post({'id': t['id']}, res=Tag)
2021-07-02 15:40:20 +00:00
snapshot, _ = user.post(res=em.Snapshot, data=json_encode(s))
2021-04-16 11:25:41 +00:00
pc_id = snapshot['device']['id']
cpu_id = snapshot['components'][3]['id']
2022-07-19 10:27:10 +00:00
ssd_id = snapshot['components'][4]['id']
2021-04-16 11:25:41 +00:00
hdd_id = snapshot['components'][5]['id']
actions = snapshot['actions']
assert {(action['type'], action['device']) for action in actions} == {
2021-04-16 11:25:41 +00:00
('BenchmarkProcessorSysbench', cpu_id),
('StressTest', pc_id),
('EraseSectors', ssd_id),
('BenchmarkRamSysbench', pc_id),
('BenchmarkProcessor', cpu_id),
('Install', ssd_id),
('EraseSectors', hdd_id),
('BenchmarkDataStorage', ssd_id),
('BenchmarkDataStorage', hdd_id),
('TestDataStorage', ssd_id),
2018-06-19 16:38:42 +00:00
}
assert snapshot['closed']
assert snapshot['severity'] == 'Info'
2022-09-02 10:42:26 +00:00
db_dev = Device.query.filter_by(id=snapshot['device']['id']).one()
device, _ = user.get(res=Device, item=db_dev.devicehub_id)
assert device['dataStorageSize'] == 1100
assert device['chassis'] == 'Tower'
2022-12-19 19:03:34 +00:00
assert device['hid'] == 'desktop-d1mr-d1ml-d1s'
assert device['graphicCardModel'] == device['components'][0]['model'] == 'gc1-1ml'
assert device['networkSpeeds'] == [1000, 58]
assert device['processorModel'] == device['components'][3]['model'] == 'p1-1ml'
assert device['ramSize'] == 2048, 'There are 3 RAM: 2 x 1024 and 1 None sizes'
# TODO JN why haven't same order in actions on each execution?
2022-07-19 10:27:10 +00:00
assert any(
[
ac['type'] in [BenchmarkProcessor.t, BenchmarkRamSysbench.t]
for ac in device['actions']
]
)
assert 'tag1' not in [x['id'] for x in device['tags']]
2018-06-19 16:38:42 +00:00
@pytest.mark.xfail(reason='Functionality not yet developed.')
2018-06-10 16:47:49 +00:00
def test_workbench_server_phases(user: UserClient):
"""Tests the phases described in the docs section `Snapshots from
2018-06-10 16:47:49 +00:00
Workbench <http://devicehub.ereuse.org/
actions.html#snapshots-from-workbench>`_.
2018-06-10 16:47:49 +00:00
"""
# 1. Snapshot with sync / rate / benchmarks / test data storage
2021-07-02 15:40:20 +00:00
s = yaml2json('workbench-server-1.snapshot')
snapshot, _ = user.post(res=em.Snapshot, data=json_encode(s))
assert not snapshot['closed'], 'Snapshot must be waiting for the new actions'
2018-06-10 16:47:49 +00:00
# 2. stress test
2021-07-02 15:40:20 +00:00
st = yaml2json('workbench-server-2.stress-test')
2018-06-10 16:47:49 +00:00
st['snapshot'] = snapshot['id']
stress_test, _ = user.post(res=em.StressTest, data=st)
2018-06-10 16:47:49 +00:00
# 3. erase
ssd_id, hdd_id = snapshot['components'][4]['id'], snapshot['components'][5]['id']
2021-07-02 15:40:20 +00:00
e = yaml2json('workbench-server-3.erase')
2018-06-10 16:47:49 +00:00
e['snapshot'], e['device'] = snapshot['id'], ssd_id
erase1, _ = user.post(res=em.EraseSectors, data=e)
2018-06-10 16:47:49 +00:00
# 3 bis. a second erase
2021-07-02 15:40:20 +00:00
e = yaml2json('workbench-server-3.erase')
2018-06-10 16:47:49 +00:00
e['snapshot'], e['device'] = snapshot['id'], hdd_id
erase2, _ = user.post(res=em.EraseSectors, data=e)
2018-06-10 16:47:49 +00:00
# 4. Install
2021-07-02 15:40:20 +00:00
i = yaml2json('workbench-server-4.install')
2018-06-10 16:47:49 +00:00
i['snapshot'], i['device'] = snapshot['id'], ssd_id
install, _ = user.post(res=em.Install, data=i)
2018-06-10 16:47:49 +00:00
# Check actions have been appended in Snapshot and devices
2018-06-10 16:47:49 +00:00
# and that Snapshot is closed
snapshot, _ = user.get(res=em.Snapshot, item=snapshot['id'])
actions = snapshot['actions']
assert len(actions) == 9
assert actions[0]['type'] == 'Rate'
assert actions[0]['device'] == 1
assert actions[0]['closed']
assert actions[0]['type'] == 'RateComputer'
assert actions[0]['device'] == 1
assert actions[1]['type'] == 'BenchmarkProcessor'
assert actions[1]['device'] == 5
assert actions[2]['type'] == 'BenchmarkProcessorSysbench'
assert actions[2]['device'] == 5
assert actions[3]['type'] == 'BenchmarkDataStorage'
assert actions[3]['device'] == 6
assert actions[4]['type'] == 'TestDataStorage'
assert actions[4]['device'] == 6
assert actions[4]['type'] == 'BenchmarkDataStorage'
assert actions[4]['device'] == 7
assert actions[5]['type'] == 'StressTest'
assert actions[5]['device'] == 1
assert actions[6]['type'] == 'EraseSectors'
assert actions[6]['device'] == 6
assert actions[7]['type'] == 'EraseSectors'
assert actions[7]['device'] == 7
assert actions[8]['type'] == 'Install'
assert actions[8]['device'] == 6
2018-06-10 16:47:49 +00:00
assert snapshot['closed']
assert snapshot['severity'] == 'Info'
2018-06-10 16:47:49 +00:00
2021-03-08 21:43:24 +00:00
pc, _ = user.get(res=Device, item=snapshot['devicehubID'])
assert len(pc['actions']) == 10 # todo shall I add child actions?
2018-07-02 10:52:54 +00:00
@pytest.mark.mvp
2018-07-02 10:52:54 +00:00
def test_real_hp_11(user: UserClient):
s = file('real-hp.snapshot.11')
snapshot, _ = user.post(res=em.Snapshot, data=s)
pc = snapshot['device']
2022-12-19 19:03:34 +00:00
assert pc['hid'] == 'desktop-hewlett-packard-hp_compaq_8100_elite_sff-czc0408yjg'
assert pc['chassis'] == 'Tower'
assert set(e['type'] for e in snapshot['actions']) == {
2018-07-02 10:52:54 +00:00
'BenchmarkDataStorage',
'BenchmarkProcessor',
'BenchmarkProcessorSysbench',
'TestDataStorage',
'BenchmarkRamSysbench',
'StressTest',
2019-05-08 17:12:05 +00:00
'TestBios',
2022-07-19 10:27:10 +00:00
'VisualTest',
2018-07-02 10:52:54 +00:00
}
2022-03-29 16:42:43 +00:00
assert len(list(e['type'] for e in snapshot['actions'])) == 8
assert pc['networkSpeeds'] == [1000, None], 'Device has no WiFi'
assert pc['processorModel'] == 'intel core i3 cpu 530 @ 2.93ghz'
assert pc['ramSize'] == 8192
assert pc['dataStorageSize'] == 305245
2018-10-23 14:24:26 +00:00
# todo check rating
2018-07-02 10:52:54 +00:00
@pytest.mark.mvp
2018-07-02 10:52:54 +00:00
def test_real_toshiba_11(user: UserClient):
s = file('real-toshiba.snapshot.11')
snapshot, _ = user.post(res=em.Snapshot, data=s)
@pytest.mark.mvp
2022-09-02 10:42:26 +00:00
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_snapshot_real_eee_1001pxd_with_rate(user: UserClient):
"""Checks the values of the device, components,
actions and their relationships of a real pc.
"""
s = file('real-eee-1001pxd.snapshot.11')
snapshot, _ = user.post(res=em.Snapshot, data=s)
2022-09-02 10:42:26 +00:00
dev = Device.query.filter_by(id=snapshot['device']['id']).one()
pc, _ = user.get(res=Device, item=dev.devicehub_id)
assert pc['type'] == 'Laptop'
assert pc['chassis'] == 'Netbook'
assert pc['model'] == '1001pxd'
assert pc['serialNumber'] == 'b8oaas048286'
assert pc['manufacturer'] == 'asustek computer inc.'
2022-12-19 19:03:34 +00:00
assert pc['hid'] == 'laptop-asustek_computer_inc.-1001pxd-b8oaas048286'
2022-07-20 12:58:32 +00:00
assert len(pc['tags']) == 0
2022-07-19 10:27:10 +00:00
assert pc['networkSpeeds'] == [
100,
0,
], 'Although it has WiFi we do not know the speed'
# assert pc['actions'][0]['appearanceRange'] == 'A'
# assert pc['actions'][0]['functionalityRange'] == 'B'
# TODO add appearance and functionality Range in device[rate]
components = snapshot['components']
wifi = components[0]
2022-07-19 10:27:10 +00:00
assert (
wifi['hid'] == 'networkadapter-qualcomm_atheros-'
2022-12-19 19:03:34 +00:00
'ar9285_wireless_network_adapter-74:2f:68:8b:fd:c8'
2022-07-19 10:27:10 +00:00
)
assert wifi['serialNumber'] == '74:2f:68:8b:fd:c8'
assert wifi['wireless']
eth = components[1]
2022-07-19 10:27:10 +00:00
assert (
eth['hid'] == 'networkadapter-qualcomm_atheros-'
2022-12-19 19:03:34 +00:00
'ar8152_v2.0_fast_ethernet-14:da:e9:42:f6:7c'
2022-07-19 10:27:10 +00:00
)
assert eth['speed'] == 100
assert not eth['wireless']
cpu = components[2]
assert cpu['address'] == 64
assert cpu['cores'] == 1
assert cpu['threads'] == 1
assert cpu['speed'] == 1.667
2022-12-19 19:03:34 +00:00
assert 'hid' in cpu
assert pc['processorModel'] == cpu['model'] == 'intel atom cpu n455 @ 1.66ghz'
2022-09-02 10:42:26 +00:00
db_cpu = Device.query.filter_by(id=cpu['id']).one()
cpu, _ = user.get(res=Device, item=db_cpu.devicehub_id)
actions = cpu['actions']
sysbench = next(e for e in actions if e['type'] == em.BenchmarkProcessorSysbench.t)
assert sysbench['elapsed'] == 164
2018-11-27 18:06:28 +00:00
assert math.isclose(sysbench['rate'], 164, rel_tol=0.001)
assert sysbench['snapshot'] == snapshot['id']
assert sysbench['device'] == cpu['id']
assert sysbench['parent'] == pc['id']
benchmark_cpu = next(e for e in actions if e['type'] == em.BenchmarkProcessor.t)
2018-11-27 18:06:28 +00:00
assert math.isclose(benchmark_cpu['rate'], 6666, rel_tol=0.001)
assert benchmark_cpu['elapsed'] == 0
action_types = tuple(e['type'] for e in actions)
assert em.BenchmarkRamSysbench.t in action_types
assert em.StressTest.t in action_types
assert em.Snapshot.t in action_types
2022-03-29 16:42:43 +00:00
assert len(actions) == 6
gpu = components[3]
2022-07-19 10:27:10 +00:00
assert (
gpu['model']
== 'atom processor d4xx/d5xx/n4xx/n5xx integrated graphics controller'
)
assert gpu['manufacturer'] == 'intel corporation'
assert gpu['memory'] == 256
2022-09-02 10:42:26 +00:00
db_gpu = Device.query.filter_by(id=gpu['id']).one()
gpu, _ = user.get(res=Device, item=db_gpu.devicehub_id)
action_types = tuple(e['type'] for e in gpu['actions'])
assert em.BenchmarkRamSysbench.t in action_types
assert em.StressTest.t in action_types
assert em.Snapshot.t in action_types
2022-03-29 16:42:43 +00:00
assert len(action_types) == 4
sound = components[4]
assert sound['model'] == 'nm10/ich7 family high definition audio controller'
sound = components[5]
assert sound['model'] == 'usb 2.0 uvc vga webcam'
ram = components[6]
assert ram['interface'] == 'DDR2'
assert ram['speed'] == 667
assert pc['ramSize'] == ram['size'] == 1024
hdd = components[7]
assert hdd['type'] == 'HardDrive'
2019-01-02 16:52:43 +00:00
assert hdd['hid'] == 'harddrive-hitachi-hts54322-e2024242cv86hj'
assert hdd['interface'] == 'ATA'
assert hdd['size'] == 238475
2022-09-02 10:42:26 +00:00
db_hdd = Device.query.filter_by(id=hdd['id']).one()
hdd, _ = user.get(res=Device, item=db_hdd.devicehub_id)
action_types = tuple(e['type'] for e in hdd['actions'])
assert em.BenchmarkRamSysbench.t in action_types
assert em.StressTest.t in action_types
assert em.BenchmarkDataStorage.t in action_types
assert em.TestDataStorage.t in action_types
assert em.EraseBasic.t in action_types
assert em.Snapshot.t in action_types
2022-03-29 16:42:43 +00:00
assert len(action_types) == 7
erase = next(e for e in hdd['actions'] if e['type'] == em.EraseBasic.t)
assert erase['endTime']
assert erase['startTime']
assert erase['severity'] == 'Info'
2018-11-27 18:06:28 +00:00
assert hdd['privacy']['type'] == 'EraseBasic'
mother = components[8]
2022-12-19 19:03:34 +00:00
assert mother['hid'] == 'motherboard-asustek_computer_inc.-1001pxd-eee0123456789'
@pytest.mark.mvp
def test_real_custom(user: UserClient):
s = file('real-custom.snapshot.11')
snapshot, _ = user.post(res=em.Snapshot, data=s, status=201)
# todo insert with tag
@pytest.mark.mvp
def test_real_hp_quad_core(user: UserClient):
s = file('real-hp-quad-core.snapshot.11')
snapshot, _ = user.post(res=em.Snapshot, data=s)
@pytest.mark.mvp
def test_real_eee_1000h(user: UserClient):
s = file('asus-eee-1000h.snapshot.11')
snapshot, _ = user.post(res=em.Snapshot, data=s)
SNAPSHOTS_NEED_ID = {
'core2.snapshot.json',
'asus-all-series.snapshot.json',
'all-series.snapshot.json',
'nox.snapshot.json',
'ecs-computers.snapshot.json',
'custom.snapshot.json',
2022-07-19 10:27:10 +00:00
'ecs-2.snapshot.json',
}
"""Snapshots that do not generate HID requiring a custom ID."""
@pytest.mark.mvp
2022-07-19 10:27:10 +00:00
@pytest.mark.parametrize(
'file',
(
pytest.param(f, id=f.name)
for f in pathlib.Path(__file__).parent.joinpath('workbench_files').iterdir()
),
)
def test_workbench_fixtures(file: pathlib.Path, user: UserClient):
"""Uploads the Snapshot files Workbench tests generate.
Keep this files up to date with the Workbench version.
"""
s = json.load(file.open())
2022-07-19 10:27:10 +00:00
user.post(res=em.Snapshot, data=json_encode(s), status=201)
2018-10-14 21:56:54 +00:00
@pytest.mark.mvp
2018-10-14 21:56:54 +00:00
def test_workbench_asus_1001pxd_rate_low(user: UserClient):
"""Tests an Asus 1001pxd with a low rate."""
s = file('asus-1001pxd.snapshot')
snapshot, _ = user.post(res=em.Snapshot, data=s)
@pytest.mark.mvp
def test_david(user: UserClient):
s = file('david.lshw.snapshot')
snapshot, _ = user.post(res=em.Snapshot, data=s)
def test_eresueprice_computer_type(user: UserClient):
s = file_workbench('computer-type.snapshot')
snapshot, _ = user.post(res=em.Snapshot, data=s)
def test_workbench_encoded_snapshot(user: UserClient):
s = file_workbench('encoded.snapshot')
snapshot, _ = user.post(res=em.Snapshot, data=s)