talm

Форк
0
/
format_test.go 
157 строк · 4.0 Кб
1
// This Source Code Form is subject to the terms of the Mozilla Public
2
// License, v. 2.0. If a copy of the MPL was not distributed with this
3
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4

5
// Package partition provides common utils for system partition format.
6
package partition_test
7

8
import (
9
	"bytes"
10
	"io"
11
	"os"
12
	"testing"
13

14
	"github.com/siderolabs/go-blockdevice/blockdevice"
15
	"github.com/siderolabs/go-blockdevice/blockdevice/loopback"
16
	"github.com/siderolabs/go-blockdevice/blockdevice/partition/gpt"
17
	"github.com/stretchr/testify/suite"
18

19
	"github.com/aenix-io/talm/internal/pkg/partition"
20
)
21

22
type manifestSuite struct {
23
	suite.Suite
24

25
	disk           *os.File
26
	loopbackDevice *os.File
27
}
28

29
const (
30
	diskSize = 10 * 1024 * 1024 // 10 MiB
31
)
32

33
func TestManifestSuite(t *testing.T) {
34
	suite.Run(t, new(manifestSuite))
35
}
36

37
func (suite *manifestSuite) SetupTest() {
38
	suite.skipIfNotRoot()
39

40
	var err error
41

42
	suite.disk, err = os.CreateTemp("", "talos")
43
	suite.Require().NoError(err)
44

45
	suite.Require().NoError(suite.disk.Truncate(diskSize))
46

47
	suite.loopbackDevice, err = loopback.NextLoopDevice()
48
	suite.Require().NoError(err)
49

50
	suite.T().Logf("Using %s", suite.loopbackDevice.Name())
51

52
	suite.Require().NoError(loopback.Loop(suite.loopbackDevice, suite.disk))
53

54
	suite.Require().NoError(loopback.LoopSetReadWrite(suite.loopbackDevice))
55
}
56

57
func (suite *manifestSuite) TearDownTest() {
58
	if suite.loopbackDevice != nil {
59
		suite.Assert().NoError(loopback.Unloop(suite.loopbackDevice))
60
	}
61

62
	if suite.disk != nil {
63
		suite.Assert().NoError(os.Remove(suite.disk.Name()))
64
		suite.Assert().NoError(suite.disk.Close())
65
	}
66
}
67

68
func (suite *manifestSuite) skipIfNotRoot() {
69
	if os.Getuid() != 0 {
70
		suite.T().Skip("can't run the test as non-root")
71
	}
72
}
73

74
func (suite *manifestSuite) skipUnderBuildkit() {
75
	hostname, _ := os.Hostname() //nolint:errcheck
76

77
	if hostname == "buildkitsandbox" {
78
		suite.T().Skip("test not supported under buildkit as partition devices are not propagated from /dev")
79
	}
80
}
81

82
func (suite *manifestSuite) TestZeroPartition() {
83
	suite.skipUnderBuildkit()
84

85
	bd, err := blockdevice.Open(suite.loopbackDevice.Name(), blockdevice.WithExclusiveLock(true))
86
	suite.Require().NoError(err)
87

88
	defer bd.Close() //nolint:errcheck
89

90
	pt, err := gpt.New(bd.Device(), gpt.WithMarkMBRBootable(false))
91
	suite.Require().NoError(err)
92

93
	// Create a partition table with a single partition.
94
	_, err = pt.Add(0, gpt.WithMaximumSize(true), gpt.WithPartitionName("zerofill"))
95
	suite.Require().NoError(err)
96

97
	suite.Require().NoError(pt.Write())
98
	suite.Require().NoError(bd.Close())
99

100
	bd, err = blockdevice.Open(suite.loopbackDevice.Name(), blockdevice.WithExclusiveLock(true))
101
	suite.Require().NoError(err)
102

103
	defer bd.Close() //nolint:errcheck
104

105
	fills := bytes.NewBuffer(bytes.Repeat([]byte{1}, 10))
106

107
	parts, err := bd.GetPartition("zerofill")
108
	suite.Require().NoError(err)
109

110
	part, err := parts.Path()
111
	suite.Require().NoError(err)
112

113
	// open the partition as read write
114
	dst, err := os.OpenFile(part, os.O_WRONLY, 0o644)
115
	suite.Require().NoError(err)
116

117
	defer dst.Close() //nolint:errcheck
118

119
	// Write some data to the partition.
120
	_, err = io.Copy(dst, fills)
121
	suite.Require().NoError(err)
122

123
	data, err := os.Open(part)
124
	suite.Require().NoError(err)
125

126
	defer data.Close() //nolint:errcheck
127

128
	read := make([]byte, fills.Len())
129

130
	_, err = data.Read(read)
131
	suite.Require().NoError(err)
132
	suite.Require().NoError(data.Close())
133

134
	suite.Assert().True(bytes.Equal(fills.Bytes(), read))
135

136
	suite.Require().NoError(bd.Close())
137

138
	err = partition.Format(part, &partition.FormatOptions{
139
		FileSystemType: partition.FilesystemTypeNone,
140
	}, suite.T().Logf)
141
	suite.Require().NoError(err)
142

143
	// reading 10 times more than what we wrote should still return 0 since the partition is wiped
144
	zerofills := bytes.NewBuffer(bytes.Repeat([]byte{0}, 100))
145

146
	data, err = os.Open(part)
147
	suite.Require().NoError(err)
148

149
	defer data.Close() //nolint:errcheck
150

151
	read = make([]byte, zerofills.Len())
152

153
	_, err = data.Read(read)
154
	suite.Require().NoError(err)
155

156
	suite.Assert().True(bytes.Equal(zerofills.Bytes(), read))
157
}
158

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.