• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mavlink / MAVSDK / 21338287353

25 Jan 2026 07:30PM UTC coverage: 49.222% (+1.2%) from 48.003%
21338287353

Pull #2751

github

web-flow
Merge 4ab72c9e3 into 397af2d3f
Pull Request #2751: Remove integration tests, migrate valuable coverage to system tests

164 of 165 new or added lines in 3 files covered. (99.39%)

2 existing lines in 2 files now uncovered.

18307 of 37193 relevant lines covered (49.22%)

669.21 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.94
/src/system_tests/mission_cancellation.cpp
1
#include "log.h"
2
#include "mavsdk.h"
3
#include "plugins/mission/mission.h"
4
#include "plugins/mission_raw_server/mission_raw_server.h"
5
#include <future>
6
#include <thread>
7
#include <gtest/gtest.h>
8

9
using namespace mavsdk;
10

11
static Mission::MissionItem add_waypoint(
12
    double latitude_deg,
13
    double longitude_deg,
14
    float relative_altitude_m,
15
    float speed_m_s,
16
    bool is_fly_through,
17
    float gimbal_pitch_deg,
18
    float gimbal_yaw_deg,
19
    bool take_photo);
20

21
TEST(SystemTest, MissionUploadCancellation)
4✔
22
{
23
    // Create two MAVSDK instances: groundstation and autopilot
24
    Mavsdk mavsdk_groundstation{Mavsdk::Configuration{ComponentType::GroundStation}};
1✔
25
    Mavsdk mavsdk_autopilot{Mavsdk::Configuration{ComponentType::Autopilot}};
1✔
26

27
    ASSERT_EQ(
1✔
28
        mavsdk_groundstation.add_any_connection("udpin://0.0.0.0:17000"),
29
        ConnectionResult::Success);
1✔
30
    ASSERT_EQ(
1✔
31
        mavsdk_autopilot.add_any_connection("udpout://127.0.0.1:17000"), ConnectionResult::Success);
1✔
32

33
    // Set up the autopilot side with MissionRawServer
34
    auto mission_raw_server = MissionRawServer{mavsdk_autopilot.server_component()};
1✔
35

36
    // Wait for groundstation to discover autopilot
37
    auto maybe_system = mavsdk_groundstation.first_autopilot(10.0);
1✔
38
    ASSERT_TRUE(maybe_system);
1✔
39
    auto system = maybe_system.value();
1✔
40
    ASSERT_TRUE(system->has_autopilot());
1✔
41

42
    auto mission = Mission{system};
1✔
43

44
    Mission::MissionPlan mission_plan{};
2✔
45

46
    // Create a large mission (1000 items) to ensure we have time to cancel
47
    for (unsigned i = 0; i < 1000; ++i) {
1,001✔
48
        mission_plan.mission_items.push_back(
1,000✔
49
            add_waypoint(47.3981703270545, 8.54564902186397, 20.0, 3.0, true, -90.0, 0.0, false));
2,000✔
50
    }
51

52
    std::promise<Mission::Result> prom{};
2✔
53
    std::future<Mission::Result> fut = prom.get_future();
1✔
54

55
    LogInfo() << "Starting mission upload...";
1✔
56
    mission.upload_mission_async(mission_plan, [&prom](Mission::Result result) {
3✔
57
        LogInfo() << "Upload mission result: " << result;
1✔
58
        prom.set_value(result);
1✔
59
    });
1✔
60

61
    // We should not be finished yet (only wait 100ms)
62
    auto future_status = fut.wait_for(std::chrono::milliseconds(100));
1✔
63
    EXPECT_EQ(future_status, std::future_status::timeout);
1✔
64

65
    LogInfo() << "Cancelling mission upload...";
1✔
66
    mission.cancel_mission_upload();
1✔
67

68
    // Wait for cancellation to complete
69
    future_status = fut.wait_for(std::chrono::milliseconds(500));
1✔
70
    EXPECT_EQ(future_status, std::future_status::ready);
1✔
71
    auto future_result = fut.get();
1✔
72
    EXPECT_EQ(future_result, Mission::Result::TransferCancelled);
1✔
73
    LogInfo() << "Mission upload cancelled successfully.";
1✔
74

75
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
1✔
76
}
1✔
77

