summaryrefslogtreecommitdiff
path: root/test/test_socket_connections.vader
blob: 9ea5580d26dbae7fb2c361b2cc32223ea21f18f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
Before:
  let g:can_run_socket_tests = !has('win32')
  \ && (exists('*ch_close') || exists('*chanclose'))

  if g:can_run_socket_tests
    call ale#test#SetDirectory('/testplugin/test')

    let g:channel_id_received = 0
    let g:data_received = ''

    function! WaitForData(expected_data, timeout) abort
      let l:ticks = 0

      while l:ticks < a:timeout
        " Sleep first, so we can switch to the callback.
        let l:ticks += 10
        sleep 10ms

        if g:data_received is# a:expected_data
          break
        endif
      endwhile
    endfunction

    function! TestCallback(channel_id, data) abort
      let g:channel_id_received = a:channel_id
      let g:data_received .= a:data
    endfunction

    let g:port = 10347
    let g:pid_tcp = str2nr(system(
    \ 'python'
    \ . ' ' . ale#Escape(g:dir . '/dumb_tcp_server.py')
    \ . ' ' . g:port
    \))
    let g:pipe_path = 'tmp_named_pipe'
    let g:pid_pipe = str2nr(system(
    \ 'python'
    \ . ' ' . ale#Escape(g:dir . '/dumb_named_pipe_server.py')
    \ . ' ' . g:pipe_path
    \))
  endif

After:
  if g:can_run_socket_tests
    call ale#test#RestoreDirectory()

    unlet! g:channel_id_received
    unlet! g:data_received
    unlet! g:channel_id

    delfunction WaitForData
    delfunction TestCallback

    if has_key(g:, 'pid_tcp')
      call system('kill ' . g:pid_tcp)
    endif

    if has_key(g:, 'pid_pipe')
      call system('kill ' . g:pid_pipe)
    endif

    unlet! g:pid_tcp
    unlet! g:port
    unlet! g:pid_pipe
    unlet! g:pipe_path
  endif

  unlet! g:can_run_socket_tests

Execute(Sending and receiving connections to tcp sockets should work):
  if g:can_run_socket_tests
    let g:channel_id = ale#socket#Open(
    \ '127.0.0.1:' . g:port,
    \ {'callback': function('TestCallback')}
    \)

    Assert g:channel_id >= 0, 'The socket was not opened!'

    call ale#socket#Send(g:channel_id, 'hello')
    call ale#socket#Send(g:channel_id, ' world')

    AssertEqual 1, ale#socket#IsOpen(g:channel_id)

    " Wait up to 1 second for the expected data to arrive.
    call WaitForData('hello world', 1000)

    AssertEqual g:channel_id, g:channel_id_received
    AssertEqual 'hello world', g:data_received
    AssertEqual '127.0.0.1:' . g:port, ale#socket#GetAddress(g:channel_id)

    call ale#socket#Close(g:channel_id)

    AssertEqual 0, ale#socket#IsOpen(g:channel_id)
    AssertEqual '', ale#socket#GetAddress(g:channel_id)
  endif

  " NeoVim versions which can't connect to sockets should just fail.
  if has('nvim') && !exists('*chanclose')
    AssertEqual -1, ale#socket#Open(
    \ '127.0.0.1:1111',
    \ {'callback': function('function')}
    \)
  endif

Execute(Sending and receiving connections to named pipe sockets should work):
  if g:can_run_socket_tests && has('nvim')
    let g:channel_id = ale#socket#Open(
    \ g:pipe_path,
    \ {'callback': function('TestCallback')}
    \)

    Assert g:channel_id >= 0, 'The socket was not opened!'

    call ale#socket#Send(g:channel_id, 'hello')
    call ale#socket#Send(g:channel_id, ' world')

    AssertEqual 1, ale#socket#IsOpen(g:channel_id)

    " Wait up to 1 second for the expected data to arrive.
    call WaitForData('hello world', 1000)

    AssertEqual g:channel_id, g:channel_id_received
    AssertEqual 'hello world', g:data_received
    AssertEqual g:pipe_path, ale#socket#GetAddress(g:channel_id)

    call ale#socket#Close(g:channel_id)

    AssertEqual 0, ale#socket#IsOpen(g:channel_id)
    AssertEqual '', ale#socket#GetAddress(g:channel_id)
  endif

  " NeoVim versions which can't connect to sockets should just fail.
  if has('nvim') && !exists('*chanclose')
    AssertEqual -1, ale#socket#Open(
    \ 'tmp_named_pipe',
    \ {'callback': function('function')}
    \)
  endif