Test and fix update_receivers

pull/68/head
Konstantin Gründger 2017-12-16 21:40:12 +01:00
rodzic 52c40582c4
commit eba91c5f5c
3 zmienionych plików z 68 dodań i 34 usunięć

Wyświetl plik

@ -170,22 +170,22 @@ def update_receivers(session=None):
last_valid_values = session.query( last_valid_values = session.query(
distinct(ReceiverBeacon.name).label('name'), distinct(ReceiverBeacon.name).label('name'),
func.first_value(ReceiverBeacon.timestamp) func.first_value(ReceiverBeacon.timestamp)
.over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.timestamp == null(), None), (ReceiverBeacon.timestamp != null(), ReceiverBeacon.timestamp)])) .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.timestamp == null(), None)], else_=ReceiverBeacon.timestamp).desc().nullslast())
.label('firstseen'), .label('firstseen'),
func.last_value(ReceiverBeacon.timestamp) func.last_value(ReceiverBeacon.timestamp)
.over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.timestamp == null(), None), (ReceiverBeacon.timestamp != null(), ReceiverBeacon.timestamp)])) .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.timestamp == null(), None)], else_=ReceiverBeacon.timestamp).asc().nullslast())
.label('lastseen'), .label('lastseen'),
func.first_value(ReceiverBeacon.location_wkt) func.first_value(ReceiverBeacon.location_wkt)
.over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.location_wkt == null(), None), (ReceiverBeacon.location_wkt != null(), ReceiverBeacon.location_wkt)])) .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.location_wkt == null(), None)], else_=ReceiverBeacon.timestamp).desc().nullslast())
.label('location_wkt'), .label('location_wkt'),
func.first_value(ReceiverBeacon.altitude) func.first_value(ReceiverBeacon.altitude)
.over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.altitude == null(), None), (ReceiverBeacon.altitude != null(), ReceiverBeacon.altitude)])) .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.altitude == null(), None)], else_=ReceiverBeacon.timestamp).desc().nullslast())
.label('altitude'), .label('altitude'),
func.first_value(ReceiverBeacon.version) func.first_value(ReceiverBeacon.version)
.over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.version == null(), None), (ReceiverBeacon.version != null(), ReceiverBeacon.version)])) .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.version == null(), None)], else_=ReceiverBeacon.timestamp).desc().nullslast())
.label('version'), .label('version'),
func.first_value(ReceiverBeacon.platform) func.first_value(ReceiverBeacon.platform)
.over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.platform == null(), None), (ReceiverBeacon.platform != null(), ReceiverBeacon.platform)])) .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.platform == null(), None)], else_=ReceiverBeacon.timestamp).desc().nullslast())
.label('platform')) \ .label('platform')) \
.filter(ReceiverBeacon.receiver_id == null()) \ .filter(ReceiverBeacon.receiver_id == null()) \
.subquery() .subquery()

Wyświetl plik

