Skip to content

Commit b823f89

Browse files
committed
Test cio.NewAttach
It wouldn't work. Signed-off-by: Kazuyoshi Kato <katokazu@amazon.com>
1 parent 056fce3 commit b823f89

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

runtime/service_integ_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)