Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d70665a authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "vc: Fix duplicate operation discriminator"

parents 9e292d6d 00e402b3
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -753,7 +753,7 @@ class VolumeControlImpl : public VolumeControl {
    devices_control_point_helper(op->devices_, op->opcode_, &(op->arguments_));
  }

  void PrepareVolumeControlOperation(std::vector<RawAddress>& devices,
  void PrepareVolumeControlOperation(std::vector<RawAddress> devices,
                                     int group_id, bool is_autonomous,
                                     uint8_t opcode,
                                     std::vector<uint8_t>& arguments) {
@@ -764,11 +764,22 @@ class VolumeControlImpl : public VolumeControl {
        arguments.size());

    if (std::find_if(ongoing_operations_.begin(), ongoing_operations_.end(),
                     [opcode, &arguments](const VolumeOperation& op) {
                       return (op.opcode_ == opcode) &&
                              std::equal(op.arguments_.begin(),
                                         op.arguments_.end(),
                                         arguments.begin());
                     [opcode, &devices, &arguments](const VolumeOperation& op) {
                       if (op.opcode_ != opcode) return false;
                       if (!std::equal(op.arguments_.begin(),
                                       op.arguments_.end(), arguments.begin()))
                         return false;
                       // Filter out all devices which have the exact operation
                       // already scheduled
                       devices.erase(
                           std::remove_if(devices.begin(), devices.end(),
                                          [&op](auto d) {
                                            return find(op.devices_.begin(),
                                                        op.devices_.end(),
                                                        d) != op.devices_.end();
                                          }),
                           devices.end());
                       return devices.empty();
                     }) == ongoing_operations_.end()) {
      ongoing_operations_.emplace_back(latest_operation_id_++, group_id,
                                       is_autonomous, opcode, arguments,
+17 −0
Original line number Diff line number Diff line
@@ -1087,6 +1087,23 @@ TEST_F(VolumeControlCsis, test_set_volume) {
  std::vector<uint8_t> value({0x03, 0x01, 0x02});
  GetNotificationEvent(conn_id_1, test_address_1, 0x0021, value);
  GetNotificationEvent(conn_id_2, test_address_2, 0x0021, value);

  /* Verify exactly one operation with this exact value is queued for each
   * device */
  EXPECT_CALL(gatt_queue,
              WriteCharacteristic(conn_id_1, 0x0024, _, GATT_WRITE, _, _))
      .Times(1);
  EXPECT_CALL(gatt_queue,
              WriteCharacteristic(conn_id_2, 0x0024, _, GATT_WRITE, _, _))
      .Times(1);
  VolumeControl::Get()->SetVolume(test_address_1, 20);
  VolumeControl::Get()->SetVolume(test_address_2, 20);
  VolumeControl::Get()->SetVolume(test_address_1, 20);
  VolumeControl::Get()->SetVolume(test_address_2, 20);

  std::vector<uint8_t> value2({20, 0x00, 0x03});
  GetNotificationEvent(conn_id_1, test_address_1, 0x0021, value2);
  GetNotificationEvent(conn_id_2, test_address_2, 0x0021, value2);
}

TEST_F(VolumeControlCsis, test_set_volume_device_not_ready) {