@@ -68,3 +68,88 @@ func TestCloneFile_CreatesParentDir(t *testing.T) {
6868 t .Errorf ("dst not created: %v" , err )
6969 }
7070}
71+
72+ func TestCloneFile_MissingSource (t * testing.T ) {
73+ dir := t .TempDir ()
74+ src := filepath .Join (dir , "nonexistent.txt" )
75+ dst := filepath .Join (dir , "dst.txt" )
76+ _ , err := reflink .CloneFile (src , dst )
77+ if err == nil {
78+ t .Error ("expected error for missing source file" )
79+ }
80+ }
81+
82+ func TestCloneFile_EmptyFile (t * testing.T ) {
83+ dir := t .TempDir ()
84+ src := filepath .Join (dir , "empty.txt" )
85+ dst := filepath .Join (dir , "dst_empty.txt" )
86+ if err := os .WriteFile (src , []byte ("" ), 0o644 ); err != nil {
87+ t .Fatalf ("write src: %v" , err )
88+ }
89+ _ , err := reflink .CloneFile (src , dst )
90+ if err != nil {
91+ t .Fatalf ("CloneFile error on empty file: %v" , err )
92+ }
93+ got , err := os .ReadFile (dst )
94+ if err != nil {
95+ t .Fatalf ("read dst: %v" , err )
96+ }
97+ if len (got ) != 0 {
98+ t .Errorf ("expected empty file, got %d bytes" , len (got ))
99+ }
100+ }
101+
102+ func TestCloneFile_LargeContent (t * testing.T ) {
103+ dir := t .TempDir ()
104+ src := filepath .Join (dir , "large.txt" )
105+ dst := filepath .Join (dir , "large_dst.txt" )
106+ data := make ([]byte , 64 * 1024 )
107+ for i := range data {
108+ data [i ] = byte (i % 251 )
109+ }
110+ if err := os .WriteFile (src , data , 0o644 ); err != nil {
111+ t .Fatalf ("write src: %v" , err )
112+ }
113+ _ , err := reflink .CloneFile (src , dst )
114+ if err != nil {
115+ t .Fatalf ("CloneFile error: %v" , err )
116+ }
117+ got , err := os .ReadFile (dst )
118+ if err != nil {
119+ t .Fatalf ("read dst: %v" , err )
120+ }
121+ if len (got ) != len (data ) {
122+ t .Errorf ("size mismatch: got %d, want %d" , len (got ), len (data ))
123+ }
124+ }
125+
126+ func TestCloneFile_DisabledPreservesContent (t * testing.T ) {
127+ t .Setenv (reflink .NoReflinkEnv , "1" )
128+ dir := t .TempDir ()
129+ src := filepath .Join (dir , "src.bin" )
130+ dst := filepath .Join (dir , "dst.bin" )
131+ data := []byte ("binary\x00 content\xff " )
132+ if err := os .WriteFile (src , data , 0o644 ); err != nil {
133+ t .Fatalf ("write src: %v" , err )
134+ }
135+ if _ , err := reflink .CloneFile (src , dst ); err != nil {
136+ t .Fatalf ("CloneFile error: %v" , err )
137+ }
138+ got , err := os .ReadFile (dst )
139+ if err != nil {
140+ t .Fatalf ("read dst: %v" , err )
141+ }
142+ if string (got ) != string (data ) {
143+ t .Error ("content mismatch after fallback copy" )
144+ }
145+ }
146+
147+ func TestReflinkSupported_Normal (t * testing.T ) {
148+ dir := t .TempDir ()
149+ // Just verify it doesn't panic; result depends on filesystem
150+ _ = reflink .ReflinkSupported (dir )
151+ }
152+
153+ func TestReflinkSupported_MissingDir (t * testing.T ) {
154+ _ = reflink .ReflinkSupported ("/nonexistent/path/for/reflink/test" )
155+ }
0 commit comments