diff options
author | Erlang/OTP <otp@erlang.org> | 2022-03-22 14:15:21 +0100 |
---|---|---|
committer | Erlang/OTP <otp@erlang.org> | 2022-03-22 14:15:21 +0100 |
commit | 329eaf1b2393110907f2ada5079f633eae8b8aac (patch) | |
tree | ebaa7edd392c6fb4dc2c3335606b1a4e16fa1977 /lib/jinterface | |
parent | 47375b6e71507c3f716168e07cbd75259d5ad6b4 (diff) | |
parent | 80d22b8df573e399f5834d6ce5bdcdd727ea0f9b (diff) | |
download | erlang-329eaf1b2393110907f2ada5079f633eae8b8aac.tar.gz |
Merge branch 'sverker/23/jinterface/write_pid-fix/OTP-17887' into maint-23
* sverker/23/jinterface/write_pid-fix/OTP-17887:
jinterface: Fix encoding bugs for pids, ports and refs
jinterface: Refactor test file MboxSendReceive.java
Diffstat (limited to 'lib/jinterface')
-rw-r--r-- | lib/jinterface/java_src/com/ericsson/otp/erlang/OtpOutputStream.java | 31 | ||||
-rw-r--r-- | lib/jinterface/test/jinterface_SUITE_data/MboxSendReceive.java | 156 |
2 files changed, 106 insertions, 81 deletions
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpOutputStream.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpOutputStream.java index 917e5baf3a..bf76fda490 100644 --- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpOutputStream.java +++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpOutputStream.java @@ -700,24 +700,22 @@ public class OtpOutputStream extends ByteArrayOutputStream { * the nodename. * * @param id - * an arbitrary number. Only the low order 15 bits will be used. + * an arbitrary number. * * @param serial - * another arbitrary number. Only the low order 13 bits will be - * used. + * another arbitrary number. * * @param creation - * yet another arbitrary number. Only the low order 2 bits will - * be used. + * node incarnation number. * */ public void write_pid(final String node, final int id, final int serial, final int creation) { write1(OtpExternal.newPidTag); write_atom(node); - write4BE(id & 0x7fff); // 15 bits - write4BE(serial & 0x1fff); // 13 bits - write1(creation & 0x3); // 2 bits + write4BE(id); + write4BE(serial); + write4BE(creation); } /** @@ -751,8 +749,8 @@ public class OtpOutputStream extends ByteArrayOutputStream { public void write_port(final String node, final int id, final int creation) { write1(OtpExternal.newPortTag); write_atom(node); - write4BE(id & 0xfffffff); // 28 bits - write1(creation & 0x3); // 2 bits + write4BE(id); + write4BE(creation); } /** @@ -797,12 +795,11 @@ public class OtpOutputStream extends ByteArrayOutputStream { * the nodename. * * @param ids - * an array of arbitrary numbers. Only the low order 18 bits of - * the first number will be used. At most three numbers + * an array of arbitrary numbers. At most three numbers * will be read from the array. * * @param creation - * another arbitrary number. Only the low order 2 bits will be used. + * another arbitrary number. * */ public void write_ref(final String node, final int[] ids, final int creation) { @@ -818,13 +815,9 @@ public class OtpOutputStream extends ByteArrayOutputStream { write_atom(node); - write1(creation & 0x3); // 2 bits + write4BE(creation); - // first int gets truncated to 18 bits - write4BE(ids[0] & 0x3ffff); - - // remaining ones are left as is - for (int i = 1; i < arity; i++) { + for (int i = 0; i < arity; i++) { write4BE(ids[i]); } } diff --git a/lib/jinterface/test/jinterface_SUITE_data/MboxSendReceive.java b/lib/jinterface/test/jinterface_SUITE_data/MboxSendReceive.java index 8e25e0f8b5..ad0ef344ba 100644 --- a/lib/jinterface/test/jinterface_SUITE_data/MboxSendReceive.java +++ b/lib/jinterface/test/jinterface_SUITE_data/MboxSendReceive.java @@ -18,13 +18,8 @@ * %CopyrightEnd% */ -import com.ericsson.otp.erlang.OtpErlangAtom; -import com.ericsson.otp.erlang.OtpErlangLong; -import com.ericsson.otp.erlang.OtpErlangObject; -import com.ericsson.otp.erlang.OtpErlangPid; -import com.ericsson.otp.erlang.OtpErlangTuple; -import com.ericsson.otp.erlang.OtpMbox; -import com.ericsson.otp.erlang.OtpNode; +import java.util.Arrays; +import com.ericsson.otp.erlang.*; class MboxSendReceive { @@ -61,9 +56,9 @@ class MboxSendReceive { // Send the pid of mbox to erlang and wait for test case // instruction: {TestCaseTag, Pid} mbox.send("erl_send_receive_server", erlNode, mbox.self()); - OtpErlangObject o = mbox.receive(recTime); - if (o == null) System.exit(1); - OtpErlangTuple testCase = (OtpErlangTuple)o; + OtpErlangObject obj = mbox.receive(recTime); + if (obj == null) System.exit(1); + OtpErlangTuple testCase = (OtpErlangTuple)obj; dbg("mbox received " + testCase); int tag = (int)((OtpErlangLong)testCase.elementAt(0)).longValue(); OtpErlangPid erlangPid = (OtpErlangPid)testCase.elementAt(1); @@ -86,10 +81,10 @@ class MboxSendReceive { dbg("java_echo_server sending " + msg); mbox.send(erlangPid,msg); - o = mbox.receive(recTime); - dbg("java_echo_server received " + o); - if (o == null) System.exit(2); - if (!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(3); + obj = mbox.receive(recTime); + dbg("java_echo_server received " + obj); + if (obj == null) System.exit(2); + if (!obj.equals(msgArray[1])) System.exit(3); // Test3: Same as Test2, but using a new mbox2 which // got its name already when it is created - i.e. not @@ -100,10 +95,47 @@ class MboxSendReceive { dbg("java_echo_server2 sending " + msg); mbox2.send(erlangPid,msg); - o = mbox2.receive(recTime); - dbg("java_echo_server received " + o); - if (o == null) System.exit(4); - if (!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(5); + obj = mbox2.receive(recTime); + dbg("java_echo_server received " + obj); + if (obj == null) System.exit(4); + if (!obj.equals(msgArray[1])) System.exit(5); + + // Test4: Test all term types + byte[] bytes = {1,2,3}; + int[] ints = {11,22,33}; + OtpErlangObject[] elements = { + new OtpErlangAtom("atom"), + new OtpErlangString("string"), + new OtpErlangLong(17), + }; + OtpErlangObject[] terms = { + new OtpErlangBitstr(bytes, 5), + new OtpErlangDouble(3.141592), + new OtpErlangExternalFun("lists", "length", 1), + //new OtpErlangFun(...), + new OtpErlangList(elements), + new OtpErlangLong(-1742), + new OtpErlangMap(Arrays.copyOfRange(elements,0,elements.length-1), + Arrays.copyOfRange(elements,1,elements.length)), + new OtpErlangPid(node.node(), 1372, 1742, 98765), + new OtpErlangPort(node.node(), 1372, 87654), + new OtpErlangRef(node.node(), ints, 76543), + new OtpErlangString("This is an OtpErlangString"), + new OtpErlangTuple(elements), + }; + for (int i=0; i < terms.length; i++) { + msgArray[1] = terms[i]; + msg = new OtpErlangTuple(msgArray); + + dbg("java_echo_server2 sending " + msg); + mbox2.send(erlangPid,msg); + + obj = mbox2.receive(recTime); + dbg("java_echo_server received " + obj); + if (obj == null) System.exit(4); + if (!obj.equals(msgArray[1])) System.exit(5); + } + break; @@ -112,34 +144,34 @@ class MboxSendReceive { // Test1: Sending message between mboxes on same node // given registered name and node without host. mbox.send("java_echo_server2","javanode",msgArray[1]); - o = mbox2.receive(recTime); - dbg("Mbox at same node: " + o); - if (o == null) System.exit(6); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(7); + obj = mbox2.receive(recTime); + dbg("Mbox at same node: " + obj); + if (obj == null) System.exit(6); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(7); // Test2: Sending message between mboxes on same node // given registered name and node with host. mbox.send("java_echo_server2",mbox2.self().node(),msgArray[1]); - o = mbox2.receive(recTime); - dbg("Mbox at same node: " + o); - if (o == null) System.exit(8); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(9); + obj = mbox2.receive(recTime); + dbg("Mbox at same node: " + obj); + if (obj == null) System.exit(8); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(9); // Test3: Sending message between mboxes on same node // given registered name but not node. mbox.send("java_echo_server2",msgArray[1]); - o = mbox2.receive(recTime); - dbg("Mbox at same node: " + o); - if (o == null) System.exit(10); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(11); + obj = mbox2.receive(recTime); + dbg("Mbox at same node: " + obj); + if (obj == null) System.exit(10); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(11); // Test4: Sending message between mboxes on same node // given pid. mbox.send(mbox2.self(),msgArray[1]); - o = mbox2.receive(recTime); - dbg("Mbox at same node: " + o); - if (o == null) System.exit(12); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(13); + obj = mbox2.receive(recTime); + dbg("Mbox at same node: " + obj); + if (obj == null) System.exit(12); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(13); break; @@ -151,27 +183,27 @@ class MboxSendReceive { // Test1: Sending message between mboxes on different // nodes given registered name and node without host. mbox.send("mboxOtherNode","javanode2",msgArray[1]); - o = mboxOtherNode.receive(recTime); - dbg("Mbox at same node: " + o); - if (o == null) System.exit(14); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(15); + obj = mboxOtherNode.receive(recTime); + dbg("Mbox at same node: " + obj); + if (obj == null) System.exit(14); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(15); // Test2: Sending message between mboxes on different // nodes given registered name and node with host. mbox.send("mboxOtherNode",mboxOtherNode.self().node(), msgArray[1]); - o = mboxOtherNode.receive(recTime); - dbg("Mbox at same node: " + o); - if (o == null) System.exit(16); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(17); + obj = mboxOtherNode.receive(recTime); + dbg("Mbox at same node: " + obj); + if (obj == null) System.exit(16); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(17); // Test3: Sending message between mboxes on different // nodes given pid. mbox.send(mboxOtherNode.self(),msgArray[1]); - o = mboxOtherNode.receive(recTime); - dbg("Mbox at same node: " + o); - if (o == null) System.exit(18); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(19); + obj = mboxOtherNode.receive(recTime); + dbg("Mbox at same node: " + obj); + if (obj == null) System.exit(18); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(19); break; @@ -181,33 +213,33 @@ class MboxSendReceive { // Test1: Sending message to myself given registered // name and node without host. mbox2.send("java_echo_server2","javanode",msgArray[1]); - o = mbox2.receive(recTime); - dbg("Self: " + o); - if (o == null) System.exit(18); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(19); + obj = mbox2.receive(recTime); + dbg("Self: " + obj); + if (obj == null) System.exit(18); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(19); // Test2: Sending message to myself given registered // name and node with host. mbox2.send("java_echo_server2",mbox2.self().node(),msgArray[1]); - o = mbox2.receive(recTime); - dbg("Self: " + o); - if (o == null) System.exit(20); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(21); + obj = mbox2.receive(recTime); + dbg("Self: " + obj); + if (obj == null) System.exit(20); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(21); // Test3: Sending message to myself given registered // name but not host. mbox2.send("java_echo_server2",msgArray[1]); - o = mbox2.receive(recTime); - dbg("Self: " + o); - if (o == null) System.exit(22); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(23); + obj = mbox2.receive(recTime); + dbg("Self: " + obj); + if (obj == null) System.exit(22); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(23); // Test4: Sending message to myself given pid. mbox2.send(mbox2.self(),msgArray[1]); - o = mbox2.receive(recTime); - dbg("Self: " + o); - if (o == null) System.exit(24); - if(!((OtpErlangAtom)o).equals(msgArray[1])) System.exit(25); + obj = mbox2.receive(recTime); + dbg("Self: " + obj); + if (obj == null) System.exit(24); + if(!((OtpErlangAtom)obj).equals(msgArray[1])) System.exit(25); break; |