Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / third_party / pigweed / repo / pw_web_ui / src / transport / web_serial_transport_test.ts
1 // Copyright 2020 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 /* eslint-env browser, jasmine */
16 import {last, take} from 'rxjs/operators';
17 import {SerialMock} from './serial_mock';
18 import {WebSerialTransport, DeviceLockedError} from './web_serial_transport';
19
20 describe('WebSerialTransport', () => {
21   let serialMock: SerialMock;
22   beforeEach(() => {
23     serialMock = new SerialMock();
24   });
25
26   it('is disconnected before connecting', () => {
27     const transport = new WebSerialTransport(serialMock as Serial);
28     expect(transport.connected.getValue()).toBeFalse();
29   });
30
31   it('reports that it has connected', async () => {
32     const transport = new WebSerialTransport(serialMock as Serial);
33     await transport.connect();
34     expect(serialMock.serialPort.open).toHaveBeenCalled();
35     expect(transport.connected.getValue()).toBeTrue();
36   });
37
38   it('emits chunks as they arrive from the device', async () => {
39     const transport = new WebSerialTransport(serialMock as Serial);
40     await transport.connect();
41     const data = new Uint8Array([1, 2, 3]);
42     const emitted = transport.chunks.pipe(take(1)).toPromise();
43     serialMock.dataFromDevice(data);
44
45     expect(await emitted).toEqual(data);
46     expect(transport.connected.getValue()).toBeTrue();
47     expect(serialMock.serialPort.readable.locked).toBeTrue();
48     expect(serialMock.serialPort.writable.locked).toBeTrue();
49   });
50
51   it('is disconnected when it reaches the final chunk', async () => {
52     const transport = new WebSerialTransport(serialMock as Serial);
53     await transport.connect();
54     const disconnectPromise = transport.connected
55       .pipe(take(2), last())
56       .toPromise();
57     serialMock.closeFromDevice();
58
59     expect(await disconnectPromise).toBeFalse();
60   });
61
62   it('waits for the writer to be ready', async () => {
63     const transport = new WebSerialTransport(serialMock as Serial);
64     await transport.connect();
65     const data = new Uint8Array([1, 2, 3]);
66
67     const dataToDevice = serialMock.dataToDevice.pipe(take(1)).toPromise();
68
69     let writtenData: Uint8Array | undefined = undefined;
70     dataToDevice.then(data => {
71       writtenData = data;
72     });
73
74     const sendPromise = transport.sendChunk(data);
75     expect(writtenData).toBeUndefined();
76     await sendPromise;
77     expect(writtenData).toBeDefined();
78   });
79
80   it('sends chunks to the device', async () => {
81     const transport = new WebSerialTransport(serialMock as Serial);
82     await transport.connect();
83     const data = new Uint8Array([1, 2, 3]);
84
85     const dataToDevice = serialMock.dataToDevice.pipe(take(1)).toPromise();
86
87     await transport.sendChunk(data);
88     expect(await dataToDevice).toEqual(data);
89   });
90
91   it('throws an error on failing to connect', async () => {
92     const connectError = new Error('Example connection error');
93     spyOn(serialMock, 'requestPort').and.throwError(connectError);
94     const transport = new WebSerialTransport(serialMock as Serial);
95     await expectAsync(transport.connect()).toBeRejectedWith(connectError);
96   });
97
98   it("emits connection errors in the 'errors' observable", async () => {
99     const transport = new WebSerialTransport(serialMock as Serial);
100     await transport.connect();
101
102     const reportedErrorPromise = transport.errors.pipe(take(1)).toPromise();
103     serialMock.serialPort.errorFromDevice(new Error());
104
105     expect(await reportedErrorPromise).toEqual(new DeviceLockedError());
106   });
107 });