|
8 | 8 | "log"
|
9 | 9 | "math"
|
10 | 10 | "os"
|
| 11 | + "os/exec" |
| 12 | + "path/filepath" |
11 | 13 | "reflect"
|
12 | 14 | "runtime"
|
13 | 15 | "strings"
|
@@ -77,6 +79,7 @@ func (m *Member) DecodeMsgpack(d *msgpack.Decoder) error {
|
77 | 79 | }
|
78 | 80 |
|
79 | 81 | var server = "127.0.0.1:3013"
|
| 82 | +var fdDialerTestServer = "127.0.0.1:3014" |
80 | 83 | var spaceNo = uint32(617)
|
81 | 84 | var spaceName = "test"
|
82 | 85 | var indexNo = uint32(0)
|
@@ -3927,6 +3930,87 @@ func TestConnect_context_cancel(t *testing.T) {
|
3927 | 3930 | }
|
3928 | 3931 | }
|
3929 | 3932 |
|
| 3933 | +func buildSidecar(dir string) error { |
| 3934 | + goPath, err := exec.LookPath("go") |
| 3935 | + if err != nil { |
| 3936 | + return err |
| 3937 | + } |
| 3938 | + cmd := exec.Command(goPath, "build", "main.go") |
| 3939 | + cmd.Dir = filepath.Join(dir, "testdata", "sidecar") |
| 3940 | + return cmd.Run() |
| 3941 | +} |
| 3942 | + |
| 3943 | +func TestFdDialer(t *testing.T) { |
| 3944 | + isLess, err := test_helpers.IsTarantoolVersionLess(3, 0, 0) |
| 3945 | + if err != nil || isLess { |
| 3946 | + t.Skip("box.session.new present in Tarantool since version 3.0") |
| 3947 | + } |
| 3948 | + |
| 3949 | + wd, err := os.Getwd() |
| 3950 | + require.NoError(t, err) |
| 3951 | + |
| 3952 | + err = buildSidecar(wd) |
| 3953 | + require.NoErrorf(t, err, "failed to build sidecar: %v", err) |
| 3954 | + |
| 3955 | + instOpts := startOpts |
| 3956 | + instOpts.Listen = fdDialerTestServer |
| 3957 | + instOpts.Dialer = NetDialer{ |
| 3958 | + Address: fdDialerTestServer, |
| 3959 | + User: "test", |
| 3960 | + Password: "test", |
| 3961 | + } |
| 3962 | + |
| 3963 | + inst, err := test_helpers.StartTarantool(instOpts) |
| 3964 | + require.NoError(t, err) |
| 3965 | + defer test_helpers.StopTarantoolWithCleanup(inst) |
| 3966 | + |
| 3967 | + conn := test_helpers.ConnectWithValidation(t, dialer, opts) |
| 3968 | + defer conn.Close() |
| 3969 | + |
| 3970 | + sidecarExe := filepath.Join(wd, "testdata", "sidecar", "main") |
| 3971 | + |
| 3972 | + evalBody := fmt.Sprintf(` |
| 3973 | + local socket = require('socket') |
| 3974 | + local popen = require('popen') |
| 3975 | + local os = require('os') |
| 3976 | + local s1, s2 = socket.socketpair('AF_UNIX', 'SOCK_STREAM', 0) |
| 3977 | +
|
| 3978 | + --[[ Tell sidecar which fd use to connect. --]] |
| 3979 | + os.setenv('SOCKET_FD', tostring(s2:fd())) |
| 3980 | +
|
| 3981 | + box.session.new({ |
| 3982 | + type = 'binary', |
| 3983 | + fd = s1:fd(), |
| 3984 | + user = 'test', |
| 3985 | + }) |
| 3986 | + s1:detach() |
| 3987 | +
|
| 3988 | + local ph, err = popen.new({'%s'}, { |
| 3989 | + stdout = popen.opts.PIPE, |
| 3990 | + stderr = popen.opts.PIPE, |
| 3991 | + inherit_fds = {s2:fd()}, |
| 3992 | + }) |
| 3993 | +
|
| 3994 | + if err ~= nil then |
| 3995 | + return 1, err |
| 3996 | + end |
| 3997 | +
|
| 3998 | + ph:wait() |
| 3999 | +
|
| 4000 | + local status_code = ph:info().status.exit_code |
| 4001 | + local stderr = ph:read({stderr=true}):rstrip() |
| 4002 | + local stdout = ph:read({stdout=true}):rstrip() |
| 4003 | + return status_code, stderr, stdout |
| 4004 | + `, sidecarExe) |
| 4005 | + |
| 4006 | + var resp []interface{} |
| 4007 | + err = conn.EvalTyped(evalBody, []interface{}{}, &resp) |
| 4008 | + require.NoError(t, err) |
| 4009 | + require.Equal(t, "", resp[1], resp[1]) |
| 4010 | + require.Equal(t, "", resp[2], resp[2]) |
| 4011 | + require.Equal(t, int8(0), resp[0]) |
| 4012 | +} |
| 4013 | + |
3930 | 4014 | // runTestMain is a body of TestMain function
|
3931 | 4015 | // (see https://pkg.go.dev/testing#hdr-Main).
|
3932 | 4016 | // Using defer + os.Exit is not works so TestMain body
|
|
0 commit comments