xref: /aosp_15_r20/external/autotest/client/cros/multimedia/webrtc_utils.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Lint as: python2, python3
2*9c5db199SXin Li# Copyright 2016 The Chromium OS Authors. All rights reserved.
3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
4*9c5db199SXin Li# found in the LICENSE file.
5*9c5db199SXin Li
6*9c5db199SXin Li"""Utils for webrtc-related functionality.
7*9c5db199SXin Li
8*9c5db199SXin LiNote that this module is shared by both server side and client side.
9*9c5db199SXin LiDo not put something only usable in client side in this module.
10*9c5db199SXin Li
11*9c5db199SXin Li"""
12*9c5db199SXin Li
13*9c5db199SXin Lifrom __future__ import absolute_import
14*9c5db199SXin Lifrom __future__ import division
15*9c5db199SXin Lifrom __future__ import print_function
16*9c5db199SXin Liimport logging
17*9c5db199SXin Liimport time
18*9c5db199SXin Liimport uuid
19*9c5db199SXin Liimport six
20*9c5db199SXin Li
21*9c5db199SXin Li
22*9c5db199SXin Liclass AppRTCParameters(object):
23*9c5db199SXin Li    """Class to hold parameters for AppRTC webpage."""
24*9c5db199SXin Li    def __init__(self):
25*9c5db199SXin Li        """Initializes an AppRTCParameters."""
26*9c5db199SXin Li        self.debug = 'loopback'
27*9c5db199SXin Li        self.audio = {'googEchoCancellation': False,
28*9c5db199SXin Li                      'googAutoGainControl': False,
29*9c5db199SXin Li                      'googNoiseReduction': False}
30*9c5db199SXin Li
31*9c5db199SXin Li
32*9c5db199SXin Li    def _get_audio_parameter_string(self):
33*9c5db199SXin Li        """Converts the audio parameters into parameter string used in URL.
34*9c5db199SXin Li
35*9c5db199SXin Li        @return: Audio parameter string like "audio=googEchoCancellation=False,..."
36*9c5db199SXin Li
37*9c5db199SXin Li        """
38*9c5db199SXin Li        audio_params = []
39*9c5db199SXin Li        for key, value in six.iteritems(self.audio):
40*9c5db199SXin Li            audio_params.append('%s=%s' % (key, 'true' if value else 'false'))
41*9c5db199SXin Li        audio_params_str = ','.join(audio_params)
42*9c5db199SXin Li        return audio_params_str
43*9c5db199SXin Li
44*9c5db199SXin Li
45*9c5db199SXin Li    def get_parameter_string(self):
46*9c5db199SXin Li        """Converts the parameters into parameter string used in URL.
47*9c5db199SXin Li
48*9c5db199SXin Li        @return: Parameter string used in URL.
49*9c5db199SXin Li
50*9c5db199SXin Li        """
51*9c5db199SXin Li        param_str = '?debug=%s' % self.debug
52*9c5db199SXin Li        param_str += '&'
53*9c5db199SXin Li        param_str += 'audio=' + self._get_audio_parameter_string()
54*9c5db199SXin Li        return param_str
55*9c5db199SXin Li
56*9c5db199SXin Li
57*9c5db199SXin Liclass AppRTCController(object):
58*9c5db199SXin Li    """Class to control AppRTC webpage."""
59*9c5db199SXin Li
60*9c5db199SXin Li    BASE_URL = 'https://appr.tc/r/'
61*9c5db199SXin Li    WAIT_FOR_JOIN_CALL_SECS = 10
62*9c5db199SXin Li    CLICK_JOIN_BUTTON_TIMEOUT_SECS = 10
63*9c5db199SXin Li
64*9c5db199SXin Li    def __init__(self, browser_facade):
65*9c5db199SXin Li        """Initializes an AppRTCController.
66*9c5db199SXin Li
67*9c5db199SXin Li        @param browser_facade: A BrowserFacadeLocal (for client side) or
68*9c5db199SXin Li                               BrowserFacadeAdapter (for server side).
69*9c5db199SXin Li
70*9c5db199SXin Li        """
71*9c5db199SXin Li        # Only use default parameters for now. If different parameter is needed
72*9c5db199SXin Li        # we can takes an AppRTCParameters from argument.
73*9c5db199SXin Li        self.param = AppRTCParameters()
74*9c5db199SXin Li        self.browser_facade = browser_facade
75*9c5db199SXin Li
76*9c5db199SXin Li
77*9c5db199SXin Li    def new_apprtc_loopback_page(self):
78*9c5db199SXin Li        """Loads a AppRTC webpage in a new tab with loopback enabled."""
79*9c5db199SXin Li        room_name = str(uuid.uuid4())
80*9c5db199SXin Li        url = self.BASE_URL + room_name + self.param.get_parameter_string()
81*9c5db199SXin Li        logging.debug('Open AppRTC loopback page %s', url)
82*9c5db199SXin Li        tab_desc = self.browser_facade.new_tab(url)
83*9c5db199SXin Li        self.click_join_button(tab_desc)
84*9c5db199SXin Li        # After clicking join button, it takes some time to actually join the
85*9c5db199SXin Li        # call.
86*9c5db199SXin Li        time.sleep(self.WAIT_FOR_JOIN_CALL_SECS)
87*9c5db199SXin Li
88*9c5db199SXin Li
89*9c5db199SXin Li    def click_join_button(self, tab_desc):
90*9c5db199SXin Li        """Clicks 'join' button on the webpage.
91*9c5db199SXin Li
92*9c5db199SXin Li        @param tab_desc: Tab descriptor returned by new_tab of browser facade.
93*9c5db199SXin Li
94*9c5db199SXin Li        """
95*9c5db199SXin Li        click_button_js = """document.getElementById('confirm-join-button').click();"""
96*9c5db199SXin Li        self.browser_facade.execute_javascript(
97*9c5db199SXin Li                tab_desc, click_button_js, self.CLICK_JOIN_BUTTON_TIMEOUT_SECS)
98