summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/cxx/TestStackHooks.h
blob: c26d5f937efa5bbcacf98f258dd6b93720fb5afd (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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#ifndef mozilla__ipdltest_TestStackHooks_h
#define mozilla__ipdltest_TestStackHooks_h 1

#include "mozilla/_ipdltest/IPDLUnitTests.h"

#include "mozilla/_ipdltest/PTestStackHooksParent.h"
#include "mozilla/_ipdltest/PTestStackHooksChild.h"

namespace mozilla {
namespace _ipdltest {


class TestStackHooksParent :
    public PTestStackHooksParent
{
public:
    TestStackHooksParent();
    virtual ~TestStackHooksParent();

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

    void Main();

protected:    
    virtual bool RecvAsync() override {
        if (!mOnStack)
            fail("not on C++ stack?!");
        return true;
    }

    virtual bool RecvSync() override {
        if (!mOnStack)
            fail("not on C++ stack?!");
        return true;
    }

    virtual bool AnswerRpc() override {
        if (!mOnStack)
            fail("not on C++ stack?!");
        return true;
    }

    virtual bool AnswerStackFrame() override;

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

    virtual void EnteredCxxStack() override {
        mOnStack = true;
    }
    virtual void ExitedCxxStack() override {
        mOnStack = false;
    }

    virtual void EnteredCall() override {
        ++mIncallDepth;
    }
    virtual void ExitedCall() override {
        --mIncallDepth;
    }

private:
    bool mOnStack;
    int mIncallDepth;
};


class TestStackHooksChild :
    public PTestStackHooksChild
{
public:
    TestStackHooksChild();
    virtual ~TestStackHooksChild();

    void RunTests();

protected:
    virtual bool RecvStart() override;

    virtual bool AnswerStackFrame() override;

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

        if (mEntered != mExited)
            fail("unbalanced enter/exit notifications");

        if (mOnStack)
            fail("computing mOnStack went awry; should have failed above assertion");

        QuitChild();
    }

    virtual void EnteredCxxStack() override {
        ++mEntered;
        mOnStack = true;
    }
    virtual void ExitedCxxStack() override {
        ++mExited;
        mOnStack = false;
    }

    virtual void EnteredCall() override {
        ++mIncallDepth;
    }
    virtual void ExitedCall() override {
        --mIncallDepth;
    }

private:
    bool mOnStack;
    int mEntered;
    int mExited;
    int mIncallDepth;
};


} // namespace _ipdltest
} // namespace mozilla


#endif // ifndef mozilla__ipdltest_TestStackHooks_h