Advertisement
Leonid99

Untitled

Jul 15th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.87 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bytes"
  5.     "errors"
  6.     "fmt"
  7.     "io/ioutil"
  8.     "os"
  9.     "strings"
  10.     "github.com/stretchr/testify/assert"
  11.     "testing"
  12. )
  13.  
  14. type slurper func(filename string) ([]byte, error)
  15.  
  16. // findRoot finds the device your rootfs is mounted on
  17. func findRoot(slurper slurper) (string, error) {
  18.     const mountsFname = "/proc/mounts"
  19.  
  20.     buf, err := slurper(mountsFname)
  21.     if err != nil {
  22.         return "", err
  23.     }
  24.  
  25.     for _, line := range bytes.Split(buf, []byte("\n")) {
  26.         fields := strings.Fields(string(line))
  27.  
  28.         if fields[1] == "/" {
  29.             return fields[0], nil
  30.         }
  31.  
  32.     }
  33.  
  34.     return "", errors.New("Root partition not found in " + mountsFname)
  35.  
  36. }
  37.  
  38. func main() {
  39.     root, err := findRoot(ioutil.ReadFile)
  40.     if err != nil {
  41.         fmt.Fprintf(os.Stderr, "Error: %v\n", err)
  42.         os.Exit(2)
  43.     }
  44.  
  45.     fmt.Println("Root:", root)
  46. }
  47.  
  48. func mockSlurper(mockFS map[string]string) slurper {
  49.     return func(filename string) ([]byte, error) {
  50.         content, ok := mockFS[filename]
  51.  
  52.         if !ok {
  53.             return nil, fmt.Errorf("%v not found", filename)
  54.         }
  55.  
  56.         return []byte(content), nil
  57.     }
  58. }
  59.  
  60. func TestFindRoot(t *testing.T) {
  61.     slurper := mockSlurper(map[string]string{
  62.         "/proc/mounts": `/dev/mapper/fedora-thin--root / ext4 rw,relatime,discard 0 0
  63. /dev/mapper/fedora-boot /boot ext4 rw,relatime,discard 0 0
  64. /dev/mapper/crypthome /home ext4 rw,relatime,discard,stripe=16 0 0
  65. /dev/mapper/fedora-thin--root /var/lib/docker/containers ext4 rw,relatime,discard 0 0
  66. /dev/mapper/fedora-thin--root /var/lib/docker/devicemapper ext4 rw,relatime,discard 0 0
  67. `})
  68.  
  69.     root, err := findRoot(slurper)
  70.     assert.NoError(t, err)
  71.     assert.Equal(t, root, "/dev/mapper/fedora-thin--root")
  72. }
  73.  
  74. func TestFindRootNegative(t *testing.T) {
  75.     slurper := mockSlurper(map[string]string{
  76.         "/jank/file": `jank content of a jank file
  77. `})
  78.  
  79.     content, err := findRoot(slurper)
  80.     assert.Error(t, err)
  81.     assert.Equal(t, content, "")
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement