diff --git a/odoo/tests/common.py b/odoo/tests/common.py index af270c5b7f86b9ad2ec9b441f2d0545d2867bb74..2abeb7bd3a8233dcff1ee57c3824bc1642452005 100644 --- a/odoo/tests/common.py +++ b/odoo/tests/common.py @@ -6,6 +6,7 @@ helpers and classes to write tests. """ import base64 import collections +import difflib import functools import importlib import inspect @@ -14,32 +15,35 @@ import json import logging import operator import os +import pathlib import platform +import pprint import re -import requests import shutil import signal -import socket import subprocess import sys import tempfile import threading import time import unittest -import difflib -import werkzeug.urls +from collections import defaultdict from contextlib import contextmanager from datetime import datetime, date +from itertools import zip_longest as izip_longest from unittest.mock import patch +from xmlrpc import client as xmlrpclib -from collections import defaultdict +import requests +import werkzeug.urls from decorator import decorator -from itertools import zip_longest as izip_longest from lxml import etree, html -from xmlrpc import client as xmlrpclib +import odoo +from odoo import api from odoo.models import BaseModel from odoo.osv.expression import normalize_domain, TRUE_LEAF, FALSE_LEAF +from odoo.service import security from odoo.sql_db import Cursor from odoo.tools import float_compare, single_email_re from odoo.tools.misc import find_in_path @@ -52,13 +56,6 @@ except ImportError: websocket = None -import odoo -import pprint -from odoo import api -from odoo.service import security - - - _logger = logging.getLogger(__name__) # The odoo library is supposed already configured. @@ -756,8 +753,18 @@ class ChromeBrowser(): def _spawn_chrome(self, cmd): if os.name != 'posix': return + pid = os.fork() if pid != 0: + port_file = pathlib.Path(self.user_data_dir, 'DevToolsActivePort') + for _ in range(100): + time.sleep(0.1) + if port_file.is_file(): + with port_file.open('r', encoding='utf-8') as f: + self.devtools_port = int(f.readline()) + break + else: + raise unittest.SkipTest('Failed to detect chrome devtools port after 2.5s.') return pid else: if platform.system() != 'Darwin': @@ -775,11 +782,6 @@ class ChromeBrowser(): def _chrome_start(self): if self.chrome_pid is not None: return - with socket.socket() as s: - s.bind(('localhost', 0)) - if hasattr(socket, 'SO_REUSEADDR'): - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - _, self.devtools_port = s.getsockname() switches = { '--headless': '', @@ -803,9 +805,8 @@ class ChromeBrowser(): '--autoplay-policy': 'no-user-gesture-required', '--window-size': self.window_size, '--remote-debugging-address': HOST, - '--remote-debugging-port': str(self.devtools_port), + '--remote-debugging-port': '0', '--no-sandbox': '', - '--disable-crash-reporter': '', '--disable-gpu': '', } cmd = [self.executable]