github.com/rigado/snapd@v2.42.5-go-mod+incompatible/interfaces/udev/udev_test.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2016-2018 Canonical Ltd 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 3 as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 */ 19 20 package udev_test 21 22 import ( 23 "testing" 24 25 . "gopkg.in/check.v1" 26 27 "github.com/snapcore/snapd/interfaces/udev" 28 "github.com/snapcore/snapd/testutil" 29 ) 30 31 func Test(t *testing.T) { 32 TestingT(t) 33 } 34 35 type uDevSuite struct{} 36 37 var _ = Suite(&uDevSuite{}) 38 39 // Tests for ReloadRules() 40 41 func (s *uDevSuite) TestReloadUDevRulesRunsUDevAdm(c *C) { 42 cmd := testutil.MockCommand(c, "udevadm", "") 43 defer cmd.Restore() 44 err := udev.ReloadRules(nil) 45 c.Assert(err, IsNil) 46 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 47 {"udevadm", "control", "--reload-rules"}, 48 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 49 // FIXME: temporary until spec.TriggerSubsystem() can be 50 // called during disconnect 51 {"udevadm", "trigger", "--property-match=ID_INPUT_JOYSTICK=1"}, 52 {"udevadm", "settle", "--timeout=10"}, 53 }) 54 } 55 56 func (s *uDevSuite) TestReloadUDevRulesReportsErrorsFromReloadRules(c *C) { 57 cmd := testutil.MockCommand(c, "udevadm", ` 58 if [ "$1" = "control" ]; then 59 echo "failure 1" 60 exit 1 61 fi 62 `) 63 defer cmd.Restore() 64 err := udev.ReloadRules(nil) 65 c.Assert(err.Error(), Equals, ""+ 66 "cannot reload udev rules: exit status 1\n"+ 67 "udev output:\n"+ 68 "failure 1\n") 69 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 70 {"udevadm", "control", "--reload-rules"}, 71 }) 72 } 73 74 func (s *uDevSuite) TestReloadUDevRulesReportsErrorsFromDefaultTrigger(c *C) { 75 cmd := testutil.MockCommand(c, "udevadm", ` 76 if [ "$1" = "trigger" ]; then 77 echo "failure 2" 78 exit 2 79 fi 80 `) 81 defer cmd.Restore() 82 err := udev.ReloadRules(nil) 83 c.Assert(err.Error(), Equals, ""+ 84 "cannot run udev triggers: exit status 2\n"+ 85 "udev output:\n"+ 86 "failure 2\n") 87 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 88 {"udevadm", "control", "--reload-rules"}, 89 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 90 }) 91 } 92 93 func (s *uDevSuite) TestReloadUDevRulesRunsUDevAdmWithSubsystem(c *C) { 94 cmd := testutil.MockCommand(c, "udevadm", "") 95 defer cmd.Restore() 96 err := udev.ReloadRules([]string{"input"}) 97 c.Assert(err, IsNil) 98 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 99 {"udevadm", "control", "--reload-rules"}, 100 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 101 {"udevadm", "trigger", "--subsystem-match=input"}, 102 {"udevadm", "settle", "--timeout=10"}, 103 }) 104 } 105 106 func (s *uDevSuite) TestReloadUDevRulesReportsErrorsFromSubsystemTrigger(c *C) { 107 cmd := testutil.MockCommand(c, "udevadm", ` 108 if [ "$2" = "--subsystem-match=input" ]; then 109 echo "failure 2" 110 exit 2 111 fi 112 `) 113 defer cmd.Restore() 114 err := udev.ReloadRules([]string{"input"}) 115 c.Assert(err.Error(), Equals, ""+ 116 "cannot run udev triggers for input subsystem: exit status 2\n"+ 117 "udev output:\n"+ 118 "failure 2\n") 119 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 120 {"udevadm", "control", "--reload-rules"}, 121 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 122 {"udevadm", "trigger", "--subsystem-match=input"}, 123 }) 124 } 125 126 func (s *uDevSuite) TestReloadUDevRulesRunsUDevAdmWithJoystick(c *C) { 127 cmd := testutil.MockCommand(c, "udevadm", "") 128 defer cmd.Restore() 129 err := udev.ReloadRules([]string{"input/joystick"}) 130 c.Assert(err, IsNil) 131 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 132 {"udevadm", "control", "--reload-rules"}, 133 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 134 {"udevadm", "trigger", "--property-match=ID_INPUT_JOYSTICK=1"}, 135 {"udevadm", "settle", "--timeout=10"}, 136 }) 137 } 138 139 func (s *uDevSuite) TestReloadUDevRulesReportsErrorsFromJoystickTrigger(c *C) { 140 cmd := testutil.MockCommand(c, "udevadm", ` 141 if [ "$2" = "--property-match=ID_INPUT_JOYSTICK=1" ]; then 142 echo "failure 2" 143 exit 2 144 fi 145 `) 146 defer cmd.Restore() 147 err := udev.ReloadRules([]string{"input/joystick"}) 148 c.Assert(err.Error(), Equals, ""+ 149 "cannot run udev triggers for joysticks: exit status 2\n"+ 150 "udev output:\n"+ 151 "failure 2\n") 152 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 153 {"udevadm", "control", "--reload-rules"}, 154 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 155 {"udevadm", "trigger", "--property-match=ID_INPUT_JOYSTICK=1"}, 156 }) 157 } 158 159 func (s *uDevSuite) TestReloadUDevRulesRunsUDevAdmWithTwoSubsystems(c *C) { 160 cmd := testutil.MockCommand(c, "udevadm", "") 161 defer cmd.Restore() 162 err := udev.ReloadRules([]string{"input", "tty"}) 163 c.Assert(err, IsNil) 164 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 165 {"udevadm", "control", "--reload-rules"}, 166 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 167 {"udevadm", "trigger", "--subsystem-match=input"}, 168 {"udevadm", "trigger", "--subsystem-match=tty"}, 169 {"udevadm", "settle", "--timeout=10"}, 170 }) 171 }