@@ -2025,64 +2025,85 @@ func TestAttach_Isolated(t *testing.T) {
20252025 image , err := alpineImage (ctx , client , defaultSnapshotterName )
20262026 require .NoError (t , err , "failed to get alpine image" )
20272027
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+ }
20292040
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" ,
20392047
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+ },
20442052
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+ }
20472058
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 ())
20542063
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 )
20572071
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 )
20612074
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 )
20652079
2066- c , err = client . LoadContainer (ctx , "container-" + vmID )
2067- require .NoError (t , err )
2080+ ch , err := t1 . Wait (ctx )
2081+ require .NoError (t , err )
20682082
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 )
20752085
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 ())
20772094
2078- ch , err := task2 . Wait ( ctx )
2079- require .NoError (t , err )
2095+ err = io . Close ( )
2096+ assert .NoError (t , err )
20802097
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
20832102
2084- <- ch
2103+ _ , err = t2 .Delete (ctx )
2104+ require .NoError (t , err )
20852105
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+ }
20882109}
0 commit comments