# Unit tests for ShotManager import mock from mock import call from mock import Mock from mock import patch import os from os import sys, path from pymavlink import mavutil import socket import struct import unittest from dronekit import Vehicle, LocationGlobalRelative, VehicleMode sys.path.append(os.path.realpath('..')) import app_packet from orbit import OrbitShot from selfie import SelfieShot from follow import FollowShot from multipoint import MultipointShot from cable_cam import CableCamShot import shotManager from shotManagerConstants import * import shots # on host systems these files are located here sys.path.append(os.path.realpath('../../../flightcode/stm32')) from sololink import btn_msg import __builtin__ ERROR = 0.1 class TestEKFCallback(unittest.TestCase): @patch.object(socket.socket, 'bind') def setUp(self, mock_bind): self.mgr = shotManager.ShotManager() vehicle = mock.create_autospec(Vehicle) # Make sure EKF is not reported as ok on Startup vehicle.ekf_ok = False self.mgr.Start(vehicle) def testEKFStartup(self): """ EKF on startup should be not ok """ self.assertFalse( self.mgr.last_ekf_ok ) def testEKFUnarmedToLoiter(self): """ Shot manager starts in loiter """ self.mgr.vehicle.ekf_ok = True self.mgr.buttonManager = Mock() self.mgr.ekf_callback( self.mgr.vehicle, "ekf_ok", True ) self.assertTrue( self.mgr.last_ekf_ok ) self.assertEqual( self.mgr.vehicle.mode.name, "LOITER" ) self.mgr.buttonManager.setButtonMappings.assert_called_with() class TestArmedCallback(unittest.TestCase): @patch.object(socket.socket, 'bind') def setUp(self, mock_bind): self.mgr = shotManager.ShotManager() vehicle = mock.create_autospec(Vehicle) self.mgr.Start(vehicle) self.mgr.buttonManager = Mock() self.mgr.goproManager = Mock() self.mgr.rewindManager = Mock() def testArmedStartup(self): """ armed on startup should be not ok """ self.assertFalse( self.mgr.last_armed ) def testArmedCallback(self): """ change button mappings if our armed state changes """ self.mgr.vehicle.armed = True self.mgr.armed_callback( self.mgr.vehicle, "armed", True) self.assertTrue( self.mgr.last_armed ) self.mgr.buttonManager.setButtonMappings.assert_called_with() def testArmedCallbackNoChange(self): """ Don't change button mappings if our armed state doesn't change """ self.mgr.vehicle.armed = False self.mgr.armed_callback( self.mgr.vehicle, "armed", False ) self.assertFalse( self.mgr.last_armed ) self.assertFalse( self.mgr.buttonManager.setButtonMappings.called ) def testDisarmExitShot(self): """ Disarming should exit a shot """ self.mgr.currentShot = shots.APP_SHOT_SELFIE self.mgr.last_armed = True self.mgr.armed_callback( self.mgr.vehicle, "armed", False ) self.assertTrue(self.mgr.currentShot == shots.APP_SHOT_NONE) def testDisarmStopGoProRecording(self): """ Disarming should stop recording on GoPro """ self.mgr.currentShot = shots.APP_SHOT_NONE self.mgr.last_armed = True self.mgr.armed_callback( self.mgr.vehicle, "armed", False ) self.assertTrue( self.mgr.goproManager.handleRecordCommand.called ) class TestEnterShot(unittest.TestCase): @patch.object(socket.socket, 'bind') def setUp(self, mock_bind): self.mgr = shotManager.ShotManager() vehicle = mock.create_autospec(Vehicle) vehicle.system_status = 'ACTIVE' self.mgr.Start(vehicle) self.mgr.buttonManager = Mock() self.mgr.appMgr.sendPacket = Mock() self.mgr.rcMgr = Mock() self.mgr.last_ekf_ok = True self.mgr.appMgr = Mock() self.mgr.appMgr.isAppConnected = Mock(return_value=True) def testShouldNotenterShotOnTheGround(self): """ Won't enter a shot from the ground """ self.mgr.vehicle.system_status = 'STANDBY' self.mgr.currentShot = shots.APP_SHOT_NONE self.mgr.enterShot( shots.APP_SHOT_CABLECAM ) packet = struct.pack('