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  }