Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  wait_until_unittest.cc

  Sprache: C
 

/*
 *  Copyright 2024 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


#include "test/wait_until.h"

#include <memory>

#include "api/rtc_error.h"
#include "api/task_queue/task_queue_base.h"
#include "api/task_queue/task_queue_factory.h"
#include "api/test/create_time_controller.h"
#include "api/test/rtc_error_matchers.h"
#include "api/test/time_controller.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "rtc_base/fake_clock.h"
#include "system_wrappers/include/clock.h"
#include "test/gmock.h"
#include "test/gtest.h"
#include "test/run_loop.h"

namespace webrtc {
namespace {

using ::testing::_;
using ::testing::AllOf;
using ::testing::Eq;
using ::testing::Ge;
using ::testing::Gt;
using ::testing::Lt;
using ::testing::MatchesRegex;
using ::testing::Property;

TEST(WaitUntilTest, ReturnsTrueWhenConditionIsMet) {
  test::RunLoop thread;

  int counter = 0;
  EXPECT_TRUE(WaitUntil([&] { return ++counter == 3; }));

  // Check that functor is not called after it returned true.
  EXPECT_EQ(counter, 3);
}

TEST(WaitUntilTest, ReturnsWhenConditionIsMet) {
  test::RunLoop thread;

  int counter = 0;
  RTCErrorOr<int> result = WaitUntil([&] { return ++counter; }, Eq(3));
  EXPECT_THAT(result, IsRtcOkAndHolds(3));
}

TEST(WaitUntilTest, ReturnsErrorWhenTimeoutIsReached) {
  test::RunLoop thread;
  int counter = 0;
  RTCErrorOr<int> result =
      WaitUntil([&] { return --counter; }, Eq(1),
                {.timeout = TimeDelta::Millis(10), .result_name = "counter"});
  // Only returns the last error. Note we only are checking that the error
  // message ends with a negative number rather than a specific number to avoid
  // flakiness.
  EXPECT_THAT(
      result,
      IsRtcErrorOrWithMessage(
          _, MatchesRegex(
                 "Value of: counter\nExpected: is equal to 1\nActual: -\\d+")));
}

TEST(WaitUntilTest, ErrorContainsMatcherExplanation) {
  test::RunLoop thread;
  int counter = 0;
  auto matcher = AllOf(Gt(0), Lt(10));
  RTCErrorOr<int> result =
      WaitUntil([&] { return --counter; }, matcher,
                {.timeout = TimeDelta::Millis(10), .result_name = "counter"});
  // Only returns the last error. Note we only are checking that the error
  // message ends with a negative number rather than a specific number to avoid
  // flakiness.
  EXPECT_THAT(
      result,
      IsRtcErrorOrWithMessage(
          _, MatchesRegex("Value of: counter\nExpected: \\(is > 0\\) and "
                          "\\(is < 10\\)\nActual: -\\d+, which doesn't match "
                          "\\(is > 0\\)")));
}

TEST(WaitUntilTest, ReturnsWhenConditionIsMetWithSimulatedClock) {
  SimulatedClock fake_clock(Timestamp::Millis(1337));

  int counter = 0;
  EXPECT_TRUE(WaitUntil(
      [&] { return ++counter == 3; },
      {.polling_interval = TimeDelta::Millis(10), .clock = &fake_clock}));
  // Check function wasn't called again after it become true.
  EXPECT_EQ(counter, 3);
}

TEST(WaitUntilTest, ReturnsFalseAfterTimeoutWithSimulatedClock) {
  SimulatedClock fake_clock(Timestamp::Millis(1'337));

  EXPECT_FALSE(
      WaitUntil([&] { return false; },
                {.timeout = TimeDelta::Seconds(1), .clock = &fake_clock}));

  // With fake time `WaitUntil` should wait exactly `timeout`, not any longer.
  EXPECT_EQ(fake_clock.CurrentTime(), Timestamp::Millis(2'337));
}

TEST(WaitUntilTest, ReturnsWhenConditionIsMetWithThreadProcessingFakeClock) {
  ScopedFakeClock fake_clock;

  int counter = 0;
  EXPECT_TRUE(WaitUntil(
      [&] { return ++counter == 3; },
      {.polling_interval = TimeDelta::Millis(1), .clock = &fake_clock}));
  EXPECT_EQ(counter, 3);
  // The fake clock should have advanced at least 2ms.
  EXPECT_THAT(Timestamp::Micros(fake_clock.TimeNanos() * 1000),
              Ge(Timestamp::Millis(1339)));
}

TEST(WaitUntilTest, ReturnsWhenConditionIsMetWithFakeClock) {
  FakeClock fake_clock;

  int counter = 0;
  EXPECT_TRUE(WaitUntil(
      [&] { return ++counter == 3; },
      {.polling_interval = TimeDelta::Millis(1), .clock = &fake_clock}));
  EXPECT_EQ(counter, 3);
  // The fake clock should have advanced at least 2ms.
  EXPECT_THAT(Timestamp::Micros(fake_clock.TimeNanos() * 1000),
              Ge(Timestamp::Millis(1339)));
}

// No default constuctor, not assignable, move-only type.
class CustomType {
 public:
  explicit CustomType(int value) : value_(value) {}
  CustomType(CustomType&&) = default;
  CustomType& operator=(CustomType&&) = delete;
  CustomType() = delete;

  int value() const { return value_; }

 private:
  const int value_;
};

TEST(WaitUntilTest, RequiresOnlyMoveCopyConstructionForReturnedType) {
  test::RunLoop thread;

  int counter = 0;
  RTCErrorOr<CustomType> result =
      WaitUntil([&] { return CustomType(++counter); },
                Property(&CustomType::value, Eq(3)));
  EXPECT_THAT(result, IsRtcOkAndHolds(Property(&CustomType::value, Eq(3))));
}

TEST(WaitUntilTest, ReturnsWhenConditionIsMetWithSimulatedTimeController) {
  std::unique_ptr<TimeController> time_controller =
      CreateSimulatedTimeController();

  int counter = 0;
  EXPECT_TRUE(WaitUntil([&] { return ++counter == 3; },
                        {.polling_interval = TimeDelta::Millis(1),
                         .clock = time_controller.get()}));
  EXPECT_EQ(counter, 3);

  // The fake clock should have advanced at least 2ms.
  EXPECT_THAT(time_controller->GetClock()->CurrentTime(),
              Ge(Timestamp::Millis(1339)));
}

TEST(WaitUntilTest,
     ReturnsTrueImmidiatelyWhenConditionIsMetByRunningPendingTask) {
  std::unique_ptr<TimeController> time_controller =
      CreateSimulatedTimeController();
  std::unique_ptr<TaskQueueBase, TaskQueueDeleter> task_queue =
      time_controller->GetTaskQueueFactory()->CreateTaskQueue(
          "task_queue", TaskQueueFactory::Priority::kNormal);

  bool condition = false;
  Timestamp start = time_controller->GetClock()->CurrentTime();
  task_queue->PostTask([&] { condition = true; });
  EXPECT_FALSE(condition);
  EXPECT_TRUE(
      WaitUntil([&] { return condition; }, {.clock = time_controller.get()}));
  EXPECT_EQ(time_controller->GetClock()->CurrentTime(), start);
}

TEST(WaiterTest, ReturnsTrueWhenConditionIsMet) {
  ScopedFakeClock clock;
  Waiter waiter({.timeout = TimeDelta::Seconds(1), .clock = &clock});

  int counter = 0;
  EXPECT_TRUE(waiter.Until([&] { return ++counter == 3; }));
  EXPECT_EQ(counter, 3);
}

TEST(WaiterTest, ReturnsResultWhenMatcherIsMet) {
  ScopedFakeClock clock;
  Waiter waiter({.timeout = TimeDelta::Seconds(1), .clock = &clock});

  int counter = 0;
  auto result = waiter.Until([&] { return ++counter; }, Eq(3));
  EXPECT_THAT(result, IsRtcOkAndHolds(3));
}

TEST(WaiterTest, ReturnsFalseWhenTimeoutIsReached) {
  SimulatedClock clock(Timestamp::Millis(1000));
  Waiter waiter({.timeout = TimeDelta::Millis(100), .clock = &clock});

  EXPECT_FALSE(waiter.Until([&] { return false; }));
  EXPECT_EQ(clock.CurrentTime(), Timestamp::Millis(1100));
}

}  // namespace
}  // namespace webrtc

Messung V0.5 in Prozent
C=92 H=95 G=93

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet am  2026-08-25) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=277311
#Domains=752002