Revert "lowpan: Introduce new unit tests for data classes"

This reverts commit 93ea3ce9b8bd53f97df2171b3e3fbc70fa1b096d.

Reason for revert: Build failure in build 4190632 on branch `git_wear-master`.
Not all branches based on master include platform/frameworks/opt/net/lowpan.

Change-Id: I70fe6be8d71424e11a537daaa69c3f6cfae8e49d
diff --git a/lowpan/tests/Android.mk b/lowpan/tests/Android.mk
index 1ea471a..bb0a944 100644
--- a/lowpan/tests/Android.mk
+++ b/lowpan/tests/Android.mk
@@ -54,35 +54,8 @@
 	mockito-target-minus-junit4 \
 	frameworks-base-testutils \
 
-LOCAL_JNI_SHARED_LIBRARIES += libframeworkslowpantestsjni
-LOCAL_JNI_SHARED_LIBRARIES += libandroid_net_lowpan
-LOCAL_JNI_SHARED_LIBRARIES += \
-    libbacktrace \
-    libbase \
-    libbinder \
-    libc++ \
-    libcutils \
-    liblog \
-    liblzma \
-    libnativehelper \
-    libnetdaidl \
-    libui \
-    libunwind \
-    libutils \
-    libvndksupport \
-    libcrypto \
-    libhidl-gen-utils \
-    libhidlbase \
-    libhidltransport \
-    libpackagelistparser \
-    libpcre2 \
-    libselinux \
-    libtinyxml2 \
-    libvintf \
-    libhwbinder \
-    android.hidl.token@1.0
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_JAVA_LIBRARIES := \
+	android.test.runner \
 
 LOCAL_PACKAGE_NAME := FrameworksLowpanApiTests
 LOCAL_COMPATIBILITY_SUITE := device-tests
