@@ -2025,64 +2025,85 @@ func TestAttach_Isolated(t *testing.T) {
2025
2025
image , err := alpineImage (ctx , client , defaultSnapshotterName )
2026
2026
require .NoError (t , err , "failed to get alpine image" )
2027
2027
2028
- vmID := testNameToVMID (t .Name ())
2028
+ testcases := []struct {
2029
+ name string
2030
+ newIO func (context.Context , string ) (cio.IO , error )
2031
+ expected string
2032
+ }{
2033
+ {
2034
+ name : "attach" ,
2035
+ newIO : func (ctx context.Context , id string ) (cio.IO , error ) {
2036
+ set , err := cio .NewFIFOSetInDir ("" , id , false )
2037
+ if err != nil {
2038
+ return nil , err
2039
+ }
2029
2040
2030
- c , err := client .NewContainer (ctx ,
2031
- "container-" + vmID ,
2032
- containerd .WithSnapshotter (defaultSnapshotterName ),
2033
- containerd .WithNewSnapshot ("snapshot-" + vmID , image ),
2034
- containerd .WithNewSpec (oci .WithProcessArgs (
2035
- "/bin/cat" ,
2036
- )),
2037
- )
2038
- require .NoError (t , err )
2041
+ return cio .NewDirectIO (ctx , set )
2042
+ },
2043
+ expected : "hello\n " ,
2044
+ },
2045
+ {
2046
+ name : "null io" ,
2039
2047
2040
- // cio.NewCreator creates FIFOs and *the readers* implicitly. Use cio.NewDirectIO() to
2041
- // only create FIFOs.
2042
- fifos , err := cio .NewFIFOSetInDir ( "" , t . Name (), false )
2043
- require . NoError ( t , err )
2048
+ // firecracker-containerd doesn't create IO Proxy objects in this case.
2049
+ newIO : func ( ctx context. Context , id string ) (cio. IO , error ) {
2050
+ return cio .NullIO ( id )
2051
+ },
2044
2052
2045
- io , err := cio .NewDirectIO (ctx , fifos )
2046
- require .NoError (t , err )
2053
+ // So, attaching new IOs doesn't work.
2054
+ // While it looks odd, containerd's v2 shim has the same behavior.
2055
+ expected : "" ,
2056
+ },
2057
+ }
2047
2058
2048
- task1 , err := c .NewTask (ctx , func (id string ) (cio.IO , error ) {
2049
- // Pass FIFO files, but don't create the readers.
2050
- return io , nil
2051
- })
2052
- require .NoError (t , err , "failed to create task for container %s" , c .ID ())
2053
- defer task1 .Delete (ctx )
2059
+ for _ , tc := range testcases {
2060
+ tc := tc
2061
+ t .Run (tc .name , func (t * testing.T ) {
2062
+ name := testNameToVMID (t .Name ())
2054
2063
2055
- err = task1 .Start (ctx )
2056
- require .NoError (t , err , "failed to start task for container %s" , c .ID ())
2064
+ c , err := client .NewContainer (ctx ,
2065
+ "container-" + name ,
2066
+ containerd .WithSnapshotter (defaultSnapshotterName ),
2067
+ containerd .WithNewSnapshot ("snapshot-" + name , image ),
2068
+ containerd .WithNewSpec (oci .WithProcessArgs ("/bin/cat" )),
2069
+ )
2070
+ require .NoError (t , err )
2057
2071
2058
- // Directly reading/writing bytes to make sure "cat" is working.
2059
- input := "line1\n "
2060
- io .Stdin .Write ([]byte (input ))
2072
+ io , err := tc .newIO (ctx , name )
2073
+ require .NoError (t , err )
2061
2074
2062
- output := make ([]byte , len (input ))
2063
- io .Stdout .Read (output )
2064
- assert .Equal (t , input , string (output ))
2075
+ t1 , err := c .NewTask (ctx , func (id string ) (cio.IO , error ) {
2076
+ return io , nil
2077
+ })
2078
+ require .NoError (t , err )
2065
2079
2066
- c , err = client . LoadContainer (ctx , "container-" + vmID )
2067
- require .NoError (t , err )
2080
+ ch , err := t1 . Wait (ctx )
2081
+ require .NoError (t , err )
2068
2082
2069
- var stderr , stdout bytes.Buffer
2070
- task2 , err := c .Task (
2071
- ctx ,
2072
- cio .NewAttach (cio .WithStreams (bytes .NewBufferString ("line2\n " ), & stdout , & stderr )),
2073
- )
2074
- require .NoError (t , err , "failed to load the task" )
2083
+ err = t1 .Start (ctx )
2084
+ require .NoError (t , err )
2075
2085
2076
- assert .Equal (t , task1 .ID (), task2 .ID (), "task1 and task2 are pointing the same task" )
2086
+ stdin := bytes .NewBufferString ("hello\n " )
2087
+ var stdout bytes.Buffer
2088
+ t2 , err := c .Task (
2089
+ ctx ,
2090
+ cio .NewAttach (cio .WithStreams (stdin , & stdout , nil )),
2091
+ )
2092
+ require .NoError (t , err )
2093
+ assert .Equal (t , t1 .ID (), t2 .ID ())
2077
2094
2078
- ch , err := task2 . Wait ( ctx )
2079
- require .NoError (t , err )
2095
+ err = io . Close ( )
2096
+ assert .NoError (t , err )
2080
2097
2081
- err = task2 .CloseIO (ctx , containerd .WithStdinCloser )
2082
- require .NoError (t , err )
2098
+ err = t2 .CloseIO (ctx , containerd .WithStdinCloser )
2099
+ assert .NoError (t , err )
2100
+
2101
+ <- ch
2083
2102
2084
- <- ch
2103
+ _ , err = t2 .Delete (ctx )
2104
+ require .NoError (t , err )
2085
2105
2086
- assert .Equal (t , "" , stderr .String (), "stderr" )
2087
- assert .Equal (t , "line2\n " , stdout .String (), "stdout" )
2106
+ assert .Equal (t , tc .expected , stdout .String ())
2107
+ })
2108
+ }
2088
2109
}
0 commit comments