github.com/meulengracht/snapd@v0.0.0-20210719210640-8bde69bcc84e/cmd/snap/cmd_pack_test.go (about)

     1  package main_test
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	"gopkg.in/check.v1"
    10  
    11  	snaprun "github.com/snapcore/snapd/cmd/snap"
    12  	"github.com/snapcore/snapd/logger"
    13  )
    14  
    15  const packSnapYaml = `name: hello
    16  version: 1.0.1
    17  apps:
    18   app:
    19    command: bin/hello
    20  `
    21  
    22  func makeSnapDirForPack(c *check.C, snapYaml string) string {
    23  	tempdir := c.MkDir()
    24  	c.Assert(os.Chmod(tempdir, 0755), check.IsNil)
    25  
    26  	// use meta/snap.yaml
    27  	metaDir := filepath.Join(tempdir, "meta")
    28  	err := os.Mkdir(metaDir, 0755)
    29  	c.Assert(err, check.IsNil)
    30  	err = ioutil.WriteFile(filepath.Join(metaDir, "snap.yaml"), []byte(snapYaml), 0644)
    31  	c.Assert(err, check.IsNil)
    32  
    33  	return tempdir
    34  }
    35  
    36  func (s *SnapSuite) TestPackCheckSkeletonNoAppFiles(c *check.C) {
    37  	_, r := logger.MockLogger()
    38  	defer r()
    39  
    40  	snapDir := makeSnapDirForPack(c, packSnapYaml)
    41  
    42  	// check-skeleton does not fail due to missing files
    43  	_, err := snaprun.Parser(snaprun.Client()).ParseArgs([]string{"pack", "--check-skeleton", snapDir})
    44  	c.Assert(err, check.IsNil)
    45  }
    46  
    47  func (s *SnapSuite) TestPackCheckSkeletonBadMeta(c *check.C) {
    48  	// no snap name
    49  	snapYaml := `
    50  version: foobar
    51  apps:
    52  `
    53  	snapDir := makeSnapDirForPack(c, snapYaml)
    54  
    55  	_, err := snaprun.Parser(snaprun.Client()).ParseArgs([]string{"pack", "--check-skeleton", snapDir})
    56  	c.Assert(err, check.ErrorMatches, `cannot validate snap "": snap name cannot be empty`)
    57  }
    58  
    59  func (s *SnapSuite) TestPackCheckSkeletonConflictingCommonID(c *check.C) {
    60  	// conflicting common-id
    61  	snapYaml := `name: foo
    62  version: foobar
    63  apps:
    64    foo:
    65      common-id: org.foo.foo
    66    bar:
    67      common-id: org.foo.foo
    68  `
    69  	snapDir := makeSnapDirForPack(c, snapYaml)
    70  
    71  	_, err := snaprun.Parser(snaprun.Client()).ParseArgs([]string{"pack", "--check-skeleton", snapDir})
    72  	c.Assert(err, check.ErrorMatches, `cannot validate snap "foo": application ("bar" common-id "org.foo.foo" must be unique, already used by application "foo"|"foo" common-id "org.foo.foo" must be unique, already used by application "bar")`)
    73  }
    74  
    75  func (s *SnapSuite) TestPackCheckSkeletonWonkyInterfaces(c *check.C) {
    76  	snapYaml := `
    77  name: foo
    78  version: 1.0.1
    79  slots:
    80    kale:
    81  `
    82  	snapDir := makeSnapDirForPack(c, snapYaml)
    83  
    84  	_, err := snaprun.Parser(snaprun.Client()).ParseArgs([]string{"pack", "--check-skeleton", snapDir})
    85  	c.Assert(err, check.IsNil)
    86  	c.Check(s.stderr.String(), check.Equals, "snap \"foo\" has bad plugs or slots: kale (unknown interface \"kale\")\n")
    87  }
    88  
    89  func (s *SnapSuite) TestPackPacksFailsForMissingPaths(c *check.C) {
    90  	_, r := logger.MockLogger()
    91  	defer r()
    92  
    93  	snapDir := makeSnapDirForPack(c, packSnapYaml)
    94  
    95  	_, err := snaprun.Parser(snaprun.Client()).ParseArgs([]string{"pack", snapDir, snapDir})
    96  	c.Assert(err, check.ErrorMatches, ".* snap is unusable due to missing files")
    97  }
    98  
    99  func (s *SnapSuite) TestPackPacksASnap(c *check.C) {
   100  	snapDir := makeSnapDirForPack(c, packSnapYaml)
   101  
   102  	const helloBinContent = `#!/bin/sh
   103  printf "hello world"
   104  `
   105  	// an example binary
   106  	binDir := filepath.Join(snapDir, "bin")
   107  	err := os.Mkdir(binDir, 0755)
   108  	c.Assert(err, check.IsNil)
   109  	err = ioutil.WriteFile(filepath.Join(binDir, "hello"), []byte(helloBinContent), 0755)
   110  	c.Assert(err, check.IsNil)
   111  
   112  	_, err = snaprun.Parser(snaprun.Client()).ParseArgs([]string{"pack", snapDir, snapDir})
   113  	c.Assert(err, check.IsNil)
   114  
   115  	matches, err := filepath.Glob(snapDir + "/hello*.snap")
   116  	c.Assert(err, check.IsNil)
   117  	c.Assert(matches, check.HasLen, 1)
   118  }
   119  
   120  func (s *SnapSuite) TestPackPacksASnapWithCompressionHappy(c *check.C) {
   121  	snapDir := makeSnapDirForPack(c, "name: hello\nversion: 1.0")
   122  
   123  	for _, comp := range []string{"xz", "lzo"} {
   124  		_, err := snaprun.Parser(snaprun.Client()).ParseArgs([]string{"pack", "--compression", comp, snapDir, snapDir})
   125  		c.Assert(err, check.IsNil)
   126  
   127  		matches, err := filepath.Glob(snapDir + "/hello*.snap")
   128  		c.Assert(err, check.IsNil)
   129  		c.Assert(matches, check.HasLen, 1)
   130  		err = os.Remove(matches[0])
   131  		c.Assert(err, check.IsNil)
   132  	}
   133  }
   134  
   135  func (s *SnapSuite) TestPackPacksASnapWithCompressionUnhappy(c *check.C) {
   136  	snapDir := makeSnapDirForPack(c, "name: hello\nversion: 1.0")
   137  
   138  	for _, comp := range []string{"gzip", "zstd", "silly"} {
   139  		_, err := snaprun.Parser(snaprun.Client()).ParseArgs([]string{"pack", "--compression", comp, snapDir, snapDir})
   140  		c.Assert(err, check.ErrorMatches, fmt.Sprintf(`cannot pack "/.*": cannot use compression %q`, comp))
   141  	}
   142  }