@@ -90,25 +63,3 @@
 LOCAL_CERTIFICATE := platform
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 include $(BUILD_PACKAGE)
-
-#########################################################################
-# Build JNI Shared Library
-#########################################################################
-
-LOCAL_PATH:= $(LOCAL_PATH)/jni
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_CFLAGS := -Wall -Wextra -Werror
-
-LOCAL_SRC_FILES := $(call all-cpp-files-under)
-
-LOCAL_SHARED_LIBRARIES += libandroid_net_lowpan
-LOCAL_SHARED_LIBRARIES += libbinder
-LOCAL_SHARED_LIBRARIES += liblog
-
-LOCAL_MODULE := libframeworkslowpantestsjni
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/lowpan/tests/java/android/net/lowpan/LowpanBeaconInfoTest.java b/lowpan/tests/java/android/net/lowpan/LowpanBeaconInfoTest.java
deleted file mode 100644
index 6dbb3ed..0000000
--- a/lowpan/tests/java/android/net/lowpan/LowpanBeaconInfoTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2017 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.net.lowpan;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertArrayEquals;
-
-import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class LowpanBeaconInfoTest {
-
-    static {
-        System.loadLibrary("frameworkslowpantestsjni");
-    }
-
-    private static native byte[] readAndWriteNative(byte[] inParcel);
-
-    public void testNativeParcelUnparcel(LowpanBeaconInfo original) {
-        byte[] inParcel = marshall(original);
-        byte[] outParcel = readAndWriteNative(inParcel);
-        LowpanBeaconInfo roundTrip = unmarshall(outParcel);
-
-        assertEquals(original, roundTrip);
-        assertArrayEquals(inParcel, outParcel);
-    }
-
-    @Test
-    public void testNativeParcelUnparcel() {
-        testNativeParcelUnparcel(
-                new LowpanBeaconInfo.Builder()
-                        .setName("TestNet1")
-                        .setPanid(0x1234)
-                        .setXpanid(
-                                new byte[] {
-                                    (byte) 0x00,
-                                    (byte) 0x11,
-                                    (byte) 0x22,
-                                    (byte) 0x33,
-                                    (byte) 0x44,
-                                    (byte) 0x55,
-                                    (byte) 0x66,
-                                    (byte) 0x77
-                                })
-                        .setType(LowpanInterface.NETWORK_TYPE_THREAD_V1)
-                        .setChannel(15)
-                        .setBeaconAddress(
-                                new byte[] {
-                                    (byte) 0x88,
-                                    (byte) 0x99,
-                                    (byte) 0xaa,
-                                    (byte) 0xbb,
-                                    (byte) 0xcc,
-                                    (byte) 0xdd,
-                                    (byte) 0xee,
-                                    (byte) 0xff
-                                })
-                        .build());
-
-        testNativeParcelUnparcel(
-                new LowpanBeaconInfo.Builder()
-                        .setName("TestNet2")
-                        .setPanid(0x5678)
-                        .setXpanid(
-                                new byte[] {
-                                    (byte) 0x88,
-                                    (byte) 0x99,
-                                    (byte) 0xaa,
-                                    (byte) 0xbb,
-                                    (byte) 0xcc,
-                                    (byte) 0xdd,
-                                    (byte) 0xee,
-                                    (byte) 0xff
-                                })
-                        .setType("bork-bork-bork")
-                        .setChannel(16)
-                        .setBeaconAddress(
-                                new byte[] {
-                                    (byte) 0x00,
-                                    (byte) 0x11,
-                                    (byte) 0x22,
-                                    (byte) 0x33,
-                                    (byte) 0x44,
-                                    (byte) 0x55,
-                                    (byte) 0x66,
-                                    (byte) 0x77
-                                })
-                        .setFlag(LowpanBeaconInfo.FLAG_CAN_ASSIST)
-                        .build());
-    }
-
-    /**
-     * Write a {@link LowpanBeaconInfo} into an empty parcel and return the underlying data.
-     *
-     * @see unmarshall(byte[])
-     */
-    private static byte[] marshall(LowpanBeaconInfo addr) {
-        Parcel p = Parcel.obtain();
-        addr.writeToParcel(p, /* flags */ 0);
-        p.setDataPosition(0);
-        return p.marshall();
-    }
-
-    /**
-     * Read raw bytes into a parcel, and read a {@link LowpanBeaconInfo} back out of them.
-     *
-     * @see marshall(LowpanBeaconInfo)
-     */
-    private static LowpanBeaconInfo unmarshall(byte[] data) {
-        Parcel p = Parcel.obtain();
-        p.unmarshall(data, 0, data.length);
-        p.setDataPosition(0);
-        return LowpanBeaconInfo.CREATOR.createFromParcel(p);
-    }
-}
diff --git a/lowpan/tests/java/android/net/lowpan/LowpanChannelInfoTest.java b/lowpan/tests/java/android/net/lowpan/LowpanChannelInfoTest.java
deleted file mode 100644
index eac4398..0000000
--- a/lowpan/tests/java/android/net/lowpan/LowpanChannelInfoTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2017 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.net.lowpan;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertArrayEquals;
-
-import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class LowpanChannelInfoTest {
-
-    static {
-        System.loadLibrary("frameworkslowpantestsjni");
-    }
-
-    private static native byte[] readAndWriteNative(byte[] inParcel);
-
-    public void testNativeParcelUnparcel(LowpanChannelInfo original) {
-        byte[] inParcel = marshall(original);
-        byte[] outParcel = readAndWriteNative(inParcel);
-        LowpanChannelInfo roundTrip = unmarshall(outParcel);
-
-        assertEquals(original, roundTrip);
-        assertArrayEquals(inParcel, outParcel);
-    }
-
-    @Test
-    public void testNativeParcelUnparcel() {
-        int i;
-        for (i = 1; i < 26; i++) {
-            testNativeParcelUnparcel(LowpanChannelInfo.getChannelInfoForIeee802154Page0(i));
-        }
-    }
-
-    /**
-     * Write a {@link LowpanChannelInfo} into an empty parcel and return the underlying data.
-     *
-     * @see unmarshall(byte[])
-     */
-    private static byte[] marshall(LowpanChannelInfo addr) {
-        Parcel p = Parcel.obtain();
-        addr.writeToParcel(p, /* flags */ 0);
-        p.setDataPosition(0);
-        return p.marshall();
-    }
-
-    /**
-     * Read raw bytes into a parcel, and read a {@link LowpanChannelInfo} back out of them.
-     *
-     * @see marshall(LowpanChannelInfo)
-     */
-    private static LowpanChannelInfo unmarshall(byte[] data) {
-        Parcel p = Parcel.obtain();
-        p.unmarshall(data, 0, data.length);
-        p.setDataPosition(0);
-        return LowpanChannelInfo.CREATOR.createFromParcel(p);
-    }
-}
diff --git a/lowpan/tests/java/android/net/lowpan/LowpanCredentialTest.java b/lowpan/tests/java/android/net/lowpan/LowpanCredentialTest.java
deleted file mode 100644
index 26e3334..0000000
--- a/lowpan/tests/java/android/net/lowpan/LowpanCredentialTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2017 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.net.lowpan;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertArrayEquals;
-
-import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class LowpanCredentialTest {
-
-    static {
-        System.loadLibrary("frameworkslowpantestsjni");
-    }
-
-    private static native byte[] readAndWriteNative(byte[] inParcel);
-
-    public void testNativeParcelUnparcel(LowpanCredential original) {
-        byte[] inParcel = marshall(original);
-        byte[] outParcel = readAndWriteNative(inParcel);
-        LowpanCredential roundTrip = unmarshall(outParcel);
-
-        assertEquals(original, roundTrip);
-        assertArrayEquals(inParcel, outParcel);
-    }
-
-    @Test
-    public void testNativeParcelUnparcel() {
-        testNativeParcelUnparcel(
-                LowpanCredential.createMasterKey(
-                        new byte[] {
-                            (byte) 0x88,
-                            (byte) 0x99,
-                            (byte) 0xaa,
-                            (byte) 0xbb,
-                            (byte) 0xcc,
-                            (byte) 0xdd,
-                            (byte) 0xee,
-                            (byte) 0xff
-                        }));
-        testNativeParcelUnparcel(
-                LowpanCredential.createMasterKey(
-                        new byte[] {
-                            (byte) 0x88, (byte) 0x99, (byte) 0xaa, (byte) 0xbb, (byte) 0xcc
-                        },
-                        15));
-    }
-
-    /**
-     * Write a {@link LowpanCredential} into an empty parcel and return the underlying data.
-     *
-     * @see unmarshall(byte[])
-     */
-    private static byte[] marshall(LowpanCredential addr) {
-        Parcel p = Parcel.obtain();
-        addr.writeToParcel(p, /* flags */ 0);
-        p.setDataPosition(0);
-        return p.marshall();
-    }
-
-    /**
-     * Read raw bytes into a parcel, and read a {@link LowpanCredential} back out of them.
-     *
-     * @see marshall(LowpanCredential)
-     */
-    private static LowpanCredential unmarshall(byte[] data) {
-        Parcel p = Parcel.obtain();
-        p.unmarshall(data, 0, data.length);
-        p.setDataPosition(0);
-        return LowpanCredential.CREATOR.createFromParcel(p);
-    }
-}
diff --git a/lowpan/tests/java/android/net/lowpan/LowpanIdentityTest.java b/lowpan/tests/java/android/net/lowpan/LowpanIdentityTest.java
deleted file mode 100644
index 1242e55..0000000
--- a/lowpan/tests/java/android/net/lowpan/LowpanIdentityTest.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2017 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.net.lowpan;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class LowpanIdentityTest {
-
-    static {
-        System.loadLibrary("frameworkslowpantestsjni");
-    }
-
-    private static native byte[] readAndWriteNative(byte[] inParcel);
-
-    public void testNativeParcelUnparcel(LowpanIdentity original) {
-        byte[] inParcel = marshall(original);
-        byte[] outParcel = readAndWriteNative(inParcel);
-        LowpanIdentity roundTrip = unmarshall(outParcel);
-
-        assertEquals(original, roundTrip);
-        assertEquals(original.hashCode(), roundTrip.hashCode());
-        assertEquals(original.getName(), roundTrip.getName());
-        assertArrayEquals(inParcel, outParcel);
-    }
-
-    @Test
-    public void testNativeParcelUnparcel1() {
-        testNativeParcelUnparcel(
-                new LowpanIdentity.Builder()
-                        .setName("TestNet1")
-                        .setPanid(0x1234)
-                        .setXpanid(
-                                new byte[] {
-                                    (byte) 0x00,
-                                    (byte) 0x11,
-                                    (byte) 0x22,
-                                    (byte) 0x33,
-                                    (byte) 0x44,
-                                    (byte) 0x55,
-                                    (byte) 0x66,
-                                    (byte) 0x77
-                                })
-                        .setType(LowpanInterface.NETWORK_TYPE_THREAD_V1)
-                        .setChannel(15)
-                        .build());
-    }
-
-    @Test
-    public void testNativeParcelUnparcel2() {
-        testNativeParcelUnparcel(
-                new LowpanIdentity.Builder()
-                        .setName("TestNet2")
-                        .setPanid(0x5678)
-                        .setXpanid(
-                                new byte[] {
-                                    (byte) 0x88,
-                                    (byte) 0x99,
-                                    (byte) 0xaa,
-                                    (byte) 0xbb,
-                                    (byte) 0xcc,
-                                    (byte) 0xdd,
-                                    (byte) 0xee,
-                                    (byte) 0xff
-                                })
-                        .setType("bork-bork-bork")
-                        .setChannel(16)
-                        .build());
-    }
-
-    @Test
-    public void testNativeParcelUnparcel3() {
-        testNativeParcelUnparcel(new LowpanIdentity.Builder().setName("TestNet3").build());
-    }
-
-    @Test
-    public void testNativeParcelUnparcel4() {
-        testNativeParcelUnparcel(new LowpanIdentity.Builder().build());
-    }
-
-    @Test
-    public void testNativeParcelUnparcel5() {
-        testNativeParcelUnparcel(
-                new LowpanIdentity.Builder()
-                        .setRawName(
-                                new byte[] {
-                                    (byte) 0x66,
-                                    (byte) 0x6F,
-                                    (byte) 0x6F,
-                                    (byte) 0xC2,
-                                    (byte) 0xAD,
-                                    (byte) 0xCD,
-                                    (byte) 0x8F,
-                                    (byte) 0xE1,
-                                    (byte) 0xA0,
-                                    (byte) 0x86,
-                                    (byte) 0xE1,
-                                    (byte) 0xA0,
-                                    (byte) 0x8B
-                                })
-                        .build());
-    }
-
-    @Test
-    public void testStringPrep1() {
-        LowpanIdentity identity =
-                new LowpanIdentity.Builder()
-                        .setRawName(
-                                new byte[] {
-                                    (byte) 0x66,
-                                    (byte) 0x6F,
-                                    (byte) 0x6F,
-                                    (byte) 0x20,
-                                    (byte) 0xC2,
-                                    (byte) 0xAD,
-                                    (byte) 0xCD,
-                                    (byte) 0x8F,
-                                    (byte) 0xE1,
-                                    (byte) 0xA0,
-                                    (byte) 0x86,
-                                    (byte) 0xE1,
-                                    (byte) 0xA0,
-                                    (byte) 0x8B
-                                })
-                        .build();
-
-        assertFalse(identity.isNameValid());
-    }
-
-    @Test
-    public void testStringPrep2() {
-        LowpanIdentity identity =
-                new LowpanIdentity.Builder()
-                        .setRawName(
-                                new byte[] {
-                                    (byte) 0x66, (byte) 0x6F, (byte) 0x6F, (byte) 0x20, (byte) 0x6F
-                                })
-                        .build();
-
-        assertEquals("foo o", identity.getName());
-        assertTrue(identity.isNameValid());
-    }
-
-    @Test
-    public void testStringPrep3() {
-        LowpanIdentity identity = new LowpanIdentity.Builder().setName("foo o").build();
-
-        assertTrue(identity.isNameValid());
-        assertEquals("foo o", identity.getName());
-    }
-
-    /**
-     * Write a {@link LowpanIdentity} into an empty parcel and return the underlying data.
-     *
-     * @see unmarshall(byte[])
-     */
-    private static byte[] marshall(LowpanIdentity addr) {
-        Parcel p = Parcel.obtain();
-        addr.writeToParcel(p, /* flags */ 0);
-        p.setDataPosition(0);
-        return p.marshall();
-    }
-
-    /**
-     * Read raw bytes into a parcel, and read a {@link LowpanIdentity} back out of them.
-     *
-     * @see marshall(LowpanIdentity)
-     */
-    private static LowpanIdentity unmarshall(byte[] data) {
-        Parcel p = Parcel.obtain();
-        p.unmarshall(data, 0, data.length);
-        p.setDataPosition(0);
-        return LowpanIdentity.CREATOR.createFromParcel(p);
-    }
-}
diff --git a/lowpan/tests/java/android/net/lowpan/LowpanInterfaceTest.java b/lowpan/tests/java/android/net/lowpan/LowpanInterfaceTest.java
deleted file mode 100644
index f26a37e..0000000
--- a/lowpan/tests/java/android/net/lowpan/LowpanInterfaceTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2017 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.net.lowpan;
-
-import static org.mockito.Mockito.*;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.net.LinkAddress;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.test.TestLooper;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
-import java.util.Map;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-/** Unit tests for android.net.lowpan.LowpanInterface. */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class LowpanInterfaceTest {
-    private static final String TEST_PACKAGE_NAME = "TestPackage";
-
-    @Mock Context mContext;
-    @Mock ILowpanInterface mLowpanInterfaceService;
-    @Mock IBinder mLowpanInterfaceBinder;
-    @Mock ApplicationInfo mApplicationInfo;
-    @Mock IBinder mAppBinder;
-    @Mock LowpanInterface.Callback mLowpanInterfaceCallback;
-
-    private Handler mHandler;
-    private final TestLooper mTestLooper = new TestLooper();
-    private ILowpanInterfaceListener mInterfaceListener;
-    private LowpanInterface mLowpanInterface;
-    private Map<String, Object> mPropertyMap;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
-        when(mContext.getOpPackageName()).thenReturn(TEST_PACKAGE_NAME);
-        when(mLowpanInterfaceService.getName()).thenReturn("wpan0");
-        when(mLowpanInterfaceService.asBinder()).thenReturn(mLowpanInterfaceBinder);
-
-        mLowpanInterface =
-                new LowpanInterface(mContext, mLowpanInterfaceService, mTestLooper.getLooper());
-    }
-
-    @Test
-    public void testStateChangedCallback() throws Exception {
-        // Register our callback
-        mLowpanInterface.registerCallback(mLowpanInterfaceCallback);
-
-        // Verify a listener was added
-        verify(mLowpanInterfaceService)
-                .addListener(
-                        argThat(
-                                listener -> {
-                                    mInterfaceListener = listener;
-                                    return listener instanceof ILowpanInterfaceListener;
-                                }));
-
-        // Change some properties
-        mInterfaceListener.onStateChanged(LowpanInterface.STATE_OFFLINE);
-        mTestLooper.dispatchAll();
-
-        // Verify that the property was changed
-        verify(mLowpanInterfaceCallback)
-                .onStateChanged(
-                        argThat(stateString -> stateString.equals(LowpanInterface.STATE_OFFLINE)));
-    }
-
-    @Test
-    public void testLinkAddressCallback() throws Exception {
-        // Register our callback
-        mLowpanInterface.registerCallback(mLowpanInterfaceCallback);
-
-        // Verify a listener was added
-        verify(mLowpanInterfaceService)
-                .addListener(
-                        argThat(
-                                listener -> {
-                                    mInterfaceListener = listener;
-                                    return listener instanceof ILowpanInterfaceListener;
-                                }));
-
-        final LinkAddress linkAddress = new LinkAddress("fe80::1/64");
-
-        // Change some properties
-        mInterfaceListener.onLinkAddressAdded(linkAddress.toString());
-        mTestLooper.dispatchAll();
-
-        // Verify that the property was changed
-        verify(mLowpanInterfaceCallback)
-                .onLinkAddressAdded(argThat(addr -> addr.equals(linkAddress)));
-
-        // Change some properties
-        mInterfaceListener.onLinkAddressRemoved(linkAddress.toString());
-        mTestLooper.dispatchAll();
-
-        // Verify that the property was changed
-        verify(mLowpanInterfaceCallback)
-                .onLinkAddressRemoved(argThat(addr -> addr.equals(linkAddress)));
-    }
-
-    @Test
-    public void testBogusLinkAddressCallback() throws Exception {
-        // Register our callback
-        mLowpanInterface.registerCallback(mLowpanInterfaceCallback);
-
-        // Verify a listener was added
-        verify(mLowpanInterfaceService)
-                .addListener(
-                        argThat(
-                                listener -> {
-                                    mInterfaceListener = listener;
-                                    return listener instanceof ILowpanInterfaceListener;
-                                }));
-
-        // Change some properties
-        mInterfaceListener.onLinkAddressAdded("fe80:::1/640");
-        mTestLooper.dispatchAll();
-
-        // Verify that no callback was called.
-        verifyNoMoreInteractions(mLowpanInterfaceCallback);
-
-        // Change some properties
-        mInterfaceListener.onLinkAddressRemoved("fe80:::1/640");
-        mTestLooper.dispatchAll();
-
-        // Verify that no callback was called.
-        verifyNoMoreInteractions(mLowpanInterfaceCallback);
-    }
-}
diff --git a/lowpan/tests/java/android/net/lowpan/LowpanProvisionTest.java b/lowpan/tests/java/android/net/lowpan/LowpanProvisionTest.java
deleted file mode 100644
index 3be2f26..0000000
--- a/lowpan/tests/java/android/net/lowpan/LowpanProvisionTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2017 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.net.lowpan;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertArrayEquals;
-
-import android.os.Parcel;
-import android.support.test.runner.AndroidJUnit4;
-import android.test.suitebuilder.annotation.SmallTest;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class LowpanProvisionTest {
-
-    static {
-        System.loadLibrary("frameworkslowpantestsjni");
-    }
-
-    private static native byte[] readAndWriteNative(byte[] inParcel);
-
-    public void testNativeParcelUnparcel(LowpanProvision original) {
-        byte[] inParcel = marshall(original);
-        byte[] outParcel = readAndWriteNative(inParcel);
-        LowpanProvision roundTrip = unmarshall(outParcel);
-
-        assertEquals(original, roundTrip);
-        assertArrayEquals(inParcel, outParcel);
-    }
-
-    @Test
-    public void testNativeParcelUnparcel() {
-        testNativeParcelUnparcel(
-                new LowpanProvision.Builder()
-                        .setLowpanIdentity(
-                                new LowpanIdentity.Builder()
-                                        .setName("TestNet1")
-                                        .setPanid(0x1234)
-                                        .setXpanid(
-                                                new byte[] {
-                                                    (byte) 0x00,
-                                                    (byte) 0x11,
-                                                    (byte) 0x22,
-                                                    (byte) 0x33,
-                                                    (byte) 0x44,
-                                                    (byte) 0x55,
-                                                    (byte) 0x66,
-                                                    (byte) 0x77
-                                                })
-                                        .setType(LowpanInterface.NETWORK_TYPE_THREAD_V1)
-                                        .setChannel(15)
-                                        .build())
-                        .build());
-        testNativeParcelUnparcel(
-                new LowpanProvision.Builder()
-                        .setLowpanIdentity(
-                                new LowpanIdentity.Builder()
-                                        .setName("TestNet2")
-                                        .setPanid(0x5678)
-                                        .setXpanid(
-                                                new byte[] {
-                                                    (byte) 0x88,
-                                                    (byte) 0x99,
-                                                    (byte) 0xaa,
-                                                    (byte) 0xbb,
-                                                    (byte) 0xcc,
-                                                    (byte) 0xdd,
-                                                    (byte) 0xee,
-                                                    (byte) 0xff
-                                                })
-                                        .setType("bork-bork-bork")
-                                        .setChannel(16)
-                                        .build())
-                        .setLowpanCredential(
-                                LowpanCredential.createMasterKey(
-                                        new byte[] {
-                                            (byte) 0x88,
-                                            (byte) 0x99,
-                                            (byte) 0xaa,
-                                            (byte) 0xbb,
-                                            (byte) 0xcc,
-                                            (byte) 0xdd,
-                                            (byte) 0xee,
-                                            (byte) 0xff
-                                        }))
-                        .build());
-    }
-
-    /**
-     * Write a {@link LowpanProvision} into an empty parcel and return the underlying data.
-     *
-     * @see unmarshall(byte[])
-     */
-    private static byte[] marshall(LowpanProvision addr) {
-        Parcel p = Parcel.obtain();
-        addr.writeToParcel(p, /* flags */ 0);
-        p.setDataPosition(0);
-        return p.marshall();
-    }
-
-    /**
-     * Read raw bytes into a parcel, and read a {@link LowpanProvision} back out of them.
-     *
-     * @see marshall(LowpanProvision)
-     */
-    private static LowpanProvision unmarshall(byte[] data) {
-        Parcel p = Parcel.obtain();
-        p.unmarshall(data, 0, data.length);
-        p.setDataPosition(0);
-        return LowpanProvision.CREATOR.createFromParcel(p);
-    }
-}
diff --git a/lowpan/tests/jni/LowpanBeaconInfoTest.cpp b/lowpan/tests/jni/LowpanBeaconInfoTest.cpp
deleted file mode 100644
index efc5f18..0000000
--- a/lowpan/tests/jni/LowpanBeaconInfoTest.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#include <memory>
-
-#include <binder/Parcel.h>
-
-#include "LowpanBeaconInfoTest.h"
-
-using android::net::lowpan::LowpanBeaconInfo;
-
-/**
- * Reads exactly one LowpanBeaconInfo from 'parcelData' assuming that it is a Parcel. Any bytes afterward
- * are ignored.
- */
-static LowpanBeaconInfo unmarshall(JNIEnv* env, jbyteArray parcelData) {
-    const int length = env->GetArrayLength(parcelData);
-
-    std::unique_ptr<uint8_t> bytes(new uint8_t[length]);
-    env->GetByteArrayRegion(parcelData, 0, length, reinterpret_cast<jbyte*>(bytes.get()));
-
-    android::Parcel p;
-    p.setData(bytes.get(), length);
-
-    LowpanBeaconInfo value;
-    value.readFromParcel(&p);
-    return value;
-}
-
-/**
- * Creates a Java byte[] array and writes the contents of 'addr' to it as a Parcel containing
- * exactly one object.
- *
- * Every LowpanBeaconInfo maps to a unique parcel object, so both 'marshall(e, unmarshall(e, x))' and
- * 'unmarshall(e, marshall(e, x))' should be fixed points.
- */
-static jbyteArray marshall(JNIEnv* env, const LowpanBeaconInfo& addr) {
-    android::Parcel p;
-    addr.writeToParcel(&p);
-    const int length = p.dataSize();
-
-    jbyteArray parcelData = env->NewByteArray(length);
-    env->SetByteArrayRegion(parcelData, 0, length, reinterpret_cast<const jbyte*>(p.data()));
-
-    return parcelData;
-}
-
-extern "C"
-JNIEXPORT jbyteArray Java_android_net_lowpan_LowpanBeaconInfoTest_readAndWriteNative(JNIEnv* env, jclass,
-        jbyteArray inParcel) {
-    const LowpanBeaconInfo value = unmarshall(env, inParcel);
-    return marshall(env, value);
-}
diff --git a/lowpan/tests/jni/LowpanBeaconInfoTest.h b/lowpan/tests/jni/LowpanBeaconInfoTest.h
deleted file mode 100644
index 1ba8eaf..0000000
--- a/lowpan/tests/jni/LowpanBeaconInfoTest.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_NET_LOWPANBEACONINFOTEST_H_
-#define _ANDROID_NET_LOWPANBEACONINFOTEST_H_
-
-#include <jni.h>
-#include <android/net/lowpan/LowpanBeaconInfo.h>
-
-extern "C"
-JNIEXPORT jbyteArray Java_android_net_lowpan_LowpanBeaconInfoTest_readAndWriteNative(JNIEnv* env, jclass,
-        jbyteArray inParcel);
-
-#endif  //  _ANDROID_NET_LOWPANBEACONINFOTEST_H_
diff --git a/lowpan/tests/jni/LowpanChannelInfoTest.cpp b/lowpan/tests/jni/LowpanChannelInfoTest.cpp
deleted file mode 100644
index 03bb72a..0000000
--- a/lowpan/tests/jni/LowpanChannelInfoTest.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#include <memory>
-
-#include <binder/Parcel.h>
-
-#include "LowpanChannelInfoTest.h"
-
-using android::net::lowpan::LowpanChannelInfo;
-
-/**
- * Reads exactly one LowpanChannelInfo from 'parcelData' assuming that it is a Parcel. Any bytes afterward
- * are ignored.
- */
-static LowpanChannelInfo unmarshall(JNIEnv* env, jbyteArray parcelData) {
-    const int length = env->GetArrayLength(parcelData);
-
-    std::unique_ptr<uint8_t> bytes(new uint8_t[length]);
-    env->GetByteArrayRegion(parcelData, 0, length, reinterpret_cast<jbyte*>(bytes.get()));
-
-    android::Parcel p;
-    p.setData(bytes.get(), length);
-
-    LowpanChannelInfo value;
-    value.readFromParcel(&p);
-    return value;
-}
-
-/**
- * Creates a Java byte[] array and writes the contents of 'addr' to it as a Parcel containing
- * exactly one object.
- *
- * Every LowpanChannelInfo maps to a unique parcel object, so both 'marshall(e, unmarshall(e, x))' and
- * 'unmarshall(e, marshall(e, x))' should be fixed points.
- */
-static jbyteArray marshall(JNIEnv* env, const LowpanChannelInfo& addr) {
-    android::Parcel p;
-    addr.writeToParcel(&p);
-    const int length = p.dataSize();
-
-    jbyteArray parcelData = env->NewByteArray(length);
-    env->SetByteArrayRegion(parcelData, 0, length, reinterpret_cast<const jbyte*>(p.data()));
-
-    return parcelData;
-}
-
-extern "C"
-JNIEXPORT jbyteArray Java_android_net_lowpan_LowpanChannelInfoTest_readAndWriteNative(JNIEnv* env, jclass,
-        jbyteArray inParcel) {
-    const LowpanChannelInfo value = unmarshall(env, inParcel);
-    return marshall(env, value);
-}
diff --git a/lowpan/tests/jni/LowpanChannelInfoTest.h b/lowpan/tests/jni/LowpanChannelInfoTest.h
deleted file mode 100644
index 3b29a90..0000000
--- a/lowpan/tests/jni/LowpanChannelInfoTest.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_NET_LOWPANCHANNELINFOTEST_H_
-#define _ANDROID_NET_LOWPANCHANNELINFOTEST_H_
-
-#include <jni.h>
-#include <android/net/lowpan/LowpanChannelInfo.h>
-
-extern "C"
-JNIEXPORT jbyteArray Java_android_net_lowpan_LowpanChannelInfoTest_readAndWriteNative(JNIEnv* env, jclass,
-        jbyteArray inParcel);
-
-#endif  //  _ANDROID_NET_LOWPANCHANNELINFOTEST_H_
diff --git a/lowpan/tests/jni/LowpanCredentialTest.cpp b/lowpan/tests/jni/LowpanCredentialTest.cpp
deleted file mode 100644
index fc860b2..0000000
--- a/lowpan/tests/jni/LowpanCredentialTest.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#include <memory>
-
-#include <binder/Parcel.h>
-
-#include "LowpanCredentialTest.h"
-
-using android::net::lowpan::LowpanCredential;
-
-/**
- * Reads exactly one LowpanCredential from 'parcelData' assuming that it is a Parcel. Any bytes afterward
- * are ignored.
- */
-static LowpanCredential unmarshall(JNIEnv* env, jbyteArray parcelData) {
-    const int length = env->GetArrayLength(parcelData);
-
-    std::unique_ptr<uint8_t> bytes(new uint8_t[length]);
-    env->GetByteArrayRegion(parcelData, 0, length, reinterpret_cast<jbyte*>(bytes.get()));
-
-    android::Parcel p;
-    p.setData(bytes.get(), length);
-
-    LowpanCredential value;
-    value.readFromParcel(&p);
-    return value;
-}
-
-/**
- * Creates a Java byte[] array and writes the contents of 'addr' to it as a Parcel containing
- * exactly one object.
- *
- * Every LowpanCredential maps to a unique parcel object, so both 'marshall(e, unmarshall(e, x))' and
- * 'unmarshall(e, marshall(e, x))' should be fixed points.
- */
-static jbyteArray marshall(JNIEnv* env, const LowpanCredential& addr) {
-    android::Parcel p;
-    addr.writeToParcel(&p);
-    const int length = p.dataSize();
-
-    jbyteArray parcelData = env->NewByteArray(length);
-    env->SetByteArrayRegion(parcelData, 0, length, reinterpret_cast<const jbyte*>(p.data()));
-
-    return parcelData;
-}
-
-extern "C"
-JNIEXPORT jbyteArray Java_android_net_lowpan_LowpanCredentialTest_readAndWriteNative(JNIEnv* env, jclass,
-        jbyteArray inParcel) {
-    const LowpanCredential value = unmarshall(env, inParcel);
-    return marshall(env, value);
-}
diff --git a/lowpan/tests/jni/LowpanCredentialTest.h b/lowpan/tests/jni/LowpanCredentialTest.h
deleted file mode 100644
index 9dd9889..0000000
--- a/lowpan/tests/jni/LowpanCredentialTest.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_NET_LOWPANCREDENTIALTEST_H_
-#define _ANDROID_NET_LOWPANCREDENTIALTEST_H_
-
-#include <jni.h>
-#include <android/net/lowpan/LowpanCredential.h>
-
-extern "C"
-JNIEXPORT jbyteArray Java_android_net_lowpan_LowpanCredentialTest_readAndWriteNative(JNIEnv* env, jclass,
-        jbyteArray inParcel);
-
-#endif  //  _ANDROID_NET_LOWPANCREDENTIALTEST_H_
diff --git a/lowpan/tests/jni/LowpanIdentityTest.cpp b/lowpan/tests/jni/LowpanIdentityTest.cpp
deleted file mode 100644
index 1a9ad33..0000000
--- a/lowpan/tests/jni/LowpanIdentityTest.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#include <memory>
-
-#include <binder/Parcel.h>
-
-#include "LowpanIdentityTest.h"
-
-using android::net::lowpan::LowpanIdentity;
-
-/**
- * Reads exactly one LowpanIdentity from 'parcelData' assuming that it is a Parcel. Any bytes afterward
- * are ignored.
- */
-static LowpanIdentity unmarshall(JNIEnv* env, jbyteArray parcelData) {
-    const int length = env->GetArrayLength(parcelData);
-
-    std::unique_ptr<uint8_t> bytes(new uint8_t[length]);
-    env->GetByteArrayRegion(parcelData, 0, length, reinterpret_cast<jbyte*>(bytes.get()));
-
-    android::Parcel p;
-    p.setData(bytes.get(), length);
-
-    LowpanIdentity value;
-    value.readFromParcel(&p);
-    return value;
-}
-
-/**
- * Creates a Java byte[] array and writes the contents of 'addr' to it as a Parcel containing
- * exactly one object.
- *
- * Every LowpanIdentity maps to a unique parcel object, so both 'marshall(e, unmarshall(e, x))' and
- * 'unmarshall(e, marshall(e, x))' should be fixed points.
- */
-static jbyteArray marshall(JNIEnv* env, const LowpanIdentity& addr) {
-    android::Parcel p;
-    addr.writeToParcel(&p);
-    const int length = p.dataSize();
-
-    jbyteArray parcelData = env->NewByteArray(length);
-    env->SetByteArrayRegion(parcelData, 0, length, reinterpret_cast<const jbyte*>(p.data()));
-
-    return parcelData;
-}
-
-extern "C"
-JNIEXPORT jbyteArray Java_android_net_lowpan_LowpanIdentityTest_readAndWriteNative(JNIEnv* env, jclass,
-        jbyteArray inParcel) {
-    const LowpanIdentity value = unmarshall(env, inParcel);
-    return marshall(env, value);
-}
diff --git a/lowpan/tests/jni/LowpanIdentityTest.h b/lowpan/tests/jni/LowpanIdentityTest.h
deleted file mode 100644
index 1d2c465..0000000
--- a/lowpan/tests/jni/LowpanIdentityTest.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_NET_LOWPANIDENTITYTEST_H_
-#define _ANDROID_NET_LOWPANIDENTITYTEST_H_
-
-#include <jni.h>
-#include <android/net/lowpan/LowpanIdentity.h>
-
-extern "C"
-JNIEXPORT jbyteArray Java_android_net_lowpan_LowpanIdentityTest_readAndWriteNative(JNIEnv* env, jclass,
-        jbyteArray inParcel);
-
-#endif  //  _ANDROID_NET_LOWPANIDENTITYTEST_H_
diff --git a/lowpan/tests/jni/LowpanProvisionTest.cpp b/lowpan/tests/jni/LowpanProvisionTest.cpp
deleted file mode 100644
index 95f64b6..0000000
--- a/lowpan/tests/jni/LowpanProvisionTest.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#include <memory>
-
-#include <binder/Parcel.h>
-
-#include "LowpanProvisionTest.h"
-
-using android::net::lowpan::LowpanProvision;
-
-/**
- * Reads exactly one LowpanProvision from 'parcelData' assuming that it is a Parcel. Any bytes afterward
- * are ignored.
- */
-static LowpanProvision unmarshall(JNIEnv* env, jbyteArray parcelData) {
-    const int length = env->GetArrayLength(parcelData);
-
-    std::unique_ptr<uint8_t> bytes(new uint8_t[length]);
-    env->GetByteArrayRegion(parcelData, 0, length, reinterpret_cast<jbyte*>(bytes.get()));
-
-    android::Parcel p;
-    p.setData(bytes.get(), length);
-
-    LowpanProvision value;
-    value.readFromParcel(&p);
-    return value;
-}
-
-/**
- * Creates a Java byte[] array and writes the contents of 'addr' to it as a Parcel containing
- * exactly one object.
- *
- * Every LowpanProvision maps to a unique parcel object, so both 'marshall(e, unmarshall(e, x))' and
- * 'unmarshall(e, marshall(e, x))' should be fixed points.
- */
-static jbyteArray marshall(JNIEnv* env, const LowpanProvision& addr) {
-    android::Parcel p;
-    addr.writeToParcel(&p);
-    const int length = p.dataSize();
-
-    jbyteArray parcelData = env->NewByteArray(length);
-    env->SetByteArrayRegion(parcelData, 0, length, reinterpret_cast<const jbyte*>(p.data()));
-
-    return parcelData;
-}
-
-extern "C"
-JNIEXPORT jbyteArray Java_android_net_lowpan_LowpanProvisionTest_readAndWriteNative(JNIEnv* env, jclass,
-        jbyteArray inParcel) {
-    const LowpanProvision value = unmarshall(env, inParcel);
-    return marshall(env, value);
-}
diff --git a/lowpan/tests/jni/LowpanProvisionTest.h b/lowpan/tests/jni/LowpanProvisionTest.h
deleted file mode 100644
index 49211b5..0000000
--- a/lowpan/tests/jni/LowpanProvisionTest.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#ifndef _ANDROID_NET_LOWPANPROVISIONTEST_H_
-#define _ANDROID_NET_LOWPANPROVISIONTEST_H_
-
-#include <jni.h>
-#include <android/net/lowpan/LowpanProvision.h>
-
-extern "C"
-JNIEXPORT jbyteArray Java_android_net_lowpan_LowpanProvisionTest_readAndWriteNative(JNIEnv* env, jclass,
-        jbyteArray inParcel);
-
-#endif  //  _ANDROID_NET_LOWPANPROVISIONTEST_H_
diff --git a/lowpan/tests/src/android/net/lowpan/LowpanInterfaceTest.java b/lowpan/tests/src/android/net/lowpan/LowpanInterfaceTest.java
new file mode 100644
index 0000000..a495d3d
--- /dev/null
+++ b/lowpan/tests/src/android/net/lowpan/LowpanInterfaceTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017 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.net.lowpan;
+
+import static org.mockito.Mockito.*;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.test.TestLooper;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/** Unit tests for android.net.lowpan.LowpanInterface. */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class LowpanInterfaceTest {
+    private static final String TEST_PACKAGE_NAME = "TestPackage";
+
+    @Mock Context mContext;
+    @Mock ILowpanInterface mLowpanInterfaceService;
+    @Mock IBinder mLowpanInterfaceBinder;
+    @Mock ApplicationInfo mApplicationInfo;
+    @Mock IBinder mAppBinder;
+    @Mock LowpanInterface.Callback mLowpanInterfaceCallback;
+
+    private Handler mHandler;
+    private final TestLooper mTestLooper = new TestLooper();
+    private ILowpanInterfaceListener mInterfaceListener;
+    private LowpanInterface mLowpanInterface;
+    private Map<String, Object> mPropertyMap;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
+        when(mContext.getOpPackageName()).thenReturn(TEST_PACKAGE_NAME);
+        when(mLowpanInterfaceService.getName()).thenReturn("wpan0");
+        when(mLowpanInterfaceService.asBinder()).thenReturn(mLowpanInterfaceBinder);
+
+        mLowpanInterface =
+                new LowpanInterface(mContext, mLowpanInterfaceService, mTestLooper.getLooper());
+    }
+
+    @Test
+    public void testStateChangedCallback() throws Exception {
+        // Register our callback
+        mLowpanInterface.registerCallback(mLowpanInterfaceCallback);
+
+        // Verify a listener was added
+        verify(mLowpanInterfaceService)
+                .addListener(
+                        argThat(
+                                listener -> {
+                                    mInterfaceListener = listener;
+                                    return listener instanceof ILowpanInterfaceListener;
+                                }));
+
+        // Change some properties
+        mInterfaceListener.onStateChanged(LowpanInterface.STATE_OFFLINE);
+        mTestLooper.dispatchAll();
+
+        // Verify that the property was changed
+        verify(mLowpanInterfaceCallback)
+                .onStateChanged(
+                        argThat(stateString -> stateString.equals(LowpanInterface.STATE_OFFLINE)));
+    }
+}
diff --git a/lowpan/tests/java/android/net/lowpan/LowpanManagerTest.java b/lowpan/tests/src/android/net/lowpan/LowpanManagerTest.java
similarity index 100%
rename from lowpan/tests/java/android/net/lowpan/LowpanManagerTest.java
rename to lowpan/tests/src/android/net/lowpan/LowpanManagerTest.java