blob: aeeefc70be256594372bdf9b74f11b2d35e8ea55 [file] [log] [blame]
Cleber Rosa7b1bd112018-05-30 14:41:54 -04001# Simple functional tests for VNC functionality
2#
3# Copyright (c) 2018 Red Hat, Inc.
4#
5# Author:
6# Cleber Rosa <crosa@redhat.com>
7#
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.
10
Vladimir Sementsov-Ogievskiy0d90da82022-04-01 17:39:36 +030011import socket
12from typing import List
13
Philippe Mathieu-Daudé2283b622021-09-27 18:14:33 +020014from avocado_qemu import QemuSystemTest
Cleber Rosa7b1bd112018-05-30 14:41:54 -040015
16
Vladimir Sementsov-Ogievskiy0d90da82022-04-01 17:39:36 +030017VNC_ADDR = '127.0.0.1'
18VNC_PORT_START = 32768
19VNC_PORT_END = VNC_PORT_START + 1024
20
21
22def check_bind(port: int) -> bool:
23 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
24 try:
25 sock.bind((VNC_ADDR, port))
26 except OSError:
27 return False
28
29 return True
30
31
32def check_connect(port: int) -> bool:
33 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
34 try:
35 sock.connect((VNC_ADDR, port))
36 except ConnectionRefusedError:
37 return False
38
39 return True
40
41
42def find_free_ports(count: int) -> List[int]:
43 result = []
44 for port in range(VNC_PORT_START, VNC_PORT_END):
45 if check_bind(port):
46 result.append(port)
47 if len(result) >= count:
48 break
49 assert len(result) == count
50 return result
51
52
Philippe Mathieu-Daudé2283b622021-09-27 18:14:33 +020053class Vnc(QemuSystemTest):
Cleber Rosa7b1bd112018-05-30 14:41:54 -040054 """
Cleber Rosa7b1bd112018-05-30 14:41:54 -040055 :avocado: tags=vnc,quick
Alex Bennée5104b732022-10-27 19:36:24 +010056 :avocado: tags=machine:none
Cleber Rosa7b1bd112018-05-30 14:41:54 -040057 """
58 def test_no_vnc(self):
59 self.vm.add_args('-nodefaults', '-S')
60 self.vm.launch()
61 self.assertFalse(self.vm.qmp('query-vnc')['return']['enabled'])
62
63 def test_no_vnc_change_password(self):
64 self.vm.add_args('-nodefaults', '-S')
65 self.vm.launch()
66 self.assertFalse(self.vm.qmp('query-vnc')['return']['enabled'])
Paolo Bonzini3e3267a2021-01-21 08:55:12 -050067 set_password_response = self.vm.qmp('change-vnc-password',
68 password='new_password')
Cleber Rosa7b1bd112018-05-30 14:41:54 -040069 self.assertIn('error', set_password_response)
70 self.assertEqual(set_password_response['error']['class'],
71 'GenericError')
72 self.assertEqual(set_password_response['error']['desc'],
73 'Could not set password')
74
Cleber Rosa41a7af12019-06-07 11:22:21 -040075 def test_change_password_requires_a_password(self):
Cleber Rosa7b1bd112018-05-30 14:41:54 -040076 self.vm.add_args('-nodefaults', '-S', '-vnc', ':0')
77 self.vm.launch()
78 self.assertTrue(self.vm.qmp('query-vnc')['return']['enabled'])
Paolo Bonzini3e3267a2021-01-21 08:55:12 -050079 set_password_response = self.vm.qmp('change-vnc-password',
80 password='new_password')
Cleber Rosa7b1bd112018-05-30 14:41:54 -040081 self.assertIn('error', set_password_response)
82 self.assertEqual(set_password_response['error']['class'],
83 'GenericError')
84 self.assertEqual(set_password_response['error']['desc'],
85 'Could not set password')
86
Cleber Rosa41a7af12019-06-07 11:22:21 -040087 def test_change_password(self):
Cleber Rosa0f981d82021-09-24 14:54:58 -040088 self.vm.add_args('-nodefaults', '-S', '-vnc', ':0,password=on')
Cleber Rosa7b1bd112018-05-30 14:41:54 -040089 self.vm.launch()
90 self.assertTrue(self.vm.qmp('query-vnc')['return']['enabled'])
Paolo Bonzini3e3267a2021-01-21 08:55:12 -050091 set_password_response = self.vm.qmp('change-vnc-password',
92 password='new_password')
Cleber Rosa7b1bd112018-05-30 14:41:54 -040093 self.assertEqual(set_password_response['return'], {})
Vladimir Sementsov-Ogievskiy0d90da82022-04-01 17:39:36 +030094
95 def test_change_listen(self):
96 a, b, c = find_free_ports(3)
97 self.assertFalse(check_connect(a))
98 self.assertFalse(check_connect(b))
99 self.assertFalse(check_connect(c))
100
101 self.vm.add_args('-nodefaults', '-S', '-vnc', f'{VNC_ADDR}:{a - 5900}')
102 self.vm.launch()
103 self.assertEqual(self.vm.qmp('query-vnc')['return']['service'], str(a))
104 self.assertTrue(check_connect(a))
105 self.assertFalse(check_connect(b))
106 self.assertFalse(check_connect(c))
107
108 res = self.vm.qmp('display-update', type='vnc',
109 addresses=[{'type': 'inet', 'host': VNC_ADDR,
110 'port': str(b)},
111 {'type': 'inet', 'host': VNC_ADDR,
112 'port': str(c)}])
113 self.assertEqual(res['return'], {})
114 self.assertEqual(self.vm.qmp('query-vnc')['return']['service'], str(b))
115 self.assertFalse(check_connect(a))
116 self.assertTrue(check_connect(b))
117 self.assertTrue(check_connect(c))