Skip to content

Commit

Permalink
Create godoc-friendly examples (#268)
Browse files Browse the repository at this point in the history
Move tests from the diskfs.go global comment section and
update them as they are slightly out of date.
  • Loading branch information
aol-nnov authored Nov 19, 2024
1 parent 0aefa87 commit 15ebb7b
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 92 deletions.
92 changes: 0 additions & 92 deletions diskfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,98 +8,6 @@
// This is not intended as a replacement for operating system filesystem and disk drivers. Instead,
// it is intended to make it easy to work with partitions, partition tables and filesystems directly
// without requiring operating system mounts.
//
// Some examples:
//
// 1. Create a disk image of size 10MB with a FAT32 filesystem spanning the entire disk.
//
// import diskfs "github.com/diskfs/go-diskfs"
// size := 10*1024*1024 // 10 MB
//
// diskImg := "/tmp/disk.img"
// disk := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault)
//
// fs, err := disk.CreateFilesystem(0, diskfs.TypeFat32)
//
// 2. Create a disk of size 20MB with an MBR partition table, a single partition beginning at block 2048 (1MB),
// of size 10MB filled with a FAT32 filesystem.
//
// import diskfs "github.com/diskfs/go-diskfs"
//
// diskSize := 10*1024*1024 // 10 MB
//
// diskImg := "/tmp/disk.img"
// disk := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault)
//
// table := &mbr.Table{
// LogicalSectorSize: 512,
// PhysicalSectorSize: 512,
// Partitions: []*mbr.Partition{
// {
// Bootable: false,
// Type: Linux,
// Start: 2048,
// Size: 20480,
// },
// },
// }
//
// fs, err := disk.CreateFilesystem(1, diskfs.TypeFat32)
//
// 3. Create a disk of size 20MB with a GPT partition table, a single partition beginning at block 2048 (1MB),
// of size 10MB, and fill with the contents from the 10MB file "/root/contents.dat"
//
// import diskfs "github.com/diskfs/go-diskfs"
//
// diskSize := 10*1024*1024 // 10 MB
//
// diskImg := "/tmp/disk.img"
// disk := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault)
//
// table := &gpt.Table{
// LogicalSectorSize: 512,
// PhysicalSectorSize: 512,
// Partitions: []*gpt.Partition{
// {
// LogicalSectorSize: 512,
// PhysicalSectorSize: 512,
// ProtectiveMBR: true,
// },
// },
// }
//
// f, err := os.Open("/root/contents.dat")
// written, err := disk.WritePartitionContents(1, f)
//
// 4. Create a disk of size 20MB with an MBR partition table, a single partition beginning at block 2048 (1MB),
// of size 10MB filled with a FAT32 filesystem, and create some directories and files in that filesystem.
//
// import diskfs "github.com/diskfs/go-diskfs"
//
// diskSize := 10*1024*1024 // 10 MB
//
// diskImg := "/tmp/disk.img"
// disk := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault)
//
// table := &mbr.Table{
// LogicalSectorSize: 512,
// PhysicalSectorSize: 512,
// Partitions: []*mbr.Partition{
// {
// Bootable: false,
// Type: Linux,
// Start: 2048,
// Size: 20480,
// },
// },
// }
//
// fs, err := disk.CreateFilesystem(1, diskfs.TypeFat32)
// err := fs.Mkdir("/FOO/BAR")
// rw, err := fs.OpenFile("/FOO/BAR/AFILE.EXE", os.O_CREATE|os.O_RDRWR)
// b := make([]byte, 1024, 1024)
// rand.Read(b)
// err := rw.Write(b)
package diskfs

import (
Expand Down
145 changes: 145 additions & 0 deletions example_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
package diskfs_test

import (
"crypto/rand"
"log"
"os"

diskfs "github.com/diskfs/go-diskfs"
"github.com/diskfs/go-diskfs/disk"
"github.com/diskfs/go-diskfs/filesystem"
"github.com/diskfs/go-diskfs/partition/gpt"
"github.com/diskfs/go-diskfs/partition/mbr"
)

func check(err error) {
if err != nil {
log.Fatal(err)
}
}

func unused(_ ...any) {
}

// Create a disk image of size 10MB with a FAT32 filesystem spanning the entire disk.
func ExampleCreate_fat32() {
var size int64 = 10 * 1024 * 1024 // 10 MB

diskImg := "/tmp/disk.img"
defer os.Remove(diskImg)
theDisk, _ := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault)

fs, err := theDisk.CreateFilesystem(disk.FilesystemSpec{
Partition: 0,
FSType: filesystem.TypeFat32,
})
check(err)
unused(fs)
}

// Create a disk of size 20MB with an MBR partition table, a single partition beginning at block 2048 (1MB),
// of size 10MB filled with a FAT32 filesystem.
func ExampleCreate_mbr() {
var size int64 = 20 * 1024 * 1024 // 20 MB

diskImg := "/tmp/disk.img"
defer os.Remove(diskImg)
theDisk, _ := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault)

table := &mbr.Table{
LogicalSectorSize: 512,
PhysicalSectorSize: 512,
Partitions: []*mbr.Partition{
{
Bootable: false,
Type: mbr.Linux,
Start: 2048,
Size: 20480,
},
},
}

check(theDisk.Partition(table))

fs, err := theDisk.CreateFilesystem(disk.FilesystemSpec{
Partition: 1,
FSType: filesystem.TypeFat32,
})
check(err)
unused(fs)
}

// Create a disk of size 20MB with a GPT partition table, a single partition beginning at block 2048 (1MB), of size 10MB, and fill with the contents from the 10MB file "/root/contents.dat"
func ExampleCreate_gpt() {
var size int64 = 20 * 1024 * 1024 // 20 MB

diskImg := "/tmp/disk.img"
defer os.Remove(diskImg)
theDisk, _ := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault)

table := &gpt.Table{
LogicalSectorSize: 512,
PhysicalSectorSize: 512,
ProtectiveMBR: true,
Partitions: []*gpt.Partition{
{
Start: 1 * 1024 * 1024 / 512,
Size: 10 * 1024 * 1024,
},
},
}

check(theDisk.Partition(table))

f, err := os.Open("/root/contents.dat")
check(err)

written, err := theDisk.WritePartitionContents(1, f)
check(err)
unused(written)
}

// Create a disk of size 20MB with an MBR partition table, a single partition beginning at block 2048 (1MB),
// of size 10MB filled with a FAT32 filesystem, and create some directories and files in that filesystem.
func ExampleCreate_fat32WithDirsAndFiles() {
var size int64 = 20 * 1024 * 1024 // 20 MB

diskImg := "/tmp/disk.img"
defer os.Remove(diskImg)
theDisk, _ := diskfs.Create(diskImg, size, diskfs.Raw, diskfs.SectorSizeDefault)

table := &mbr.Table{
LogicalSectorSize: 512,
PhysicalSectorSize: 512,
Partitions: []*mbr.Partition{
{
Bootable: false,
Type: mbr.Linux,
Start: 2048,
Size: 20480,
},
},
}

check(theDisk.Partition(table))

fs, err := theDisk.CreateFilesystem(disk.FilesystemSpec{
Partition: 1,
FSType: filesystem.TypeFat32,
})
check(err)

err = fs.Mkdir("/FOO/BAR")
check(err)

rw, err := fs.OpenFile("/FOO/BAR/AFILE.EXE", os.O_CREATE|os.O_RDWR)
check(err)
b := make([]byte, 1024)

_, err = rand.Read(b)
check(err)

written, err := rw.Write(b)
check(err)
unused(written)
}

0 comments on commit 15ebb7b

Please sign in to comment.