fleet/pkg/file/rpm_test.go
Lucas Manuel Rodriguez f8f24e0a80
Add support to upload RPM packages (#22502)
#22473

- [X] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/Committing-Changes.md#changes-files)
for more information.
- [X] Added/updated tests
- [X] Manual QA for all new/changed functionality
- For Orbit and Fleet Desktop changes:
- [x] Manual QA must be performed in the three main OSs, macOS, Windows
and Linux.

---------

Co-authored-by: RachelElysia <71795832+RachelElysia@users.noreply.github.com>
Co-authored-by: Ian Littman <iansltx@gmail.com>
2024-10-01 13:02:13 -03:00

94 lines
2.4 KiB
Go

package file
import (
"crypto/sha256"
"io"
"os"
"path/filepath"
"testing"
"github.com/fleetdm/fleet/v4/orbit/pkg/constant"
"github.com/goreleaser/nfpm/v2"
"github.com/goreleaser/nfpm/v2/files"
"github.com/goreleaser/nfpm/v2/rpm"
"github.com/stretchr/testify/require"
)
func TestExtractRPMMetadata(t *testing.T) {
//
// Build an RPM package on the fly with nfpm.
//
tmpDir := t.TempDir()
err := os.WriteFile(filepath.Join(tmpDir, "foo.sh"), []byte("#!/bin/sh\n\necho \"Foo!\"\n"), constant.DefaultFileMode)
require.NoError(t, err)
contents := files.Contents{
&files.Content{
Source: filepath.Join(tmpDir, "**"),
Destination: "/",
},
}
postInstallPath := filepath.Join(t.TempDir(), "postinstall.sh")
err = os.WriteFile(postInstallPath, []byte("#!/bin/sh\n\necho \"Hello world!\"\n"), constant.DefaultFileMode)
require.NoError(t, err)
info := &nfpm.Info{
Name: "foobar",
Version: "1.2.3",
Description: "Foo bar",
Arch: "x86_64",
Maintainer: "Fleet Device Management",
Vendor: "Fleet Device Management",
License: "LICENSE",
Homepage: "https://example.com",
Overridables: nfpm.Overridables{
Contents: contents,
Scripts: nfpm.Scripts{
PostInstall: postInstallPath,
},
},
}
rpmPath := filepath.Join(t.TempDir(), "foobar.rpm")
out, err := os.OpenFile(rpmPath, os.O_CREATE|os.O_RDWR, constant.DefaultFileMode)
require.NoError(t, err)
t.Cleanup(func() {
out.Close()
})
err = rpm.Default.Package(info, out)
require.NoError(t, err)
err = out.Close()
require.NoError(t, err)
//
// Test ExtractRPMMetadata with the generated package.
// Using ExtractInstallerMetadata for broader testing (for a file
// with rpm extension it will call ExtractRPMMetadata).
//
f, err := os.Open(rpmPath)
require.NoError(t, err)
t.Cleanup(func() {
f.Close()
})
m, err := ExtractInstallerMetadata(f)
require.NoError(t, err)
err = f.Close()
require.NoError(t, err)
require.Empty(t, m.BundleIdentifier)
require.Equal(t, "rpm", m.Extension)
require.Equal(t, "foobar", m.Name)
require.Equal(t, []string{"foobar"}, m.PackageIDs)
require.Equal(t, sha256FilePath(t, rpmPath), m.SHASum)
require.Equal(t, "1.2.3", m.Version)
}
func sha256FilePath(t *testing.T, path string) []byte {
f, err := os.Open(path)
require.NoError(t, err)
t.Cleanup(func() {
f.Close()
})
h := sha256.New()
_, err = io.Copy(h, f)
require.NoError(t, err)
err = f.Close()
require.NoError(t, err)
return h.Sum(nil)
}