/* Copyright (C) 2023 Martin.JM This file is part of Gadgetbridge. Gadgetbridge is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gadgetbridge is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei; import android.bluetooth.BluetoothGattCharacteristic; import android.content.Context; import org.junit.Assert; import org.junit.Test; import java.io.IOException; import java.util.List; import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiTLV; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Workout; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.service.btbr.Transaction; import nodomain.freeyourgadget.gadgetbridge.service.btbr.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.DebugRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.Request; public class TestDebugRequestParser { HuaweiSupportProvider supportProvider = new HuaweiSupportProvider(new HuaweiLESupport()) { @Override public boolean isBLE() { return true; } @Override public Context getContext() { return null; } @Override public GBDevice getDevice() { return null; } @Override public byte[] getSerial() { return new byte[0]; } @Override public String getDeviceMac() { return null; } @Override public byte[] getMacAddress() { return new byte[0]; } @Override public byte[] getAndroidId() { return new byte[0]; } @Override public short getNotificationId() { return 0; } @Override public TransactionBuilder createBrTransactionBuilder(String taskName) { return null; } @Override public nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder createLeTransactionBuilder(String taskName) { return null; } @Override public void performConnected(Transaction transaction) throws IOException { } @Override public void performConnected(nodomain.freeyourgadget.gadgetbridge.service.btle.Transaction transaction) throws IOException { } @Override public void evaluateGBDeviceEvent(GBDeviceEvent deviceEvent) { } @Override public BluetoothGattCharacteristic getLeCharacteristic(UUID uuid) { return null; } @Override public HuaweiPacket.ParamsProvider getParamsProvider() { return null; } @Override public void addInProgressRequest(Request request) { } @Override public void removeInProgressRequests(Request request) { } @Override public void setSecretKey(byte[] authKey) { } @Override public byte[] getSecretKey() { return new byte[0]; } @Override public void addTotalFitnessData(int steps, int calories, int distance) { } @Override public void addStepData(int timestamp, short steps, short calories, short distance, byte spo, byte heartrate) { } @Override public Long addWorkoutTotalsData(Workout.WorkoutTotals.Response packet) { return null; } @Override public void addWorkoutSampleData(Long workoutId, List dataList) { } @Override public void sendSetMusic() { } }; @Test public void emptyPacket() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false"); Assert.assertEquals(expected, packet); } @Test public void emptyPacketShortBooleans() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,f,f"); Assert.assertEquals(expected, packet); } @Test public void emptyTag() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV().put(1)); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false,(1,/)"); Assert.assertEquals(expected, packet); } @Test public void byteTag() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV().put(1, (byte) 1)); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false,(1,B1)"); Assert.assertEquals(expected, packet); } @Test public void shortTag() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV().put(1, (short) 1)); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false,(1,S1)"); Assert.assertEquals(expected, packet); } @Test public void integerTag() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV().put(1, (int) 1)); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false,(1,I1)"); Assert.assertEquals(expected, packet); } @Test public void booleanTag() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV().put(1, true)); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false,(1,b1)"); Assert.assertEquals(expected, packet); } @Test public void arrayTag() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV().put(1, new byte[] {(byte) 0xCA, (byte) 0xFE})); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false,(1,aCAFE)"); Assert.assertEquals(expected, packet); } @Test public void stringTag() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV().put(1, new byte[] {0x79, 0x65, 0x73})); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false,(1,-yes)"); Assert.assertEquals(expected, packet); } @Test public void hexValues() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV().put(1, new byte[] {0x79, 0x65, 0x73})); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("0x01,0x1,false,false,(0x01,-yes)"); Assert.assertEquals(expected, packet); } @Test public void largeServiceCommand() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = (byte) 0xff; expected.commandId = (byte) 255; expected.setEncryption(false); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("0xff,255,false,false"); Assert.assertEquals(expected, packet); } @Test public void subTlv() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV() .put(129, new HuaweiTLV() .put(1) .put(2) )); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false,(129,(1,/),(2,/))"); Assert.assertEquals(expected, packet); } @Test public void subSubSubTlv() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV() .put(129, new HuaweiTLV() .put(129, new HuaweiTLV() .put(129, new HuaweiTLV() .put(1) ) ) )); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false,(129,(129,(129,(1,/))))"); Assert.assertEquals(expected, packet); } @Test public void subTlvVCombined() throws Request.RequestCreationException { DebugRequest debugRequest = new DebugRequest(supportProvider); HuaweiPacket expected = new HuaweiPacket(supportProvider.getParamsProvider()); expected.serviceId = 1; expected.commandId = 1; expected.setEncryption(false); expected.setTlv(new HuaweiTLV() .put(129, new HuaweiTLV() .put(1) .put(2, true) ) .put(1, true) ); expected.complete = true; HuaweiPacket packet = debugRequest.parseDebugString("1,1,false,false,(129,(1,/),(2,b1)),(1,b1)"); Assert.assertEquals(expected, packet); } }