| package efivarfs |
| |
| import ( |
| "bytes" |
| "testing" |
| |
| "github.com/google/uuid" |
| ) |
| |
| func TestMarshalExamples(t *testing.T) { |
| cases := []struct { |
| name string |
| path DevicePath |
| expected []byte |
| expectError bool |
| }{ |
| { |
| name: "TestNone", |
| path: DevicePath{}, |
| expected: []byte{ |
| 0x7f, 0xff, // End of HW device path |
| 0x04, 0x00, // Length: 4 bytes |
| }, |
| }, |
| { |
| // From UEFI Device Path Examples, extracted single entry |
| name: "TestHD", |
| path: DevicePath{ |
| &HardDrivePath{ |
| PartitionNumber: 1, |
| PartitionStartBlock: 0x22, |
| PartitionSizeBlocks: 0x2710000, |
| PartitionMatch: PartitionGPT{ |
| PartitionUUID: uuid.MustParse("15E39A00-1DD2-1000-8D7F-00A0C92408FC"), |
| }, |
| }, |
| }, |
| expected: []byte{ |
| 0x04, 0x01, // Hard Disk type |
| 0x2a, 0x00, // Length |
| 0x01, 0x00, 0x00, 0x00, // Partition Number |
| 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Part Start |
| 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x00, 0x00, // Part Size |
| 0x00, 0x9a, 0xe3, 0x15, 0xd2, 0x1d, 0x00, 0x10, |
| 0x8d, 0x7f, 0x00, 0xa0, 0xc9, 0x24, 0x08, 0xfc, // Signature |
| 0x02, // Part Format GPT |
| 0x02, // Signature GPT |
| 0x7f, 0xff, // End of HW device path |
| 0x04, 0x00, // Length: 4 bytes |
| }, |
| }, |
| { |
| name: "TestFilePath", |
| path: DevicePath{ |
| FilePath("asdf"), |
| }, |
| expected: []byte{ |
| 0x04, 0x04, // File Path type |
| 0x0e, 0x00, // Length |
| 'a', 0x00, 's', 0x00, 'd', 0x00, 'f', 0x00, |
| 0x00, 0x00, |
| 0x7f, 0xff, // End of HW device path |
| 0x04, 0x00, // Length: 4 bytes |
| }, |
| }, |
| } |
| |
| for _, c := range cases { |
| t.Run(c.name, func(t *testing.T) { |
| got, err := c.path.Marshal() |
| if err != nil && !c.expectError { |
| t.Fatalf("unexpected error: %v", err) |
| } |
| if err == nil && c.expectError { |
| t.Fatalf("expected error, got %x", got) |
| } |
| if err != nil && c.expectError { |
| // Do not compare result in case error is expected |
| return |
| } |
| if !bytes.Equal(got, c.expected) { |
| t.Fatalf("expected %x, got %x", c.expected, got) |
| } |
| if _, err := UnmarshalDevicePath(got); err != nil { |
| t.Errorf("failed to unmarshal value again: %v", err) |
| } |
| }) |
| } |
| } |