Skip to content

Commit

Permalink
slicer/test: Support for custom packages
Browse files Browse the repository at this point in the history
Currently we only test with the embedded base-files files package. This
quite limits what we can test. But since commit a3315e3
("testutil/pkgdata: Create deb programatically") we have the ability to
define our own custom package content.

Add support for testing with custom packages. These can be defined in
each test case per archive name. The content can be defined directly in
test case definition with the help of testutil.MustMakeDeb().

The package content is wrapped in the testPackage structure. This
introduces one level of nesting in each test case package definition. In
future, we will add package metadata to the package definition, namely
version. So wrapping the package content in the structure now and later
just adding a new field to it the structure later will make the future
diff much smaller.
  • Loading branch information
woky committed Oct 9, 2023
1 parent 140428e commit 61d2839
Showing 1 changed file with 104 additions and 8 deletions.
112 changes: 104 additions & 8 deletions internal/slicer/slicer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,20 @@ import (
"github.com/canonical/chisel/internal/testutil"
)

var (
REG = testutil.REG
DIR = testutil.DIR
LNK = testutil.LNK
)

type testPackage struct {
content []byte
}

type slicerTest struct {
summary string
arch string
pkgs map[string]map[string]testPackage
release map[string]string
slices []setup.SliceKey
hackopt func(c *C, opts *slicer.RunOptions)
Expand Down Expand Up @@ -515,6 +526,77 @@ var slicerTests = []slicerTest{{
"/usr/bin/": "dir 0755",
"/usr/bin/hello": "file 0775 eaf29575",
},
}, {
summary: "Custom archives with custom packages",
pkgs: map[string]map[string]testPackage{
"leptons": {
"electron": testPackage{
content: testutil.MustMakeDeb([]testutil.TarEntry{
DIR(0755, "./"),
DIR(0755, "./mass/"),
REG(0644, "./mass/electron", "9.1093837015E−31 kg\n"),
DIR(0755, "./usr/"),
DIR(0755, "./usr/share/"),
DIR(0755, "./usr/share/doc/"),
DIR(0755, "./usr/share/doc/electron/"),
REG(0644, "./usr/share/doc/electron/copyright", ""),
}),
},
},
"hadrons": {
"proton": testPackage{
content: testutil.MustMakeDeb([]testutil.TarEntry{
DIR(0755, "./"),
DIR(0755, "./mass/"),
REG(0644, "./mass/proton", "1.67262192369E−27 kg\n"),
}),
},
},
},
release: map[string]string{
"chisel.yaml": `
format: chisel-v1
archives:
leptons:
version: 1
suites: [main]
components: [main, universe]
default: true
hadrons:
version: 1
suites: [main]
components: [main]
`,
"slices/mydir/electron.yaml": `
package: electron
slices:
mass:
contents:
/mass/electron:
`,
"slices/mydir/proton.yaml": `
package: proton
archive: hadrons
slices:
mass:
contents:
/mass/proton:
`,
},
slices: []setup.SliceKey{
{"electron", "mass"},
{"proton", "mass"},
},
result: map[string]string{
"/mass/": "dir 0755",
"/mass/electron": "file 0644 a1258e30",
"/mass/proton": "file 0644 a2390d10",
"/usr/": "dir 0755",
"/usr/share/": "dir 0755",
"/usr/share/doc/": "dir 0755",
"/usr/share/doc/electron/": "dir 0755",
"/usr/share/doc/electron/copyright": "file 0644 empty",
},
}}

const defaultChiselYaml = `
Expand All @@ -527,7 +609,7 @@ const defaultChiselYaml = `

type testArchive struct {
options archive.Options
pkgs map[string][]byte
pkgs map[string]testPackage
}

func (a *testArchive) Options() *archive.Options {
Expand All @@ -536,7 +618,7 @@ func (a *testArchive) Options() *archive.Options {

func (a *testArchive) Fetch(pkg string) (io.ReadCloser, error) {
if data, ok := a.pkgs[pkg]; ok {
return io.NopCloser(bytes.NewBuffer(data)), nil
return io.NopCloser(bytes.NewBuffer(data.content)), nil
}
return nil, fmt.Errorf("attempted to open %q package", pkg)
}
Expand Down Expand Up @@ -569,16 +651,23 @@ func (s *S) TestRun(c *C) {
selection, err := setup.Select(release, test.slices)
c.Assert(err, IsNil)

pkgs := map[string][]byte{
"base-files": testutil.PackageData["base-files"],
pkgs := map[string]testPackage{
"base-files": testPackage{content: testutil.PackageData["base-files"]},
}
for name, entries := range packageEntries {
deb, err := testutil.MakeDeb(entries)
c.Assert(err, IsNil)
pkgs[name] = deb
pkgs[name] = testPackage{content: deb}
}
archives := map[string]archive.Archive{}
for name, setupArchive := range release.Archives {
var archivePkgs map[string]testPackage
if test.pkgs != nil {
archivePkgs = test.pkgs[name]
}
if archivePkgs == nil {
archivePkgs = pkgs
}
archive := &testArchive{
options: archive.Options{
Label: setupArchive.Name,
Expand All @@ -587,7 +676,7 @@ func (s *S) TestRun(c *C) {
Components: setupArchive.Components,
Arch: test.arch,
},
pkgs: pkgs,
pkgs: archivePkgs,
}
archives[name] = archive
}
Expand All @@ -611,8 +700,15 @@ func (s *S) TestRun(c *C) {

if test.result != nil {
result := make(map[string]string, len(copyrightEntries)+len(test.result))
for k, v := range copyrightEntries {
result[k] = v
if test.pkgs == nil {
// This was added in order to not specify copyright entries for each
// existing test. These tests use only the base-files embedded
// package. Custom packages may not include copyright entries
// though. So if a test defines any custom packages, it must include
// copyright entries explicitly in the results.
for k, v := range copyrightEntries {
result[k] = v
}
}
for k, v := range test.result {
result[k] = v
Expand Down

0 comments on commit 61d2839

Please sign in to comment.