16c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley/* 26c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * Copyright (C) 2017 The Android Open Source Project 36c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * 46c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * Licensed under the Apache License, Version 2.0 (the "License"); 56c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * you may not use this file except in compliance with the License. 66c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * You may obtain a copy of the License at 76c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * 86c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * http://www.apache.org/licenses/LICENSE-2.0 96c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * 106c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * Unless required by applicable law or agreed to in writing, software 116c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * distributed under the License is distributed on an "AS IS" BASIS, 126c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * See the License for the specific language governing permissions and 146c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * limitations under the License. 156c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley */ 166c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 176c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley#define LOG_TAG "VtsHalGnssV1_0TargetTest" 186c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley#include <android/hardware/gnss/1.0/IGnss.h> 194e7a3077309d33a21b08e9380573019cc7a8cffbSteven Moreland#include <log/log.h> 206c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 21ed2bb4e8f851688c09f7639a9183b1285aa0967cYuexi Ma#include <VtsHalHidlTargetTestBase.h> 226c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 236c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley#include <chrono> 246c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley#include <condition_variable> 256c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley#include <mutex> 266c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 276c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Rileyusing android::hardware::Return; 286c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Rileyusing android::hardware::Void; 296c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 306c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Rileyusing android::hardware::gnss::V1_0::GnssLocation; 316c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Rileyusing android::hardware::gnss::V1_0::GnssLocationFlags; 326c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Rileyusing android::hardware::gnss::V1_0::IGnss; 336c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Rileyusing android::hardware::gnss::V1_0::IGnssCallback; 34c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Rileyusing android::hardware::gnss::V1_0::IGnssDebug; 35c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Rileyusing android::hardware::gnss::V1_0::IGnssMeasurement; 366c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Rileyusing android::sp; 376c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 380ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley#define TIMEOUT_SEC 2 // for basic commands/responses 396c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 400ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley// for command line argument on how strictly to run the test 410ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Rileybool sAgpsIsPresent = false; // if SUPL or XTRA assistance available 420ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Rileybool sSignalIsWeak = false; // if GNSS signals are weak (e.g. light indoor) 43c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 446c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley// The main test class for GNSS HAL. 45ed2bb4e8f851688c09f7639a9183b1285aa0967cYuexi Maclass GnssHalTest : public ::testing::VtsHalHidlTargetTestBase { 466c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley public: 476c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley virtual void SetUp() override { 48917640b752effad5615228804c3a404e695ed3ccWyatt Riley // Clean between tests 49917640b752effad5615228804c3a404e695ed3ccWyatt Riley capabilities_called_count_ = 0; 50917640b752effad5615228804c3a404e695ed3ccWyatt Riley location_called_count_ = 0; 51917640b752effad5615228804c3a404e695ed3ccWyatt Riley info_called_count_ = 0; 525d190b774e220f69edd942ccda9186f7a4518682Wyatt Riley notify_count_ = 0; 536c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 54ed2bb4e8f851688c09f7639a9183b1285aa0967cYuexi Ma gnss_hal_ = ::testing::VtsHalHidlTargetTestBase::getService<IGnss>(); 556c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ASSERT_NE(gnss_hal_, nullptr); 566c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 576c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley gnss_cb_ = new GnssCallback(*this); 586c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ASSERT_NE(gnss_cb_, nullptr); 596c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 606c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley auto result = gnss_hal_->setCallback(gnss_cb_); 616c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley if (!result.isOk()) { 62917640b752effad5615228804c3a404e695ed3ccWyatt Riley ALOGE("result of failed setCallback %s", result.description().c_str()); 636c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 646c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 656c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ASSERT_TRUE(result.isOk()); 666c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ASSERT_TRUE(result); 676c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 68917640b752effad5615228804c3a404e695ed3ccWyatt Riley /* 69917640b752effad5615228804c3a404e695ed3ccWyatt Riley * At least one callback should trigger - it may be capabilites, or 70917640b752effad5615228804c3a404e695ed3ccWyatt Riley * system info first, so wait again if capabilities not received. 71917640b752effad5615228804c3a404e695ed3ccWyatt Riley */ 72917640b752effad5615228804c3a404e695ed3ccWyatt Riley EXPECT_EQ(std::cv_status::no_timeout, wait(TIMEOUT_SEC)); 73917640b752effad5615228804c3a404e695ed3ccWyatt Riley if (capabilities_called_count_ == 0) { 74917640b752effad5615228804c3a404e695ed3ccWyatt Riley EXPECT_EQ(std::cv_status::no_timeout, wait(TIMEOUT_SEC)); 75917640b752effad5615228804c3a404e695ed3ccWyatt Riley } 76917640b752effad5615228804c3a404e695ed3ccWyatt Riley 77917640b752effad5615228804c3a404e695ed3ccWyatt Riley /* 78917640b752effad5615228804c3a404e695ed3ccWyatt Riley * Generally should be 1 capabilites callback - 79917640b752effad5615228804c3a404e695ed3ccWyatt Riley * or possibly 2 in some recovery cases (default cached & refreshed) 80917640b752effad5615228804c3a404e695ed3ccWyatt Riley */ 81917640b752effad5615228804c3a404e695ed3ccWyatt Riley EXPECT_GE(capabilities_called_count_, 1); 82917640b752effad5615228804c3a404e695ed3ccWyatt Riley EXPECT_LE(capabilities_called_count_, 2); 83917640b752effad5615228804c3a404e695ed3ccWyatt Riley 84917640b752effad5615228804c3a404e695ed3ccWyatt Riley /* 85917640b752effad5615228804c3a404e695ed3ccWyatt Riley * Clear notify/waiting counter, allowing up till the timeout after 86917640b752effad5615228804c3a404e695ed3ccWyatt Riley * the last reply for final startup messages to arrive (esp. system 87917640b752effad5615228804c3a404e695ed3ccWyatt Riley * info.) 886c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley */ 89917640b752effad5615228804c3a404e695ed3ccWyatt Riley while (wait(TIMEOUT_SEC) == std::cv_status::no_timeout) { 90917640b752effad5615228804c3a404e695ed3ccWyatt Riley } 916c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 926c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 936c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley virtual void TearDown() override { 946c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley if (gnss_hal_ != nullptr) { 956c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley gnss_hal_->cleanup(); 966c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 975d190b774e220f69edd942ccda9186f7a4518682Wyatt Riley if (notify_count_ > 0) { 985d190b774e220f69edd942ccda9186f7a4518682Wyatt Riley ALOGW("%d unprocessed callbacks discarded", notify_count_); 995d190b774e220f69edd942ccda9186f7a4518682Wyatt Riley } 1006c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 1016c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1026c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley /* Used as a mechanism to inform the test that a callback has occurred */ 1036c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley inline void notify() { 1046c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley std::unique_lock<std::mutex> lock(mtx_); 1055d190b774e220f69edd942ccda9186f7a4518682Wyatt Riley notify_count_++; 1066c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley cv_.notify_one(); 1076c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 1086c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1096c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley /* Test code calls this function to wait for a callback */ 1106c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley inline std::cv_status wait(int timeoutSeconds) { 1116c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley std::unique_lock<std::mutex> lock(mtx_); 1126c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1136c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley std::cv_status status = std::cv_status::no_timeout; 1146c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley auto now = std::chrono::system_clock::now(); 1155d190b774e220f69edd942ccda9186f7a4518682Wyatt Riley while (notify_count_ == 0) { 1165d190b774e220f69edd942ccda9186f7a4518682Wyatt Riley status = cv_.wait_until(lock, now + std::chrono::seconds(timeoutSeconds)); 1175d190b774e220f69edd942ccda9186f7a4518682Wyatt Riley if (status == std::cv_status::timeout) return status; 1186c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 1195d190b774e220f69edd942ccda9186f7a4518682Wyatt Riley notify_count_--; 1206c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley return status; 1216c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 1226c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1236c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley /* Callback class for data & Event. */ 1246c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley class GnssCallback : public IGnssCallback { 125917640b752effad5615228804c3a404e695ed3ccWyatt Riley public: 1266c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley GnssHalTest& parent_; 1276c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1286c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley GnssCallback(GnssHalTest& parent) : parent_(parent){}; 1296c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1306c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley virtual ~GnssCallback() = default; 1316c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1326c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley // Dummy callback handlers 1336c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley Return<void> gnssStatusCb( 1344b52395aa5c2a685eb2e61c73246ea7761b8c354Steven Moreland const IGnssCallback::GnssStatusValue /* status */) override { 1356c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley return Void(); 1366c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 1376c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley Return<void> gnssSvStatusCb( 1384b52395aa5c2a685eb2e61c73246ea7761b8c354Steven Moreland const IGnssCallback::GnssSvStatus& /* svStatus */) override { 1396c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley return Void(); 1406c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 1416c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley Return<void> gnssNmeaCb( 1424b52395aa5c2a685eb2e61c73246ea7761b8c354Steven Moreland int64_t /* timestamp */, 1434b52395aa5c2a685eb2e61c73246ea7761b8c354Steven Moreland const android::hardware::hidl_string& /* nmea */) override { 1446c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley return Void(); 1456c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 1466c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley Return<void> gnssAcquireWakelockCb() override { return Void(); } 1476c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley Return<void> gnssReleaseWakelockCb() override { return Void(); } 1486c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley Return<void> gnssRequestTimeCb() override { return Void(); } 1496c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1506c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley // Actual (test) callback handlers 1516c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley Return<void> gnssLocationCb(const GnssLocation& location) override { 1526c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ALOGI("Location received"); 1536c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley parent_.location_called_count_++; 1546c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley parent_.last_location_ = location; 1556c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley parent_.notify(); 1566c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley return Void(); 1576c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 1586c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1596c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley Return<void> gnssSetCapabilitesCb(uint32_t capabilities) override { 1606c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ALOGI("Capabilities received %d", capabilities); 1616c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley parent_.capabilities_called_count_++; 1626c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley parent_.last_capabilities_ = capabilities; 1636c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley parent_.notify(); 1646c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley return Void(); 1656c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 1666c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1676c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley Return<void> gnssSetSystemInfoCb( 1686c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley const IGnssCallback::GnssSystemInfo& info) override { 1696c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ALOGI("Info received, year %d", info.yearOfHw); 1706c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley parent_.info_called_count_++; 1716c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley parent_.last_info_ = info; 1726c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley parent_.notify(); 1736c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley return Void(); 1746c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 1756c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley }; 1766c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1776c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley sp<IGnss> gnss_hal_; // GNSS HAL to call into 1786c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley sp<IGnssCallback> gnss_cb_; // Primary callback interface 1796c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1806c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley /* Count of calls to set the following items, and the latest item (used by 1816c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * test.) 1826c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley */ 1836c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley int capabilities_called_count_; 1846c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley uint32_t last_capabilities_; 1856c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1866c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley int location_called_count_; 1876c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley GnssLocation last_location_; 1886c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1896c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley int info_called_count_; 1906c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley IGnssCallback::GnssSystemInfo last_info_; 1916c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1926c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley private: 1936c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley std::mutex mtx_; 1946c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley std::condition_variable cv_; 1955d190b774e220f69edd942ccda9186f7a4518682Wyatt Riley int notify_count_; 1966c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley}; 1976c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 1986c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley/* 1996c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * SetCallbackCapabilitiesCleanup: 2006c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * Sets up the callback, awaits the capabilities, and calls cleanup 2016c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * 2026c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * Since this is just the basic operation of SetUp() and TearDown(), 203917640b752effad5615228804c3a404e695ed3ccWyatt Riley * the function definition is intentionally empty 2046c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley */ 2056c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt RileyTEST_F(GnssHalTest, SetCallbackCapabilitiesCleanup) {} 2066c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 207917640b752effad5615228804c3a404e695ed3ccWyatt Riley/* 208917640b752effad5615228804c3a404e695ed3ccWyatt Riley * CheckLocation: 209917640b752effad5615228804c3a404e695ed3ccWyatt Riley * Helper function to vet Location fields 210917640b752effad5615228804c3a404e695ed3ccWyatt Riley */ 211917640b752effad5615228804c3a404e695ed3ccWyatt Rileyvoid CheckLocation(GnssLocation& location, bool checkAccuracies) { 2126c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_LAT_LONG); 2136c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_ALTITUDE); 2146c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_SPEED); 2156c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_TRUE(location.gnssLocationFlags & 2166c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley GnssLocationFlags::HAS_HORIZONTAL_ACCURACY); 217917640b752effad5615228804c3a404e695ed3ccWyatt Riley // New uncertainties available in O must be provided, 218917640b752effad5615228804c3a404e695ed3ccWyatt Riley // at least when paired with modern hardware (2017+) 219917640b752effad5615228804c3a404e695ed3ccWyatt Riley if (checkAccuracies) { 220917640b752effad5615228804c3a404e695ed3ccWyatt Riley EXPECT_TRUE(location.gnssLocationFlags & 221917640b752effad5615228804c3a404e695ed3ccWyatt Riley GnssLocationFlags::HAS_VERTICAL_ACCURACY); 222917640b752effad5615228804c3a404e695ed3ccWyatt Riley EXPECT_TRUE(location.gnssLocationFlags & 223917640b752effad5615228804c3a404e695ed3ccWyatt Riley GnssLocationFlags::HAS_SPEED_ACCURACY); 224917640b752effad5615228804c3a404e695ed3ccWyatt Riley if (location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING) { 225917640b752effad5615228804c3a404e695ed3ccWyatt Riley EXPECT_TRUE(location.gnssLocationFlags & 226917640b752effad5615228804c3a404e695ed3ccWyatt Riley GnssLocationFlags::HAS_BEARING_ACCURACY); 227917640b752effad5615228804c3a404e695ed3ccWyatt Riley } 228917640b752effad5615228804c3a404e695ed3ccWyatt Riley } 2296c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_GE(location.latitudeDegrees, -90.0); 2306c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_LE(location.latitudeDegrees, 90.0); 2316c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_GE(location.longitudeDegrees, -180.0); 2326c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_LE(location.longitudeDegrees, 180.0); 2336c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_GE(location.altitudeMeters, -1000.0); 2346c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_LE(location.altitudeMeters, 30000.0); 2356c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_GE(location.speedMetersPerSec, 0.0); 2366c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_LE(location.speedMetersPerSec, 5.0); // VTS tests are stationary. 2376c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 238917640b752effad5615228804c3a404e695ed3ccWyatt Riley // Non-zero speeds must be reported with an associated bearing 239917640b752effad5615228804c3a404e695ed3ccWyatt Riley if (location.speedMetersPerSec > 0.0) { 240917640b752effad5615228804c3a404e695ed3ccWyatt Riley EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING); 241917640b752effad5615228804c3a404e695ed3ccWyatt Riley } 242917640b752effad5615228804c3a404e695ed3ccWyatt Riley 2436c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley /* 2446c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * Tolerating some especially high values for accuracy estimate, in case of 245917640b752effad5615228804c3a404e695ed3ccWyatt Riley * first fix with especially poor geometry (happens occasionally) 2466c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley */ 2476c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_GT(location.horizontalAccuracyMeters, 0.0); 248917640b752effad5615228804c3a404e695ed3ccWyatt Riley EXPECT_LE(location.horizontalAccuracyMeters, 250.0); 2496c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 2506c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley /* 2516c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * Some devices may define bearing as -180 to +180, others as 0 to 360. 2526c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * Both are okay & understandable. 2536c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley */ 2546c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley if (location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING) { 2556c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_GE(location.bearingDegrees, -180.0); 2566c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_LE(location.bearingDegrees, 360.0); 2576c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 2586c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley if (location.gnssLocationFlags & GnssLocationFlags::HAS_VERTICAL_ACCURACY) { 2596c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_GT(location.verticalAccuracyMeters, 0.0); 2606c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_LE(location.verticalAccuracyMeters, 500.0); 2616c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 2626c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley if (location.gnssLocationFlags & GnssLocationFlags::HAS_SPEED_ACCURACY) { 2636c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_GT(location.speedAccuracyMetersPerSecond, 0.0); 2646c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_LE(location.speedAccuracyMetersPerSecond, 50.0); 2656c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 2666c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley if (location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING_ACCURACY) { 2676c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_GT(location.bearingAccuracyDegrees, 0.0); 2686c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_LE(location.bearingAccuracyDegrees, 360.0); 2696c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 2706c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 2716c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley // Check timestamp > 1.48e12 (47 years in msec - 1970->2017+) 2726c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley EXPECT_GT(location.timestamp, 1.48e12); 2736c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley} 2746c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 2756c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley/* 2760ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley * StartAndGetSingleLocation: 2770ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley * Helper function to get one Location and check fields 2780ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley * 2790ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley * returns true if a location was successfully generated 2800ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley */ 2810ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Rileybool StartAndGetSingleLocation(GnssHalTest* test, bool checkAccuracies) { 2820ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley auto result = test->gnss_hal_->start(); 2830ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley 2840ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley EXPECT_TRUE(result.isOk()); 2850ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley EXPECT_TRUE(result); 2860ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley 2870ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley /* 2880ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley * GPS signals initially optional for this test, so don't expect fast fix, 2890ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley * or no timeout, unless signal is present 2900ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley */ 2910ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley int firstGnssLocationTimeoutSeconds = sAgpsIsPresent ? 15 : 45; 2920ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley if (sSignalIsWeak) { 2930ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley // allow more time for weak signals 2940ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley firstGnssLocationTimeoutSeconds += 30; 2950ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley } 2960ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley 2970ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley test->wait(firstGnssLocationTimeoutSeconds); 2980ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley if (sAgpsIsPresent) { 2990ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley EXPECT_EQ(test->location_called_count_, 1); 3000ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley } 3010ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley if (test->location_called_count_ > 0) { 3020ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley CheckLocation(test->last_location_, checkAccuracies); 3030ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley return true; 3040ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley } 3050ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley return false; 3060ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley} 3070ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley 3080ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley/* 3096c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * GetLocation: 3106c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * Turns on location, waits 45 second for at least 5 locations, 3116c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley * and checks them for reasonable validity. 3126c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley */ 3136c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt RileyTEST_F(GnssHalTest, GetLocation) { 3146c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley#define MIN_INTERVAL_MSEC 500 3156c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley#define PREFERRED_ACCURACY 0 // Ideally perfect (matches GnssLocationProvider) 3166c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley#define PREFERRED_TIME_MSEC 0 // Ideally immediate 3176c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 3186c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley#define LOCATION_TIMEOUT_SUBSEQUENT_SEC 3 3196c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley#define LOCATIONS_TO_CHECK 5 3206c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 321917640b752effad5615228804c3a404e695ed3ccWyatt Riley bool checkMoreAccuracies = 322917640b752effad5615228804c3a404e695ed3ccWyatt Riley (info_called_count_ > 0 && last_info_.yearOfHw >= 2017); 323917640b752effad5615228804c3a404e695ed3ccWyatt Riley 3246c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley auto result = gnss_hal_->setPositionMode( 3256c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley IGnss::GnssPositionMode::MS_BASED, 3266c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley IGnss::GnssPositionRecurrence::RECURRENCE_PERIODIC, MIN_INTERVAL_MSEC, 3276c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley PREFERRED_ACCURACY, PREFERRED_TIME_MSEC); 3286c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 3296c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ASSERT_TRUE(result.isOk()); 330c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley EXPECT_TRUE(result); 3316c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 332c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley /* 333c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley * GPS signals initially optional for this test, so don't expect no timeout 334c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley * yet 335c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley */ 3360ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley bool gotLocation = StartAndGetSingleLocation(this, checkMoreAccuracies); 3376c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 3380ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley if (gotLocation) { 3390ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley for (int i = 1; i < LOCATIONS_TO_CHECK; i++) { 3400ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley EXPECT_EQ(std::cv_status::no_timeout, 3410ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley wait(LOCATION_TIMEOUT_SUBSEQUENT_SEC)); 3420ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley EXPECT_EQ(location_called_count_, i + 1); 343917640b752effad5615228804c3a404e695ed3ccWyatt Riley CheckLocation(last_location_, checkMoreAccuracies); 344917640b752effad5615228804c3a404e695ed3ccWyatt Riley } 3456c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley } 3466c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 3476c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley result = gnss_hal_->stop(); 3486c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 3496c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ASSERT_TRUE(result.isOk()); 3506c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ASSERT_TRUE(result); 3516c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley} 3526c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley 353c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley/* 354c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley * InjectDelete: 355c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley * Ensures that calls to inject and/or delete information state are handled. 356c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley */ 357c139959874d33e04b412a4df70b77e0aa4f04905Wyatt RileyTEST_F(GnssHalTest, InjectDelete) { 358c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley // confidently, well north of Alaska 359c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto result = gnss_hal_->injectLocation(80.0, -170.0, 1000.0); 360c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 361c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(result.isOk()); 362c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley EXPECT_TRUE(result); 363c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 364c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley // fake time, but generally reasonable values (time in Aug. 2018) 365c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley result = gnss_hal_->injectTime(1534567890123L, 123456L, 10000L); 366c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 367c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(result.isOk()); 368c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley EXPECT_TRUE(result); 369c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 370c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto resultVoid = gnss_hal_->deleteAidingData(IGnss::GnssAidingData::DELETE_ALL); 371c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 372c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(resultVoid.isOk()); 3730ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley 3740ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley // Ensure we can get a good location after a bad injection has been deleted 3750ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley StartAndGetSingleLocation(this, false); 376c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley} 377c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 378c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley/* 379c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley * GetAllExtentions: 380c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley * Tries getting all optional extensions, and ensures a valid return 381c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley * null or actual extension, no crash. 382c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley * Confirms year-based required extensions (Measurement & Debug) are present 383c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley */ 384c139959874d33e04b412a4df70b77e0aa4f04905Wyatt RileyTEST_F(GnssHalTest, GetAllExtensions) { 385c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley // Basic call-is-handled checks 386c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto gnssXtra = gnss_hal_->getExtensionXtra(); 387c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(gnssXtra.isOk()); 388c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 389c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto gnssRil = gnss_hal_->getExtensionAGnssRil(); 390c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(gnssRil.isOk()); 391c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 392c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto gnssAgnss = gnss_hal_->getExtensionAGnss(); 393c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(gnssAgnss.isOk()); 394c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 395c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto gnssNi = gnss_hal_->getExtensionGnssNi(); 396c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(gnssNi.isOk()); 397c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 398c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto gnssNavigationMessage = gnss_hal_->getExtensionGnssNavigationMessage(); 399c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(gnssNavigationMessage.isOk()); 400c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 401c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto gnssConfiguration = gnss_hal_->getExtensionGnssConfiguration(); 402c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(gnssConfiguration.isOk()); 403c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 404c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto gnssGeofencing = gnss_hal_->getExtensionGnssGeofencing(); 405c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(gnssGeofencing.isOk()); 406c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 407c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto gnssBatching = gnss_hal_->getExtensionGnssBatching(); 408c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(gnssBatching.isOk()); 409c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 410c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley // Verifying, in some cases, that these return actual extensions 411c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto gnssMeasurement = gnss_hal_->getExtensionGnssMeasurement(); 412c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(gnssMeasurement.isOk()); 413c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley if (last_capabilities_ & IGnssCallback::Capabilities::MEASUREMENTS) { 414c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley sp<IGnssMeasurement> iGnssMeas = gnssMeasurement; 415c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley EXPECT_NE(iGnssMeas, nullptr); 416c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley } 417c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 418c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley auto gnssDebug = gnss_hal_->getExtensionGnssDebug(); 419c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley ASSERT_TRUE(gnssDebug.isOk()); 420c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley if (info_called_count_ > 0 && last_info_.yearOfHw >= 2017) { 421c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley sp<IGnssDebug> iGnssDebug = gnssDebug; 422c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley EXPECT_NE(iGnssDebug, nullptr); 423c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley } 424c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley} 425c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 426c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley/* 427c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley * MeasurementCapabilities: 428c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley * Verifies that modern hardware supports measurement capabilities. 429c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley */ 430c139959874d33e04b412a4df70b77e0aa4f04905Wyatt RileyTEST_F(GnssHalTest, MeasurementCapabilites) { 431c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley if (info_called_count_ > 0 && last_info_.yearOfHw >= 2016) { 432c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley EXPECT_TRUE(last_capabilities_ & IGnssCallback::Capabilities::MEASUREMENTS); 433c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley } 434c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley} 435c139959874d33e04b412a4df70b77e0aa4f04905Wyatt Riley 4366c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Rileyint main(int argc, char** argv) { 4376c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ::testing::InitGoogleTest(&argc, argv); 4380ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley /* 4390ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley * These arguments not used by automated VTS testing. 4400ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley * Only for use in manual testing, when wanting to run 4410ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley * stronger tests that require the presence of GPS signal. 4420ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley */ 4430ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley for (int i = 1; i < argc; i++) { 4440ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley if (strcmp(argv[i],"-agps") == 0) { 4450ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley sAgpsIsPresent = true; 4460ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley } else if (strcmp(argv[i],"-weak") == 0) { 4470ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley sSignalIsWeak = true; 4480ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley } 4490ee0cfbd7439c5f38003529534368cb91a25e1f6Wyatt Riley } 4506c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley int status = RUN_ALL_TESTS(); 4516c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley ALOGI("Test result = %d", status); 4526c26ed7e9fa8b5f95567152b6cd35d47ff134752Wyatt Riley return status; 453917640b752effad5615228804c3a404e695ed3ccWyatt Riley}