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(
distinct(ReceiverBeacon.name).label('name'),
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'),
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'),
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'),
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'),
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'),
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')) \
.filter(ReceiverBeacon.receiver_id == null()) \
.subquery()

Wyświetl plik

@ -40,6 +40,13 @@ class ReceiverBeacon(Beacon):
# Multi-column indices
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):
return "<ReceiverBeacon %s: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s>" % (
self.version,

Wyświetl plik

@ -1,8 +1,8 @@
import unittest
import os
from ogn.model import AircraftBeacon, Device
from ogn.collect.database import update_devices
from ogn.model import AircraftBeacon, ReceiverBeacon, Device, Receiver
from ogn.collect.database import update_devices, update_receivers
class TestDB(unittest.TestCase):
@ -19,26 +19,31 @@ class TestDB(unittest.TestCase):
from ogn.commands.database import init
init()
# Create basic data and insert
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: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: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: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:05', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=None, real_address='DD0815')
# Prepare Beacons
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.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.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.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.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.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):
session = self.session
session.execute("DELETE FROM device")
session.execute("DELETE FROM receiver")
session.execute("DELETE FROM aircraft_beacon")
session.execute("DELETE FROM receiver_beacon")
session.commit()
def test_update_devices(self):
session = self.session
# Compute 1st beacon
session.add(self.ab00)
session.add(self.ab01)
session.commit()
update_devices(session)
@ -47,19 +52,9 @@ class TestDB(unittest.TestCase):
self.assertEqual(len(devices), 1)
self.assertEqual(devices[0].address, 'DD4711')
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
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.commit()
@ -67,23 +62,55 @@ class TestDB(unittest.TestCase):
devices = session.query(Device).all()
self.assertEqual(len(devices), 1)
self.assertEqual(devices[0].address, 'DD4711')
self.assertEqual(devices[0].software_version, 0.26)
self.assertEqual(devices[0].hardware_version, None)
self.assertEqual(devices[0].real_address, None)
self.assertEqual(devices[0].software_version, 6.01)
self.assertEqual(self.ab02.device_id, devices[0].id)
# Compute 4.-6. beacon
# Compute 3rd beacon: changed software version, but with error_count > 0
session.add(self.ab03)
session.add(self.ab05) # order is not important
session.add(self.ab04)
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.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].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__':