github.com/rigado/snapd@v2.42.5-go-mod+incompatible/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  version: 0
   157  slots:
   158    old:
   159      interface: interface
   160    slot:
   161      interface: interface
   162  plugs:
   163    plug:
   164      interface: interface
   165  apps:
   166    app:
   167  hooks:
   168    configure:
   169  `, nil)
   170  
   171  	// Rename "old" to "plug"
   172  	err := snaptest.RenameSlot(snapInfo, "old", "plug")
   173  	c.Assert(err, ErrorMatches, `cannot rename slot "old" to "plug": existing plug with that name`)
   174  
   175  	// Rename "old" to "slot"
   176  	err = snaptest.RenameSlot(snapInfo, "old", "slot")
   177  	c.Assert(err, ErrorMatches, `cannot rename slot "old" to "slot": existing slot with that name`)
   178  
   179  	// Rename "old" to "bad name"
   180  	err = snaptest.RenameSlot(snapInfo, "old", "bad name")
   181  	c.Assert(err, ErrorMatches, `cannot rename slot "old" to "bad name": invalid slot name: "bad name"`)
   182  
   183  	// Rename "old" to "new"
   184  	err = snaptest.RenameSlot(snapInfo, "old", "new")
   185  	c.Assert(err, IsNil)
   186  
   187  	// Check that there's no trace of the old slot name.
   188  	c.Assert(snapInfo.Slots["old"], IsNil)
   189  	c.Assert(snapInfo.Slots["new"], NotNil)
   190  	c.Assert(snapInfo.Slots["new"].Name, Equals, "new")
   191  	c.Assert(snapInfo.Apps["app"].Slots["old"], IsNil)
   192  	c.Assert(snapInfo.Apps["app"].Slots["new"], DeepEquals, snapInfo.Slots["new"])
   193  	c.Assert(snapInfo.Hooks["configure"].Slots["old"], IsNil)
   194  	c.Assert(snapInfo.Hooks["configure"].Slots["new"], DeepEquals, snapInfo.Slots["new"])
   195  
   196  	// Rename "old" to "new" (again)
   197  	err = snaptest.RenameSlot(snapInfo, "old", "new")
   198  	c.Assert(err, ErrorMatches, `cannot rename slot "old" to "new": no such slot`)
   199  
   200  }
   201  
   202  func (s *snapTestSuite) TestMockSnapWithFiles(c *C) {
   203  	snapInfo := snaptest.MockSnapWithFiles(c, sampleYaml, &snap.SideInfo{Revision: snap.R(42)}, [][]string{
   204  		{"foo/bar", "bar"},
   205  		{"bar", "not foo"},
   206  		{"meta/gadget.yaml", "gadget yaml\nmulti line"},
   207  	})
   208  	// Data from YAML is used
   209  	c.Check(snapInfo.InstanceName(), Equals, "sample")
   210  	// Data from SideInfo is used
   211  	c.Check(snapInfo.Revision, Equals, snap.R(42))
   212  	c.Check(filepath.Join(snapInfo.MountDir(), "bar"), testutil.FileEquals, "not foo")
   213  	c.Check(filepath.Join(snapInfo.MountDir(), "foo/bar"), testutil.FileEquals, "bar")
   214  	c.Check(filepath.Join(snapInfo.MountDir(), "meta/gadget.yaml"), testutil.FileEquals, "gadget yaml\nmulti line")
   215  }