55 "strings"
66 "syscall"
77 "testing"
8+ time "time"
89
910 "github.com/coder/envbuilder/internal/notcodersdk"
1011 "github.com/stretchr/testify/assert"
@@ -25,9 +26,11 @@ func Test_tempRemount(t *testing.T) {
2526 mounts := fakeMounts ("/home" , "/var/lib/modules:ro" , "/proc" , "/sys" )
2627
2728 mm .EXPECT ().GetMounts ().Return (mounts , nil )
29+ mm .EXPECT ().Stat ("/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
2830 mm .EXPECT ().MkdirAll ("/.test/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (nil )
2931 mm .EXPECT ().Mount ("/var/lib/modules" , "/.test/var/lib/modules" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (nil )
3032 mm .EXPECT ().Unmount ("/var/lib/modules" , 0 ).Times (1 ).Return (nil )
33+ mm .EXPECT ().Stat ("/.test/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
3134 mm .EXPECT ().MkdirAll ("/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (nil )
3235 mm .EXPECT ().Mount ("/.test/var/lib/modules" , "/var/lib/modules" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (nil )
3336 mm .EXPECT ().Unmount ("/.test/var/lib/modules" , 0 ).Times (1 ).Return (nil )
@@ -40,6 +43,33 @@ func Test_tempRemount(t *testing.T) {
4043 _ = remount ()
4144 })
4245
46+ t .Run ("OKFile" , func (t * testing.T ) {
47+ t .Parallel ()
48+
49+ ctrl := gomock .NewController (t )
50+ mm := NewMockmounter (ctrl )
51+ mounts := fakeMounts ("/home" , "/usr/bin/utility:ro" , "/proc" , "/sys" )
52+
53+ mm .EXPECT ().GetMounts ().Return (mounts , nil )
54+ mm .EXPECT ().Stat ("/usr/bin/utility" ).Return (& fakeFileInfo {isDir : false }, nil )
55+ mm .EXPECT ().MkdirAll ("/.test/usr/bin" , os .FileMode (0o750 )).Times (1 ).Return (nil )
56+ mm .EXPECT ().OpenFile ("/.test/usr/bin/utility" , os .O_CREATE , os .FileMode (0o640 )).Times (1 ).Return (new (os.File ), nil )
57+ mm .EXPECT ().Mount ("/usr/bin/utility" , "/.test/usr/bin/utility" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (nil )
58+ mm .EXPECT ().Unmount ("/usr/bin/utility" , 0 ).Times (1 ).Return (nil )
59+ mm .EXPECT ().Stat ("/.test/usr/bin/utility" ).Return (& fakeFileInfo {isDir : false }, nil )
60+ mm .EXPECT ().MkdirAll ("/usr/bin" , os .FileMode (0o750 )).Times (1 ).Return (nil )
61+ mm .EXPECT ().OpenFile ("/usr/bin/utility" , os .O_CREATE , os .FileMode (0o640 )).Times (1 ).Return (new (os.File ), nil )
62+ mm .EXPECT ().Mount ("/.test/usr/bin/utility" , "/usr/bin/utility" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (nil )
63+ mm .EXPECT ().Unmount ("/.test/usr/bin/utility" , 0 ).Times (1 ).Return (nil )
64+
65+ remount , err := tempRemount (mm , fakeLog (t ), "/.test" )
66+ require .NoError (t , err )
67+ err = remount ()
68+ require .NoError (t , err )
69+ // sync.Once should handle multiple remount calls
70+ _ = remount ()
71+ })
72+
4373 t .Run ("IgnorePrefixes" , func (t * testing.T ) {
4474 t .Parallel ()
4575
@@ -75,6 +105,7 @@ func Test_tempRemount(t *testing.T) {
75105 mounts := fakeMounts ("/home" , "/var/lib/modules:ro" , "/proc" , "/sys" )
76106
77107 mm .EXPECT ().GetMounts ().Return (mounts , nil )
108+ mm .EXPECT ().Stat ("/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
78109 mm .EXPECT ().MkdirAll ("/.test/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (assert .AnError )
79110
80111 remount , err := tempRemount (mm , fakeLog (t ), "/.test" )
@@ -91,6 +122,7 @@ func Test_tempRemount(t *testing.T) {
91122 mounts := fakeMounts ("/home" , "/var/lib/modules:ro" , "/proc" , "/sys" )
92123
93124 mm .EXPECT ().GetMounts ().Return (mounts , nil )
125+ mm .EXPECT ().Stat ("/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
94126 mm .EXPECT ().MkdirAll ("/.test/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (nil )
95127 mm .EXPECT ().Mount ("/var/lib/modules" , "/.test/var/lib/modules" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (assert .AnError )
96128
@@ -108,6 +140,7 @@ func Test_tempRemount(t *testing.T) {
108140 mounts := fakeMounts ("/home" , "/var/lib/modules:ro" , "/proc" , "/sys" )
109141
110142 mm .EXPECT ().GetMounts ().Return (mounts , nil )
143+ mm .EXPECT ().Stat ("/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
111144 mm .EXPECT ().MkdirAll ("/.test/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (nil )
112145 mm .EXPECT ().Mount ("/var/lib/modules" , "/.test/var/lib/modules" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (nil )
113146 mm .EXPECT ().Unmount ("/var/lib/modules" , 0 ).Times (1 ).Return (assert .AnError )
@@ -126,9 +159,11 @@ func Test_tempRemount(t *testing.T) {
126159 mounts := fakeMounts ("/home" , "/var/lib/modules:ro" , "/proc" , "/sys" )
127160
128161 mm .EXPECT ().GetMounts ().Return (mounts , nil )
162+ mm .EXPECT ().Stat ("/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
129163 mm .EXPECT ().MkdirAll ("/.test/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (nil )
130164 mm .EXPECT ().Mount ("/var/lib/modules" , "/.test/var/lib/modules" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (nil )
131165 mm .EXPECT ().Unmount ("/var/lib/modules" , 0 ).Times (1 ).Return (nil )
166+ mm .EXPECT ().Stat ("/.test/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
132167 mm .EXPECT ().MkdirAll ("/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (assert .AnError )
133168
134169 remount , err := tempRemount (mm , fakeLog (t ), "/.test" )
@@ -145,9 +180,11 @@ func Test_tempRemount(t *testing.T) {
145180 mounts := fakeMounts ("/home" , "/var/lib/modules:ro" , "/proc" , "/sys" )
146181
147182 mm .EXPECT ().GetMounts ().Return (mounts , nil )
183+ mm .EXPECT ().Stat ("/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
148184 mm .EXPECT ().MkdirAll ("/.test/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (nil )
149185 mm .EXPECT ().Mount ("/var/lib/modules" , "/.test/var/lib/modules" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (nil )
150186 mm .EXPECT ().Unmount ("/var/lib/modules" , 0 ).Times (1 ).Return (nil )
187+ mm .EXPECT ().Stat ("/.test/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
151188 mm .EXPECT ().MkdirAll ("/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (nil )
152189 mm .EXPECT ().Mount ("/.test/var/lib/modules" , "/var/lib/modules" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (assert .AnError )
153190
@@ -165,9 +202,11 @@ func Test_tempRemount(t *testing.T) {
165202 mounts := fakeMounts ("/home" , "/var/lib/modules:ro" , "/proc" , "/sys" )
166203
167204 mm .EXPECT ().GetMounts ().Return (mounts , nil )
205+ mm .EXPECT ().Stat ("/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
168206 mm .EXPECT ().MkdirAll ("/.test/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (nil )
169207 mm .EXPECT ().Mount ("/var/lib/modules" , "/.test/var/lib/modules" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (nil )
170208 mm .EXPECT ().Unmount ("/var/lib/modules" , 0 ).Times (1 ).Return (nil )
209+ mm .EXPECT ().Stat ("/.test/var/lib/modules" ).Return (& fakeFileInfo {isDir : true }, nil )
171210 mm .EXPECT ().MkdirAll ("/var/lib/modules" , os .FileMode (0o750 )).Times (1 ).Return (nil )
172211 mm .EXPECT ().Mount ("/.test/var/lib/modules" , "/var/lib/modules" , "bind" , uintptr (syscall .MS_BIND ), "" ).Times (1 ).Return (nil )
173212 mm .EXPECT ().Unmount ("/.test/var/lib/modules" , 0 ).Times (1 ).Return (assert .AnError )
@@ -200,3 +239,16 @@ func fakeLog(t *testing.T) func(notcodersdk.LogLevel, string, ...any) {
200239 t .Logf (s , a ... )
201240 }
202241}
242+
243+ type fakeFileInfo struct {
244+ isDir bool
245+ }
246+
247+ func (fi * fakeFileInfo ) Name () string { return "" }
248+ func (fi * fakeFileInfo ) Size () int64 { return 0 }
249+ func (fi * fakeFileInfo ) Mode () os.FileMode { return 0 }
250+ func (fi * fakeFileInfo ) ModTime () time.Time { return time.Time {} }
251+ func (fi * fakeFileInfo ) IsDir () bool { return fi .isDir }
252+ func (fi * fakeFileInfo ) Sys () any { return nil }
253+
254+ var _ os.FileInfo = & fakeFileInfo {}
0 commit comments