1 # Simple functional tests for VNC functionality
3 # Copyright (c) 2018 Red Hat, Inc.
6 # Cleber Rosa <crosa@redhat.com>
8 # This work is licensed under the terms of the GNU GPL, version 2 or
9 # later. See the COPYING file in the top-level directory.
12 from typing
import List
14 from avocado_qemu
import QemuSystemTest
17 VNC_ADDR
= '127.0.0.1'
18 VNC_PORT_START
= 32768
19 VNC_PORT_END
= VNC_PORT_START
+ 1024
22 def check_bind(port
: int) -> bool:
23 with socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
) as sock
:
25 sock
.bind((VNC_ADDR
, port
))
32 def check_connect(port
: int) -> bool:
33 with socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
) as sock
:
35 sock
.connect((VNC_ADDR
, port
))
36 except ConnectionRefusedError
:
42 def find_free_ports(count
: int) -> List
[int]:
44 for port
in range(VNC_PORT_START
, VNC_PORT_END
):
47 if len(result
) >= count
:
49 assert len(result
) == count
53 class Vnc(QemuSystemTest
):
55 :avocado: tags=vnc,quick
57 def test_no_vnc(self
):
58 self
.vm
.add_args('-nodefaults', '-S')
60 self
.assertFalse(self
.vm
.qmp('query-vnc')['return']['enabled'])
62 def test_no_vnc_change_password(self
):
63 self
.vm
.add_args('-nodefaults', '-S')
65 self
.assertFalse(self
.vm
.qmp('query-vnc')['return']['enabled'])
66 set_password_response
= self
.vm
.qmp('change-vnc-password',
67 password
='new_password')
68 self
.assertIn('error', set_password_response
)
69 self
.assertEqual(set_password_response
['error']['class'],
71 self
.assertEqual(set_password_response
['error']['desc'],
72 'Could not set password')
74 def test_change_password_requires_a_password(self
):
75 self
.vm
.add_args('-nodefaults', '-S', '-vnc', ':0')
77 self
.assertTrue(self
.vm
.qmp('query-vnc')['return']['enabled'])
78 set_password_response
= self
.vm
.qmp('change-vnc-password',
79 password
='new_password')
80 self
.assertIn('error', set_password_response
)
81 self
.assertEqual(set_password_response
['error']['class'],
83 self
.assertEqual(set_password_response
['error']['desc'],
84 'Could not set password')
86 def test_change_password(self
):
87 self
.vm
.add_args('-nodefaults', '-S', '-vnc', ':0,password=on')
89 self
.assertTrue(self
.vm
.qmp('query-vnc')['return']['enabled'])
90 set_password_response
= self
.vm
.qmp('change-vnc-password',
91 password
='new_password')
92 self
.assertEqual(set_password_response
['return'], {})
94 def test_change_listen(self
):
95 a
, b
, c
= find_free_ports(3)
96 self
.assertFalse(check_connect(a
))
97 self
.assertFalse(check_connect(b
))
98 self
.assertFalse(check_connect(c
))
100 self
.vm
.add_args('-nodefaults', '-S', '-vnc', f
'{VNC_ADDR}:{a - 5900}')
102 self
.assertEqual(self
.vm
.qmp('query-vnc')['return']['service'], str(a
))
103 self
.assertTrue(check_connect(a
))
104 self
.assertFalse(check_connect(b
))
105 self
.assertFalse(check_connect(c
))
107 res
= self
.vm
.qmp('display-update', type='vnc',
108 addresses
=[{'type': 'inet', 'host': VNC_ADDR
,
110 {'type': 'inet', 'host': VNC_ADDR
,
112 self
.assertEqual(res
['return'], {})
113 self
.assertEqual(self
.vm
.qmp('query-vnc')['return']['service'], str(b
))
114 self
.assertFalse(check_connect(a
))
115 self
.assertTrue(check_connect(b
))
116 self
.assertTrue(check_connect(c
))