Home | History | Annotate | Download | only in testing
      1 // Copyright 2015 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef TESTING_EMBEDDER_TEST_TIMER_HANDLING_DELEGATE_H_
      6 #define TESTING_EMBEDDER_TEST_TIMER_HANDLING_DELEGATE_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <utility>
     11 #include <vector>
     12 
     13 #include "embedder_test.h"
     14 #include "test_support.h"
     15 
     16 class EmbedderTestTimerHandlingDelegate : public EmbedderTest::Delegate {
     17  public:
     18   struct ReceivedAlert {
     19     ReceivedAlert(FPDF_WIDESTRING message_in,
     20                   FPDF_WIDESTRING title_in,
     21                   int type_in,
     22                   int icon_in)
     23         : type(type_in), icon(icon_in) {
     24       message = GetPlatformWString(message_in);
     25       title = GetPlatformWString(title_in);
     26     }
     27 
     28     std::wstring message;
     29     std::wstring title;
     30     int type;
     31     int icon;
     32   };
     33 
     34   int Alert(FPDF_WIDESTRING message,
     35             FPDF_WIDESTRING title,
     36             int type,
     37             int icon) override {
     38     alerts_.push_back(ReceivedAlert(message, title, type, icon));
     39     return 0;
     40   }
     41 
     42   int SetTimer(int msecs, TimerCallback fn) override {
     43     expiry_to_timer_map_.insert(std::pair<int, Timer>(
     44         msecs + imaginary_elapsed_msecs_, Timer(++next_timer_id_, fn)));
     45     return next_timer_id_;
     46   }
     47 
     48   void KillTimer(int id) override {
     49     for (auto iter = expiry_to_timer_map_.begin();
     50          iter != expiry_to_timer_map_.end(); ++iter) {
     51       if (iter->second.first == id) {
     52         expiry_to_timer_map_.erase(iter);
     53         break;
     54       }
     55     }
     56   }
     57 
     58   void AdvanceTime(int increment_msecs) {
     59     imaginary_elapsed_msecs_ += increment_msecs;
     60     while (1) {
     61       auto iter = expiry_to_timer_map_.begin();
     62       if (iter == expiry_to_timer_map_.end()) {
     63         break;
     64       }
     65       Timer t = iter->second;
     66       if (t.first > imaginary_elapsed_msecs_) {
     67         break;
     68       }
     69       expiry_to_timer_map_.erase(iter);
     70       t.second(t.first);  // Fire timer.
     71     }
     72   }
     73 
     74   const std::vector<ReceivedAlert>& GetAlerts() const { return alerts_; }
     75 
     76  protected:
     77   using Timer = std::pair<int, TimerCallback>;     // ID, callback pair.
     78   std::multimap<int, Timer> expiry_to_timer_map_;  // Keyed by timeout.
     79   int next_timer_id_ = 0;
     80   int imaginary_elapsed_msecs_ = 0;
     81   std::vector<ReceivedAlert> alerts_;
     82 };
     83 
     84 #endif  // TESTING_EMBEDDER_TEST_TIMER_HANDLING_DELEGATE_H_
     85