1 package dmverity
2
3 import (
4 "bytes"
5 "encoding/binary"
6 "io"
7 "math/rand"
8 "os"
9 "strings"
10 "testing"
11
12 "github.com/pkg/errors"
13 )
14
15 func tempFileWithContentLength(t *testing.T, length int) *os.File {
16 t.Helper()
17 tmpFile, err := os.CreateTemp("", "")
18 if err != nil {
19 t.Fatalf("failed to create temp file")
20 }
21 defer tmpFile.Close()
22
23 content := make([]byte, length)
24 if _, err := rand.Read(content); err != nil {
25 t.Fatalf("failed to write random bytes to buffer")
26 }
27 if _, err := tmpFile.Write(content); err != nil {
28 t.Fatalf("failed to write random bytes to temp file")
29 }
30 return tmpFile
31 }
32
33 func writeDMVeritySuperBlock(filename string) (*os.File, error) {
34 out, err := os.OpenFile(filename, os.O_RDWR, 0777)
35 if err != nil {
36 return nil, err
37 }
38 defer out.Close()
39 fsSize, err := out.Seek(0, io.SeekEnd)
40 if err != nil {
41 return nil, err
42 }
43 sb := NewDMVeritySuperblock(uint64(fsSize))
44 if err := binary.Write(out, binary.LittleEndian, sb); err != nil {
45 return nil, err
46 }
47 padding := bytes.Repeat([]byte{0}, blockSize-(sbSize%blockSize))
48 if _, err = out.Write(padding); err != nil {
49 return nil, err
50 }
51 return out, nil
52 }
53
54 func TestInvalidReadEOF(t *testing.T) {
55 tmpFile := tempFileWithContentLength(t, blockSize)
56 _, err := ReadDMVerityInfo(tmpFile.Name(), blockSize)
57 if err == nil {
58 t.Fatalf("no error returned")
59 }
60 if errors.Cause(err) != io.EOF {
61 t.Fatalf("unexpected error: %s", err)
62 }
63 }
64
65 func TestInvalidReadNotEnoughBytes(t *testing.T) {
66 tmpFile := tempFileWithContentLength(t, blockSize+blockSize/2)
67 _, err := ReadDMVerityInfo(tmpFile.Name(), blockSize)
68 if err == nil {
69 t.Fatalf("no error returned")
70 }
71 if errors.Cause(err) != ErrSuperBlockReadFailure || !strings.Contains(err.Error(), "unexpected bytes read") {
72 t.Fatalf("unexpected error: %s", err)
73 }
74 }
75
76 func TestNotVeritySuperBlock(t *testing.T) {
77 tmpFile := tempFileWithContentLength(t, 2*blockSize)
78 _, err := ReadDMVerityInfo(tmpFile.Name(), blockSize)
79 if err == nil {
80 t.Fatalf("no error returned")
81 }
82 if err != ErrNotVeritySuperBlock {
83 t.Fatalf("expected %q, got %q", ErrNotVeritySuperBlock, err)
84 }
85 }
86
87 func TestNoMerkleTree(t *testing.T) {
88 tmpFile := tempFileWithContentLength(t, blockSize)
89 targetFile, err := writeDMVeritySuperBlock(tmpFile.Name())
90 if err != nil {
91 t.Fatalf("failed to write dm-verity super-block: %s", err)
92 }
93 _, err = ReadDMVerityInfo(targetFile.Name(), blockSize)
94 if err == nil {
95 t.Fatalf("no error returned")
96 }
97 if errors.Cause(err) != io.EOF || !strings.Contains(err.Error(), "failed to read dm-verity root hash") {
98 t.Fatalf("expected %q, got %q", io.EOF, err)
99 }
100 }
101
View as plain text