summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/cxx/TestLatency.h
blob: 687b107808b7c2f3c5dc7bfd73a578689ad2d272 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifndef mozilla__ipdltest_TestLatency_h
#define mozilla__ipdltest_TestLatency_h 1

#include "mozilla/_ipdltest/IPDLUnitTests.h"

#include "mozilla/_ipdltest/PTestLatencyParent.h"
#include "mozilla/_ipdltest/PTestLatencyChild.h"

#include "mozilla/TimeStamp.h"

#define NR_TRIALS 10000
#define NR_SPAMS 25000

namespace mozilla {
namespace _ipdltest {

class TestLatencyParent : public PTestLatencyParent {
  friend class PTestLatencyParent;

 private:
  typedef mozilla::TimeStamp TimeStamp;
  typedef mozilla::TimeDuration TimeDuration;

 public:
  TestLatencyParent();
  virtual ~TestLatencyParent();

  static bool RunTestInProcesses() { return true; }
  static bool RunTestInThreads() { return true; }

  void Main();

 protected:
  mozilla::ipc::IPCResult RecvPong();
  mozilla::ipc::IPCResult RecvPong5();

  virtual void ActorDestroy(ActorDestroyReason why) override {
    if (NormalShutdown != why) fail("unexpected destruction!");

    passed(
        "\n"
        "  average #ping-pong/sec:        %g\n"
        "  average #ping5-pong5/sec:      %g\n"
        "  average #RPC call-answer/sec:  %g\n"
        "  average #spams/sec:            %g\n"
        "  pct. spams compressed away:    %g\n",
        double(NR_TRIALS) / mPPTimeTotal.ToSecondsSigDigits(),
        double(NR_TRIALS) / mPP5TimeTotal.ToSecondsSigDigits(),
        double(NR_TRIALS) / mRpcTimeTotal.ToSecondsSigDigits(),
        double(NR_SPAMS) / mSpamTimeTotal.ToSecondsSigDigits(),
        100.0 * (double(NR_SPAMS - mNumChildProcessedCompressedSpams) /
                 double(NR_SPAMS)));

    QuitParent();
  }

 private:
  void PingPongTrial();
  void Ping5Pong5Trial();
  void RpcTrials();
  void SpamTrial();
  void CompressedSpamTrial();
  void Exit();

  TimeStamp mStart;
  TimeDuration mPPTimeTotal;
  TimeDuration mPP5TimeTotal;
  TimeDuration mRpcTimeTotal;
  TimeDuration mSpamTimeTotal;

  int mPPTrialsToGo;
  int mPP5TrialsToGo;
  uint32_t mNumChildProcessedCompressedSpams;
  uint32_t mWhichPong5;
};

class TestLatencyChild : public PTestLatencyChild {
  friend class PTestLatencyChild;

 public:
  TestLatencyChild();
  virtual ~TestLatencyChild();

 protected:
  mozilla::ipc::IPCResult RecvPing();
  mozilla::ipc::IPCResult RecvPing5();
  mozilla::ipc::IPCResult AnswerRpc();
  mozilla::ipc::IPCResult RecvSpam();
  mozilla::ipc::IPCResult AnswerSynchro();
  mozilla::ipc::IPCResult RecvCompressedSpam(const uint32_t& seqno);
  mozilla::ipc::IPCResult AnswerSynchro2(uint32_t* lastSeqno,
                                         uint32_t* numMessagesDispatched);

  virtual void ActorDestroy(ActorDestroyReason why) override {
    if (NormalShutdown != why) fail("unexpected destruction!");
    QuitChild();
  }

  uint32_t mLastSeqno;
  uint32_t mNumProcessedCompressedSpams;
  uint32_t mWhichPing5;
};

}  // namespace _ipdltest
}  // namespace mozilla

#endif  // ifndef mozilla__ipdltest_TestLatency_h