summaryrefslogtreecommitdiff
diff options
-rw-r--r--.bumpversion.cfg2
-rwxr-xr-xbin/graphics_max_resolution.py148
-rwxr-xr-xbin/graphics_modes_info.py74
-rwxr-xr-xbin/install-method-check.sh39
-rwxr-xr-xbin/light_sensor_test.sh10
-rwxr-xr-xbin/network_device_info.py3
-rwxr-xr-xbin/removable_storage_watcher.py4
-rwxr-xr-xbin/touchpad_confidence_bit.py3
-rwxr-xr-xbin/touchpad_test.py72
-rwxr-xr-xmanage.py2
-rw-r--r--units/graphics/jobs.pxu20
-rw-r--r--units/graphics/legacy.pxu8
-rw-r--r--units/suspend/suspend.pxu12
-rw-r--r--units/touchpad/jobs.pxu33
-rw-r--r--units/touchpad/test-plan.pxu12
15 files changed, 262 insertions, 180 deletions
diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index 629f838..47f6f88 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -1,5 +1,5 @@
[bumpversion]
-current_version = 0.65.0.dev0
+current_version = 0.66.0.dev0
files = manage.py
parse = (?P<major>\d+)\.(?P<minor>\d+)(\.(?P<patch>\d+))?((?P<release>\.?[a-z]+)(?P<N>\d+))?
serialize =
diff --git a/bin/graphics_max_resolution.py b/bin/graphics_max_resolution.py
new file mode 100755
index 0000000..56628a4
--- /dev/null
+++ b/bin/graphics_max_resolution.py
@@ -0,0 +1,148 @@
+#!/usr/bin/env python3
+#
+# This file is part of Checkbox.
+#
+# Copyright 2022 Canonical Ltd.
+#
+# Authors:
+# Pierre Equoy <pierre.equoy@canonical.com>
+#
+# Checkbox is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 3,
+# as published by the Free Software Foundation.
+#
+# Checkbox is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
+
+import gi
+from glob import glob
+import os
+import sys
+from pathlib import Path
+
+gi.require_versions({"Gtk": "3.0", "Gdk": "3.0"})
+from gi.repository import Gdk, Gtk # noqa: E402
+
+
+def get_sysfs_info():
+ """
+ Go through each graphics cards sysfs entries to find max resolution if
+ connected to a monitor.
+ Return a list of ports with information about them.
+ """
+ ports = glob("/sys/class/drm/card*-*")
+ entries = []
+ for p in ports:
+ with open(Path(p) / "modes") as f:
+ # Topmost line in the modes file is the max resolution
+ max_resolution = f.readline().strip()
+ if max_resolution:
+ # e.g. "/sys/class/drm/card0-HDMI-A-1"
+ port = p.split("/")[-1]
+ width, height = max_resolution.split("x")
+ with open(Path(p) / "enabled") as f:
+ enabled = f.readline().strip()
+ with open(Path(p) / "dpms") as f:
+ dpms = f.readline().strip()
+ with open(Path(p) / "status") as f:
+ status = f.readline().strip()
+ port_info = {
+ "port": port,
+ "width": int(width),
+ "height": int(height),
+ "enabled": enabled, # "enabled" or "disabled"
+ "status": status, # "connected" or "disconnected"
+ "dpms": dpms, # "On" or "Off"
+ }
+ entries.append(port_info)
+ return entries
+
+
+def get_monitors_info():
+ """
+ Get information (model, manufacturer, resolution) from each connected
+ monitors using Gtk.
+ Return a list of monitors with their information.
+ """
+ Gtk.init()
+ display = Gdk.Display.get_default()
+ monitors = []
+ for i in range(display.get_n_monitors()):
+ mon = display.get_monitor(i)
+ monitor = {
+ "model": mon.get_model(),
+ "manufacturer": mon.get_manufacturer(),
+ "width": mon.get_geometry().width,
+ "height": mon.get_geometry().height,
+ "scale_factor": mon.get_scale_factor(),
+ }
+ monitors.append(monitor)
+ return monitors
+
+
+if __name__ == "__main__":
+ sysfs_entries = get_sysfs_info()
+ mons_entries = get_monitors_info()
+ total_sysfs_res = 0
+ total_mons_res = 0
+ compositor = os.environ.get("XDG_SESSION_TYPE")
+ print("Current compositor: {}".format(compositor))
+ print()
+ print("Maximum resolution found for each connected monitors:")
+ for p in sysfs_entries:
+ port = p["port"]
+ width = p["width"]
+ height = p["height"]
+ enabled = p["enabled"]
+ status = p["status"]
+ dpms = p["dpms"].lower()
+ print(
+ "\t{}: {}x{} ({}, {}, {})".format(
+ port, width, height, dpms, status, enabled
+ )
+ )
+ # If the monitor is disabled (e.g. "Single Display" mode), don't take
+ # its surface into account.
+ if enabled == "enabled":
+ total_sysfs_res += width * height
+ print()
+ print("Current resolution found for each connected monitors:")
+ for m in mons_entries:
+ model = m["model"]
+ manufacturer = m["manufacturer"]
+ scale = m["scale_factor"]
+ # Under X11, the returned width and height are in "application pixels",
+ # not "device pixels", so it has to be multiplied by the scale factor.
+ # However, Wayland always returns the "device pixels" width and height.
+ #
+ # Example: a 3840x2160 screen set to 200% scale will have
+ # width = 1920, height = 1080, scale_factor = 2 on X11
+ # width = 3840, height = 2160, scale_factor = 2 on Wayland
+ if compositor == "x11":
+ width = m["width"] * m["scale_factor"]
+ height = m["height"] * m["scale_factor"]
+ else:
+ width = m["width"]
+ height = m["height"]
+ print(
+ "\t{} ({}): {}x{} @{}%".format(
+ model, manufacturer, width, height, scale * 100
+ )
+ )
+ total_mons_res += width * height
+ print()
+ if total_sysfs_res == total_mons_res:
+ print("The displays are configured at their maximum resolution.")
+ else:
+ sys.exit(
+ (
+ "The displays do not seem to be configured at their maximum "
+ "resolution.\nPlease switch to the maximum resolution before "
+ "continuing."
+ )
+ )
diff --git a/bin/graphics_modes_info.py b/bin/graphics_modes_info.py
deleted file mode 100755
index f92cd76..0000000
--- a/bin/graphics_modes_info.py
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# graphics_modes_info.py
-#
-# This file is part of Checkbox.
-#
-# Copyright 2012 Canonical Ltd.
-#
-# Authors: Alberto Milone <alberto.milone@canonical.com>
-#
-# Checkbox is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License version 3,
-# as published by the Free Software Foundation.
-
-#
-# Checkbox is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
-
-from __future__ import print_function
-from __future__ import unicode_literals
-import sys
-
-from checkbox_support.contrib import xrandr
-
-
-def print_modes_info(screen):
- """Print some information about the detected screen and its outputs"""
- xrandr._check_required_version((1, 0))
- print("Screen %s: minimum %s x %s, current %s x %s, maximum %s x %s" %
- (screen._screen,
- screen._width_min, screen._height_min,
- screen._width, screen._height,
- screen._width_max, screen._height_max))
- print(" %smm x %smm" % (screen._width_mm, screen._height_mm))
- print("Outputs:")
- for o in list(screen.outputs.keys()):
- output = screen.outputs[o]
- print(" %s" % o, end=' ')
- if output.is_connected():
- print("(%smm x %smm)" % (output.get_physical_width(),
- output.get_physical_height()))
- modes = output.get_available_modes()
- print(" Modes:")
- for m in range(len(modes)):
- mode = modes[m]
- refresh = mode.dotClock / (mode.hTotal * mode.vTotal)
- print(
- " [%s] %s x %s @ %s Hz" %
- (m, mode.width, mode.height, refresh), end=' ')
- if mode.id == output._mode:
- print("(current)", end=' ')
- if m == output.get_preferred_mode():
- print("(preferred)", end=' ')
- print("")
- else:
- print("(not connected)")
-
-
-def main():
- screen = xrandr.get_current_screen()
- try:
- print_modes_info(screen)
- except(xrandr.UnsupportedRRError):
- print('Error: RandR version lower than 1.0', file=sys.stderr)
-
-
-if __name__ == '__main__':
- main()
diff --git a/bin/install-method-check.sh b/bin/install-method-check.sh
index 20c0e61..0e86385 100755
--- a/bin/install-method-check.sh
+++ b/bin/install-method-check.sh
@@ -70,21 +70,46 @@ get_install_datasource() {
fi
}
+# Returns 1 if input takes the form of an IPv4 address,
+# 0 otherwise
+is_ip_addr() {
+ local ip=$1
+ local stat=1
+ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ read -r -a ip_array <<< "$ip"
+ IFS=$OIFS
+ [[ ${ip_array[0]} -le 255 && ${ip_array[1]} -le 255 \
+ && ${ip_array[2]} -le 255 && ${ip_array[3]} -le 255 ]]
+ stat=$?
+ fi
+ return $stat
+}
+
# Verify that the $INSTALL_DATASOURCE points to a valid IP address.
# Note: Function assumes that $INSTALL_DATASOURCE is already set, as is
# done by the get_install_datasource() function.
verify_maas_ip() {
+ MAAS_IP=""
if [[ $INSTALL_DATASOURCE_FOUND == 1 ]]; then
MAAS_HOSTNAME=$(echo "$INSTALL_DATASOURCE" | cut -d "/" -f 3 | cut -d ":" -f 1)
- HOST_OUTPUT=$(host "$MAAS_HOSTNAME" | grep "has address")
- status=$?
- if [[ $status -eq 0 ]]; then
- MAAS_IP=$(echo "$HOST_OUTPUT" | cut -d " " -f 4)
- conditional_print "MAAS server's IP address is $MAAS_IP" "maas"
- conditional_print "ERROR: MAAS server's IP address is $MAAS_IP" "subiquity"
- MAAS_IP_FOUND=1
+ is_ip_addr "$MAAS_HOSTNAME"
+ if [[ $? -ne 1 ]]; then
+ MAAS_IP=$MAAS_HOSTNAME
else
+ HOST_OUTPUT=$(host "$MAAS_HOSTNAME" | grep "has address")
+ status=$?
+ if [[ $status -eq 0 ]]; then
+ MAAS_IP=$(echo "$HOST_OUTPUT" | cut -d " " -f 4)
+ fi
+ fi
+ if [ -z "$MAAS_IP" ] ; then
conditional_print "ERROR: Unable to determine MAAS server's IP address" "maas"
+ else
+ MAAS_IP_FOUND=1
+ conditional_print "MAAS server's IP address is $MAAS_IP" "maas"
+ conditional_print "ERROR: MAAS server's IP address is $MAAS_IP" "subiquity"
fi
fi
}
diff --git a/bin/light_sensor_test.sh b/bin/light_sensor_test.sh
index cb8fbe9..494ca39 100755
--- a/bin/light_sensor_test.sh
+++ b/bin/light_sensor_test.sh
@@ -1,16 +1,16 @@
#!/bin/bash
#Check if light sensor driver available, this section will be retired after checkbox resource jobs implement the light sensor in Device check
-#Bug for reference https://bugs.launchpad.net/checkbox-support/+bug/1864960
-als_sensors=$(udevadm info --export-db|grep hid_sensor_als)
+#Bug for reference LP #1864960 and LP #1980797
+als_sensors=$(udevadm info --export-db|grep IIO_SENSOR_PROXY_TYPE |grep als)
-#Check hid_sensor_als driver is loaded and available first.
+#Check iio_sensor_als is ready and available first.
if [ -z "$als_sensors" ]
then
- echo "Light sensor driver not found"
+ echo "Light sensor is not found"
exit 1
else
- echo "Light sensor driver is available"
+ echo "Light sensor is available"
echo "$als_sensors"
fi
diff --git a/bin/network_device_info.py b/bin/network_device_info.py
index 10865b9..9d31f75 100755
--- a/bin/network_device_info.py
+++ b/bin/network_device_info.py
@@ -343,7 +343,8 @@ class UdevDevices():
def _collect_devices(self):
cmd = ['udevadm', 'info', '--export-db']
try:
- output = check_output(cmd).decode(sys.stdout.encoding)
+ output = check_output(cmd).decode(sys.stdout.encoding,
+ errors='ignore')
except CalledProcessError as err:
sys.stderr.write(err)
return
diff --git a/bin/removable_storage_watcher.py b/bin/removable_storage_watcher.py
index 7208954..988abc3 100755
--- a/bin/removable_storage_watcher.py
+++ b/bin/removable_storage_watcher.py
@@ -948,6 +948,10 @@ def main():
else:
print("\n\n{} NOW\n\n".format(args.action.upper()), flush=True)
+ try:
+ return listener.check(args.timeout)
+ except KeyboardInterrupt:
+ return 1
if __name__ == "__main__":
diff --git a/bin/touchpad_confidence_bit.py b/bin/touchpad_confidence_bit.py
index ff47e6d..127dca4 100755
--- a/bin/touchpad_confidence_bit.py
+++ b/bin/touchpad_confidence_bit.py
@@ -14,7 +14,8 @@ class TouchpadDevices:
def _collect_devices(self):
cmd = ['udevadm', 'info', '--export-db']
try:
- output = check_output(cmd).decode(sys.stdout.encoding)
+ output = check_output(cmd).decode(sys.stdout.encoding,
+ errors='ignore')
except CalledProcessError as err:
sys.stderr.write(err)
return
diff --git a/bin/touchpad_test.py b/bin/touchpad_test.py
index 6ecde92..83940ec 100755
--- a/bin/touchpad_test.py
+++ b/bin/touchpad_test.py
@@ -3,6 +3,7 @@
import gi
import sys
import gettext
+from time import sleep
from gettext import gettext as _
gi.require_version('Gdk', '3.0')
@@ -43,7 +44,7 @@ class GtkScroller(object):
# Initialize GTK constants
self.ICON_SIZE = Gtk.IconSize.BUTTON
self.ICON_TESTED = Gtk.STOCK_YES
- self.ICON_UNTESTED = Gtk.STOCK_INDEX
+ self.ICON_UNTESTED = Gtk.STOCK_DIALOG_QUESTION
self.ICON_NOT_REQUIRED = Gtk.STOCK_REMOVE
self.button_factory = Gtk.Button
@@ -70,7 +71,7 @@ class GtkScroller(object):
button_hbox = self._add_hbox(vbox)
validation_hbox = self._add_hbox(vbox)
self.status = self._add_label(vbox)
- self.exit_button = self._add_button(vbox, Gtk.STOCK_CLOSE)
+ self.exit_button = self._add_button(vbox, "_Close")
self.exit_button.connect("clicked", lambda w: self.quit())
# Add widgets for each direction.
@@ -78,15 +79,15 @@ class GtkScroller(object):
for direction in self.directions:
self._add_label(button_hbox, direction.name)
self.icons[direction] = self._add_image(
- validation_hbox, Gtk.STOCK_INDEX)
+ validation_hbox, self.ICON_UNTESTED)
self.show_text(
_("Please move the mouse cursor to this window.") +
"\n" +
_("Then scroll in each direction on your touchpad."))
- def _add_button(self, context, stock):
- button = self.button_factory(stock=stock)
+ def _add_button(self, context, label):
+ button = self.button_factory.new_with_mnemonic(label)
context.add(button)
button.show()
return button
@@ -124,29 +125,33 @@ class GtkScroller(object):
def run(self):
# Save touchpad settings.
- if self.horiz_scroll_key:
- self.saved_horiz_scroll_enabled = \
- self.touchpad_settings.get_boolean("horiz-scroll-enabled")
- self.saved_scroll_method = self.touchpad_settings.get_string(
- "scroll-method")
+ self.saved_edge_scrolling_enabled = self.touchpad_settings.get_boolean(
+ "edge-scrolling-enabled")
+ self.saved_two_finger_enabled = self.touchpad_settings.get_boolean(
+ "two-finger-scrolling-enabled")
# Set touchpad settings.
- if self.horiz_scroll_key:
- self.touchpad_settings.set_boolean("horiz-scroll-enabled", True)
if self.edge_scroll:
- self.touchpad_settings.set_string(
- "scroll-method", "edge-scrolling")
-
+ self.touchpad_settings.set_boolean(
+ "edge-scrolling-enabled", True)
+ self.touchpad_settings.set_boolean(
+ "two-finger-scrolling-enabled", False)
+ else:
+ self.touchpad_settings.set_boolean(
+ "two-finger-scrolling-enabled", True)
+ self.touchpad_settings.set_boolean(
+ "edge-scrolling-enabled", False)
Gtk.main()
def quit(self):
# Reset touchpad settings.
- if self.horiz_scroll_key:
- self.touchpad_settings.set_boolean(
- "horiz-scroll-enabled", self.saved_horiz_scroll_enabled)
- self.touchpad_settings.set_string(
- "scroll-method", self.saved_scroll_method)
-
+ self.touchpad_settings.set_boolean(
+ "two-finger-scrolling-enabled", self.saved_two_finger_enabled)
+ # GNOME does not like when both settings are set at the same time, so
+ # waiting a bit.
+ sleep(0.1)
+ self.touchpad_settings.set_boolean(
+ "edge-scrolling-enabled", self.saved_edge_scrolling_enabled)
Gtk.main_quit()
def show_text(self, text, widget=None):
@@ -156,7 +161,7 @@ class GtkScroller(object):
def found_direction(self, direction):
direction.tested = True
- self.icons[direction].set_from_stock(
+ self.icons[direction].set_from_icon_name(
self.ICON_TESTED, size=self.ICON_SIZE)
self.check_directions()
@@ -169,10 +174,25 @@ class GtkScroller(object):
def on_scroll(self, window, event):
for direction in self.directions:
- if direction.value == event.direction:
- self.found_direction(direction)
- break
-
+ scroll_delta, delta_x, delta_y = event.get_scroll_deltas()
+ if scroll_delta:
+ event_direction = None
+ # Arbitrarily using 0.8, which requires a little bit of hand
+ # movement on the touchpads used for testing.
+ # Note that the directions are based on the default natural
+ # scrolling settings in GNOME settings.
+ if delta_x > 0.8:
+ event_direction = Direction("left")
+ elif delta_x < -0.8:
+ event_direction = Direction("right")
+ if delta_y > 0.8:
+ event_direction = Direction("up")
+ elif delta_y < -0.8:
+ event_direction = Direction("down")
+ if event_direction:
+ if direction.value == event_direction.value:
+ self.found_direction(direction)
+ break
return True
diff --git a/manage.py b/manage.py
index bd952b7..60eb5fb 100755
--- a/manage.py
+++ b/manage.py
@@ -5,7 +5,7 @@ from plainbox.provider_manager import N_
setup(
name='plainbox-provider-checkbox',
namespace='com.canonical.certification',
- version="0.65.0.dev0",
+ version="0.66.0.dev0",
description=N_("Checkbox provider"),
gettext_domain='plainbox-provider-checkbox',
strict=False, deprecated=False,
diff --git a/units/graphics/jobs.pxu b/units/graphics/jobs.pxu
index 4dde304..d9814c7 100644
--- a/units/graphics/jobs.pxu
+++ b/units/graphics/jobs.pxu
@@ -43,7 +43,6 @@ template-resource: graphics_card
plugin: manual
category_id: com.canonical.plainbox::graphics
id: graphics/{index}_resolution-change_{product_slug}
-depends: graphics/xorg-version
_summary: Test changing resolution for {vendor} {product}
_description:
PURPOSE:
@@ -133,13 +132,7 @@ category_id: com.canonical.plainbox::graphics
requires:
device.category == 'VIDEO'
command:
- # shellcheck disable=SC1091
- source graphics_env.sh {driver} {index}
- maxi="$(xrandr -q |grep -A 1 "connected\( primary\)* [0-9]" |tail -1 |awk '{{print $1}}')"
- now="$(python3 -c 'from gi.repository import Gdk; screen=Gdk.Screen.get_default(); geo = screen.get_monitor_geometry(screen.get_primary_monitor()); print(geo.width, "x", geo.height, sep="")')"
- test "$maxi" != "$now" && notify="\nPlease switch to the maximum resolution \nfor every graphic tests"
- echo "Maximum resolution: $maxi"
- echo "Current resolution: $now $notify"
+ graphics_max_resolution.py
estimated_duration: 10.0
_summary: Test maximum supported resolution for {vendor} {product}
_description:
@@ -154,16 +147,6 @@ _description:
unit: template
template-resource: graphics_card
-id: graphics/{index}_modes_{product_slug}
-plugin: shell
-category_id: com.canonical.plainbox::graphics
-command: graphics_modes_info.py
-estimated_duration: 0.250
-_description: Collect info on graphics modes (screen resolution and refresh rate) for {vendor} {product}
-_summary: Test graphic modes info for {vendor} {product}
-
-unit: template
-template-resource: graphics_card
id: graphics/{index}_color_depth_{product_slug}
plugin: shell
category_id: com.canonical.plainbox::graphics
@@ -252,7 +235,6 @@ template-filter: graphics_card.prime_gpu_offload == 'Off'
plugin: user-interact-verify
category_id: com.canonical.plainbox::graphics
id: graphics/{index}_rotation_{product_slug}
-depends: graphics/xorg-version
command:
# shellcheck disable=SC1091
source graphics_env.sh {driver} {index}
diff --git a/units/graphics/legacy.pxu b/units/graphics/legacy.pxu
index 14969b0..2b9545d 100644
--- a/units/graphics/legacy.pxu
+++ b/units/graphics/legacy.pxu
@@ -96,14 +96,6 @@ _description:
VERIFICATION:
Is this the display's maximum resolution?
-id: graphics/modes
-plugin: shell
-category_id: com.canonical.plainbox::graphics
-command: graphics_modes_info.py
-estimated_duration: 0.250
-_description: Collect info on graphics modes (screen resolution and refresh rate)
-_summary: Collect info on graphics modes
-
id: graphics/color_depth
plugin: shell
category_id: com.canonical.plainbox::graphics
diff --git a/units/suspend/suspend.pxu b/units/suspend/suspend.pxu
index 1225d90..9d905da 100644
--- a/units/suspend/suspend.pxu
+++ b/units/suspend/suspend.pxu
@@ -202,9 +202,11 @@ command:
else
echo "Calling rtcwake"
if [ -z "$RTC_DEVICE_FILE" ]; then
- rtcwake -m mem -s 30
+ rtcwake -m on -s 30 &
+ systemctl suspend
else
- rtcwake -d "$RTC_DEVICE_FILE" -m mem -s 30
+ rtcwake -d "$RTC_DEVICE_FILE" -m on -s 30 &
+ systemctl suspend
fi
fi
else
@@ -285,9 +287,11 @@ command:
else
echo "Calling rtcwake"
if [ -z "$RTC_DEVICE_FILE" ]; then
- rtcwake -m mem -s 30
+ rtcwake -m on -s 30 &
+ systemctl suspend
else
- rtcwake -d "$RTC_DEVICE_FILE" -m mem -s 30
+ rtcwake -d "$RTC_DEVICE_FILE" -m on -s 30 &
+ systemctl suspend
fi
fi
estimated_duration: 90.000
diff --git a/units/touchpad/jobs.pxu b/units/touchpad/jobs.pxu
index 0a6c52c..11960ee 100644
--- a/units/touchpad/jobs.pxu
+++ b/units/touchpad/jobs.pxu
@@ -102,37 +102,20 @@ _siblings:
plugin: user-interact
category_id: com.canonical.plainbox::touchpad
-id: touchpad/multitouch-horizontal
+id: touchpad/multitouch
requires: dmi.product in ['Notebook','Laptop','Portable','Convertible']
-command: touchpad_test.py right left
+command: touchpad_test.py up down right left
estimated_duration: 120.0
_purpose:
- Touchpad 2-touch horizontal scroll verification
+ Touchpad 2-finger scroll verification
_steps:
- 1. Select "Test" when ready and place your cursor within the borders of the displayed test window.
- 2. Verify that you can move the horizontal slider by moving 2 fingers right and left along the touchpad.
+ 1. Press "Enter" when ready and place your cursor within the borders of the displayed test window.
+ 2. Verify that the scroll events are detected by moving two fingers in all four directions along the touchpad.
_verification:
- Could you scroll right and left?
-_siblings:
- [{ "id": "touchpad/multitouch-horizontal-after-suspend",
- "depends": "suspend/suspend_advanced_auto touchpad/multitouch-horizontal" }]
-
-plugin: user-interact
-category_id: com.canonical.plainbox::touchpad
-id: touchpad/multitouch-vertical
-requires: dmi.product in ['Notebook','Laptop','Portable','Convertible']
-command: touchpad_test.py up down
-estimated_duration: 120.0
-_purpose:
- Touchpad 2-touch vertical scroll verification
-_steps:
- 1. Select "Test" when ready and place your cursor within the borders of the displayed test window.
- 2. Verify that you can move the vertical slider by moving 2 fingers up and down along the touchpad.
-_verification:
- Could you scroll up and down?
+ Were scroll events detected for all four directions?
_siblings:
- [{ "id": "touchpad/multitouch-vertical-after-suspend",
- "depends": "suspend/suspend_advanced_auto touchpad/multitouch-vertical" }]
+ [{ "id": "touchpad/multitouch-after-suspend",
+ "depends": "suspend/suspend_advanced_auto touchpad/multitouch" }]
plugin: manual
category_id: com.canonical.plainbox::touchpad
diff --git a/units/touchpad/test-plan.pxu b/units/touchpad/test-plan.pxu
index e03ea54..74d41a5 100644
--- a/units/touchpad/test-plan.pxu
+++ b/units/touchpad/test-plan.pxu
@@ -20,8 +20,7 @@ include:
touchpad/singletouch-selection certification-status=blocker
touchpad/drag-and-drop certification-status=blocker
touchpad/multitouch-rightclick certification-status=blocker
- touchpad/multitouch-horizontal certification-status=blocker
- touchpad/multitouch-vertical certification-status=blocker
+ touchpad/multitouch certification-status=blocker
id: touchpad-cert-automated
unit: test plan
@@ -45,8 +44,7 @@ include:
touchpad/singletouch-selection-after-suspend certification-status=blocker
touchpad/drag-and-drop-after-suspend certification-status=blocker
touchpad/multitouch-rightclick-after-suspend certification-status=blocker
- touchpad/multitouch-horizontal-after-suspend certification-status=blocker
- touchpad/multitouch-vertical-after-suspend certification-status=blocker
+ touchpad/multitouch-after-suspend certification-status=blocker
id: touchpad-cert-blockers
unit: test plan
@@ -59,8 +57,7 @@ include:
touchpad/singletouch-selection certification-status=blocker
touchpad/drag-and-drop certification-status=blocker
touchpad/multitouch-rightclick certification-status=blocker
- touchpad/multitouch-horizontal certification-status=blocker
- touchpad/multitouch-vertical certification-status=blocker
+ touchpad/multitouch certification-status=blocker
id: after-suspend-touchpad-cert-blockers
unit: test plan
@@ -73,5 +70,4 @@ include:
touchpad/singletouch-selection-after-suspend certification-status=blocker
touchpad/drag-and-drop-after-suspend certification-status=blocker
touchpad/multitouch-rightclick-after-suspend certification-status=blocker
- touchpad/multitouch-horizontal-after-suspend certification-status=blocker
- touchpad/multitouch-vertical-after-suspend certification-status=blocker
+ touchpad/multitouch-after-suspend certification-status=blocker