@@ -2012,3 +2012,77 @@ func TestCreateVM_Isolated(t *testing.T) {
2012
2012
})
2013
2013
}
2014
2014
}
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