blob: 7016f6528746494418babca851085758341143f4 [file] [log] [blame]
/*
* Copyright (C) 2016 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 com.android.server.wifi.hotspot2;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import androidx.test.filters.SmallTest;
import com.android.server.wifi.Clock;
import com.android.server.wifi.WifiBaseTest;
import com.android.server.wifi.hotspot2.anqp.ANQPElement;
import com.android.server.wifi.hotspot2.anqp.CellularNetwork;
import com.android.server.wifi.hotspot2.anqp.Constants;
import com.android.server.wifi.hotspot2.anqp.HSWanMetricsElement;
import com.android.server.wifi.hotspot2.anqp.I18Name;
import com.android.server.wifi.hotspot2.anqp.ThreeGPPNetworkElement;
import com.android.server.wifi.hotspot2.anqp.VenueNameElement;
import com.android.server.wifi.hotspot2.anqp.VenueUrlElement;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
* Unit tests for {@link com.android.server.wifi.hotspot2.ANQPData}.
*
* TODO(b/33000864): add more test once the ANQP elements cleanup are completed, which will
* allow easy construction of ANQP elements for testing.
*/
@SmallTest
public class ANQPDataTest extends WifiBaseTest {
@Mock Clock mClock;
private static final String TEST_LANGUAGE = "en";
private static final Locale TEST_LOCALE = Locale.forLanguageTag(TEST_LANGUAGE);
private static final String TEST_VENUE_NAME1 = "Venue1";
private static final String TEST_VENUE_NAME2 = "Venue2";
private static final String TEST_VENUE_URL1 = "https://www.google.com/";
private static final long TEST_CLOCK_MILLISEOCONDS = 10000L;
/**
* Sets up test.
*/
@Before
public void setUp() throws Exception {
initMocks(this);
// Returning the initial timestamp.
when(mClock.getElapsedSinceBootMillis()).thenReturn(0L);
}
/**
* Verify creation of ANQPData with null elements.
*
* @throws Exception
*/
@Test
public void createWithNullElements() throws Exception {
ANQPData data = new ANQPData(mClock, null);
Map<Constants.ANQPElementType, ANQPElement> elements = data.getElements();
assertTrue(elements.isEmpty());
}
/**
* Verify the data expiration behavior.
*
* @throws Exception
*/
@Test
public void verifyExpiration() throws Exception {
ANQPData data = new ANQPData(mClock, null);
assertFalse(data.expired(ANQPData.DATA_LIFETIME_MILLISECONDS - 1));
assertTrue(data.expired(ANQPData.DATA_LIFETIME_MILLISECONDS));
}
private URL createUrlFromString(String stringUrl) {
URL url;
try {
url = new URL(stringUrl);
} catch (java.net.MalformedURLException e) {
return null;
}
return url;
}
/**
* Verify creation of ANQPData with data elements and then update the entry.
*
* @throws Exception
*/
@Test
public void createWithElementsAndUpdate() throws Exception {
Map<Constants.ANQPElementType, ANQPElement> anqpList1 = new HashMap<>();
List<I18Name> nameList = new ArrayList<>();
nameList.add(new I18Name(TEST_LANGUAGE, TEST_LOCALE, TEST_VENUE_NAME1));
VenueNameElement venueNameElement = new VenueNameElement(nameList);
// Add one ANQP element
anqpList1.put(Constants.ANQPElementType.ANQPVenueName, venueNameElement);
ANQPData data = new ANQPData(mClock, anqpList1);
assertNotNull(data);
assertFalse(data.getElements().isEmpty());
assertTrue(data.getElements().get(Constants.ANQPElementType.ANQPVenueName)
.equals(venueNameElement));
// Add another ANQP element to the same entry
Map<Constants.ANQPElementType, ANQPElement> anqpList2 = new HashMap<>();
Map<Integer, URL> urlList = new HashMap<>();
urlList.put(Integer.valueOf(1), createUrlFromString(TEST_VENUE_URL1));
VenueUrlElement venueUrlElement = new VenueUrlElement(urlList);
anqpList2.put(Constants.ANQPElementType.ANQPVenueUrl, venueUrlElement);
// Update the name
nameList = new ArrayList<>();
nameList.add(new I18Name(TEST_LANGUAGE, TEST_LOCALE, TEST_VENUE_NAME2));
venueNameElement = new VenueNameElement(nameList);
anqpList2.put(Constants.ANQPElementType.ANQPVenueName, venueNameElement);
data.update(anqpList2);
assertTrue(data.getElements().get(Constants.ANQPElementType.ANQPVenueName)
.equals(venueNameElement));
assertTrue(data.getElements().get(Constants.ANQPElementType.ANQPVenueUrl)
.equals(venueUrlElement));
}
/**
* Verify the correct data lifetime of an ANQP entry
*
* @throws Exception
*/
@Test
public void testDataLifetime() throws Exception {
Map<Constants.ANQPElementType, ANQPElement> anqpList = new HashMap<>();
List<I18Name> nameList = new ArrayList<>();
nameList.add(new I18Name(TEST_LANGUAGE, TEST_LOCALE, TEST_VENUE_NAME1));
VenueNameElement venueNameElement = new VenueNameElement(nameList);
CellularNetwork cellularNetwork =
new CellularNetwork(Arrays.asList(new String[]{"123456"}));
ThreeGPPNetworkElement threeGPPNetworkElement =
new ThreeGPPNetworkElement(Arrays.asList(new CellularNetwork[]{cellularNetwork}));
// Setup an uninitialized WAN Metrics element (or initialized with 0's)
ByteBuffer buffer = ByteBuffer.allocate(HSWanMetricsElement.EXPECTED_BUFFER_SIZE);
buffer.put(new byte[HSWanMetricsElement.EXPECTED_BUFFER_SIZE]);
buffer.position(0);
HSWanMetricsElement wanMetricsElement = HSWanMetricsElement.parse(buffer);
// Add ANQP elements
anqpList.put(Constants.ANQPElementType.ANQPVenueName, venueNameElement);
anqpList.put(Constants.ANQPElementType.ANQP3GPPNetwork, threeGPPNetworkElement);
anqpList.put(Constants.ANQPElementType.HSWANMetrics, wanMetricsElement);
when(mClock.getElapsedSinceBootMillis()).thenReturn(10000L);
// Data life should be DATA_LIFETIME_MILLISECONDS
ANQPData data = new ANQPData(mClock, anqpList);
assertNotNull(data);
assertFalse(data.getElements().isEmpty());
assertFalse(
data.expired(TEST_CLOCK_MILLISEOCONDS + ANQPData.DATA_LIFETIME_MILLISECONDS - 1));
assertTrue(data.expired(TEST_CLOCK_MILLISEOCONDS + ANQPData.DATA_LIFETIME_MILLISECONDS));
wanMetricsElement = new HSWanMetricsElement(HSWanMetricsElement.LINK_STATUS_UP, true, false,
10000, 10000, 50, 50, 0);
anqpList.put(Constants.ANQPElementType.HSWANMetrics, wanMetricsElement);
// Data life should be DATA_LIFETIME_MILLISECONDS
data = new ANQPData(mClock, anqpList);
assertNotNull(data);
assertFalse(data.getElements().isEmpty());
assertFalse(
data.expired(TEST_CLOCK_MILLISEOCONDS + ANQPData.DATA_LIFETIME_MILLISECONDS - 1));
assertTrue(data.expired(TEST_CLOCK_MILLISEOCONDS + ANQPData.DATA_LIFETIME_MILLISECONDS));
// The following checks should result in a short data lifetime
wanMetricsElement = new HSWanMetricsElement(HSWanMetricsElement.LINK_STATUS_DOWN, true,
false, 10000, 10000, 50, 50, 0);
anqpList.put(Constants.ANQPElementType.HSWANMetrics, wanMetricsElement);
// Data life should be DATA_SHORT_LIFETIME_MILLISECONDS
data = new ANQPData(mClock, anqpList);
assertNotNull(data);
assertFalse(data.getElements().isEmpty());
assertFalse(data.expired(
TEST_CLOCK_MILLISEOCONDS + ANQPData.DATA_SHORT_LIFETIME_MILLISECONDS - 1));
assertTrue(
data.expired(TEST_CLOCK_MILLISEOCONDS + ANQPData.DATA_SHORT_LIFETIME_MILLISECONDS));
// The following checks should result in a short data lifetime
wanMetricsElement = new HSWanMetricsElement(HSWanMetricsElement.LINK_STATUS_UP, true, true,
10000, 10000, 50, 50, 0);
anqpList.put(Constants.ANQPElementType.HSWANMetrics, wanMetricsElement);
// Data life should be DATA_SHORT_LIFETIME_MILLISECONDS
data = new ANQPData(mClock, anqpList);
assertNotNull(data);
assertFalse(data.getElements().isEmpty());
assertFalse(data.expired(
TEST_CLOCK_MILLISEOCONDS + ANQPData.DATA_SHORT_LIFETIME_MILLISECONDS - 1));
assertTrue(
data.expired(TEST_CLOCK_MILLISEOCONDS + ANQPData.DATA_SHORT_LIFETIME_MILLISECONDS));
}
}