78
TEST(SystemTest, MissionDownloadCancellation)
4✔
79
{
80
    // Create two MAVSDK instances: groundstation and autopilot
81
    Mavsdk mavsdk_groundstation{Mavsdk::Configuration{ComponentType::GroundStation}};
1✔
82
    Mavsdk mavsdk_autopilot{Mavsdk::Configuration{ComponentType::Autopilot}};
1✔
83

84
    ASSERT_EQ(
1✔
85
        mavsdk_groundstation.add_any_connection("udpin://0.0.0.0:17000"),
86
        ConnectionResult::Success);
1✔
87
    ASSERT_EQ(
1✔
88
        mavsdk_autopilot.add_any_connection("udpout://127.0.0.1:17000"), ConnectionResult::Success);
1✔
89

90
    // Set up the autopilot side with MissionRawServer
91
    auto mission_raw_server = MissionRawServer{mavsdk_autopilot.server_component()};
1✔
92

93
    // Wait for groundstation to discover autopilot
94
    auto maybe_system = mavsdk_groundstation.first_autopilot(10.0);
1✔
95
    ASSERT_TRUE(maybe_system);
1✔
96
    auto system = maybe_system.value();
1✔
97
    ASSERT_TRUE(system->has_autopilot());
1✔
98

99
    auto mission = Mission{system};
1✔
100

101
    Mission::MissionPlan mission_plan{};
1✔
102

103
    // Create a large mission (1000 items) to ensure we have time to cancel during download
104
    for (unsigned i = 0; i < 1000; ++i) {
1,001✔
105
        mission_plan.mission_items.push_back(
1,000✔
106
            add_waypoint(47.3981703270545, 8.54564902186397, 20.0, 3.0, true, -90.0, 0.0, false));
2,000✔
107
    }
108

109
    // First upload the mission
110
    {
111
        std::promise<Mission::Result> prom{};
1✔
112
        std::future<Mission::Result> fut = prom.get_future();
1✔
113

114
        LogInfo() << "Uploading mission first...";
1✔
115
        mission.upload_mission_async(mission_plan, [&prom](Mission::Result result) {
3✔
116
            LogInfo() << "Upload mission result: " << result;
1✔
117
            prom.set_value(result);
1✔
118
        });
1✔
119

120
        auto future_result = fut.get();
1✔
121
        EXPECT_EQ(future_result, Mission::Result::Success);
1✔
122
        LogInfo() << "Mission uploaded successfully.";
1✔
123
    }
1✔
124

125
    // Now try to download and cancel
126
    {
127
        std::promise<Mission::Result> prom{};
1✔
128
        std::future<Mission::Result> fut = prom.get_future();
1✔
129

130
        LogInfo() << "Starting mission download...";
1✔
131
        mission.download_mission_async([&prom](Mission::Result result, Mission::MissionPlan) {
3✔
132
            LogInfo() << "Download mission result: " << result;
1✔
133
            prom.set_value(result);
1✔
134
        });
1✔
135

136
        // We should not be finished yet (only wait 100ms)
137
        auto future_status = fut.wait_for(std::chrono::milliseconds(100));
1✔
138
        EXPECT_EQ(future_status, std::future_status::timeout);
1✔
139

140
        LogInfo() << "Cancelling mission download...";
1✔
141
        mission.cancel_mission_download();
1✔
142

143
        // Wait for cancellation to complete
144
        future_status = fut.wait_for(std::chrono::milliseconds(500));
1✔
145
        EXPECT_EQ(future_status, std::future_status::ready);
1✔
146
        auto future_result = fut.get();
1✔
147
        EXPECT_EQ(future_result, Mission::Result::TransferCancelled);
1✔
148
        LogInfo() << "Mission download cancelled successfully.";
1✔
149
    }
1✔
150

151
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
1✔
152
}
1✔
153

154
Mission::MissionItem add_waypoint(
2,000✔
155
    double latitude_deg,
156
    double longitude_deg,
157
    float relative_altitude_m,
158
    float speed_m_s,
159
    bool is_fly_through,
160
    float gimbal_pitch_deg,
161
    float gimbal_yaw_deg,
162
    bool take_photo)
163
{
164
    Mission::MissionItem new_item{};
2,000✔
165
    new_item.latitude_deg = latitude_deg;
2,000✔
166
    new_item.longitude_deg = longitude_deg;
2,000✔
167
    new_item.relative_altitude_m = relative_altitude_m;
2,000✔
168
    new_item.speed_m_s = speed_m_s;
2,000✔
169
    new_item.is_fly_through = is_fly_through;
2,000✔
170

171
    new_item.gimbal_pitch_deg = gimbal_pitch_deg;
2,000✔
172
    new_item.gimbal_yaw_deg = gimbal_yaw_deg;
2,000✔
173
    if (take_photo) {
2,000✔
NEW
174
        new_item.camera_action = Mission::MissionItem::CameraAction::TakePhoto;
×
175
    }
176
    return new_item;
2,000✔
177
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc