To: vim_dev@googlegroups.com Subject: Patch 7.4.1515 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.1515 Problem: Channel test is a bit flaky. Solution: Instead of a fixed sleep time wait until an expression evaluates to true. Files: src/testdir/test_channel.vim *** ../vim-7.4.1514/src/testdir/test_channel.vim 2016-03-08 15:37:36.734963213 +0100 --- src/testdir/test_channel.vim 2016-03-08 16:05:39.697475475 +0100 *************** *** 53,61 **** endif " Wait for up to 2 seconds for the port number to be there. - let cnt = 20 let l = [] ! while cnt > 0 try let l = readfile("Xportnr") catch --- 53,60 ---- endif " Wait for up to 2 seconds for the port number to be there. let l = [] ! for i in range(200) try let l = readfile("Xportnr") catch *************** *** 63,71 **** if len(l) >= 1 break endif ! sleep 100m ! let cnt -= 1 ! endwhile call delete("Xportnr") if len(l) == 0 --- 62,69 ---- if len(l) >= 1 break endif ! sleep 10m ! endfor call delete("Xportnr") if len(l) == 0 *************** *** 102,107 **** --- 100,115 ---- let s:responseMsg = a:msg endfunc + " Wait for up to a second for "expr" to become true. + func s:waitFor(expr) + for i in range(100) + if eval(a:expr) + return + endif + sleep 10m + endfor + endfunc + func s:communicate(port) let handle = ch_open('localhost:' . a:port, s:chopt) if ch_status(handle) == "fail" *************** *** 120,136 **** " handled before getting the response, but it's not guaranteed, thus wait a " tiny bit for the commands to get executed. call assert_equal('ok', ch_evalexpr(handle, 'make change')) ! sleep 10m call assert_equal('added1', getline(line('$') - 1)) call assert_equal('added2', getline('$')) call assert_equal('ok', ch_evalexpr(handle, 'do normal', {'timeout': 100})) ! sleep 10m call assert_equal('added more', getline('$')) " Send a request with a specific handler. call ch_sendexpr(handle, 'hello!', {'callback': 's:RequestHandler'}) ! sleep 10m if !exists('s:responseHandle') call assert_false(1, 's:responseHandle was not set') else --- 128,144 ---- " handled before getting the response, but it's not guaranteed, thus wait a " tiny bit for the commands to get executed. call assert_equal('ok', ch_evalexpr(handle, 'make change')) ! call s:waitFor('"added2" == getline("$")') call assert_equal('added1', getline(line('$') - 1)) call assert_equal('added2', getline('$')) call assert_equal('ok', ch_evalexpr(handle, 'do normal', {'timeout': 100})) ! call s:waitFor('"added more" == getline("$")') call assert_equal('added more', getline('$')) " Send a request with a specific handler. call ch_sendexpr(handle, 'hello!', {'callback': 's:RequestHandler'}) ! call s:waitFor('exists("s:responseHandle")') if !exists('s:responseHandle') call assert_false(1, 's:responseHandle was not set') else *************** *** 141,147 **** let s:responseMsg = '' call ch_sendexpr(handle, 'hello!', {'callback': function('s:RequestHandler')}) ! sleep 10m if !exists('s:responseHandle') call assert_false(1, 's:responseHandle was not set') else --- 149,155 ---- let s:responseMsg = '' call ch_sendexpr(handle, 'hello!', {'callback': function('s:RequestHandler')}) ! call s:waitFor('exists("s:responseHandle")') if !exists('s:responseHandle') call assert_false(1, 's:responseHandle was not set') else *************** *** 182,188 **** " Send an expr request call assert_equal('ok', ch_evalexpr(handle, 'an expr')) ! sleep 10m call assert_equal('one', getline(line('$') - 2)) call assert_equal('two', getline(line('$') - 1)) call assert_equal('three', getline('$')) --- 190,196 ---- " Send an expr request call assert_equal('ok', ch_evalexpr(handle, 'an expr')) ! call s:waitFor('"three" == getline("$")') call assert_equal('one', getline(line('$') - 2)) call assert_equal('two', getline(line('$') - 1)) call assert_equal('three', getline('$')) *************** *** 281,292 **** " Test that it works while waiting on a numbered message. call assert_equal('ok', ch_evalexpr(handle, 'call me')) ! sleep 10m call assert_equal('we called you', s:reply) " Test that it works while not waiting on a numbered message. call ch_sendexpr(handle, 'call me again') ! sleep 10m call assert_equal('we did call you', s:reply) endfunc --- 289,300 ---- " Test that it works while waiting on a numbered message. call assert_equal('ok', ch_evalexpr(handle, 'call me')) ! call s:waitFor('"we called you" == s:reply') call assert_equal('we called you', s:reply) " Test that it works while not waiting on a numbered message. call ch_sendexpr(handle, 'call me again') ! call s:waitFor('"we did call you" == s:reply') call assert_equal('we did call you', s:reply) endfunc *************** *** 326,335 **** " Check that eval works if a zero id message is sent back. let s:ch_reply = '' call assert_equal('sent zero', ch_evalexpr(handle, 'send zero')) - sleep 10m if s:has_handler call assert_equal('zero index', s:ch_reply) else call assert_equal('', s:ch_reply) endif --- 334,344 ---- " Check that eval works if a zero id message is sent back. let s:ch_reply = '' call assert_equal('sent zero', ch_evalexpr(handle, 'send zero')) if s:has_handler + call s:waitFor('"zero index" == s:ch_reply') call assert_equal('zero index', s:ch_reply) else + sleep 20m call assert_equal('', s:ch_reply) endif *************** *** 337,349 **** let s:ch_reply = '' let s:zero_reply = '' call ch_sendexpr(handle, 'send zero', {'callback': 's:OneHandler'}) ! " Somehow the second message takes a bit of time. ! for i in range(50) ! if s:zero_reply == 'sent zero' ! break ! endif ! sleep 10m ! endfor if s:has_handler call assert_equal('zero index', s:ch_reply) else --- 346,352 ---- let s:ch_reply = '' let s:zero_reply = '' call ch_sendexpr(handle, 'send zero', {'callback': 's:OneHandler'}) ! call s:waitFor('"sent zero" == s:zero_reply') if s:has_handler call assert_equal('zero index', s:ch_reply) else *************** *** 395,423 **** " The message are sent raw, we do our own JSON strings here. call ch_sendraw(handle, "[1, \"hello!\"]", {'callback': 's:HandleRaw1'}) ! for i in range(50) ! sleep 10m ! if s:reply1 != '' ! break ! endif ! endfor call assert_equal("[1, \"got it\"]", s:reply1) call ch_sendraw(handle, "[2, \"echo something\"]", {'callback': 's:HandleRaw2'}) call ch_sendraw(handle, "[3, \"wait a bit\"]", {'callback': 's:HandleRaw3'}) ! for i in range(50) ! sleep 10m ! if s:reply2 != '' ! break ! endif ! endfor call assert_equal("[2, \"something\"]", s:reply2) ! " wait for up to 500 msec for the 200 msec delayed reply ! for i in range(50) ! sleep 10m ! if s:reply3 != '' ! break ! endif ! endfor call assert_equal("[3, \"waited\"]", s:reply3) endfunc --- 398,411 ---- " The message are sent raw, we do our own JSON strings here. call ch_sendraw(handle, "[1, \"hello!\"]", {'callback': 's:HandleRaw1'}) ! call s:waitFor('s:reply1 != ""') call assert_equal("[1, \"got it\"]", s:reply1) call ch_sendraw(handle, "[2, \"echo something\"]", {'callback': 's:HandleRaw2'}) call ch_sendraw(handle, "[3, \"wait a bit\"]", {'callback': 's:HandleRaw3'}) ! call s:waitFor('s:reply2 != ""') call assert_equal("[2, \"something\"]", s:reply2) ! " wait for the 200 msec delayed reply ! call s:waitFor('s:reply3 != ""') call assert_equal("[3, \"waited\"]", s:reply3) endfunc *************** *** 572,583 **** call ch_sendraw(handle, "echo line one\n") call ch_sendraw(handle, "echo line two\n") call ch_sendraw(handle, "double this\n") ! for i in range(50) ! sleep 10m ! if len(readfile('Xoutput')) > 2 ! break ! endif ! endfor call assert_equal(['line one', 'line two', 'this', 'AND this'], readfile('Xoutput')) finally call job_stop(job) --- 560,566 ---- call ch_sendraw(handle, "echo line one\n") call ch_sendraw(handle, "echo line two\n") call ch_sendraw(handle, "double this\n") ! call s:waitFor('len(readfile("Xoutput")) > 2') call assert_equal(['line one', 'line two', 'this', 'AND this'], readfile('Xoutput')) finally call job_stop(job) *************** *** 602,613 **** call ch_sendraw(handle, "echoerr line one\n") call ch_sendraw(handle, "echoerr line two\n") call ch_sendraw(handle, "doubleerr this\n") ! for i in range(50) ! sleep 10m ! if len(readfile('Xoutput')) > 2 ! break ! endif ! endfor call assert_equal(['line one', 'line two', 'this', 'AND this'], readfile('Xoutput')) finally call job_stop(job) --- 585,591 ---- call ch_sendraw(handle, "echoerr line one\n") call ch_sendraw(handle, "echoerr line two\n") call ch_sendraw(handle, "doubleerr this\n") ! call s:waitFor('len(readfile("Xoutput")) > 2') call assert_equal(['line one', 'line two', 'this', 'AND this'], readfile('Xoutput')) finally call job_stop(job) *************** *** 633,644 **** call ch_sendraw(handle, "echo line two\n") call ch_sendraw(handle, "double this\n") call ch_sendraw(handle, "doubleerr that\n") ! for i in range(50) ! sleep 10m ! if len(readfile('Xoutput')) > 5 ! break ! endif ! endfor call assert_equal(['line one', 'line two', 'this', 'AND this', 'that', 'AND that'], readfile('Xoutput')) finally call job_stop(job) --- 611,617 ---- call ch_sendraw(handle, "echo line two\n") call ch_sendraw(handle, "double this\n") call ch_sendraw(handle, "doubleerr that\n") ! call s:waitFor('len(readfile("Xoutput")) > 5') call assert_equal(['line one', 'line two', 'this', 'AND this', 'that', 'AND that'], readfile('Xoutput')) finally call job_stop(job) *************** *** 661,672 **** call ch_sendraw(handle, "double this\n") call ch_sendraw(handle, "quit\n") sp pipe-output ! for i in range(100) ! sleep 10m ! if line('$') >= 6 ! break ! endif ! endfor call assert_equal(['Reading from channel output...', 'line one', 'line two', 'this', 'AND this', 'Goodbye!'], getline(1, '$')) bwipe! finally --- 634,640 ---- call ch_sendraw(handle, "double this\n") call ch_sendraw(handle, "quit\n") sp pipe-output ! call s:waitFor('line("$") >= 6') call assert_equal(['Reading from channel output...', 'line one', 'line two', 'this', 'AND this', 'Goodbye!'], getline(1, '$')) bwipe! finally *************** *** 710,721 **** call ch_sendraw(handle, "echo line one\n") call ch_sendraw(handle, "echo line two\n") exe ch_getbufnr(handle, "out") . 'sbuf' ! for i in range(100) ! sleep 10m ! if line('$') >= 3 ! break ! endif ! endfor call assert_equal(['Reading from channel output...', 'line one', 'line two'], getline(1, '$')) bwipe! finally --- 678,684 ---- call ch_sendraw(handle, "echo line one\n") call ch_sendraw(handle, "echo line two\n") exe ch_getbufnr(handle, "out") . 'sbuf' ! call s:waitFor('line("$") >= 3') call assert_equal(['Reading from channel output...', 'line one', 'line two'], getline(1, '$')) bwipe! finally *************** *** 736,747 **** call ch_sendraw(handle, "echo [0, \"hello\"]\n") call ch_sendraw(handle, "echo [-2, 12.34]\n") exe ch_getbufnr(handle, "out") . 'sbuf' ! for i in range(100) ! sleep 10m ! if line('$') >= 3 ! break ! endif ! endfor call assert_equal(['Reading from channel output...', '[0,"hello"]', '[-2,12.34]'], getline(1, '$')) bwipe! finally --- 699,705 ---- call ch_sendraw(handle, "echo [0, \"hello\"]\n") call ch_sendraw(handle, "echo [-2, 12.34]\n") exe ch_getbufnr(handle, "out") . 'sbuf' ! call s:waitFor('line("$") >= 3') call assert_equal(['Reading from channel output...', '[0,"hello"]', '[-2,12.34]'], getline(1, '$')) bwipe! finally *************** *** 750,761 **** endfunc " Wait a little while for the last line, minus "offset", to equal "line". ! func Wait_for_last_line(line, offset) for i in range(100) - sleep 10m if getline(line('$') - a:offset) == a:line break endif endfor endfunc --- 708,719 ---- endfunc " Wait a little while for the last line, minus "offset", to equal "line". ! func s:wait_for_last_line(line, offset) for i in range(100) if getline(line('$') - a:offset) == a:line break endif + sleep 10m endfor endfunc *************** *** 778,790 **** try exe "normal Gaecho hello\" exe bufwinnr('pipe-output') . "wincmd w" ! call Wait_for_last_line('hello', 0) call assert_equal('hello', getline('$')) exe bufwinnr('pipe-input') . "wincmd w" exe "normal Gadouble this\" exe bufwinnr('pipe-output') . "wincmd w" ! call Wait_for_last_line('AND this', 0) call assert_equal('this', getline(line('$') - 1)) call assert_equal('AND this', getline('$')) --- 736,748 ---- try exe "normal Gaecho hello\" exe bufwinnr('pipe-output') . "wincmd w" ! call s:wait_for_last_line('hello', 0) call assert_equal('hello', getline('$')) exe bufwinnr('pipe-input') . "wincmd w" exe "normal Gadouble this\" exe bufwinnr('pipe-output') . "wincmd w" ! call s:wait_for_last_line('AND this', 0) call assert_equal('this', getline(line('$') - 1)) call assert_equal('AND this', getline('$')) *************** *** 812,822 **** call assert_equal("run", job_status(job)) try exe "normal Goecho hello\" ! call Wait_for_last_line('hello', 1) call assert_equal('hello', getline(line('$') - 1)) exe "normal Gadouble this\" ! call Wait_for_last_line('AND this', 1) call assert_equal('this', getline(line('$') - 2)) call assert_equal('AND this', getline(line('$') - 1)) --- 770,780 ---- call assert_equal("run", job_status(job)) try exe "normal Goecho hello\" ! call s:wait_for_last_line('hello', 1) call assert_equal('hello', getline(line('$') - 1)) exe "normal Gadouble this\" ! call s:wait_for_last_line('AND this', 1) call assert_equal('this', getline(line('$') - 2)) call assert_equal('AND this', getline(line('$') - 1)) *************** *** 838,844 **** func s:unlet_handle(port) let s:channelfd = ch_open('localhost:' . a:port, s:chopt) call ch_sendexpr(s:channelfd, "test", {'callback': function('s:UnletHandler')}) ! sleep 10m call assert_equal('what?', s:unletResponse) endfunc --- 796,802 ---- func s:unlet_handle(port) let s:channelfd = ch_open('localhost:' . a:port, s:chopt) call ch_sendexpr(s:channelfd, "test", {'callback': function('s:UnletHandler')}) ! call s:waitFor('"what?" == s:unletResponse') call assert_equal('what?', s:unletResponse) endfunc *************** *** 859,865 **** func s:close_handle(port) let s:channelfd = ch_open('localhost:' . a:port, s:chopt) call ch_sendexpr(s:channelfd, "test", {'callback': function('s:CloseHandler')}) ! sleep 10m call assert_equal('what?', s:unletResponse) endfunc --- 817,823 ---- func s:close_handle(port) let s:channelfd = ch_open('localhost:' . a:port, s:chopt) call ch_sendexpr(s:channelfd, "test", {'callback': function('s:CloseHandler')}) ! call s:waitFor('"what?" == s:unletResponse') call assert_equal('what?', s:unletResponse) endfunc *************** *** 911,918 **** return endif call assert_equal('ok', ch_evalexpr(handle, 'call-func')) ! sleep 20m call assert_equal([1, 2, 3], s:call_ret) endfunc --- 869,877 ---- return endif + let s:call_ret = [] call assert_equal('ok', ch_evalexpr(handle, 'call-func')) ! call s:waitFor('len(s:call_ret) > 0') call assert_equal([1, 2, 3], s:call_ret) endfunc *************** *** 969,975 **** call ch_setoptions(handle, {'close-cb': 'MyCloseCb'}) call assert_equal('', ch_evalexpr(handle, 'close me')) ! sleep 20m call assert_equal('closed', s:ch_close_ret) endfunc --- 928,934 ---- call ch_setoptions(handle, {'close-cb': 'MyCloseCb'}) call assert_equal('', ch_evalexpr(handle, 'close me')) ! call s:waitFor('"closed" == s:ch_close_ret') call assert_equal('closed', s:ch_close_ret) endfunc *** ../vim-7.4.1514/src/version.c 2016-03-08 15:37:36.734963213 +0100 --- src/version.c 2016-03-08 16:05:57.473290606 +0100 *************** *** 745,746 **** --- 745,748 ---- { /* Add new patch number below this line */ + /**/ + 1515, /**/ -- "How is your new girlfriend?" "90-60-90 man!" "What, pale purple?" /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///