11package integration
22
33import (
4- "bufio"
54 "bytes"
6- "errors"
75 "os"
86 "os/exec"
97 "path/filepath"
@@ -15,38 +13,11 @@ import (
1513 "golang.org/x/sys/unix"
1614)
1715
18- func showFile (t * testing.T , fname string ) {
19- t .Helper ()
20- t .Logf ("=== %s ===\n " , fname )
21-
22- f , err := os .Open (fname )
23- if err != nil {
24- t .Log (err )
25- return
26- }
27- defer f .Close () //nolint: errcheck
28-
29- scanner := bufio .NewScanner (f )
30- for scanner .Scan () {
31- t .Log (scanner .Text ())
32- }
33-
34- if err := scanner .Err (); err != nil {
35- t .Log (err )
36- return
37- }
38-
39- t .Logf ("=== END ===\n " )
16+ func criuFeature (feature string ) bool {
17+ return exec .Command ("criu" , "check" , "--feature" , feature ).Run () == nil
4018}
4119
4220func TestUsernsCheckpoint (t * testing.T ) {
43- if _ , err := os .Stat ("/proc/self/ns/user" ); os .IsNotExist (err ) {
44- t .Skip ("Test requires userns." )
45- }
46- cmd := exec .Command ("criu" , "check" , "--feature" , "userns" )
47- if err := cmd .Run (); err != nil {
48- t .Skip ("Unable to c/r a container with userns" )
49- }
5021 testCheckpoint (t , true )
5122}
5223
@@ -69,6 +40,10 @@ func testCheckpoint(t *testing.T, userns bool) {
6940 t .Skip ("Test requires criu >= 3.17-4 on CentOS Stream 9." )
7041 }
7142
43+ if userns && ! criuFeature ("userns" ) {
44+ t .Skip ("Test requires userns" )
45+ }
46+
7247 config := newTemplateConfig (t , & tParam {userns : userns })
7348 stateDir := t .TempDir ()
7449
@@ -102,46 +77,43 @@ func testCheckpoint(t *testing.T, userns bool) {
10277 ok (t , err )
10378
10479 tmp := t .TempDir ()
80+ var parentImage string
81+
82+ // Test pre-dump if mem_dirty_track is available.
83+ if criuFeature ("mem_dirty_track" ) {
84+ parentImage = "../criu-parent"
85+ parentDir := filepath .Join (tmp , "criu-parent" )
86+ preDumpOpts := & libcontainer.CriuOpts {
87+ ImagesDirectory : parentDir ,
88+ WorkDirectory : parentDir ,
89+ PreDump : true ,
90+ }
10591
106- parentDir := filepath .Join (tmp , "criu-parent" )
107- preDumpOpts := & libcontainer.CriuOpts {
108- ImagesDirectory : parentDir ,
109- WorkDirectory : parentDir ,
110- PreDump : true ,
111- }
112- preDumpLog := filepath .Join (preDumpOpts .WorkDirectory , "dump.log" )
113-
114- if err := container .Checkpoint (preDumpOpts ); err != nil {
115- showFile (t , preDumpLog )
116- if errors .Is (err , libcontainer .ErrCriuMissingFeatures ) {
117- t .Skip (err )
92+ if err := container .Checkpoint (preDumpOpts ); err != nil {
93+ t .Fatal (err )
11894 }
119- t .Fatal (err )
120- }
12195
122- state , err := container .Status ()
123- ok (t , err )
96+ state , err := container .Status ()
97+ ok (t , err )
12498
125- if state != libcontainer .Running {
126- t .Fatal ("Unexpected preDump state: " , state )
99+ if state != libcontainer .Running {
100+ t .Fatal ("Unexpected preDump state: " , state )
101+ }
127102 }
128103
129104 imagesDir := filepath .Join (tmp , "criu" )
130105
131106 checkpointOpts := & libcontainer.CriuOpts {
132107 ImagesDirectory : imagesDir ,
133108 WorkDirectory : imagesDir ,
134- ParentImage : "../criu-parent" ,
109+ ParentImage : parentImage ,
135110 }
136- dumpLog := filepath .Join (checkpointOpts .WorkDirectory , "dump.log" )
137- restoreLog := filepath .Join (checkpointOpts .WorkDirectory , "restore.log" )
138111
139112 if err := container .Checkpoint (checkpointOpts ); err != nil {
140- showFile (t , dumpLog )
141113 t .Fatal (err )
142114 }
143115
144- state , err = container .Status ()
116+ state , err : = container .Status ()
145117 ok (t , err )
146118
147119 if state != libcontainer .Stopped {
@@ -171,7 +143,6 @@ func testCheckpoint(t *testing.T, userns bool) {
171143 _ = restoreStdinR .Close ()
172144 defer restoreStdinW .Close () //nolint: errcheck
173145 if err != nil {
174- showFile (t , restoreLog )
175146 t .Fatal (err )
176147 }
177148
0 commit comments