1# encoding=utf-8
2#
3# Copyright (C) 2013 Red Hat, Inc.
4#
5# This work is licensed under the GNU GPLv2 or later.
6# See the COPYING file in the top-level directory.
7
8import os.path
9
10import pytest
11
12from virtinst import Guest
13from virtinst import NodeDevice
14from virtinst import DeviceHostdev
15
16from tests import utils
17
18# Requires XML_SANITIZE to parse correctly, see bug 1184131
19funky_chars_xml = """
20<device>
21  <name>L3B2616</name>
22  <capability type='LENOVOá'/>
23</device>
24"""
25
26DATADIR = utils.DATADIR + "/nodedev/"
27
28
29def _nodeDevFromName(conn, devname):
30    node = conn.nodeDeviceLookupByName(devname)
31    xml = node.XMLDesc(0)
32    return NodeDevice(conn, xml)
33
34
35def _testNode2DeviceCompare(conn, nodename, devfile, nodedev=None):
36    devfile = os.path.join(DATADIR, "devxml", devfile)
37    if not nodedev:
38        nodedev = _nodeDevFromName(conn, nodename)
39
40    dev = DeviceHostdev(conn)
41    dev.set_from_nodedev(nodedev)
42    dev.set_defaults(Guest(conn))
43    utils.diff_compare(dev.get_xml() + "\n", devfile)
44
45
46def testFunkyChars():
47    # Ensure parsing doesn't fail
48    conn = utils.URIs.open_testdriver_cached()
49    dev = NodeDevice(conn, funky_chars_xml)
50    assert dev.name == "L3B2616"
51    assert dev.device_type == "LENOVO"
52
53
54def testNetDevice():
55    conn = utils.URIs.open_testdriver_cached()
56    devname = "net_00_1c_25_10_b1_e4"
57    dev = _nodeDevFromName(conn, devname)
58    assert dev.name == devname
59    assert dev.parent == "pci_8086_1049"
60    assert dev.device_type == "net"
61    assert dev.interface == "eth0"
62
63
64def testPCIDevice():
65    conn = utils.URIs.open_testdriver_cached()
66    nodename = "pci_8086_10fb"
67    obj = _nodeDevFromName(conn, nodename)
68    assert obj.is_pci_sriov() is True
69    nodename = "pci_8086_2448"
70    obj = _nodeDevFromName(conn, nodename)
71    assert obj.is_pci_bridge() is True
72
73
74
75def testUSBDevDevice():
76    conn = utils.URIs.open_testdriver_cached()
77    devname = "usb_device_781_5151_2004453082054CA1BEEE"
78    dev = _nodeDevFromName(conn, devname)
79    assert dev.vendor_name == "SanDisk Corp."
80    assert dev.product_name == "Cruzer Micro 256/512MB Flash Drive"
81
82    devname = "usb_device_1d6b_1_0000_00_1a_0"
83    dev = _nodeDevFromName(conn, devname)
84    assert dev.is_usb_linux_root_hub() is True
85
86
87def testSCSIDevice():
88    conn = utils.URIs.open_testdriver_cached()
89    devname = "pci_8086_2829_scsi_host_scsi_device_lun0"
90    dev = _nodeDevFromName(conn, devname)
91    assert dev.host == "0"
92    assert dev.bus == "0"
93    assert dev.target == "0"
94
95
96def testStorageDevice():
97    conn = utils.URIs.open_testdriver_cached()
98    devname = "storage_serial_SATA_WDC_WD1600AAJS__WD_WCAP95119685"
99    dev = _nodeDevFromName(conn, devname)
100    assert dev.block == "/dev/sda"
101    assert dev.drive_type == "disk"
102    assert dev.media_available is None
103
104    devname = "storage_model_DVDRAM_GSA_U1200N"
105    dev = _nodeDevFromName(conn, devname)
106    assert dev.media_label == "Fedora12_media"
107    assert dev.media_available == 1
108
109
110def testSCSIBus():
111    conn = utils.URIs.open_testdriver_cached()
112    devname = "pci_8086_2829_scsi_host_1"
113    dev = _nodeDevFromName(conn, devname)
114    assert dev.host == "2"
115
116
117def testDRMDevice():
118    conn = utils.URIs.open_testdriver_cached()
119    devname = "drm_renderD129"
120    dev = _nodeDevFromName(conn, devname)
121    assert dev.devnodes[0].path == "/dev/dri/renderD129"
122    assert dev.devnodes[0].node_type == "dev"
123    assert dev.devnodes[1].path == "/dev/dri/by-path/pci-0000:00:02.0-render"
124    assert dev.devnodes[1].node_type == "link"
125    assert dev.is_drm_render() is True
126    assert dev.get_devnode("frob")
127
128
129# NodeDevice 2 Device XML tests
130
131def testNodeDev2USB1():
132    conn = utils.URIs.open_testdriver_cached()
133    nodename = "usb_device_781_5151_2004453082054CA1BEEE"
134    devfile = "usbdev1.xml"
135    _testNode2DeviceCompare(conn, nodename, devfile)
136
137
138def testNodeDev2USB2():
139    conn = utils.URIs.open_testdriver_cached()
140    nodename = "usb_device_1d6b_2_0000_00_1d_7"
141    devfile = "usbdev2.xml"
142    nodedev = _nodeDevFromName(conn, nodename)
143
144    _testNode2DeviceCompare(conn, nodename, devfile, nodedev=nodedev)
145
146
147def testNodeDev2PCI():
148    conn = utils.URIs.open_testdriver_cached()
149    nodename = "pci_1180_592"
150    devfile = "pcidev.xml"
151    _testNode2DeviceCompare(conn, nodename, devfile)
152
153
154def testNodeDevFail():
155    conn = utils.URIs.open_testdriver_cached()
156    nodename = "usb_device_1d6b_1_0000_00_1d_1_if0"
157    devfile = ""
158
159    # This should exist, since usbbus is not a valid device to
160    # pass to a guest.
161    with pytest.raises(ValueError):
162        _testNode2DeviceCompare(conn, nodename, devfile)
163