clonetool/disklayout_test.go
2026-09-06 20:15:54 +02:00

114 lines
3.2 KiB
Go

package main
import (
"strings"
"testing"
)
const gptDump = `label: gpt
label-id: 1D2E3F4A-1111-2222-3333-444455556666
device: /dev/sda
unit: sectors
first-lba: 2048
last-lba: 8388574
sector-size: 512
/dev/sda1 : start= 2048, size= 204800, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, uuid=AAAAAAAA-1111-2222-3333-444455556666, name="EFI System Partition"
/dev/sda2 : start= 206848, size= 8179712, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=BBBBBBBB-1111-2222-3333-444455556666
`
const mbrDump = `label: dos
label-id: 0x1a2b3c4d
device: /dev/sdb
unit: sectors
sector-size: 512
/dev/sdb1 : start= 2048, size= 512000, type=83, bootable
/dev/sdb2 : start= 514048, size= 41734144, type=83
`
func TestParseSfdiskDumpGPT(t *testing.T) {
var d DiskLayout
if err := d.parseSfdiskDump(gptDump); err != nil {
t.Fatal(err)
}
if d.Label != "gpt" || d.Scheme != "gpt" {
t.Fatalf("label/scheme = %q/%q", d.Label, d.Scheme)
}
if d.LabelID != "1D2E3F4A-1111-2222-3333-444455556666" {
t.Fatalf("labelID = %q", d.LabelID)
}
if d.FirstLBA != 2048 || d.LastLBA != 8388574 {
t.Fatalf("lba = %d/%d", d.FirstLBA, d.LastLBA)
}
if len(d.Partitions) != 2 {
t.Fatalf("parts = %d", len(d.Partitions))
}
p1 := d.Partitions[0]
if p1.Num != 1 || p1.Start != 2048 || p1.Size != 204800 {
t.Fatalf("p1 = %+v", p1)
}
if p1.Type != "C12A7328-F81F-11D2-BA4B-00A0C93EC93B" || p1.UUID != "AAAAAAAA-1111-2222-3333-444455556666" {
t.Fatalf("p1 type/uuid = %q/%q", p1.Type, p1.UUID)
}
if p1.Name != "EFI System Partition" {
t.Fatalf("p1 name = %q", p1.Name)
}
if !p1.isESP() {
t.Fatalf("p1 should be ESP")
}
if d.Partitions[1].Num != 2 || d.Partitions[1].Size != 8179712 {
t.Fatalf("p2 = %+v", d.Partitions[1])
}
}
func TestParseSfdiskDumpMBR(t *testing.T) {
var d DiskLayout
if err := d.parseSfdiskDump(mbrDump); err != nil {
t.Fatal(err)
}
if d.Scheme != "mbr" || d.LabelID != "0x1a2b3c4d" {
t.Fatalf("scheme/id = %q/%q", d.Scheme, d.LabelID)
}
if len(d.Partitions) != 2 || d.Partitions[0].Attrs != "bootable" {
t.Fatalf("parts = %+v", d.Partitions)
}
}
func TestSfdiskRestoreScript(t *testing.T) {
var d DiskLayout
if err := d.parseSfdiskDump(gptDump); err != nil {
t.Fatal(err)
}
// keep IDs
s := d.sfdiskRestoreScript(false, nil)
if !strings.Contains(s, "label-id: 1D2E3F4A-1111-2222-3333-444455556666") {
t.Fatalf("expected label-id kept:\n%s", s)
}
if !strings.Contains(s, "uuid=AAAAAAAA-1111-2222-3333-444455556666") {
t.Fatalf("expected part uuid kept:\n%s", s)
}
if strings.Contains(s, "device:") || strings.Contains(s, "/dev/sda1") {
t.Fatalf("script must be device-independent:\n%s", s)
}
if strings.Contains(s, "last-lba") {
t.Fatalf("script must drop last-lba:\n%s", s)
}
// new IDs
s2 := d.sfdiskRestoreScript(true, nil)
if strings.Contains(s2, "label-id:") || strings.Contains(s2, "uuid=") {
t.Fatalf("--new-ids must strip ids:\n%s", s2)
}
// size override on p2
s3 := d.sfdiskRestoreScript(false, map[int]int64{2: 4000000})
if !strings.Contains(s3, "size=4000000") {
t.Fatalf("expected overridden size:\n%s", s3)
}
if strings.Contains(s3, "size=8179712") {
t.Fatalf("old size should be gone:\n%s", s3)
}
}