summaryrefslogtreecommitdiff
path: root/lib/jinterface
diff options
context:
space:
mode:
authorErlang/OTP <otp@erlang.org>2022-03-22 14:15:21 +0100
committerErlang/OTP <otp@erlang.org>2022-03-22 14:15:21 +0100
commit329eaf1b2393110907f2ada5079f633eae8b8aac (patch)
treeebaa7edd392c6fb4dc2c3335606b1a4e16fa1977 /lib/jinterface
parent47375b6e71507c3f716168e07cbd75259d5ad6b4 (diff)
parent80d22b8df573e399f5834d6ce5bdcdd727ea0f9b (diff)
downloaderlang-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.java31
-rw-r--r--lib/jinterface/test/jinterface_SUITE_data/MboxSendReceive.java156
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;