diff --git a/test/test-message-translator-complex.js b/test/test-message-translator-complex.js index 69e10745..b688f92d 100644 --- a/test/test-message-translator-complex.js +++ b/test/test-message-translator-complex.js @@ -209,16 +209,33 @@ describe('Rclnodejs message translation: complex types', function () { const MessageType = testData.pkg + '/msg/' + testData.type; const publisher = node.createPublisher(MessageType, topic); return new Promise((resolve, reject) => { + let timer; const sub = node.createSubscription(MessageType, topic, (value) => { if (deepEqual(value, v)) { + clearInterval(timer); node.destroy(); resolve(); } else { + clearInterval(timer); + node.destroy(); console.log('got', value); console.log('expected', v); reject('case ' + i + '. Expected: ' + v + ', Got: ' + value); } }); + // Keep republishing until the subscription is matched and the + // message is received; a single publish can be lost while pub/sub + // discovery is still in progress. + const start = Date.now(); + timer = setInterval(() => { + if (Date.now() - start > 55 * 1000) { + clearInterval(timer); + node.destroy(); + reject('Timed out waiting for message'); + return; + } + publisher.publish(v); + }, 100); publisher.publish(v); rclnodejs.spin(node); }); diff --git a/test/test-message-translator-primitive.js b/test/test-message-translator-primitive.js index 1163c3f4..7a3932ab 100644 --- a/test/test-message-translator-primitive.js +++ b/test/test-message-translator-primitive.js @@ -94,18 +94,31 @@ describe('Rclnodejs message translation: primitive types', function () { const MessageType = 'std_msgs/msg/' + testData.type; const publisher = node.createPublisher(MessageType, topic); return new Promise((resolve, reject) => { + let timer; const sub = node.createSubscription(MessageType, topic, (value) => { // For primitive types, msgs are defined as a single `.data` field if (value.data === v) { + clearInterval(timer); node.destroy(); resolve(); } else { + clearInterval(timer); node.destroy(); reject( 'case ' + i + '. Expected: ' + v + ', Got: ' + value.data ); } }); + const start = Date.now(); + timer = setInterval(() => { + if (Date.now() - start > 55 * 1000) { + clearInterval(timer); + node.destroy(); + reject('Timed out waiting for message'); + return; + } + publisher.publish(v); + }, 100); publisher.publish(v); // Short-cut form of publishing primitive types rclnodejs.spin(node); }); @@ -119,18 +132,31 @@ describe('Rclnodejs message translation: primitive types', function () { const MessageType = 'std_msgs/msg/' + testData.type; const publisher = node.createPublisher(MessageType, topic); return new Promise((resolve, reject) => { + let timer; const sub = node.createSubscription(MessageType, topic, (value) => { // For primitive types, msgs are defined as a single `.data` field if (value.data === v) { + clearInterval(timer); node.destroy(); resolve(); } else { + clearInterval(timer); node.destroy(); reject( 'case ' + i + '. Expected: ' + v + ', Got: ' + value.data ); } }); + const start = Date.now(); + timer = setInterval(() => { + if (Date.now() - start > 55 * 1000) { + clearInterval(timer); + node.destroy(); + reject('Timed out waiting for message'); + return; + } + publisher.publish({ data: v }); + }, 100); publisher.publish({ data: v }); // Ensure the original form of the message can be used rclnodejs.spin(node); }); @@ -221,6 +247,7 @@ describe('Rclnodejs message translation: primitive types array', function () { const MessageType = 'std_msgs/msg/' + testData.type; const publisher = node.createPublisher(MessageType, topic); return new Promise((resolve, reject) => { + let timer; const sub = node.createSubscription(MessageType, topic, (value) => { // For primitive types, msgs are defined as a single `.data` field if ( @@ -228,20 +255,33 @@ describe('Rclnodejs message translation: primitive types array', function () { deepEqual(Array.from(value.data), testData.values)) || deepEqual(value.data, testData.values) ) { + clearInterval(timer); node.destroy(); resolve(); } else { + clearInterval(timer); node.destroy(); reject('Expected: ' + testData.values + ', Got: ' + value.data); } }); - publisher.publish({ + const msg = { layout: { dim: [{ label: 'length', size: 0, stride: 0 }], data_offset: 0, }, data: testData.values, - }); + }; + const start = Date.now(); + timer = setInterval(() => { + if (Date.now() - start > 55 * 1000) { + clearInterval(timer); + node.destroy(); + reject('Timed out waiting for message'); + return; + } + publisher.publish(msg); + }, 100); + publisher.publish(msg); rclnodejs.spin(node); }); } @@ -478,6 +518,7 @@ describe('Rclnodejs message translation: TypedArray large data', function () { const MessageType = 'std_msgs/msg/' + testData.type; const publisher = node.createPublisher(MessageType, topic); return new Promise((resolve, reject) => { + let timer; const sub = node.createSubscription(MessageType, topic, (value) => { // For primitive types, msgs are defined as a single `.data` field if ( @@ -485,9 +526,11 @@ describe('Rclnodejs message translation: TypedArray large data', function () { deepEqual(Array.from(value.data), testData.values)) || deepEqual(value.data, testData.values) ) { + clearInterval(timer); node.destroy(); resolve(); } else { + clearInterval(timer); node.destroy(); reject( 'Expected: ' + @@ -497,13 +540,24 @@ describe('Rclnodejs message translation: TypedArray large data', function () { ); } }); - publisher.publish({ + const msg = { layout: { dim: [{ label: 'length', size: 0, stride: 0 }], data_offset: 0, }, data: testData.values, - }); + }; + const start = Date.now(); + timer = setInterval(() => { + if (Date.now() - start > 55 * 1000) { + clearInterval(timer); + node.destroy(); + reject('Timed out waiting for message'); + return; + } + publisher.publish(msg); + }, 100); + publisher.publish(msg); rclnodejs.spin(node); }); }