Merge "Add UWB Tests to verify Builders and Parcels" am: 84afc97ad7 am: 86d811e556 am: d947f25a20
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1472364 Change-Id: I77cb51315534cfd76c2df14594150c3918723b83
This commit is contained in:
@@ -20,6 +20,8 @@ import android.annotation.FloatRange;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Angle measurement
|
||||
*
|
||||
@@ -75,6 +77,32 @@ public final class AngleMeasurement implements Parcelable {
|
||||
return mConfidenceLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj instanceof AngleMeasurement) {
|
||||
AngleMeasurement other = (AngleMeasurement) obj;
|
||||
return mRadians == other.getRadians()
|
||||
&& mErrorRadians == other.getErrorRadians()
|
||||
&& mConfidenceLevel == other.getConfidenceLevel();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mRadians, mErrorRadians, mConfidenceLevel);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
|
||||
@@ -21,6 +21,8 @@ import android.annotation.Nullable;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Represents an angle of arrival measurement between two devices using Ultra Wideband
|
||||
*
|
||||
@@ -72,6 +74,31 @@ public final class AngleOfArrivalMeasurement implements Parcelable {
|
||||
return mAltitudeAngleMeasurement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj instanceof AngleOfArrivalMeasurement) {
|
||||
AngleOfArrivalMeasurement other = (AngleOfArrivalMeasurement) obj;
|
||||
return mAzimuthAngleMeasurement.equals(other.getAzimuth())
|
||||
&& mAltitudeAngleMeasurement.equals(other.getAltitude());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mAzimuthAngleMeasurement, mAltitudeAngleMeasurement);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
|
||||
@@ -17,9 +17,12 @@
|
||||
package android.uwb;
|
||||
|
||||
import android.annotation.FloatRange;
|
||||
import android.annotation.Nullable;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* A data point for the distance measurement
|
||||
*
|
||||
@@ -71,6 +74,32 @@ public final class DistanceMeasurement implements Parcelable {
|
||||
return mConfidenceLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(@Nullable Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj instanceof DistanceMeasurement) {
|
||||
DistanceMeasurement other = (DistanceMeasurement) obj;
|
||||
return mMeters == other.getMeters()
|
||||
&& mErrorMeters == other.getErrorMeters()
|
||||
&& mConfidenceLevel == other.getConfidenceLevel();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mMeters, mErrorMeters, mConfidenceLevel);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.os.SystemClock;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Representation of a ranging measurement between the local device and a remote device
|
||||
@@ -129,6 +130,35 @@ public final class RangingMeasurement implements Parcelable {
|
||||
return mAngleOfArrivalMeasurement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(@Nullable Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj instanceof RangingMeasurement) {
|
||||
RangingMeasurement other = (RangingMeasurement) obj;
|
||||
return mRemoteDeviceAddress.equals(other.getRemoteDeviceAddress())
|
||||
&& mStatus == other.getStatus()
|
||||
&& mElapsedRealtimeNanos == other.getElapsedRealtimeNanos()
|
||||
&& mDistanceMeasurement.equals(other.getDistance())
|
||||
&& mAngleOfArrivalMeasurement.equals(other.getAngleOfArrival());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mRemoteDeviceAddress, mStatus, mElapsedRealtimeNanos,
|
||||
mDistanceMeasurement, mAngleOfArrivalMeasurement);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
|
||||
@@ -30,6 +30,7 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
@@ -201,6 +202,43 @@ public final class RangingParams implements Parcelable {
|
||||
return new PersistableBundle(mSpecificationParameters);
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(@Nullable Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj instanceof RangingParams) {
|
||||
RangingParams other = (RangingParams) obj;
|
||||
|
||||
return mIsInitiator == other.mIsInitiator
|
||||
&& mIsController == other.mIsController
|
||||
&& mSamplePeriod.equals(other.mSamplePeriod)
|
||||
&& mLocalDeviceAddress.equals(other.mLocalDeviceAddress)
|
||||
&& mRemoteDeviceAddresses.equals(other.mRemoteDeviceAddresses)
|
||||
&& mChannelNumber == other.mChannelNumber
|
||||
&& mTransmitPreambleCodeIndex == other.mTransmitPreambleCodeIndex
|
||||
&& mReceivePreambleCodeIndex == other.mReceivePreambleCodeIndex
|
||||
&& mStsPhyPacketType == other.mStsPhyPacketType
|
||||
&& mSpecificationParameters.size() == other.mSpecificationParameters.size()
|
||||
&& mSpecificationParameters.kindofEquals(other.mSpecificationParameters);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mIsInitiator, mIsController, mSamplePeriod, mLocalDeviceAddress,
|
||||
mRemoteDeviceAddresses, mChannelNumber, mTransmitPreambleCodeIndex,
|
||||
mReceivePreambleCodeIndex, mStsPhyPacketType, mSpecificationParameters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
|
||||
@@ -17,11 +17,13 @@
|
||||
package android.uwb;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* This class contains the UWB ranging data
|
||||
@@ -50,6 +52,31 @@ public final class RangingReport implements Parcelable {
|
||||
return mRangingMeasurements;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(@Nullable Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj instanceof RangingReport) {
|
||||
RangingReport other = (RangingReport) obj;
|
||||
return mRangingMeasurements.equals(other.getMeasurements());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mRangingMeasurements);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
|
||||
7
core/java/android/uwb/TEST_MAPPING
Normal file
7
core/java/android/uwb/TEST_MAPPING
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"presubmit": [
|
||||
{
|
||||
"name": "UwbManagerTests"
|
||||
}
|
||||
]
|
||||
}
|
||||
28
core/tests/uwbtests/Android.bp
Normal file
28
core/tests/uwbtests/Android.bp
Normal file
@@ -0,0 +1,28 @@
|
||||
// Copyright 2020 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.
|
||||
|
||||
android_test {
|
||||
name: "UwbManagerTests",
|
||||
static_libs: [
|
||||
"androidx.test.ext.junit",
|
||||
"androidx.test.rules",
|
||||
],
|
||||
libs: [
|
||||
"android.test.runner",
|
||||
],
|
||||
srcs: ["src/**/*.java"],
|
||||
platform_apis: true,
|
||||
certificate: "platform",
|
||||
test_suites: ["device-tests"],
|
||||
}
|
||||
31
core/tests/uwbtests/AndroidManifest.xml
Normal file
31
core/tests/uwbtests/AndroidManifest.xml
Normal file
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright 2020 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.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="android.uwb">
|
||||
|
||||
<application>
|
||||
<uses-library android:name="android.test.runner" />
|
||||
</application>
|
||||
|
||||
<!-- This is a self-instrumenting test package. -->
|
||||
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
|
||||
android:targetPackage="android.uwb"
|
||||
android:label="UWB Manager Tests">
|
||||
</instrumentation>
|
||||
|
||||
</manifest>
|
||||
|
||||
32
core/tests/uwbtests/AndroidTest.xml
Normal file
32
core/tests/uwbtests/AndroidTest.xml
Normal file
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright 2020 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.
|
||||
-->
|
||||
<configuration description="Config for UWB Manager test cases">
|
||||
<option name="test-suite-tag" value="apct"/>
|
||||
<option name="test-suite-tag" value="apct-instrumentation"/>
|
||||
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
|
||||
<option name="cleanup-apks" value="true" />
|
||||
<option name="test-file-name" value="UwbManagerTests.apk" />
|
||||
</target_preparer>
|
||||
|
||||
<option name="test-suite-tag" value="apct"/>
|
||||
<option name="test-tag" value="UwbManagerTests"/>
|
||||
|
||||
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
|
||||
<option name="package" value="android.uwb" />
|
||||
<option name="hidden-api-checks" value="false"/>
|
||||
<option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/>
|
||||
</test>
|
||||
</configuration>
|
||||
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright 2020 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.uwb;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import android.os.Parcel;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
/**
|
||||
* Test of {@link AngleMeasurement}.
|
||||
*/
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class AngleMeasurementTest {
|
||||
private static final double EPSILON = 0.00000000001;
|
||||
|
||||
@Test
|
||||
public void testBuilder() {
|
||||
double radians = 0.1234;
|
||||
double errorRadians = 0.5678;
|
||||
double confidence = 0.5;
|
||||
|
||||
AngleMeasurement.Builder builder = new AngleMeasurement.Builder();
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setRadians(radians);
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setErrorRadians(errorRadians);
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setConfidenceLevel(confidence);
|
||||
AngleMeasurement measurement = tryBuild(builder, true);
|
||||
|
||||
assertEquals(measurement.getRadians(), radians, 0);
|
||||
assertEquals(measurement.getErrorRadians(), errorRadians, 0);
|
||||
assertEquals(measurement.getConfidenceLevel(), confidence, 0);
|
||||
}
|
||||
|
||||
private AngleMeasurement tryBuild(AngleMeasurement.Builder builder, boolean expectSuccess) {
|
||||
AngleMeasurement measurement = null;
|
||||
try {
|
||||
measurement = builder.build();
|
||||
if (!expectSuccess) {
|
||||
fail("Expected AngleMeasurement.Builder.build() to fail, but it succeeded");
|
||||
}
|
||||
} catch (IllegalStateException e) {
|
||||
if (expectSuccess) {
|
||||
fail("Expected AngleMeasurement.Builder.build() to succeed, but it failed");
|
||||
}
|
||||
}
|
||||
return measurement;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParcel() {
|
||||
Parcel parcel = Parcel.obtain();
|
||||
AngleMeasurement measurement = UwbTestUtils.getAngleMeasurement();
|
||||
measurement.writeToParcel(parcel, 0);
|
||||
parcel.setDataPosition(0);
|
||||
AngleMeasurement fromParcel = AngleMeasurement.CREATOR.createFromParcel(parcel);
|
||||
assertEquals(measurement, fromParcel);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright 2020 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.uwb;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import android.os.Parcel;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
/**
|
||||
* Test of {@link AngleOfArrivalMeasurement}.
|
||||
*/
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class AngleOfArrivalMeasurementTest {
|
||||
|
||||
@Test
|
||||
public void testBuilder() {
|
||||
AngleMeasurement azimuth = UwbTestUtils.getAngleMeasurement();
|
||||
AngleMeasurement altitude = UwbTestUtils.getAngleMeasurement();
|
||||
|
||||
AngleOfArrivalMeasurement.Builder builder = new AngleOfArrivalMeasurement.Builder();
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setAltitudeAngleMeasurement(altitude);
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setAzimuthAngleMeasurement(azimuth);
|
||||
AngleOfArrivalMeasurement measurement = tryBuild(builder, true);
|
||||
|
||||
assertEquals(azimuth, measurement.getAzimuth());
|
||||
assertEquals(altitude, measurement.getAltitude());
|
||||
}
|
||||
|
||||
private AngleMeasurement getAngleMeasurement(double radian, double error, double confidence) {
|
||||
return new AngleMeasurement.Builder()
|
||||
.setRadians(radian)
|
||||
.setErrorRadians(error)
|
||||
.setConfidenceLevel(confidence)
|
||||
.build();
|
||||
}
|
||||
|
||||
private AngleOfArrivalMeasurement tryBuild(AngleOfArrivalMeasurement.Builder builder,
|
||||
boolean expectSuccess) {
|
||||
AngleOfArrivalMeasurement measurement = null;
|
||||
try {
|
||||
measurement = builder.build();
|
||||
if (!expectSuccess) {
|
||||
fail("Expected AngleOfArrivalMeasurement.Builder.build() to fail");
|
||||
}
|
||||
} catch (IllegalStateException e) {
|
||||
if (expectSuccess) {
|
||||
fail("Expected AngleOfArrivalMeasurement.Builder.build() to succeed");
|
||||
}
|
||||
}
|
||||
return measurement;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParcel() {
|
||||
Parcel parcel = Parcel.obtain();
|
||||
AngleOfArrivalMeasurement measurement = UwbTestUtils.getAngleOfArrivalMeasurement();
|
||||
measurement.writeToParcel(parcel, 0);
|
||||
parcel.setDataPosition(0);
|
||||
AngleOfArrivalMeasurement fromParcel =
|
||||
AngleOfArrivalMeasurement.CREATOR.createFromParcel(parcel);
|
||||
assertEquals(measurement, fromParcel);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright 2020 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.uwb;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import android.os.Parcel;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
/**
|
||||
* Test of {@link DistanceMeasurement}.
|
||||
*/
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class DistanceMeasurementTest {
|
||||
private static final double EPSILON = 0.00000000001;
|
||||
|
||||
@Test
|
||||
public void testBuilder() {
|
||||
double meters = 0.12;
|
||||
double error = 0.54;
|
||||
double confidence = 0.99;
|
||||
|
||||
DistanceMeasurement.Builder builder = new DistanceMeasurement.Builder();
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setMeters(meters);
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setErrorMeters(error);
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setConfidenceLevel(confidence);
|
||||
DistanceMeasurement measurement = tryBuild(builder, true);
|
||||
|
||||
assertEquals(meters, measurement.getMeters(), 0);
|
||||
assertEquals(error, measurement.getErrorMeters(), 0);
|
||||
assertEquals(confidence, measurement.getConfidenceLevel(), 0);
|
||||
}
|
||||
|
||||
private DistanceMeasurement tryBuild(DistanceMeasurement.Builder builder,
|
||||
boolean expectSuccess) {
|
||||
DistanceMeasurement measurement = null;
|
||||
try {
|
||||
measurement = builder.build();
|
||||
if (!expectSuccess) {
|
||||
fail("Expected DistanceMeasurement.Builder.build() to fail");
|
||||
}
|
||||
} catch (IllegalStateException e) {
|
||||
if (expectSuccess) {
|
||||
fail("Expected DistanceMeasurement.Builder.build() to succeed");
|
||||
}
|
||||
}
|
||||
return measurement;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParcel() {
|
||||
Parcel parcel = Parcel.obtain();
|
||||
DistanceMeasurement measurement = UwbTestUtils.getDistanceMeasurement();
|
||||
measurement.writeToParcel(parcel, 0);
|
||||
parcel.setDataPosition(0);
|
||||
DistanceMeasurement fromParcel =
|
||||
DistanceMeasurement.CREATOR.createFromParcel(parcel);
|
||||
assertEquals(measurement, fromParcel);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright 2020 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.uwb;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.SystemClock;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
/**
|
||||
* Test of {@link RangingMeasurement}.
|
||||
*/
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class RangingMeasurementTest {
|
||||
|
||||
@Test
|
||||
public void testBuilder() {
|
||||
int status = RangingMeasurement.RANGING_STATUS_SUCCESS;
|
||||
UwbAddress address = UwbTestUtils.getUwbAddress(false);
|
||||
long time = SystemClock.elapsedRealtimeNanos();
|
||||
AngleOfArrivalMeasurement angleMeasurement = UwbTestUtils.getAngleOfArrivalMeasurement();
|
||||
DistanceMeasurement distanceMeasurement = UwbTestUtils.getDistanceMeasurement();
|
||||
|
||||
RangingMeasurement.Builder builder = new RangingMeasurement.Builder();
|
||||
|
||||
builder.setStatus(status);
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setElapsedRealtimeNanos(time);
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setAngleOfArrivalMeasurement(angleMeasurement);
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setDistanceMeasurement(distanceMeasurement);
|
||||
tryBuild(builder, false);
|
||||
|
||||
builder.setRemoteDeviceAddress(address);
|
||||
RangingMeasurement measurement = tryBuild(builder, true);
|
||||
|
||||
assertEquals(status, measurement.getStatus());
|
||||
assertEquals(address, measurement.getRemoteDeviceAddress());
|
||||
assertEquals(time, measurement.getElapsedRealtimeNanos());
|
||||
assertEquals(angleMeasurement, measurement.getAngleOfArrival());
|
||||
assertEquals(distanceMeasurement, measurement.getDistance());
|
||||
}
|
||||
|
||||
private RangingMeasurement tryBuild(RangingMeasurement.Builder builder,
|
||||
boolean expectSuccess) {
|
||||
RangingMeasurement measurement = null;
|
||||
try {
|
||||
measurement = builder.build();
|
||||
if (!expectSuccess) {
|
||||
fail("Expected RangingMeasurement.Builder.build() to fail");
|
||||
}
|
||||
} catch (IllegalStateException e) {
|
||||
if (expectSuccess) {
|
||||
fail("Expected DistanceMeasurement.Builder.build() to succeed");
|
||||
}
|
||||
}
|
||||
return measurement;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParcel() {
|
||||
Parcel parcel = Parcel.obtain();
|
||||
RangingMeasurement measurement = UwbTestUtils.getRangingMeasurement();
|
||||
measurement.writeToParcel(parcel, 0);
|
||||
parcel.setDataPosition(0);
|
||||
RangingMeasurement fromParcel = RangingMeasurement.CREATOR.createFromParcel(parcel);
|
||||
assertEquals(measurement, fromParcel);
|
||||
}
|
||||
}
|
||||
102
core/tests/uwbtests/src/android/uwb/RangingParamsTest.java
Normal file
102
core/tests/uwbtests/src/android/uwb/RangingParamsTest.java
Normal file
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Copyright 2020 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.uwb;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.PersistableBundle;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
/**
|
||||
* Test of {@link RangingParams}.
|
||||
*/
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class RangingParamsTest {
|
||||
|
||||
@Test
|
||||
public void testParams_Build() {
|
||||
UwbAddress local = UwbAddress.fromBytes(new byte[] {(byte) 0xA0, (byte) 0x57});
|
||||
UwbAddress remote = UwbAddress.fromBytes(new byte[] {(byte) 0x4D, (byte) 0x8C});
|
||||
int channel = 9;
|
||||
int rxPreamble = 16;
|
||||
int txPreamble = 21;
|
||||
boolean isController = true;
|
||||
boolean isInitiator = false;
|
||||
@RangingParams.StsPhyPacketType int stsPhyType = RangingParams.STS_PHY_PACKET_TYPE_SP2;
|
||||
Duration samplePeriod = Duration.ofSeconds(1, 234);
|
||||
PersistableBundle specParams = new PersistableBundle();
|
||||
specParams.putString("protocol", "some_protocol");
|
||||
|
||||
RangingParams params = new RangingParams.Builder()
|
||||
.setChannelNumber(channel)
|
||||
.setReceivePreambleCodeIndex(rxPreamble)
|
||||
.setTransmitPreambleCodeIndex(txPreamble)
|
||||
.setLocalDeviceAddress(local)
|
||||
.addRemoteDeviceAddress(remote)
|
||||
.setIsController(isController)
|
||||
.setIsInitiator(isInitiator)
|
||||
.setSamplePeriod(samplePeriod)
|
||||
.setStsPhPacketType(stsPhyType)
|
||||
.setSpecificationParameters(specParams)
|
||||
.build();
|
||||
|
||||
assertEquals(params.getLocalDeviceAddress(), local);
|
||||
assertEquals(params.getRemoteDeviceAddresses().size(), 1);
|
||||
assertEquals(params.getRemoteDeviceAddresses().get(0), remote);
|
||||
assertEquals(params.getChannelNumber(), channel);
|
||||
assertEquals(params.isController(), isController);
|
||||
assertEquals(params.isInitiator(), isInitiator);
|
||||
assertEquals(params.getRxPreambleIndex(), rxPreamble);
|
||||
assertEquals(params.getTxPreambleIndex(), txPreamble);
|
||||
assertEquals(params.getStsPhyPacketType(), stsPhyType);
|
||||
assertEquals(params.getSamplingPeriod(), samplePeriod);
|
||||
assertTrue(params.getSpecificationParameters().kindofEquals(specParams));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParcel() {
|
||||
Parcel parcel = Parcel.obtain();
|
||||
RangingParams params = new RangingParams.Builder()
|
||||
.setChannelNumber(9)
|
||||
.setReceivePreambleCodeIndex(16)
|
||||
.setTransmitPreambleCodeIndex(21)
|
||||
.setLocalDeviceAddress(UwbTestUtils.getUwbAddress(false))
|
||||
.addRemoteDeviceAddress(UwbTestUtils.getUwbAddress(true))
|
||||
.setIsController(false)
|
||||
.setIsInitiator(true)
|
||||
.setSamplePeriod(Duration.ofSeconds(2))
|
||||
.setStsPhPacketType(RangingParams.STS_PHY_PACKET_TYPE_SP1)
|
||||
.build();
|
||||
params.writeToParcel(parcel, 0);
|
||||
parcel.setDataPosition(0);
|
||||
RangingParams fromParcel = RangingParams.CREATOR.createFromParcel(parcel);
|
||||
Log.w("bstack", "original: " + params.toString());
|
||||
Log.w("bstack", "parcel: " + fromParcel.toString());
|
||||
assertEquals(params, fromParcel);
|
||||
}
|
||||
}
|
||||
90
core/tests/uwbtests/src/android/uwb/RangingReportTest.java
Normal file
90
core/tests/uwbtests/src/android/uwb/RangingReportTest.java
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright 2020 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.uwb;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import android.os.Parcel;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Test of {@link RangingReport}.
|
||||
*/
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class RangingReportTest {
|
||||
|
||||
@Test
|
||||
public void testBuilder() {
|
||||
List<RangingMeasurement> measurements = UwbTestUtils.getRangingMeasurements(5);
|
||||
|
||||
RangingReport.Builder builder = new RangingReport.Builder();
|
||||
builder.addMeasurements(measurements);
|
||||
RangingReport report = tryBuild(builder, true);
|
||||
verifyMeasurementsEqual(measurements, report.getMeasurements());
|
||||
|
||||
|
||||
builder = new RangingReport.Builder();
|
||||
for (RangingMeasurement measurement : measurements) {
|
||||
builder.addMeasurement(measurement);
|
||||
}
|
||||
report = tryBuild(builder, true);
|
||||
verifyMeasurementsEqual(measurements, report.getMeasurements());
|
||||
}
|
||||
|
||||
private void verifyMeasurementsEqual(List<RangingMeasurement> expected,
|
||||
List<RangingMeasurement> actual) {
|
||||
assertEquals(expected.size(), actual.size());
|
||||
for (int i = 0; i < expected.size(); i++) {
|
||||
assertEquals(expected.get(i), actual.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
private RangingReport tryBuild(RangingReport.Builder builder,
|
||||
boolean expectSuccess) {
|
||||
RangingReport report = null;
|
||||
try {
|
||||
report = builder.build();
|
||||
if (!expectSuccess) {
|
||||
fail("Expected RangingReport.Builder.build() to fail");
|
||||
}
|
||||
} catch (IllegalStateException e) {
|
||||
if (expectSuccess) {
|
||||
fail("Expected RangingReport.Builder.build() to succeed");
|
||||
}
|
||||
}
|
||||
return report;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParcel() {
|
||||
Parcel parcel = Parcel.obtain();
|
||||
RangingReport report = UwbTestUtils.getRangingReports(5);
|
||||
report.writeToParcel(parcel, 0);
|
||||
parcel.setDataPosition(0);
|
||||
RangingReport fromParcel = RangingReport.CREATOR.createFromParcel(parcel);
|
||||
assertEquals(report, fromParcel);
|
||||
}
|
||||
}
|
||||
79
core/tests/uwbtests/src/android/uwb/UwbAddressTest.java
Normal file
79
core/tests/uwbtests/src/android/uwb/UwbAddressTest.java
Normal file
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright 2020 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.uwb;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import android.os.Parcel;
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
/**
|
||||
* Test of {@link UwbAddress}.
|
||||
*/
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class UwbAddressTest {
|
||||
|
||||
@Test
|
||||
public void testFromBytes_Short() {
|
||||
runFromBytes(UwbAddress.SHORT_ADDRESS_BYTE_LENGTH);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFromBytes_Extended() {
|
||||
runFromBytes(UwbAddress.EXTENDED_ADDRESS_BYTE_LENGTH);
|
||||
}
|
||||
|
||||
private void runFromBytes(int len) {
|
||||
byte[] addressBytes = getByteArray(len);
|
||||
UwbAddress address = UwbAddress.fromBytes(addressBytes);
|
||||
assertEquals(address.size(), len);
|
||||
assertEquals(addressBytes, address.toBytes());
|
||||
}
|
||||
|
||||
private byte[] getByteArray(int len) {
|
||||
byte[] res = new byte[len];
|
||||
for (int i = 0; i < len; i++) {
|
||||
res[i] = (byte) i;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParcel_Short() {
|
||||
runParcel(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParcel_Extended() {
|
||||
runParcel(false);
|
||||
}
|
||||
|
||||
private void runParcel(boolean useShortAddress) {
|
||||
Parcel parcel = Parcel.obtain();
|
||||
UwbAddress address = UwbTestUtils.getUwbAddress(useShortAddress);
|
||||
address.writeToParcel(parcel, 0);
|
||||
parcel.setDataPosition(0);
|
||||
UwbAddress fromParcel = UwbAddress.CREATOR.createFromParcel(parcel);
|
||||
assertEquals(address, fromParcel);
|
||||
}
|
||||
}
|
||||
92
core/tests/uwbtests/src/android/uwb/UwbTestUtils.java
Normal file
92
core/tests/uwbtests/src/android/uwb/UwbTestUtils.java
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright 2020 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.uwb;
|
||||
|
||||
import android.os.SystemClock;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class UwbTestUtils {
|
||||
private UwbTestUtils() {}
|
||||
|
||||
public static AngleMeasurement getAngleMeasurement() {
|
||||
return new AngleMeasurement.Builder()
|
||||
.setRadians(getDoubleInRange(-Math.PI, Math.PI))
|
||||
.setErrorRadians(getDoubleInRange(0, Math.PI))
|
||||
.setConfidenceLevel(getDoubleInRange(0, 1))
|
||||
.build();
|
||||
}
|
||||
|
||||
public static AngleOfArrivalMeasurement getAngleOfArrivalMeasurement() {
|
||||
return new AngleOfArrivalMeasurement.Builder()
|
||||
.setAltitudeAngleMeasurement(getAngleMeasurement())
|
||||
.setAzimuthAngleMeasurement(getAngleMeasurement())
|
||||
.build();
|
||||
}
|
||||
|
||||
public static DistanceMeasurement getDistanceMeasurement() {
|
||||
return new DistanceMeasurement.Builder()
|
||||
.setMeters(getDoubleInRange(0, 100))
|
||||
.setErrorMeters(getDoubleInRange(0, 10))
|
||||
.setConfidenceLevel(getDoubleInRange(0, 1))
|
||||
.build();
|
||||
}
|
||||
|
||||
public static RangingMeasurement getRangingMeasurement() {
|
||||
return getRangingMeasurement(getUwbAddress(false));
|
||||
}
|
||||
|
||||
public static RangingMeasurement getRangingMeasurement(UwbAddress address) {
|
||||
return new RangingMeasurement.Builder()
|
||||
.setDistanceMeasurement(getDistanceMeasurement())
|
||||
.setAngleOfArrivalMeasurement(getAngleOfArrivalMeasurement())
|
||||
.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos())
|
||||
.setRemoteDeviceAddress(address != null ? address : getUwbAddress(false))
|
||||
.setStatus(RangingMeasurement.RANGING_STATUS_SUCCESS)
|
||||
.build();
|
||||
}
|
||||
|
||||
public static List<RangingMeasurement> getRangingMeasurements(int num) {
|
||||
List<RangingMeasurement> result = new ArrayList<>();
|
||||
for (int i = 0; i < num; i++) {
|
||||
result.add(getRangingMeasurement());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static RangingReport getRangingReports(int numMeasurements) {
|
||||
RangingReport.Builder builder = new RangingReport.Builder();
|
||||
for (int i = 0; i < numMeasurements; i++) {
|
||||
builder.addMeasurement(getRangingMeasurement());
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
private static double getDoubleInRange(double min, double max) {
|
||||
return min + (max - min) * Math.random();
|
||||
}
|
||||
|
||||
public static UwbAddress getUwbAddress(boolean isShortAddress) {
|
||||
byte[] addressBytes = new byte[isShortAddress ? UwbAddress.SHORT_ADDRESS_BYTE_LENGTH :
|
||||
UwbAddress.EXTENDED_ADDRESS_BYTE_LENGTH];
|
||||
for (int i = 0; i < addressBytes.length; i++) {
|
||||
addressBytes[i] = (byte) getDoubleInRange(1, 255);
|
||||
}
|
||||
return UwbAddress.fromBytes(addressBytes);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user