diff options
author | Frank Li <lifr@google.com> | 2020-06-24 16:36:37 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-06-24 16:36:37 +0000 |
commit | c2cdb2c76459fd41a6307de517dbb21d41cef311 (patch) | |
tree | 528734e58ad933a85370d7261c69968de84726d1 | |
parent | 4a61b59c36ff0a0839dc7b3d5dd1a9576e977797 (diff) | |
parent | ad90e1bfe13e6a5dc85a33d64c37981ce1ac4408 (diff) |
Fix NullPointerException on addErrorCode when input is Invalid error code am: ad90e1bfe1
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/NetworkStack/+/11987398
Change-Id: I78c4025468341c9a515bcedd83cf19ea6795e283
-rw-r--r-- | src/com/android/networkstack/metrics/IpProvisioningMetrics.java | 11 | ||||
-rw-r--r-- | tests/unit/src/com/android/networkstack/metrics/NetworkIpProvisioningMetricsTest.java | 28 |
2 files changed, 24 insertions, 15 deletions
diff --git a/src/com/android/networkstack/metrics/IpProvisioningMetrics.java b/src/com/android/networkstack/metrics/IpProvisioningMetrics.java index 1f969d4..64e173d 100644 --- a/src/com/android/networkstack/metrics/IpProvisioningMetrics.java +++ b/src/com/android/networkstack/metrics/IpProvisioningMetrics.java @@ -120,12 +120,21 @@ public class IpProvisioningMetrics { transSuccess ? HostnameTransResult.HTR_SUCCESS : HostnameTransResult.HTR_FAILURE); } + private static DhcpErrorCode dhcpErrorFromNumberSafe(int number) { + // See DhcpErrorCode.errorCodeWithOption + // TODO: add a DhcpErrorCode method to extract the code; + // or replace legacy error codes with the new metrics. + final DhcpErrorCode error = DhcpErrorCode.forNumber(number & 0xFFFF0000); + if (error == null) return DhcpErrorCode.ET_UNKNOWN; + return error; + } + /** * write the DHCP error code into DhcpSession. */ public void addDhcpErrorCode(final int errorCode) { if (mDhcpSessionBuilder.getErrorCodeCount() >= MAX_DHCP_ERROR_COUNT) return; - mDhcpSessionBuilder.addErrorCode(DhcpErrorCode.forNumber(errorCode)); + mDhcpSessionBuilder.addErrorCode(dhcpErrorFromNumberSafe(errorCode)); } /** diff --git a/tests/unit/src/com/android/networkstack/metrics/NetworkIpProvisioningMetricsTest.java b/tests/unit/src/com/android/networkstack/metrics/NetworkIpProvisioningMetricsTest.java index 08812b7..01d94e2 100644 --- a/tests/unit/src/com/android/networkstack/metrics/NetworkIpProvisioningMetricsTest.java +++ b/tests/unit/src/com/android/networkstack/metrics/NetworkIpProvisioningMetricsTest.java @@ -16,6 +16,7 @@ package com.android.networkstack.metrics; +import android.net.dhcp.DhcpPacket; import android.net.metrics.DhcpErrorEvent; import android.stats.connectivity.DhcpErrorCode; import android.stats.connectivity.DhcpFeature; @@ -64,25 +65,24 @@ public class NetworkIpProvisioningMetricsTest { final NetworkIpProvisioningReported mStats; final IpProvisioningMetrics mMetrics = new IpProvisioningMetrics(); mMetrics.reset(); - mMetrics.addDhcpErrorCode(DhcpErrorEvent.DHCP_ERROR); - mMetrics.addDhcpErrorCode(DhcpErrorEvent.L2_WRONG_ETH_TYPE); - mMetrics.addDhcpErrorCode(DhcpErrorEvent.L3_INVALID_IP); - mMetrics.addDhcpErrorCode(DhcpErrorEvent.L4_WRONG_PORT); mMetrics.addDhcpErrorCode(DhcpErrorEvent.BOOTP_TOO_SHORT); - mMetrics.addDhcpErrorCode(DhcpErrorEvent.DHCP_NO_COOKIE); + mMetrics.addDhcpErrorCode(DhcpErrorEvent.errorCodeWithOption( + DhcpErrorEvent.BUFFER_UNDERFLOW, DhcpPacket.DHCP_HOST_NAME)); + // Write the incorrect input number 50000 as DHCP error number + int incorrectErrorCodeNumber = 50000; + mMetrics.addDhcpErrorCode(incorrectErrorCodeNumber); for (int i = 0; i < mMetrics.MAX_DHCP_ERROR_COUNT; i++) { mMetrics.addDhcpErrorCode(DhcpErrorEvent.PARSING_ERROR); } mStats = mMetrics.statsWrite(); - assertEquals(DhcpErrorCode.ET_DHCP_ERROR, mStats.getDhcpSession().getErrorCode(0)); - assertEquals(DhcpErrorCode.ET_L2_WRONG_ETH_TYPE, mStats.getDhcpSession().getErrorCode(1)); - assertEquals(DhcpErrorCode.ET_L3_INVALID_IP, mStats.getDhcpSession().getErrorCode(2)); - assertEquals(DhcpErrorCode.ET_L4_WRONG_PORT, mStats.getDhcpSession().getErrorCode(3)); - assertEquals(DhcpErrorCode.ET_BOOTP_TOO_SHORT, mStats.getDhcpSession().getErrorCode(4)); - assertEquals(DhcpErrorCode.ET_DHCP_NO_COOKIE, mStats.getDhcpSession().getErrorCode(5)); - // Check can record the same error code - assertEquals(DhcpErrorCode.ET_PARSING_ERROR, mStats.getDhcpSession().getErrorCode(6)); - assertEquals(DhcpErrorCode.ET_PARSING_ERROR, mStats.getDhcpSession().getErrorCode(6)); + assertEquals(DhcpErrorCode.ET_BOOTP_TOO_SHORT, mStats.getDhcpSession().getErrorCode(0)); + assertEquals(DhcpErrorCode.ET_BUFFER_UNDERFLOW, mStats.getDhcpSession().getErrorCode(1)); + // When the input is an invalid integer value (such as incorrectErrorCodeNumber), + // the DhcpErrorCode will be ET_UNKNOWN + assertEquals(DhcpErrorCode.ET_UNKNOWN, mStats.getDhcpSession().getErrorCode(2)); + // If the same error code appears, it must be recorded + assertEquals(DhcpErrorCode.ET_PARSING_ERROR, mStats.getDhcpSession().getErrorCode(3)); + assertEquals(DhcpErrorCode.ET_PARSING_ERROR, mStats.getDhcpSession().getErrorCode(4)); // The maximum number of DHCP error code counts is MAX_DHCP_ERROR_COUNT assertEquals(mMetrics.MAX_DHCP_ERROR_COUNT, mStats.getDhcpSession().getErrorCodeCount()); } |