@ -40,6 +40,13 @@ class ReceiverBeacon(Beacon):
# Multi-column indices # Multi-column indices
Index('ix_receiver_beacon_receiver_id_name', 'receiver_id', 'name') Index('ix_receiver_beacon_receiver_id_name', 'receiver_id', 'name')
def __init__(self, name, timestamp, altitude, version, platform):
self.name = name
self.timestamp = timestamp
self.altitude = altitude
self.version = version
self.platform = platform
def __repr__(self): def __repr__(self):
return "<ReceiverBeacon %s: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s>" % ( return "<ReceiverBeacon %s: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s>" % (
self.version, self.version,

Wyświetl plik

@ -1,8 +1,8 @@
import unittest import unittest
import os import os
from ogn.model import AircraftBeacon, Device from ogn.model import AircraftBeacon, ReceiverBeacon, Device, Receiver
from ogn.collect.database import update_devices from ogn.collect.database import update_devices, update_receivers
class TestDB(unittest.TestCase): class TestDB(unittest.TestCase):
@ -19,26 +19,31 @@ class TestDB(unittest.TestCase):
from ogn.commands.database import init from ogn.commands.database import init
init() init()
# Create basic data and insert # Prepare Beacons
self.ab00 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:00', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=None, real_address=None) self.ab01 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:00', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=None, real_address=None)
self.ab01 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:01', aircraft_type=1, stealth=False, error_count=0, software_version=0.26, hardware_version=None, real_address=None) self.ab02 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:01', aircraft_type=1, stealth=False, error_count=0, software_version=6.01, hardware_version=None, real_address=None)
self.ab02 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:02', aircraft_type=1, stealth=False, error_count=1, software_version=0.27, hardware_version=None, real_address=None) self.ab03 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:02', aircraft_type=1, stealth=False, error_count=1, software_version=6.02, hardware_version=None, real_address=None)
self.ab03 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:03', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=5, real_address='DD1234') self.ab04 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:03', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=5, real_address='DD1234')
self.ab04 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:04', aircraft_type=1, stealth=False, error_count=0, software_version=0.25, hardware_version=123, real_address='DDxxxx') self.ab05 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:04', aircraft_type=1, stealth=False, error_count=0, software_version=6.00, hardware_version=123, real_address='DDxxxx')
self.ab05 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:05', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=None, real_address='DD0815') self.ab06 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:05', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=None, real_address='DD0815')
self.rb01 = ReceiverBeacon(name='Koenigsdf', timestamp='2017-12-10 09:55:00', altitude=601, version='0.2.5', platform='ARM')
self.rb02 = ReceiverBeacon(name='Koenigsdf', timestamp='2017-12-10 10:00:00', altitude=601, version='0.2.7', platform='ARM')
self.rb03 = ReceiverBeacon(name='Koenigsdf', timestamp='2017-12-10 10:05:00', altitude=601, version='0.2.6', platform='ARM')
def tearDown(self): def tearDown(self):
session = self.session session = self.session
session.execute("DELETE FROM device") session.execute("DELETE FROM device")
session.execute("DELETE FROM receiver") session.execute("DELETE FROM receiver")
session.execute("DELETE FROM aircraft_beacon") session.execute("DELETE FROM aircraft_beacon")
session.execute("DELETE FROM receiver_beacon")
session.commit() session.commit()
def test_update_devices(self): def test_update_devices(self):
session = self.session session = self.session
# Compute 1st beacon # Compute 1st beacon
session.add(self.ab00) session.add(self.ab01)
session.commit() session.commit()
update_devices(session) update_devices(session)
@ -47,19 +52,9 @@ class TestDB(unittest.TestCase):
self.assertEqual(len(devices), 1) self.assertEqual(len(devices), 1)
self.assertEqual(devices[0].address, 'DD4711') self.assertEqual(devices[0].address, 'DD4711')
self.assertEqual(devices[0].software_version, None) self.assertEqual(devices[0].software_version, None)
self.assertEqual(self.ab00.device_id, devices[0].id) self.assertEqual(self.ab01.device_id, devices[0].id)
# Compute 2nd beacon: changed software version # Compute 2nd beacon: changed software version
session.add(self.ab01)
session.commit()
update_devices(session)
devices = session.query(Device).all()
self.assertEqual(len(devices), 1)
self.assertEqual(devices[0].address, 'DD4711')
self.assertEqual(devices[0].software_version, 0.26)
# Compute 3rd beacon: changed software version, but with error_count > 0
session.add(self.ab02) session.add(self.ab02)
session.commit() session.commit()
@ -67,23 +62,55 @@ class TestDB(unittest.TestCase):
devices = session.query(Device).all() devices = session.query(Device).all()
self.assertEqual(len(devices), 1) self.assertEqual(len(devices), 1)
self.assertEqual(devices[0].address, 'DD4711') self.assertEqual(devices[0].address, 'DD4711')
self.assertEqual(devices[0].software_version, 0.26) self.assertEqual(devices[0].software_version, 6.01)
self.assertEqual(devices[0].hardware_version, None) self.assertEqual(self.ab02.device_id, devices[0].id)
self.assertEqual(devices[0].real_address, None)
# Compute 4.-6. beacon # Compute 3rd beacon: changed software version, but with error_count > 0
session.add(self.ab03) session.add(self.ab03)
session.add(self.ab05) # order is not important
session.add(self.ab04)
session.commit() session.commit()
update_devices(session) update_devices(session)
devices = session.query(Device).all() devices = session.query(Device).all()
self.assertEqual(len(devices), 1) self.assertEqual(len(devices), 1)
self.assertEqual(devices[0].address, 'DD4711') self.assertEqual(devices[0].address, 'DD4711')
self.assertEqual(devices[0].software_version, 0.25) self.assertEqual(devices[0].software_version, 6.01)
self.assertEqual(devices[0].hardware_version, None)
self.assertEqual(devices[0].real_address, None)
self.assertEqual(self.ab03.device_id, devices[0].id)
# Compute 4.-6. beacon
session.add(self.ab04)
session.add(self.ab06) # order is not important
session.add(self.ab05)
session.commit()
update_devices(session)
devices = session.query(Device).all()
self.assertEqual(len(devices), 1)
self.assertEqual(devices[0].address, 'DD4711')
self.assertEqual(devices[0].software_version, 6.0)
self.assertEqual(devices[0].hardware_version, 123) self.assertEqual(devices[0].hardware_version, 123)
self.assertEqual(devices[0].real_address, 'DD0815') self.assertEqual(devices[0].real_address, 'DD0815')
self.assertEqual(self.ab04.device_id, devices[0].id)
self.assertEqual(self.ab05.device_id, devices[0].id)
self.assertEqual(self.ab06.device_id, devices[0].id)
def test_update_receivers(self):
session = self.session
# Compute beacons
session.add(self.rb01)
session.add(self.rb02)
session.add(self.rb03)
session.commit()
update_receivers(session)
receivers = session.query(Receiver).all()
self.assertEqual(len(receivers), 1)
self.assertEqual(receivers[0].name, 'Koenigsdf')
self.assertEqual(receivers[0].altitude, 601)
self.assertEqual(receivers[0].version, '0.2.6')
if __name__ == '__main__': if __name__ == '__main__':