You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.7 KiB
52 lines
1.7 KiB
package main
|
|
|
|
import (
|
|
"compress/gzip"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"tera-clone/services/tera-api/internal/update"
|
|
)
|
|
|
|
func TestPackRecoveryCreatesVerifiableOfflinePackage(t *testing.T) {
|
|
base := t.TempDir()
|
|
keys := filepath.Join(base, "keys")
|
|
if err := keygen([]string{"--output-dir", keys, "--key-id", "test-key", "--product", "tera-core-x48-pro", "--profile", "fet3568j-c"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
rootfsPath := filepath.Join(base, "rootfs.img.gz")
|
|
file, err := os.OpenFile(rootfsPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0o600)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
compressed := gzip.NewWriter(file)
|
|
if _, err := compressed.Write([]byte("rootfs-image-fixture")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := compressed.Close(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := file.Close(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
bootPath := filepath.Join(base, "boot.img")
|
|
if err := os.WriteFile(bootPath, []byte("signed-boot-fit-fixture"), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
packagePath := filepath.Join(base, "release.tera-update")
|
|
if err := packRecovery([]string{
|
|
"--private-key", filepath.Join(keys, "test-key.private.json"), "--output", packagePath,
|
|
"--rootfs-payload", rootfsPath, "--rootfs-encoding", "gzip", "--boot-payload", bootPath,
|
|
"--package-id", "release-1", "--version", "1.1.0", "--minimum-current-version", "1.0.0",
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
manifest, signer, err := update.VerifyPackage(packagePath, keys, "tera-core-x48-pro", "fet3568j-c", "1.0.0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if signer != "test-key" || manifest.Apply.Capability != update.ApplyCapabilityRecoveryV1 || !manifest.Apply.RebootRequired || len(manifest.Payloads) != 2 {
|
|
t.Fatalf("manifest=%+v signer=%q", manifest, signer)
|
|
}
|
|
}
|
|
|