github.com/bugraaydogar/snapd@v0.0.0-20210315170335-8c70bb858939/snap/snaptest/snaptest_test.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2016 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 snaptest_test
    21  
    22  import (
    23  	"os"
    24  	"path/filepath"
    25  	"testing"
    26  
    27  	. "gopkg.in/check.v1"
    28  
    29  	"github.com/snapcore/snapd/dirs"
    30  	"github.com/snapcore/snapd/snap"
    31  	"github.com/snapcore/snapd/snap/snaptest"
    32  	"github.com/snapcore/snapd/testutil"
    33  )
    34  
    35  func TestSnapTest(t *testing.T) { TestingT(t) }
    36  
    37  const sampleYaml = `
    38  name: sample
    39  version: 1
    40  apps:
    41   app:
    42     command: foo
    43  plugs:
    44   network:
    45    interface: network
    46  `
    47  
    48  type snapTestSuite struct{}
    49  
    50  var _ = Suite(&snapTestSuite{})
    51  
    52  func (s *snapTestSuite) SetUpTest(c *C) {
    53  	dirs.SetRootDir(c.MkDir())
    54  }
    55  
    56  func (s *snapTestSuite) TearDownTest(c *C) {
    57  	dirs.SetRootDir("")
    58  }
    59  
    60  func (s *snapTestSuite) TestMockSnap(c *C) {
    61  	snapInfo := snaptest.MockSnap(c, sampleYaml, &snap.SideInfo{Revision: snap.R(42)})
    62  	// Data from YAML is used
    63  	c.Check(snapInfo.InstanceName(), Equals, "sample")
    64  	// Data from SideInfo is used
    65  	c.Check(snapInfo.Revision, Equals, snap.R(42))
    66  	// The YAML is placed on disk
    67  	c.Check(filepath.Join(dirs.SnapMountDir, "sample", "42", "meta", "snap.yaml"),
    68  		testutil.FileEquals, sampleYaml)
    69  
    70  	// More
    71  	c.Check(snapInfo.Apps["app"].Command, Equals, "foo")
    72  	c.Check(snapInfo.Plugs["network"].Interface, Equals, "network")
    73  }
    74  
    75  func (s *snapTestSuite) TestMockSnapInstance(c *C) {
    76  	snapInfo := snaptest.MockSnapInstance(c, "sample_instance", sampleYaml, &snap.SideInfo{Revision: snap.R(42)})
    77  	// Data from YAML and parameters is used
    78  	c.Check(snapInfo.InstanceName(), Equals, "sample_instance")
    79  	c.Check(snapInfo.SnapName(), Equals, "sample")
    80  	c.Check(snapInfo.InstanceKey, Equals, "instance")
    81  
    82  	// Data from SideInfo is used
    83  	c.Check(snapInfo.Revision, Equals, snap.R(42))
    84  	// The YAML is placed on disk
    85  	c.Check(filepath.Join(dirs.SnapMountDir, "sample_instance", "42", "meta", "snap.yaml"),
    86  		testutil.FileEquals, sampleYaml)
    87  
    88  	// More
    89  	c.Check(snapInfo.Apps["app"].Command, Equals, "foo")
    90  	c.Check(snapInfo.Plugs["network"].Interface, Equals, "network")
    91  }
    92  
    93  func (s *snapTestSuite) TestMockSnapCurrent(c *C) {
    94  	snapInfo := snaptest.MockSnapCurrent(c, sampleYaml, &snap.SideInfo{Revision: snap.R(42)})
    95  	// Data from YAML is used
    96  	c.Check(snapInfo.InstanceName(), Equals, "sample")
    97  	// Data from SideInfo is used
    98  	c.Check(snapInfo.Revision, Equals, snap.R(42))
    99  	// The YAML is placed on disk
   100  	c.Check(filepath.Join(dirs.SnapMountDir, "sample", "42", "meta", "snap.yaml"),
   101  		testutil.FileEquals, sampleYaml)
   102  	link, err := os.Readlink(filepath.Join(dirs.SnapMountDir, "sample", "current"))
   103  	c.Check(err, IsNil)
   104  	c.Check(link, Equals, "42")
   105  }
   106  
   107  func (s *snapTestSuite) TestMockSnapInstanceCurrent(c *C) {
   108  	snapInfo := snaptest.MockSnapInstanceCurrent(c, "sample_instance", sampleYaml, &snap.SideInfo{Revision: snap.R(42)})
   109  	// Data from YAML and parameters is used
   110  	c.Check(snapInfo.InstanceName(), Equals, "sample_instance")
   111  	c.Check(snapInfo.SnapName(), Equals, "sample")
   112  	c.Check(snapInfo.InstanceKey, Equals, "instance")
   113  	// Data from SideInfo is used
   114  	c.Check(snapInfo.Revision, Equals, snap.R(42))
   115  	// The YAML is placed on disk
   116  	c.Check(filepath.Join(dirs.SnapMountDir, "sample_instance", "42", "meta", "snap.yaml"),
   117  		testutil.FileEquals, sampleYaml)
   118  	link, err := os.Readlink(filepath.Join(dirs.SnapMountDir, "sample_instance", "current"))
   119  	c.Check(err, IsNil)
   120  	c.Check(link, Equals, filepath.Join(dirs.SnapMountDir, "sample_instance", "42"))
   121  }
   122  
   123  func (s *snapTestSuite) TestMockInfo(c *C) {
   124  	snapInfo := snaptest.MockInfo(c, sampleYaml, &snap.SideInfo{Revision: snap.R(42)})
   125  	// Data from YAML is used
   126  	c.Check(snapInfo.InstanceName(), Equals, "sample")
   127  	// Data from SideInfo is used
   128  	c.Check(snapInfo.Revision, Equals, snap.R(42))
   129  	// The YAML is *not* placed on disk
   130  	_, err := os.Stat(filepath.Join(dirs.SnapMountDir, "sample", "42", "meta", "snap.yaml"))
   131  	c.Assert(os.IsNotExist(err), Equals, true)
   132  	// More
   133  	c.Check(snapInfo.Apps["app"].Command, Equals, "foo")
   134  	c.Check(snapInfo.Plugs["network"].Interface, Equals, "network")
   135  }
   136  
   137  func (s *snapTestSuite) TestMockInvalidInfo(c *C) {
   138  	snapInfo := snaptest.MockInvalidInfo(c, sampleYaml+"\nslots:\n network:\n", &snap.SideInfo{Revision: snap.R(42)})
   139  	// Data from YAML is used
   140  	c.Check(snapInfo.InstanceName(), Equals, "sample")
   141  	// Data from SideInfo is used
   142  	c.Check(snapInfo.Revision, Equals, snap.R(42))
   143  	// The YAML is *not* placed on disk
   144  	_, err := os.Stat(filepath.Join(dirs.SnapMountDir, "sample", "42", "meta", "snap.yaml"))
   145  	c.Assert(os.IsNotExist(err), Equals, true)
   146  	// More
   147  	c.Check(snapInfo.Apps["app"].Command, Equals, "foo")
   148  	c.Check(snapInfo.Plugs["network"].Interface, Equals, "network")
   149  	c.Check(snapInfo.Slots["network"].Interface, Equals, "network")
   150  	// They info object is not valid
   151  	c.Check(snap.Validate(snapInfo), ErrorMatches, `cannot have plug and slot with the same name: "network"`)
   152  }
   153  
   154  func (s *snapTestSuite) TestRenameSlot(c *C) {
   155  	snapInfo := snaptest.MockInfo(c, `name: core
   156  type: os
   157  version: 0
   158  slots:
   159    old:
   160      interface: interface
   161    slot:
   162      interface: interface
   163  plugs:
   164    plug:
   165      interface: interface
   166  apps:
   167    app:
   168  hooks:
   169    configure:
   170  `, nil)
   171  
   172  	// Rename "old" to "plug"
   173  	err := snaptest.RenameSlot(snapInfo, "old", "plug")
   174  	c.Assert(err, ErrorMatches, `cannot rename slot "old" to "plug": existing plug with that name`)
   175  
   176  	// Rename "old" to "slot"
   177  	err = snaptest.RenameSlot(snapInfo, "old", "slot")
   178  	c.Assert(err, ErrorMatches, `cannot rename slot "old" to "slot": existing slot with that name`)
   179  
   180  	// Rename "old" to "bad name"
   181  	err = snaptest.RenameSlot(snapInfo, "old", "bad name")
   182  	c.Assert(err, ErrorMatches, `cannot rename slot "old" to "bad name": invalid slot name: "bad name"`)
   183  
   184  	// Rename "old" to "new"
   185  	err = snaptest.RenameSlot(snapInfo, "old", "new")
   186  	c.Assert(err, IsNil)
   187  
   188  	// Check that there's no trace of the old slot name.
   189  	c.Assert(snapInfo.Slots["old"], IsNil)
   190  	c.Assert(snapInfo.Slots["new"], NotNil)
   191  	c.Assert(snapInfo.Slots["new"].Name, Equals, "new")
   192  	c.Assert(snapInfo.Apps["app"].Slots["old"], IsNil)
   193  	c.Assert(snapInfo.Apps["app"].Slots["new"], DeepEquals, snapInfo.Slots["new"])
   194  	c.Assert(snapInfo.Hooks["configure"].Slots["old"], IsNil)
   195  	c.Assert(snapInfo.Hooks["configure"].Slots["new"], DeepEquals, snapInfo.Slots["new"])
   196  
   197  	// Rename "old" to "new" (again)
   198  	err = snaptest.RenameSlot(snapInfo, "old", "new")
   199  	c.Assert(err, ErrorMatches, `cannot rename slot "old" to "new": no such slot`)
   200  
   201  }
   202  
   203  func (s *snapTestSuite) TestMockSnapWithFiles(c *C) {
   204  	snapInfo := snaptest.MockSnapWithFiles(c, sampleYaml, &snap.SideInfo{Revision: snap.R(42)}, [][]string{
   205  		{"foo/bar", "bar"},
   206  		{"bar", "not foo"},
   207  		{"meta/gadget.yaml", "gadget yaml\nmulti line"},
   208  	})
   209  	// Data from YAML is used
   210  	c.Check(snapInfo.InstanceName(), Equals, "sample")
   211  	// Data from SideInfo is used
   212  	c.Check(snapInfo.Revision, Equals, snap.R(42))
   213  	c.Check(filepath.Join(snapInfo.MountDir(), "bar"), testutil.FileEquals, "not foo")
   214  	c.Check(filepath.Join(snapInfo.MountDir(), "foo/bar"), testutil.FileEquals, "bar")
   215  	c.Check(filepath.Join(snapInfo.MountDir(), "meta/gadget.yaml"), testutil.FileEquals, "gadget yaml\nmulti line")
   216  }
   217  
   218  func (s *snapTestSuite) TestMockContainerMinimal(c *C) {
   219  	cont := snaptest.MockContainer(c, nil)
   220  	err := snap.ValidateContainer(cont, &snap.Info{}, nil)
   221  	c.Check(err, IsNil)
   222  }
   223  
   224  func (s *snapTestSuite) TestMockContainer(c *C) {
   225  	defer snap.MockSanitizePlugsSlots(func(snapInfo *snap.Info) {})()
   226  
   227  	const snapYaml = `name: gadget
   228  type: gadget
   229  version: 1.0`
   230  	const gadgetYaml = `defaults:
   231  `
   232  	cont := snaptest.MockContainer(c, [][]string{
   233  		{"meta/snap.yaml", snapYaml},
   234  		{"meta/gadget.yaml", gadgetYaml},
   235  	})
   236  
   237  	info, err := snap.ReadInfoFromSnapFile(cont, nil)
   238  	c.Assert(err, IsNil)
   239  	c.Check(info.SnapName(), Equals, "gadget")
   240  	err = snap.ValidateContainer(cont, info, nil)
   241  	c.Assert(err, IsNil)
   242  	readGadgetYaml, err := cont.ReadFile("meta/gadget.yaml")
   243  	c.Assert(err, IsNil)
   244  	c.Check(readGadgetYaml, DeepEquals, []byte(gadgetYaml))
   245  }