github.com/meulengracht/snapd@v0.0.0-20210719210640-8bde69bcc84e/interfaces/kmod/spec_test.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2017 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 kmod_test 21 22 import ( 23 . "gopkg.in/check.v1" 24 25 "github.com/snapcore/snapd/interfaces" 26 "github.com/snapcore/snapd/interfaces/ifacetest" 27 "github.com/snapcore/snapd/interfaces/kmod" 28 "github.com/snapcore/snapd/snap" 29 ) 30 31 type specSuite struct { 32 iface1, iface2 *ifacetest.TestInterface 33 spec *kmod.Specification 34 plugInfo *snap.PlugInfo 35 plug *interfaces.ConnectedPlug 36 slotInfo *snap.SlotInfo 37 slot *interfaces.ConnectedSlot 38 } 39 40 var _ = Suite(&specSuite{ 41 iface1: &ifacetest.TestInterface{ 42 InterfaceName: "test", 43 KModConnectedPlugCallback: func(spec *kmod.Specification, plug *interfaces.ConnectedPlug, slot *interfaces.ConnectedSlot) error { 44 return spec.AddModule("module1") 45 }, 46 KModConnectedSlotCallback: func(spec *kmod.Specification, plug *interfaces.ConnectedPlug, slot *interfaces.ConnectedSlot) error { 47 return spec.AddModule("module2") 48 }, 49 KModPermanentPlugCallback: func(spec *kmod.Specification, plug *snap.PlugInfo) error { 50 return spec.AddModule("module3") 51 }, 52 KModPermanentSlotCallback: func(spec *kmod.Specification, slot *snap.SlotInfo) error { 53 return spec.AddModule("module4") 54 }, 55 }, 56 iface2: &ifacetest.TestInterface{ 57 InterfaceName: "test-two", 58 KModConnectedPlugCallback: func(spec *kmod.Specification, plug *interfaces.ConnectedPlug, slot *interfaces.ConnectedSlot) error { 59 return spec.AddModule("module1") 60 }, 61 KModConnectedSlotCallback: func(spec *kmod.Specification, plug *interfaces.ConnectedPlug, slot *interfaces.ConnectedSlot) error { 62 return spec.AddModule("module2") 63 }, 64 KModPermanentPlugCallback: func(spec *kmod.Specification, plug *snap.PlugInfo) error { 65 return spec.AddModule("module5") 66 }, 67 KModPermanentSlotCallback: func(spec *kmod.Specification, slot *snap.SlotInfo) error { 68 return spec.AddModule("module6") 69 }, 70 }, 71 plugInfo: &snap.PlugInfo{ 72 Snap: &snap.Info{SuggestedName: "snap"}, 73 Name: "name", 74 Interface: "test", 75 }, 76 slotInfo: &snap.SlotInfo{ 77 Snap: &snap.Info{SuggestedName: "snap"}, 78 Name: "name", 79 Interface: "test", 80 }, 81 }) 82 83 func (s *specSuite) SetUpTest(c *C) { 84 s.spec = &kmod.Specification{} 85 s.plug = interfaces.NewConnectedPlug(s.plugInfo, nil, nil) 86 s.slot = interfaces.NewConnectedSlot(s.slotInfo, nil, nil) 87 } 88 89 // AddModule is not broken 90 func (s *specSuite) TestSmoke(c *C) { 91 m1 := "module1" 92 m2 := "module2" 93 c.Assert(s.spec.AddModule(m1), IsNil) 94 c.Assert(s.spec.AddModule(m2), IsNil) 95 c.Assert(s.spec.Modules(), DeepEquals, map[string]bool{ 96 "module1": true, "module2": true}) 97 } 98 99 // AddModule ignores duplicated modules 100 func (s *specSuite) TestDeduplication(c *C) { 101 mod := "module1" 102 c.Assert(s.spec.AddModule(mod), IsNil) 103 c.Assert(s.spec.AddModule(mod), IsNil) 104 c.Assert(s.spec.Modules(), DeepEquals, map[string]bool{"module1": true}) 105 106 var r interfaces.Specification = s.spec 107 c.Assert(r.AddConnectedPlug(s.iface1, s.plug, s.slot), IsNil) 108 c.Assert(r.AddConnectedSlot(s.iface1, s.plug, s.slot), IsNil) 109 c.Assert(r.AddPermanentPlug(s.iface1, s.plugInfo), IsNil) 110 c.Assert(r.AddPermanentSlot(s.iface1, s.slotInfo), IsNil) 111 112 c.Assert(r.AddConnectedPlug(s.iface2, s.plug, s.slot), IsNil) 113 c.Assert(r.AddConnectedSlot(s.iface2, s.plug, s.slot), IsNil) 114 c.Assert(r.AddPermanentPlug(s.iface2, s.plugInfo), IsNil) 115 c.Assert(r.AddPermanentSlot(s.iface2, s.slotInfo), IsNil) 116 c.Assert(s.spec.Modules(), DeepEquals, map[string]bool{ 117 "module1": true, "module2": true, "module3": true, "module4": true, "module5": true, "module6": true}) 118 } 119 120 // The kmod.Specification can be used through the interfaces.Specification interface 121 func (s *specSuite) TestSpecificationIface(c *C) { 122 var r interfaces.Specification = s.spec 123 c.Assert(r.AddConnectedPlug(s.iface1, s.plug, s.slot), IsNil) 124 c.Assert(r.AddConnectedSlot(s.iface1, s.plug, s.slot), IsNil) 125 c.Assert(r.AddPermanentPlug(s.iface1, s.plugInfo), IsNil) 126 c.Assert(r.AddPermanentSlot(s.iface1, s.slotInfo), IsNil) 127 c.Assert(s.spec.Modules(), DeepEquals, map[string]bool{ 128 "module1": true, "module2": true, "module3": true, "module4": true}) 129 }