gitee.com/mysnapcore/mysnapd@v0.1.0/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 "gitee.com/mysnapcore/mysnapd/interfaces" 28 "gitee.com/mysnapcore/mysnapd/interfaces/udev" 29 "gitee.com/mysnapcore/mysnapd/testutil" 30 ) 31 32 func Test(t *testing.T) { 33 TestingT(t) 34 } 35 36 type uDevSuite struct { 37 backend *udev.Backend 38 } 39 40 var _ = Suite(&uDevSuite{}) 41 42 // Tests for ReloadRules() 43 44 func (s *uDevSuite) SetUpTest(c *C) { 45 s.backend = &udev.Backend{} 46 c.Assert(s.backend.Initialize(nil), IsNil) 47 } 48 49 func (s *uDevSuite) TestReloadUDevRulesRunsUDevAdm(c *C) { 50 cmd := testutil.MockCommand(c, "udevadm", "") 51 defer cmd.Restore() 52 err := s.backend.ReloadRules(nil) 53 c.Assert(err, IsNil) 54 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 55 {"udevadm", "control", "--reload-rules"}, 56 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 57 // FIXME: temporary until spec.TriggerSubsystem() can be 58 // called during disconnect 59 {"udevadm", "trigger", "--property-match=ID_INPUT_JOYSTICK=1"}, 60 {"udevadm", "settle", "--timeout=10"}, 61 }) 62 } 63 64 func (s *uDevSuite) TestReloadUDevRulesReportsErrorsFromReloadRules(c *C) { 65 cmd := testutil.MockCommand(c, "udevadm", ` 66 if [ "$1" = "control" ]; then 67 echo "failure 1" 68 exit 1 69 fi 70 `) 71 defer cmd.Restore() 72 err := s.backend.ReloadRules(nil) 73 c.Assert(err.Error(), Equals, ""+ 74 "cannot reload udev rules: exit status 1\n"+ 75 "udev output:\n"+ 76 "failure 1\n") 77 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 78 {"udevadm", "control", "--reload-rules"}, 79 }) 80 } 81 82 func (s *uDevSuite) TestReloadUDevRulesIgnoresErrorsFromDefaultTrigger(c *C) { 83 cmd := testutil.MockCommand(c, "udevadm", ` 84 if [ "$1" = "trigger" ]; then 85 echo "failure 2" 86 exit 2 87 fi 88 `) 89 defer cmd.Restore() 90 err := s.backend.ReloadRules(nil) 91 c.Assert(err, IsNil) 92 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 93 {"udevadm", "control", "--reload-rules"}, 94 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 95 // FIXME: temporary until spec.TriggerSubsystem() can be 96 // called during disconnect 97 {"udevadm", "trigger", "--property-match=ID_INPUT_JOYSTICK=1"}, 98 {"udevadm", "settle", "--timeout=10"}, 99 }) 100 } 101 102 func (s *uDevSuite) TestReloadUDevRulesReportsErrorsFromDefaultTriggerSignals(c *C) { 103 cmd := testutil.MockCommand(c, "udevadm", ` 104 if [ "$1" = "trigger" ]; then 105 echo "failure 2" 106 kill -9 $$ 107 fi 108 `) 109 defer cmd.Restore() 110 err := s.backend.ReloadRules(nil) 111 c.Assert(err, ErrorMatches, `cannot run udev triggers: signal: killed 112 udev output: 113 failure 2 114 `) 115 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 116 {"udevadm", "control", "--reload-rules"}, 117 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 118 }) 119 } 120 121 func (s *uDevSuite) TestReloadUDevRulesRunsUDevAdmWithSubsystem(c *C) { 122 cmd := testutil.MockCommand(c, "udevadm", "") 123 defer cmd.Restore() 124 err := s.backend.ReloadRules([]string{"input"}) 125 c.Assert(err, IsNil) 126 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 127 {"udevadm", "control", "--reload-rules"}, 128 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 129 {"udevadm", "trigger", "--subsystem-match=input"}, 130 {"udevadm", "settle", "--timeout=10"}, 131 }) 132 } 133 134 func (s *uDevSuite) TestReloadUDevRulesIgnoresErrorsFromSubsystemTrigger(c *C) { 135 cmd := testutil.MockCommand(c, "udevadm", ` 136 if [ "$2" = "--subsystem-match=input" ]; then 137 echo "failure 2" 138 exit 2 139 fi 140 `) 141 defer cmd.Restore() 142 err := s.backend.ReloadRules([]string{"input"}) 143 c.Assert(err, IsNil) 144 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 145 {"udevadm", "control", "--reload-rules"}, 146 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 147 {"udevadm", "trigger", "--subsystem-match=input"}, 148 {"udevadm", "settle", "--timeout=10"}, 149 }) 150 } 151 152 func (s *uDevSuite) TestReloadUDevRulesRunsUDevAdmWithJoystick(c *C) { 153 cmd := testutil.MockCommand(c, "udevadm", "") 154 defer cmd.Restore() 155 err := s.backend.ReloadRules([]string{"input/joystick"}) 156 c.Assert(err, IsNil) 157 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 158 {"udevadm", "control", "--reload-rules"}, 159 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 160 {"udevadm", "trigger", "--property-match=ID_INPUT_JOYSTICK=1"}, 161 {"udevadm", "settle", "--timeout=10"}, 162 }) 163 } 164 165 func (s *uDevSuite) TestReloadUDevRulesIgnoresErrorsFromJoystickTrigger(c *C) { 166 cmd := testutil.MockCommand(c, "udevadm", ` 167 if [ "$2" = "--property-match=ID_INPUT_JOYSTICK=1" ]; then 168 echo "failure 2" 169 exit 2 170 fi 171 `) 172 defer cmd.Restore() 173 err := s.backend.ReloadRules([]string{"input/joystick"}) 174 c.Assert(err, IsNil) 175 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 176 {"udevadm", "control", "--reload-rules"}, 177 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 178 {"udevadm", "trigger", "--property-match=ID_INPUT_JOYSTICK=1"}, 179 {"udevadm", "settle", "--timeout=10"}, 180 }) 181 } 182 183 func (s *uDevSuite) TestReloadUDevRulesRunsUDevAdmWithTwoSubsystems(c *C) { 184 cmd := testutil.MockCommand(c, "udevadm", "") 185 defer cmd.Restore() 186 err := s.backend.ReloadRules([]string{"input", "tty"}) 187 c.Assert(err, IsNil) 188 c.Assert(cmd.Calls(), DeepEquals, [][]string{ 189 {"udevadm", "control", "--reload-rules"}, 190 {"udevadm", "trigger", "--subsystem-nomatch=input"}, 191 {"udevadm", "trigger", "--subsystem-match=input"}, 192 {"udevadm", "settle", "--timeout=10"}, 193 }) 194 } 195 196 func (s *uDevSuite) TestNoReloadWhenPreseeding(c *C) { 197 cmd := testutil.MockCommand(c, "udevadm", "") 198 defer cmd.Restore() 199 200 b := udev.Backend{} 201 opts := &interfaces.SecurityBackendOptions{ 202 Preseed: true, 203 } 204 c.Assert(b.Initialize(opts), IsNil) 205 c.Assert(b.ReloadRules(nil), IsNil) 206 c.Assert(cmd.Calls(), HasLen, 0) 207 }