[API Coverage] BluetoothGattServerCallback

Bug: 222564727
Test: atest BluetoothGattServerCallbackTest
Change-Id: If6ac1de9df43d45339145300bcec4edc001b1b53
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/BluetoothGattServerCallbackTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/BluetoothGattServerCallbackTest.java
new file mode 100644
index 0000000..f247d5e
--- /dev/null
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/BluetoothGattServerCallbackTest.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2022 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.
+ */
+
+package android.bluetooth.cts;
+
+import static android.Manifest.permission.BLUETOOTH_CONNECT;
+
+import android.app.UiAutomation;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothGatt;
+import android.bluetooth.BluetoothGattCharacteristic;
+import android.bluetooth.BluetoothGattDescriptor;
+import android.bluetooth.BluetoothGattServerCallback;
+import android.bluetooth.BluetoothGattService;
+import android.bluetooth.BluetoothManager;
+import android.bluetooth.BluetoothProfile;
+import android.content.pm.PackageManager;
+import android.test.AndroidTestCase;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import java.util.UUID;
+
+public class BluetoothGattServerCallbackTest extends AndroidTestCase {
+    private final BluetoothGattServerCallback mCallbacks = new BluetoothGattServerCallback() {
+        @Override
+        public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
+        }
+
+        @Override
+        public void onServiceAdded(int status, BluetoothGattService service) {
+        }
+
+        @Override
+        public void onCharacteristicReadRequest(BluetoothDevice device, int requestId,
+                int offset, BluetoothGattCharacteristic characteristic) {
+        }
+
+        @Override
+        public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId,
+                BluetoothGattCharacteristic characteristic,
+                boolean preparedWrite, boolean responseNeeded,
+                int offset, byte[] value) {
+        }
+
+        @Override
+        public void onDescriptorReadRequest(BluetoothDevice device, int requestId,
+                int offset, BluetoothGattDescriptor descriptor) {
+        }
+
+        @Override
+        public void onDescriptorWriteRequest(BluetoothDevice device, int requestId,
+                BluetoothGattDescriptor descriptor,
+                boolean preparedWrite, boolean responseNeeded,
+                int offset, byte[] value) {
+        }
+
+        @Override
+        public void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) {
+        }
+
+        @Override
+        public void onNotificationSent(BluetoothDevice device, int status) {
+        }
+
+        @Override
+        public void onMtuChanged(BluetoothDevice device, int mtu) {
+        }
+
+        @Override
+        public void onPhyUpdate(BluetoothDevice device, int txPhy, int rxPhy, int status) {
+        }
+
+        @Override
+        public void onPhyRead(BluetoothDevice device, int txPhy, int rxPhy, int status) {
+        }
+
+    };
+    private final UUID TEST_UUID = UUID.fromString("0000110a-0000-1000-8000-00805f9b34fb");
+    private final byte[] mBytes = new byte[]{};
+    private boolean mHasBluetooth;
+    private BluetoothDevice mBluetoothDevice;
+    private BluetoothAdapter mAdapter;
+    private UiAutomation mUiAutomation;
+    private BluetoothGattService mBluetoothGattService;
+    private BluetoothGattDescriptor mBluetoothGattDescriptor;
+    private BluetoothGattCharacteristic mBluetoothGattCharacteristic;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mHasBluetooth = getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_BLUETOOTH);
+        BluetoothManager manager = getContext().getSystemService(BluetoothManager.class);
+        if (!mHasBluetooth) return;
+        mUiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        mUiAutomation.adoptShellPermissionIdentity(BLUETOOTH_CONNECT);
+        mAdapter = manager.getAdapter();
+        assertTrue(BTAdapterUtils.enableAdapter(mAdapter, mContext));
+        mBluetoothDevice = mAdapter.getRemoteDevice("00:11:22:AA:BB:CC");
+        mBluetoothGattService = new BluetoothGattService(TEST_UUID,
+                BluetoothGattService.SERVICE_TYPE_PRIMARY);
+        mBluetoothGattCharacteristic = new BluetoothGattCharacteristic(TEST_UUID, 0x0A, 0x11);
+        mBluetoothGattDescriptor = new BluetoothGattDescriptor(TEST_UUID, 0x11);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        super.tearDown();
+        if (mHasBluetooth) {
+            mUiAutomation.adoptShellPermissionIdentity(BLUETOOTH_CONNECT);
+            assertTrue(BTAdapterUtils.disableAdapter(mAdapter, mContext));
+            mAdapter = null;
+            mBluetoothDevice = null;
+            mBluetoothGattService = null;
+            mBluetoothGattCharacteristic = null;
+            mBluetoothGattDescriptor = null;
+            mUiAutomation.dropShellPermissionIdentity();
+        }
+    }
+
+    public void test_allMethods() {
+        mCallbacks.onConnectionStateChange(mBluetoothDevice, BluetoothProfile.STATE_CONNECTED,
+                BluetoothProfile.STATE_CONNECTED);
+        mCallbacks.onServiceAdded(BluetoothGatt.GATT_SUCCESS, mBluetoothGattService);
+        mCallbacks.onCharacteristicReadRequest(mBluetoothDevice, 0, 0,
+                mBluetoothGattCharacteristic);
+        mCallbacks.onCharacteristicWriteRequest(mBluetoothDevice, 0,
+                mBluetoothGattCharacteristic,
+                true, true, 0, mBytes);
+        mCallbacks.onDescriptorReadRequest(mBluetoothDevice, 0, 0,
+                mBluetoothGattDescriptor);
+        mCallbacks.onDescriptorWriteRequest(mBluetoothDevice, 0,
+                mBluetoothGattDescriptor, true,
+                true, 0, mBytes);
+        mCallbacks.onExecuteWrite(mBluetoothDevice, 0, true);
+        mCallbacks.onNotificationSent(mBluetoothDevice, BluetoothGatt.GATT_SUCCESS);
+        mCallbacks.onMtuChanged(mBluetoothDevice, 0);
+        mCallbacks.onPhyUpdate(mBluetoothDevice, BluetoothDevice.PHY_LE_2M,
+                BluetoothDevice.PHY_LE_2M, BluetoothGatt.GATT_SUCCESS);
+        mCallbacks.onPhyRead(mBluetoothDevice, BluetoothDevice.PHY_LE_2M,
+                BluetoothDevice.PHY_LE_2M,
+                BluetoothGatt.GATT_SUCCESS);
+    }
+}