@@ -2012,3 +2012,77 @@ func TestCreateVM_Isolated(t *testing.T) {
20122012 })
20132013 }
20142014}
2015+
2016+ func TestAttach_Isolated (t * testing.T ) {
2017+ prepareIntegTest (t )
2018+
2019+ client , err := containerd .New (containerdSockPath , containerd .WithDefaultRuntime (firecrackerRuntime ))
2020+ require .NoError (t , err , "unable to create client to containerd service at %s, is containerd running?" , containerdSockPath )
2021+ defer client .Close ()
2022+
2023+ ctx := namespaces .WithNamespace (context .Background (), "default" )
2024+
2025+ image , err := alpineImage (ctx , client , defaultSnapshotterName )
2026+ require .NoError (t , err , "failed to get alpine image" )
2027+
2028+ vmID := testNameToVMID (t .Name ())
2029+
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 )
2039+
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 )
2044+
2045+ io , err := cio .NewDirectIO (ctx , fifos )
2046+ require .NoError (t , err )
2047+
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 )
2054+
2055+ err = task1 .Start (ctx )
2056+ require .NoError (t , err , "failed to start task for container %s" , c .ID ())
2057+
2058+ // Directly reading/writing bytes to make sure "cat" is working.
2059+ input := "line1\n "
2060+ io .Stdin .Write ([]byte (input ))
2061+
2062+ output := make ([]byte , len (input ))
2063+ io .Stdout .Read (output )
2064+ assert .Equal (t , input , string (output ))
2065+
2066+ c , err = client .LoadContainer (ctx , "container-" + vmID )
2067+ require .NoError (t , err )
2068+
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" )
2075+
2076+ assert .Equal (t , task1 .ID (), task2 .ID (), "task1 and task2 are pointing the same task" )
2077+
2078+ ch , err := task2 .Wait (ctx )
2079+ require .NoError (t , err )
2080+
2081+ err = task2 .CloseIO (ctx , containerd .WithStdinCloser )
2082+ require .NoError (t , err )
2083+
2084+ <- ch
2085+
2086+ assert .Equal (t , "" , stderr .String (), "stderr" )
2087+ assert .Equal (t , "line2\n " , stdout .String (), "stdout" )
2088+ }
0 commit comments