interfaces: interfaces: also add an app/hook-specific udev RUN rule for hotplugging #4374

Merged
merged 4 commits into from Dec 11, 2017
Prev

interfaces: also verify added RUN rule in builtin tests

  • Loading branch information...
commit 29c3619b2c217d0003013733c7d1c91328b2b341 @jdstrand jdstrand committed Dec 8, 2017
@@ -91,6 +91,7 @@ func (s *AlsaInterfaceSuite) TestUDevpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 8)
c.Assert(spec.Snippets(), testutil.Contains, `# alsa
KERNEL=="pcmC[0-9]*D[0-9]*[cp]", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *AlsaInterfaceSuite) TestStaticInfo(c *C) {
@@ -109,6 +109,7 @@ func (s *BluetoothControlInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# bluetooth-control
SUBSYSTEM=="bluetooth", TAG+="snap_other_app2"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_other_app2", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_other_app2 $devpath $major:$minor"`)
}
func (s *BluetoothControlInterfaceSuite) TestInterfaces(c *C) {
@@ -235,6 +235,7 @@ func (s *BluezInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# bluez
KERNEL=="rfkill", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
// on a classic system with bluez slot coming from the core snap.
restore = release.MockOnClassic(true)
@@ -244,6 +245,7 @@ KERNEL=="rfkill", TAG+="snap_consumer_app"`)
c.Assert(spec.AddConnectedPlug(s.iface, s.plug, s.coreSlot), IsNil)
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets()[0], testutil.Contains, `KERNEL=="rfkill", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
@@ -96,6 +96,7 @@ func (s *BroadcomAsicControlSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 3)
c.Assert(spec.Snippets(), testutil.Contains, `# broadcom-asic-control
SUBSYSTEM=="net", KERNEL=="bcm[0-9]*", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *BroadcomAsicControlSuite) TestKModSpec(c *C) {
@@ -91,6 +91,7 @@ func (s *CameraInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# camera
KERNEL=="video[0-9]*", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *CameraInterfaceSuite) TestStaticInfo(c *C) {
@@ -93,6 +93,7 @@ func (s *FramebufferInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets()[0], Equals, `# framebuffer
KERNEL=="fb[0-9]*", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *FramebufferInterfaceSuite) TestStaticInfo(c *C) {
@@ -100,6 +100,7 @@ func (s *FuseSupportInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# fuse-support
KERNEL=="fuse", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *FuseSupportInterfaceSuite) TestStaticInfo(c *C) {
@@ -91,6 +91,7 @@ func (s *HardwareRandomControlInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# hardware-random-control
KERNEL=="hwrng", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *HardwareRandomControlInterfaceSuite) TestStaticInfo(c *C) {
@@ -91,6 +91,7 @@ func (s *HardwareRandomObserveInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# hardware-random-observe
KERNEL=="hwrng", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *HardwareRandomObserveInterfaceSuite) TestStaticInfo(c *C) {
@@ -250,6 +250,9 @@ func (s *HidrawInterfaceSuite) TestConnectedPlugUDevSnippets(c *C) {
expectedSnippet1 := `# hidraw
SUBSYSTEM=="hidraw", KERNEL=="hidraw0", TAG+="snap_client-snap_app-accessing-2-devices"`
c.Assert(snippet, Equals, expectedSnippet1)
+ extraSnippet := spec.Snippets()[1]
+ expectedExtraSnippet1 := `TAG=="snap_client-snap_app-accessing-2-devices", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_client-snap_app-accessing-2-devices $devpath $major:$minor"`
+ c.Assert(extraSnippet, Equals, expectedExtraSnippet1)
// add the plug for the first slot with vendor and product ids
spec = &udev.Specification{}
@@ -260,6 +263,9 @@ SUBSYSTEM=="hidraw", KERNEL=="hidraw0", TAG+="snap_client-snap_app-accessing-2-d
IMPORT{builtin}="usb_id"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0001", ATTRS{idProduct}=="0001", TAG+="snap_client-snap_app-accessing-2-devices"`
c.Assert(snippet, Equals, expectedSnippet2)
+ extraSnippet = spec.Snippets()[1]
+ expectedExtraSnippet2 := `TAG=="snap_client-snap_app-accessing-2-devices", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_client-snap_app-accessing-2-devices $devpath $major:$minor"`
+ c.Assert(extraSnippet, Equals, expectedExtraSnippet2)
// add the plug for the second slot with vendor and product ids
spec = &udev.Specification{}
@@ -270,6 +276,9 @@ SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0001", ATTRS{idProduct
IMPORT{builtin}="usb_id"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="ffff", ATTRS{idProduct}=="ffff", TAG+="snap_client-snap_app-accessing-2-devices"`
c.Assert(snippet, Equals, expectedSnippet3)
+ extraSnippet = spec.Snippets()[1]
+ expectedExtraSnippet3 := `TAG=="snap_client-snap_app-accessing-2-devices", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_client-snap_app-accessing-2-devices $devpath $major:$minor"`
+ c.Assert(extraSnippet, Equals, expectedExtraSnippet3)
}
func (s *HidrawInterfaceSuite) TestConnectedPlugAppArmorSnippets(c *C) {
@@ -301,32 +310,41 @@ func (s *HidrawInterfaceSuite) TestConnectedPlugAppArmorSnippets(c *C) {
func (s *HidrawInterfaceSuite) TestConnectedPlugUDevSnippetsForPath(c *C) {
expectedSnippet1 := `# hidraw
SUBSYSTEM=="hidraw", KERNEL=="hidraw0", TAG+="snap_client-snap_app-accessing-2-devices"`
+ expectedExtraSnippet1 := `TAG=="snap_client-snap_app-accessing-2-devices", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_client-snap_app-accessing-2-devices $devpath $major:$minor"`
udevSpec := &udev.Specification{}
err := udevSpec.AddConnectedPlug(s.iface, s.testPlugPort1, s.testSlot1)
c.Assert(err, IsNil)
c.Assert(udevSpec.Snippets(), HasLen, 2)
snippet := udevSpec.Snippets()[0]
c.Assert(snippet, Equals, expectedSnippet1)
+ extraSnippet := udevSpec.Snippets()[1]
+ c.Assert(extraSnippet, Equals, expectedExtraSnippet1)
expectedSnippet2 := `# hidraw
IMPORT{builtin}="usb_id"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0001", ATTRS{idProduct}=="0001", TAG+="snap_client-snap_app-accessing-2-devices"`
+ expectedExtraSnippet2 := `TAG=="snap_client-snap_app-accessing-2-devices", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_client-snap_app-accessing-2-devices $devpath $major:$minor"`
udevSpec = &udev.Specification{}
err = udevSpec.AddConnectedPlug(s.iface, s.testPlugPort1, s.testUDev1)
c.Assert(err, IsNil)
c.Assert(udevSpec.Snippets(), HasLen, 2)
snippet = udevSpec.Snippets()[0]
c.Assert(snippet, Equals, expectedSnippet2)
+ extraSnippet = udevSpec.Snippets()[1]
+ c.Assert(extraSnippet, Equals, expectedExtraSnippet2)
expectedSnippet3 := `# hidraw
IMPORT{builtin}="usb_id"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="ffff", ATTRS{idProduct}=="ffff", TAG+="snap_client-snap_app-accessing-2-devices"`
+ expectedExtraSnippet3 := `TAG=="snap_client-snap_app-accessing-2-devices", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_client-snap_app-accessing-2-devices $devpath $major:$minor"`
udevSpec = &udev.Specification{}
err = udevSpec.AddConnectedPlug(s.iface, s.testPlugPort2, s.testUDev2)
c.Assert(err, IsNil)
c.Assert(udevSpec.Snippets(), HasLen, 2)
snippet = udevSpec.Snippets()[0]
c.Assert(snippet, Equals, expectedSnippet3)
+ extraSnippet = udevSpec.Snippets()[1]
+ c.Assert(extraSnippet, Equals, expectedExtraSnippet3)
}
func (s *HidrawInterfaceSuite) TestInterfaces(c *C) {
@@ -188,6 +188,7 @@ func (s *I2cInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# i2c
KERNEL=="i2c-1", TAG+="snap_client-snap_app-accessing-1-port"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_client-snap_app-accessing-1-port", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_client-snap_app-accessing-1-port $devpath $major:$minor"`)
}
func (s *I2cInterfaceSuite) TestAppArmorSpec(c *C) {
@@ -187,6 +187,7 @@ func (s *IioInterfaceSuite) TestConnectedPlugUDevSnippets(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# iio
KERNEL=="iio:device1", TAG+="snap_client-snap_app-accessing-1-port"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_client-snap_app-accessing-1-port", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_client-snap_app-accessing-1-port $devpath $major:$minor"`)
}
func (s *IioInterfaceSuite) TestConnectedPlugAppArmorSnippets(c *C) {
@@ -99,6 +99,7 @@ func (s *ioPortsControlInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(udevSpec.Snippets(), HasLen, 2)
c.Assert(udevSpec.Snippets(), testutil.Contains, `# io-ports-control
KERNEL=="port", TAG+="snap_consumer_app"`)
+ c.Assert(udevSpec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *ioPortsControlInterfaceSuite) TestStaticInfo(c *C) {
@@ -91,6 +91,7 @@ func (s *JoystickInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# joystick
KERNEL=="js[0-9]*", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *JoystickInterfaceSuite) TestStaticInfo(c *C) {
@@ -99,6 +99,7 @@ func (s *KernelModuleControlInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# kernel-module-control
KERNEL=="mem", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *KernelModuleControlInterfaceSuite) TestStaticInfo(c *C) {
@@ -96,6 +96,7 @@ func (s *kvmInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets()[0], Equals, `# kvm
KERNEL=="kvm", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *kvmInterfaceSuite) TestStaticInfo(c *C) {
@@ -157,6 +157,7 @@ KERNEL=="mouse[0-9]*", TAG+="snap_mir-server_mir"`)
KERNEL=="event[0-9]*", TAG+="snap_mir-server_mir"`)
c.Assert(udevSpec.Snippets(), testutil.Contains, `# mir
KERNEL=="ts[0-9]*", TAG+="snap_mir-server_mir"`)
+ c.Assert(udevSpec.Snippets(), testutil.Contains, `TAG=="snap_mir-server_mir", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_mir-server_mir $devpath $major:$minor"`)
}
func (s *MirInterfaceSuite) TestInterfaces(c *C) {
@@ -207,6 +207,7 @@ func (s *ModemManagerInterfaceSuite) TestUsedSecuritySystems(c *C) {
c.Assert(udevSpec.Snippets()[0], testutil.Contains, `SUBSYSTEMS=="usb"`)
c.Assert(udevSpec.Snippets(), testutil.Contains, `# modem-manager
KERNEL=="tty[A-Z]*[0-9]*|cdc-wdm[0-9]*", TAG+="snap_modem-manager_mm"`)
+ c.Assert(udevSpec.Snippets(), testutil.Contains, `TAG=="snap_modem-manager_mm", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_modem-manager_mm $devpath $major:$minor"`)
}
func (s *ModemManagerInterfaceSuite) TestPermanentSlotDBus(c *C) {
@@ -99,6 +99,7 @@ func (s *NetworkControlInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 3)
c.Assert(spec.Snippets(), testutil.Contains, `# network-control
KERNEL=="tun", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *NetworkControlInterfaceSuite) TestStaticInfo(c *C) {
@@ -196,6 +196,7 @@ func (s *NetworkManagerInterfaceSuite) TestUDevPermanentSlot(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# network-manager
KERNEL=="rfkill", TAG+="snap_network-manager_nm"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_network-manager_nm", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_network-manager_nm $devpath $major:$minor"`)
}
func (s *NetworkManagerInterfaceSuite) TestInterfaces(c *C) {
@@ -206,6 +206,7 @@ KERNEL=="tty[A-Z]*[0-9]*|cdc-wdm[0-9]*", TAG+="snap_ofono_app"`)
KERNEL=="tun", TAG+="snap_ofono_app"`)
c.Assert(spec.Snippets(), testutil.Contains, `# ofono
KERNEL=="dsp", TAG+="snap_ofono_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_ofono_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_ofono_app $devpath $major:$minor"`)
}
func (s *OfonoInterfaceSuite) TestInterfaces(c *C) {
@@ -92,6 +92,7 @@ func (s *OpenglInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 3)
c.Assert(spec.Snippets(), testutil.Contains, `# opengl
SUBSYSTEM=="drm", KERNEL=="card[0-9]*", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *OpenglInterfaceSuite) TestStaticInfo(c *C) {
@@ -91,6 +91,7 @@ func (s *OpticalDriveInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 3)
c.Assert(spec.Snippets(), testutil.Contains, `# optical-drive
KERNEL=="sr[0-9]*", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *OpticalDriveInterfaceSuite) TestStaticInfo(c *C) {
@@ -91,6 +91,7 @@ func (s *PhysicalMemoryControlInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# physical-memory-control
KERNEL=="mem", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *PhysicalMemoryControlInterfaceSuite) TestStaticInfo(c *C) {
@@ -92,6 +92,7 @@ func (s *PhysicalMemoryObserveInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# physical-memory-observe
KERNEL=="mem", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *PhysicalMemoryObserveInterfaceSuite) TestStaticInfo(c *C) {
@@ -101,6 +101,7 @@ func (s *PppInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 3)
c.Assert(spec.Snippets(), testutil.Contains, `# ppp
KERNEL=="ppp", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *PppInterfaceSuite) TestStaticInfo(c *C) {
@@ -129,6 +129,7 @@ KERNEL=="controlC[0-9]*", TAG+="snap_pulseaudio_app1"`)
KERNEL=="pcmC[0-9]*D[0-9]*[cp]", TAG+="snap_pulseaudio_app1"`)
c.Assert(spec.Snippets(), testutil.Contains, `# pulseaudio
KERNEL=="timer", TAG+="snap_pulseaudio_app1"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_pulseaudio_app1", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_pulseaudio_app1 $devpath $major:$minor"`)
}
func (s *PulseAudioInterfaceSuite) TestInterfaces(c *C) {
@@ -91,6 +91,7 @@ func (s *RawUsbInterfaceSuite) TestUDevSpec(c *C) {
c.Assert(spec.Snippets(), HasLen, 2)
c.Assert(spec.Snippets(), testutil.Contains, `# raw-usb
SUBSYSTEM=="usb", TAG+="snap_consumer_app"`)
+ c.Assert(spec.Snippets(), testutil.Contains, `TAG=="snap_consumer_app", RUN+="/lib/udev/snappy-app-dev $env{ACTION} snap_consumer_app $devpath $major:$minor"`)
}
func (s *RawUsbInterfaceSuite) TestStaticInfo(c *C) {
Oops, something went wrong.