File 0550-ct-Add-option-newline-string-to-ct_telnet-cmd-and-ct.patch of Package erlang

From 5cf3304d44ecb8ee28045d44377e2e9747e80f26 Mon Sep 17 00:00:00 2001
From: Siri Hansen <siri@erlang.org>
Date: Thu, 31 Jan 2019 13:29:41 +0100
Subject: [PATCH 2/2] [ct] Add option {newline,string()} to ct_telnet:cmd and
 ct_telnet:send

By default, each command is appended with "\n", but in some cases a
command must end with "\r\n" to evaluate correctly. This can now be
specified with option {newline,"\r\n"}.
---
 lib/common_test/doc/src/ct_telnet.xml              | 29 ++++++++++++++--------
 lib/common_test/src/ct_telnet.erl                  |  9 +++++++
 lib/common_test/src/ct_telnet_client.erl           |  6 +++--
 .../ct_telnet_own_server_SUITE.erl                 | 11 +++++++-
 4 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/lib/common_test/doc/src/ct_telnet.xml b/lib/common_test/doc/src/ct_telnet.xml
index 9a12ce79ed..76f5305c46 100644
--- a/lib/common_test/doc/src/ct_telnet.xml
+++ b/lib/common_test/doc/src/ct_telnet.xml
@@ -239,18 +239,21 @@
         <v>Connection = connection()</v>
         <v>Cmd = string()</v>
         <v>Opts = [Opt]</v>
-        <v>Opt = {timeout, timeout()} | {newline, boolean()}</v>
+        <v>Opt = {timeout, timeout()} | {newline, boolean() | string()}</v>
         <v>Data = [string()]</v>
         <v>Reason = term()</v>
       </type>
       <desc><marker id="cmd-3"/>
         <p>Sends a command through Telnet and waits for prompt.</p>
 
-        <p>By default, this function adds a new line to the end of the
+        <p>By default, this function adds "\n" to the end of the
           specified command. If this is not desired, use option
           <c>{newline,false}</c>. This is necessary, for example, when
           sending Telnet command sequences prefixed with character
-          Interprete As Command (IAC).</p>
+          Interpret As Command (IAC). Option <c>{newline,string()}</c>
+          can also be used if a different line end than "\n" is
+          required, for instance <c>{newline,"\r\n"}</c>, to add both
+          carriage return and newline characters.</p>
 
         <p>Option <c>timeout</c> specifies how long the client must wait
           for prompt. If the time expires, the function returns
@@ -280,7 +283,7 @@
         <v>CmdFormat = string()</v>
         <v>Args = list()</v>
         <v>Opts = [Opt]</v>
-        <v>Opt = {timeout, timeout()} | {newline, boolean()}</v>
+        <v>Opt = {timeout, timeout()} | {newline, boolean() | string()}</v>
         <v>Data = [string()]</v>
         <v>Reason = term()</v>
       </type>
@@ -339,7 +342,7 @@
           subexpression number <c>N</c>. Subexpressions are denoted with
           <c>'(' ')'</c> in the regular expression.</p>
 
-        <p>If a <c>Tag</c> is speciifed, the returned <c>Match</c> also
+        <p>If a <c>Tag</c> is specified, the returned <c>Match</c> also
           includes the matched <c>Tag</c>. Otherwise, only <c>RxMatch</c>
           is returned.</p>
 
@@ -382,7 +385,7 @@
             can abort the operation of waiting for prompt.</p></item>
           <tag><c>repeat | repeat, N</c></tag>
           <item><p>The pattern(s) must be matched multiple times. If <c>N</c>
-            is speciified, the pattern(s) are matched <c>N</c> times, and
+            is specified, the pattern(s) are matched <c>N</c> times, and
             the function returns <c>HaltReason = done</c>. This option can be
             interrupted by one or more <c>HaltPatterns</c>. <c>MatchList</c>
             is always returned, that is, a list of <c>Match</c> instead of
@@ -547,17 +550,20 @@
         <v>Connection = connection()</v>
         <v>Cmd = string()</v>
         <v>Opts = [Opt]</v>
-        <v>Opt = {newline, boolean()}</v>
+        <v>Opt = {newline, boolean() | string()}</v>
         <v>Reason = term()</v>
       </type>
       <desc><marker id="send-3"/>
         <p>Sends a Telnet command and returns immediately.</p>
 
