blob: 21b28988125a895e08fa70337821cffc3e783be5 [file] [log] [blame]
// Copyright (C) 2019 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import {dingus} from 'dingusjs';
import {utf8Encode} from '../base/string_utils';
import {perfetto} from '../gen/protos';
import {AdbStream, MockAdb, MockAdbStream} from './adb_interfaces';
import {AdbConsumerPort} from './adb_shell_controller';
import {Consumer} from './record_controller_interfaces';
function generateMockConsumer(): Consumer {
return {
onConsumerPortResponse: jest.fn(),
onError: jest.fn(),
onStatus: jest.fn(),
};
}
const mainCallback = generateMockConsumer();
const adbMock = new MockAdb();
const adbController = new AdbConsumerPort(adbMock, mainCallback);
const mockIntArray = new Uint8Array();
const enableTracingRequest = new perfetto.protos.EnableTracingRequest();
enableTracingRequest.traceConfig = new perfetto.protos.TraceConfig();
const enableTracingRequestProto =
perfetto.protos.EnableTracingRequest.encode(enableTracingRequest).finish();
test('handleCommand', async () => {
adbController.findDevice = () => {
return Promise.resolve(dingus<USBDevice>());
};
const enableTracing = jest.fn();
adbController.enableTracing = enableTracing;
await adbController.invoke('EnableTracing', mockIntArray);
expect(enableTracing).toHaveBeenCalledTimes(1);
const readBuffers = jest.fn();
adbController.readBuffers = readBuffers;
adbController.invoke('ReadBuffers', mockIntArray);
expect(readBuffers).toHaveBeenCalledTimes(1);
const sendErrorMessage = jest.fn();
adbController.sendErrorMessage = sendErrorMessage;
adbController.invoke('unknown', mockIntArray);
expect(sendErrorMessage).toBeCalledWith('Method not recognized: unknown');
});
test('enableTracing', async () => {
const mainCallback = generateMockConsumer();
const adbMock = new MockAdb();
const adbController = new AdbConsumerPort(adbMock, mainCallback);
adbController.sendErrorMessage =
jest.fn().mockImplementation((s) => console.error(s));
const findDevice = jest.fn().mockImplementation(() => {
return Promise.resolve({} as unknown as USBDevice);
});
adbController.findDevice = findDevice;
const connectToDevice =
jest.fn().mockImplementation((_: USBDevice) => Promise.resolve());
adbMock.connect = connectToDevice;
const stream: AdbStream = new MockAdbStream();
const adbShell =
jest.fn().mockImplementation((_: string) => Promise.resolve(stream));
adbMock.shell = adbShell;
const sendMessage = jest.fn();
adbController.sendMessage = sendMessage;
adbController.generateStartTracingCommand = (_) => 'CMD';
await adbController.enableTracing(enableTracingRequestProto);
expect(adbShell).toBeCalledWith('CMD');
expect(sendMessage).toHaveBeenCalledTimes(0);
stream.onData(utf8Encode('starting tracing Wrote 123 bytes'));
stream.onClose();
expect(adbController.sendErrorMessage).toHaveBeenCalledTimes(0);
expect(sendMessage).toBeCalledWith({type: 'EnableTracingResponse'});
});
test('generateStartTracing', () => {
adbController.traceDestFile = 'DEST';
const testArray = new Uint8Array(1);
testArray[0] = 65;
const generatedCmd = adbController.generateStartTracingCommand(testArray);
expect(generatedCmd)
.toBe(`echo '${btoa('A')}' | base64 -d | perfetto -c - -o DEST`);
});
test('tracingEndedSuccessfully', () => {
expect(
adbController.tracingEndedSuccessfully(
'Connected to the Perfetto traced service, starting tracing for 10000 ms\nWrote 564 bytes into /data/misc/perfetto-traces/trace'))
.toBe(true);
expect(
adbController.tracingEndedSuccessfully(
'Connected to the Perfetto traced service, starting tracing for 10000 ms'))
.toBe(false);
expect(
adbController.tracingEndedSuccessfully(
'Connected to the Perfetto traced service, starting tracing for 0 ms'))
.toBe(false);
});