Skip to content

Commit

Permalink
serial: Fix getSignals() error handling
Browse files Browse the repository at this point in the history
This change fixes error handling for the getSignals() method. It was
assumed that the Mojo reply value could be null on error but this was
not allowed by serial.mojom. This meant that if a call to
GetControlSignals() failed it would trigger a Mojo connection failure
rather than only reporting the (potentially recoverable) error.

Tests exercising this case on both the renderer and browser process
sides have been added.

Bug: 1156864
Change-Id: Ife5c953d5f6748c0290fae2f2d53c5415c1faba6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2580747
Commit-Queue: Reilly Grant <reillyg@chromium.org>
Reviewed-by: Dominick Ng <dominickn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#835293}
  • Loading branch information
reillyeon authored and chromium-wpt-export-bot committed Dec 9, 2020
1 parent e811907 commit 351a997
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 0 deletions.
18 changes: 18 additions & 0 deletions resources/chromium/fake-serial.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,13 @@ class FakeSerialPort {
ringIndicator: false,
dataSetReady: false
};
this.inputSignalFailure_ = false;
this.outputSignals_ = {
dataTerminalReady: false,
requestToSend: false,
break: false
};
this.outputSignalFailure_ = false;
}

open(options, client) {
Expand Down Expand Up @@ -170,10 +172,18 @@ class FakeSerialPort {
this.inputSignals_ = signals;
}

simulateInputSignalFailure(fail) {
this.inputSignalFailure_ = fail;
}

get outputSignals() {
return this.outputSignals_;
}

simulateOutputSignalFailure(fail) {
this.outputSignalFailure_ = fail;
}

writable() {
if (this.writable_)
return Promise.resolve();
Expand Down Expand Up @@ -241,6 +251,10 @@ class FakeSerialPort {
}

async getControlSignals() {
if (this.inputSignalFailure_) {
return {signals: null};
}

const signals = {
dcd: this.inputSignals_.dataCarrierDetect,
cts: this.inputSignals_.clearToSend,
Expand All @@ -251,6 +265,10 @@ class FakeSerialPort {
}

async setControlSignals(signals) {
if (this.outputSignalFailure_) {
return {success: false};
}

if (signals.hasDtr) {
this.outputSignals_.dataTerminalReady = signals.dtr;
}
Expand Down
20 changes: 20 additions & 0 deletions serial/serialPort_getSignals.https.any.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,23 @@ serial_test(async (t, fake) => {
signals = await port.getSignals();
assert_object_equals(signals, expectedSignals, 'DSR set');
}, 'getSignals() returns the current state of input control signals');

serial_test(async (t, fake) => {
const {port, fakePort} = await getFakeSerialPort(fake);
await port.open({baudRate: 9600});

fakePort.simulateInputSignalFailure(true);
await promise_rejects_dom(t, 'NetworkError', port.getSignals());

fakePort.simulateInputSignalFailure(false);
const expectedSignals = {
dataCarrierDetect: false,
clearToSend: false,
ringIndicator: false,
dataSetReady: false
};
const signals = await port.getSignals();
assert_object_equals(signals, expectedSignals);

await port.close();
}, 'getSignals() rejects on failure');
14 changes: 14 additions & 0 deletions serial/serialPort_setSignals.https.any.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,17 @@ serial_test(async (t, fake) => {
expectedSignals.break = false;
assert_object_equals(fakePort.outputSignals, expectedSignals, 'invert');
}, 'setSignals() modifies the state of the port');

serial_test(async (t, fake) => {
const {port, fakePort} = await getFakeSerialPort(fake);
await port.open({baudRate: 9600});

fakePort.simulateOutputSignalFailure(true);
await promise_rejects_dom(t, 'NetworkError', port.setSignals({break: true}));

fakePort.simulateOutputSignalFailure(false);
await port.setSignals({break: true});
assert_true(fakePort.outputSignals.break);

await port.close();
}, 'setSignals() rejects on failure');

0 comments on commit 351a997

Please sign in to comment.