#include #include #include #include "gps/gps_ephemeris_cache.h" static gps_ephemeris_t make_ephemeris( unsigned int prn, unsigned char iode) { gps_ephemeris_t ephemeris; memset(&ephemeris, 0, sizeof(ephemeris)); ephemeris.SVID = (unsigned char)prn; ephemeris.iode = iode; ephemeris.ephemeris_valid = true; ephemeris.toe.week = 2430; ephemeris.toe.sec = 123456.0; return ephemeris; } static void test_store_restore_and_expiry(void) { gps_ephemeris_cache_t cache; gps_ephemeris_cache_init(&cache, 100u); gps_ephemeris_t input = make_ephemeris(4u, 17u); gps_ephemeris_t output; memset(&output, 0, sizeof(output)); assert(gps_ephemeris_cache_store( &cache, 4u, &input, 1000u)); input.iode = 99u; assert(gps_ephemeris_cache_restore( &cache, 4u, 1100u, &output)); assert(output.iode == 17u); assert(output.SVID == 4u); assert(!gps_ephemeris_cache_restore( &cache, 4u, 1101u, &output)); /* Expiration invalidates the slot, not only this read. */ assert(!gps_ephemeris_cache_restore( &cache, 4u, 1001u, &output)); } static void test_validation_independence_and_invalidate(void) { gps_ephemeris_cache_t cache; gps_ephemeris_cache_init(&cache, 500u); gps_ephemeris_t prn4 = make_ephemeris(4u, 21u); gps_ephemeris_t prn19 = make_ephemeris(19u, 44u); gps_ephemeris_t output; prn4.ephemeris_valid = false; assert(!gps_ephemeris_cache_store( &cache, 4u, &prn4, 0u)); prn4.ephemeris_valid = true; assert(!gps_ephemeris_cache_store( &cache, 5u, &prn4, 0u)); assert(!gps_ephemeris_cache_store( &cache, GPS_PRN_COUNT, &prn4, 0u)); assert(gps_ephemeris_cache_store( &cache, 4u, &prn4, 20u)); assert(gps_ephemeris_cache_store( &cache, 19u, &prn19, 30u)); assert(gps_ephemeris_cache_restore( &cache, 19u, 40u, &output)); assert(output.iode == 44u); gps_ephemeris_cache_invalidate(&cache, 4u); assert(!gps_ephemeris_cache_restore( &cache, 4u, 40u, &output)); assert(gps_ephemeris_cache_restore( &cache, 19u, 40u, &output)); } int main(void) { test_store_restore_and_expiry(); test_validation_independence_and_invalidate(); puts("gps ephemeris cache tests passed"); return 0; }