xref: /qemu/tests/functional/test_vnc.py (revision 513823e7521a09ed7ad1e32e6454bac3b2cbf52d)
1#!/usr/bin/env python3
2#
3# Simple functional tests for VNC functionality
4#
5# Copyright (c) 2018 Red Hat, Inc.
6#
7# Author:
8#  Cleber Rosa <crosa@redhat.com>
9#
10# This work is licensed under the terms of the GNU GPL, version 2 or
11# later.  See the COPYING file in the top-level directory.
12
13import socket
14from typing import List
15
16from qemu_test import QemuSystemTest
17from qemu_test.ports import Ports
18
19VNC_ADDR = '127.0.0.1'
20
21def check_connect(port: int) -> bool:
22    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
23        try:
24            sock.connect((VNC_ADDR, port))
25        except ConnectionRefusedError:
26            return False
27
28    return True
29
30class Vnc(QemuSystemTest):
31
32    def test_no_vnc_change_password(self):
33        self.vm.add_args('-nodefaults', '-S')
34        self.vm.launch()
35        self.assertFalse(self.vm.qmp('query-vnc')['return']['enabled'])
36        set_password_response = self.vm.qmp('change-vnc-password',
37                                            password='new_password')
38        self.assertIn('error', set_password_response)
39        self.assertEqual(set_password_response['error']['class'],
40                         'GenericError')
41        self.assertEqual(set_password_response['error']['desc'],
42                         'Could not set password')
43
44    def test_change_password_requires_a_password(self):
45        self.vm.add_args('-nodefaults', '-S', '-vnc', ':1,to=999')
46        self.vm.launch()
47        self.assertTrue(self.vm.qmp('query-vnc')['return']['enabled'])
48        set_password_response = self.vm.qmp('change-vnc-password',
49                                            password='new_password')
50        self.assertIn('error', set_password_response)
51        self.assertEqual(set_password_response['error']['class'],
52                         'GenericError')
53        self.assertEqual(set_password_response['error']['desc'],
54                         'Could not set password')
55
56    def test_change_password(self):
57        self.vm.add_args('-nodefaults', '-S', '-vnc', ':1,to=999,password=on')
58        self.vm.launch()
59        self.assertTrue(self.vm.qmp('query-vnc')['return']['enabled'])
60        self.vm.cmd('change-vnc-password',
61                    password='new_password')
62
63    def do_test_change_listen(self, a, b, c):
64        self.assertFalse(check_connect(a))
65        self.assertFalse(check_connect(b))
66        self.assertFalse(check_connect(c))
67
68        self.vm.add_args('-nodefaults', '-S', '-vnc', f'{VNC_ADDR}:{a - 5900}')
69        self.vm.launch()
70        self.assertEqual(self.vm.qmp('query-vnc')['return']['service'], str(a))
71        self.assertTrue(check_connect(a))
72        self.assertFalse(check_connect(b))
73        self.assertFalse(check_connect(c))
74
75        self.vm.cmd('display-update', type='vnc',
76                    addresses=[{'type': 'inet', 'host': VNC_ADDR,
77                                'port': str(b)},
78                               {'type': 'inet', 'host': VNC_ADDR,
79                                'port': str(c)}])
80        self.assertEqual(self.vm.qmp('query-vnc')['return']['service'], str(b))
81        self.assertFalse(check_connect(a))
82        self.assertTrue(check_connect(b))
83        self.assertTrue(check_connect(c))
84
85    def test_change_listen(self):
86        with Ports() as ports:
87            a, b, c = ports.find_free_ports(3)
88            self.do_test_change_listen(a, b, c)
89
90
91if __name__ == '__main__':
92    QemuSystemTest.main()
93