Run CI tests in parallel (#1962)

* run car model unit tests in parallel

* remove refs to deleted file

* run with coverage

* that wasn't necessary

* as builder

* need a new route for this one too
pull/1964/head
Adeeb Shihadeh 5 years ago committed by GitHub
parent 58b167d75d
commit 9ee1cc9b82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      .coveragerc-app
  2. 6
      .github/workflows/test.yaml
  3. 1
      Dockerfile.openpilot
  4. 6
      selfdrive/car/volkswagen/interface.py
  5. 10
      selfdrive/test/test_models.py

@ -1,3 +0,0 @@
[run]
concurrency=multiprocessing

@ -37,7 +37,7 @@ jobs:
external/bin selfdrive/modeld/runners $TEST_DIR external/bin selfdrive/modeld/runners $TEST_DIR
# need these so docker copy won't fail # need these so docker copy won't fail
cp Pipfile Pipfile.lock .pylintrc .coveragerc-app .pre-commit-config.yaml $TEST_DIR cp Pipfile Pipfile.lock .pylintrc .pre-commit-config.yaml $TEST_DIR
cd $TEST_DIR cd $TEST_DIR
mkdir laika laika_repo tools mkdir laika laika_repo tools
- name: Build Docker image - name: Build Docker image
@ -199,8 +199,8 @@ jobs:
run: | run: |
$PERSIST "cd /tmp/openpilot && \ $PERSIST "cd /tmp/openpilot && \
scons -j$(nproc) && \ scons -j$(nproc) && \
coverage run --parallel-mode --concurrency=multiprocessing \ coverage run --parallel-mode -m nose --processes=4 --process-timeout=60 \
--rcfile=./.coveragerc-app selfdrive/test/test_models.py && \ selfdrive/test/test_models.py && \
coverage combine" coverage combine"
- name: Upload coverage to Codecov - name: Upload coverage to Codecov
run: | run: |

@ -81,7 +81,6 @@ RUN mkdir -p /tmp/openpilot
COPY SConstruct \ COPY SConstruct \
.pylintrc \ .pylintrc \
.pre-commit-config.yaml \ .pre-commit-config.yaml \
.coveragerc-app \
/tmp/openpilot/ /tmp/openpilot/
COPY ./pyextra /tmp/openpilot/pyextra COPY ./pyextra /tmp/openpilot/pyextra

@ -1,6 +1,5 @@
from cereal import car from cereal import car
from selfdrive.car.volkswagen.values import CAR, BUTTON_STATES from selfdrive.car.volkswagen.values import CAR, BUTTON_STATES
from common.params import put_nonblocking
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase from selfdrive.car.interfaces import CarInterfaceBase
@ -76,10 +75,11 @@ class CarInterface(CarInterfaceBase):
ret.canValid = self.cp.can_valid and self.cp_cam.can_valid ret.canValid = self.cp.can_valid and self.cp_cam.can_valid
ret.steeringRateLimited = self.CC.steer_rate_limited if self.CC is not None else False ret.steeringRateLimited = self.CC.steer_rate_limited if self.CC is not None else False
# TODO: add a field for this to carState, car interface code shouldn't write params
# Update the device metric configuration to match the car at first startup, # Update the device metric configuration to match the car at first startup,
# or if there's been a change. # or if there's been a change.
if self.CS.displayMetricUnits != self.displayMetricUnitsPrev: #if self.CS.displayMetricUnits != self.displayMetricUnitsPrev:
put_nonblocking("IsMetric", "1" if self.CS.displayMetricUnits else "0") # put_nonblocking("IsMetric", "1" if self.CS.displayMetricUnits else "0")
# Check for and process state-change events (button press or release) from # Check for and process state-change events (button press or release) from
# the turn stalk switch or ACC steering wheel/control stalk buttons. # the turn stalk switch or ACC steering wheel/control stalk buttons.

@ -7,7 +7,6 @@ from collections import Counter
from parameterized import parameterized_class from parameterized import parameterized_class
from cereal import log, car from cereal import log, car
import cereal.messaging as messaging
from selfdrive.car.fingerprints import all_known_cars from selfdrive.car.fingerprints import all_known_cars
from selfdrive.car.car_helpers import interfaces from selfdrive.car.car_helpers import interfaces
from selfdrive.test.test_car_models import routes, non_tested_cars from selfdrive.test.test_car_models import routes, non_tested_cars
@ -29,6 +28,7 @@ ignore_can_valid = [
"TOYOTA COROLLA 2017", "TOYOTA COROLLA 2017",
"LEXUS RX HYBRID 2017", "LEXUS RX HYBRID 2017",
"TOYOTA AVALON 2016", "TOYOTA AVALON 2016",
"HONDA PILOT 2019 ELITE",
] ]
@parameterized_class(('car_model'), [(car,) for car in all_known_cars()]) @parameterized_class(('car_model'), [(car,) for car in all_known_cars()])
@ -99,14 +99,10 @@ class TestCarModel(unittest.TestCase):
can_invalid_cnt = 0 can_invalid_cnt = 0
CC = car.CarControl.new_message() CC = car.CarControl.new_message()
for msg in self.can_msgs: for msg in self.can_msgs:
# filter out openpilot msgs CS = self.CI.update(CC, (msg.as_builder().to_bytes(),))
can = [m for m in msg.can if m.src < 128]
can_pkt = messaging.new_message('can', len(can))
can_pkt.can = can
CS = self.CI.update(CC, (can_pkt.to_bytes(),))
self.CI.apply(CC) self.CI.apply(CC)
can_invalid_cnt += not CS.canValid can_invalid_cnt += not CS.canValid
if self.car_model not in ignore_can_valid: if self.car_model not in ignore_can_valid:
self.assertLess(can_invalid_cnt, 50) self.assertLess(can_invalid_cnt, 50)

Loading…
Cancel
Save