-        <p>By default, this function adds a newline to the end of the
+        <p>By default, this function adds "\n" to the end of the
           specified command. If this is not desired, option
           <c>{newline,false}</c> can be used. This is necessary, for example,
           when sending Telnet command sequences prefixed with character   
-          Interprete As Command (IAC).</p>
+          Interpret As Command (IAC). Option <c>{newline,string()}</c>
+          can also be used if a different line end than "\n" is
+          required, for instance <c>{newline,"\r\n"}</c>, to add both
+          carriage return and newline characters.</p>
 
         <p>The resulting output from the command can be read with
           <seealso marker="#get_data-1"><c>ct_telnet:get_data/2</c></seealso> or
@@ -584,12 +590,15 @@
         <v>CmdFormat = string()</v>
         <v>Args = list()</v>
         <v>Opts = [Opt]</v>
-        <v>Opt = {newline, boolean()}</v>
+        <v>Opt = {newline, boolean() | string()}</v>
         <v>Reason = term()</v>
       </type>
       <desc><marker id="sendf-4"/>
         <p>Sends a Telnet command and returns immediately (uses a format
           string and a list of arguments to build the command).</p>
+
+        <p>For details, see
+          <seealso marker="#send-3"><c>ct_telnet:send/3</c></seealso>.</p>
       </desc>
     </func>
   </funcs>
diff --git a/lib/common_test/src/ct_telnet.erl b/lib/common_test/src/ct_telnet.erl
index 3df06cb3b4..174008c790 100644
--- a/lib/common_test/src/ct_telnet.erl
+++ b/lib/common_test/src/ct_telnet.erl
@@ -194,6 +194,15 @@ send(Connection,Cmd,Opts) ->
 
 check_send_opts([{newline,Bool}|Opts]) when is_boolean(Bool) ->
     check_send_opts(Opts);
+check_send_opts([{newline,String}|Opts]) when is_list(String) ->
+    case lists:all(fun(I) when is_integer(I), I>=0, I=<127 -> true;
+                      (_) -> false
+                   end, String) of
+        true ->
+            check_send_opts(Opts);
+        false ->
+            {error,{invalid_option,{newline,String}}}
+    end;
 check_send_opts([Invalid|_]) ->
     {error,{invalid_option,Invalid}};
 check_send_opts([]) ->
diff --git a/lib/common_test/src/ct_telnet_client.erl b/lib/common_test/src/ct_telnet_client.erl
index 76e4b9ea70..007477c855 100644
--- a/lib/common_test/src/ct_telnet_client.erl
+++ b/lib/common_test/src/ct_telnet_client.erl
@@ -101,9 +101,11 @@ close(Pid) ->
     end.	    
 
 send_data(Pid, Data) ->
-    send_data(Pid, Data, true).
+    send_data(Pid, Data, "\n").
 send_data(Pid, Data, true) ->
-    send_data(Pid, Data++"\n", false);
+    send_data(Pid, Data, "\n");
+send_data(Pid, Data, Newline) when is_list(Newline) ->
+    send_data(Pid, Data++Newline, false);
 send_data(Pid, Data, false) ->
     Pid ! {send_data, Data},
     ok.
diff --git a/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_own_server_SUITE.erl b/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_own_server_SUITE.erl
index 985fa40ad2..34df57027e 100644
--- a/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_own_server_SUITE.erl
+++ b/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_own_server_SUITE.erl
@@ -58,7 +58,8 @@ all() ->
      server_speaks,
      server_disconnects,
      newline_ayt,
-     newline_break
+     newline_break,
+     newline_string
     ].
 
 groups() ->
@@ -393,3 +394,11 @@ newline_break(_) ->
     "> " = lists:flatten(R),
     ok = ct_telnet:close(Handle),
     ok.
+
+%% Test option {newline,String} to specify an own newline, e.g. "\r\n"
+newline_string(_) ->
+    {ok, Handle} = ct_telnet:open(telnet_server_conn1),
+    ok = ct_telnet:send(Handle, "echo hello-", [{newline,"own_nl\n"}]),
+    {ok,["hello-own_nl"]} = ct_telnet:expect(Handle, ["hello-own_nl"]),
+    ok = ct_telnet:close(Handle),
+    ok.
-- 
2.16.4

openSUSE Build Service is sponsored by