Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/media/gtest/TestGMPCrossOrigin.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "gtest/gtest.h"
8
#include "nsIObserverService.h"
9
#include "mozilla/Services.h"
10
#include "mozilla/StaticPtr.h"
11
#include "GMPTestMonitor.h"
12
#include "GMPVideoDecoderProxy.h"
13
#include "GMPVideoEncoderProxy.h"
14
#include "GMPServiceParent.h"
15
#include "nsAppDirectoryServiceDefs.h"
16
#include "mozilla/Atomics.h"
17
#include "mozilla/DebugOnly.h"
18
#include "nsThreadUtils.h"
19
20
using namespace std;
21
22
using namespace mozilla;
23
using namespace mozilla::gmp;
24
25
struct GMPTestRunner
26
{
27
  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPTestRunner)
28
29
0
  GMPTestRunner() {}
30
  void DoTest(void (GMPTestRunner::*aTestMethod)(GMPTestMonitor&));
31
  void RunTestGMPTestCodec1(GMPTestMonitor& aMonitor);
32
  void RunTestGMPTestCodec2(GMPTestMonitor& aMonitor);
33
  void RunTestGMPTestCodec3(GMPTestMonitor& aMonitor);
34
  void RunTestGMPCrossOrigin1(GMPTestMonitor& aMonitor);
35
  void RunTestGMPCrossOrigin2(GMPTestMonitor& aMonitor);
36
  void RunTestGMPCrossOrigin3(GMPTestMonitor& aMonitor);
37
  void RunTestGMPCrossOrigin4(GMPTestMonitor& aMonitor);
38
39
private:
40
0
  ~GMPTestRunner() { }
41
};
42
43
template<class T, class Base,
44
         nsresult (NS_STDCALL GeckoMediaPluginService::*Getter)(GMPCrashHelper*,
45
                                                                nsTArray<nsCString>*,
46
                                                                const nsACString&,
47
                                                                UniquePtr<Base>&&)>
48
class RunTestGMPVideoCodec : public Base
49
{
50
public:
51
  void Done(T* aGMP, GMPVideoHost* aHost) override
52
0
  {
53
0
    EXPECT_TRUE(aGMP);
54
0
    EXPECT_TRUE(aHost);
55
0
    if (aGMP) {
56
0
      aGMP->Close();
57
0
    }
58
0
    mMonitor.SetFinished();
59
0
  }
Unexecuted instantiation: RunTestGMPVideoCodec<GMPVideoDecoderProxy, GMPVideoGetterCallback<GMPVideoDecoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoDecoder>::Done(GMPVideoDecoderProxy*, GMPVideoHost*)
Unexecuted instantiation: RunTestGMPVideoCodec<GMPVideoEncoderProxy, GMPVideoGetterCallback<GMPVideoEncoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoEncoder>::Done(GMPVideoEncoderProxy*, GMPVideoHost*)
60
61
  static void Run(GMPTestMonitor& aMonitor, const nsCString& aOrigin)
62
0
  {
63
0
    UniquePtr<GMPCallbackType> callback(new RunTestGMPVideoCodec(aMonitor));
64
0
    Get(aOrigin, std::move(callback));
65
0
  }
Unexecuted instantiation: RunTestGMPVideoCodec<GMPVideoDecoderProxy, GMPVideoGetterCallback<GMPVideoDecoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoDecoder>::Run(GMPTestMonitor&, nsTString<char> const&)
Unexecuted instantiation: RunTestGMPVideoCodec<GMPVideoEncoderProxy, GMPVideoGetterCallback<GMPVideoEncoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoEncoder>::Run(GMPTestMonitor&, nsTString<char> const&)
66
67
protected:
68
  typedef T GMPCodecType;
69
  typedef Base GMPCallbackType;
70
71
  explicit RunTestGMPVideoCodec(GMPTestMonitor& aMonitor)
72
    : mMonitor(aMonitor)
73
0
  {
74
0
  }
Unexecuted instantiation: RunTestGMPVideoCodec<GMPVideoDecoderProxy, GMPVideoGetterCallback<GMPVideoDecoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoDecoder>::RunTestGMPVideoCodec(GMPTestMonitor&)
Unexecuted instantiation: RunTestGMPVideoCodec<GMPVideoEncoderProxy, GMPVideoGetterCallback<GMPVideoEncoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoEncoder>::RunTestGMPVideoCodec(GMPTestMonitor&)
75
76
  static nsresult Get(const nsACString& aNodeId, UniquePtr<Base>&& aCallback)
77
0
  {
78
0
    nsTArray<nsCString> tags;
79
0
    tags.AppendElement(NS_LITERAL_CSTRING("h264"));
80
0
    tags.AppendElement(NS_LITERAL_CSTRING("fake"));
81
0
82
0
    RefPtr<GeckoMediaPluginService> service =
83
0
      GeckoMediaPluginService::GetGeckoMediaPluginService();
84
0
    return ((*service).*Getter)(nullptr, &tags, aNodeId, std::move(aCallback));
85
0
  }
Unexecuted instantiation: RunTestGMPVideoCodec<GMPVideoDecoderProxy, GMPVideoGetterCallback<GMPVideoDecoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoDecoder>::Get(nsTSubstring<char> const&, mozilla::UniquePtr<GMPVideoGetterCallback<GMPVideoDecoderProxy>, mozilla::DefaultDelete<GMPVideoGetterCallback<GMPVideoDecoderProxy> > >&&)
Unexecuted instantiation: RunTestGMPVideoCodec<GMPVideoEncoderProxy, GMPVideoGetterCallback<GMPVideoEncoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoEncoder>::Get(nsTSubstring<char> const&, mozilla::UniquePtr<GMPVideoGetterCallback<GMPVideoEncoderProxy>, mozilla::DefaultDelete<GMPVideoGetterCallback<GMPVideoEncoderProxy> > >&&)
86
87
protected:
88
  GMPTestMonitor& mMonitor;
89
};
90
91
typedef RunTestGMPVideoCodec<GMPVideoDecoderProxy,
92
                             GetGMPVideoDecoderCallback,
93
                             &GeckoMediaPluginService::GetGMPVideoDecoder>
94
  RunTestGMPVideoDecoder;
95
typedef RunTestGMPVideoCodec<GMPVideoEncoderProxy,
96
                             GetGMPVideoEncoderCallback,
97
                             &GeckoMediaPluginService::GetGMPVideoEncoder>
98
  RunTestGMPVideoEncoder;
99
100
void
101
GMPTestRunner::RunTestGMPTestCodec1(GMPTestMonitor& aMonitor)
102
0
{
103
0
  RunTestGMPVideoDecoder::Run(aMonitor, NS_LITERAL_CSTRING("o"));
104
0
}
105
106
void
107
GMPTestRunner::RunTestGMPTestCodec2(GMPTestMonitor& aMonitor)
108
0
{
109
0
  RunTestGMPVideoDecoder::Run(aMonitor, NS_LITERAL_CSTRING(""));
110
0
}
111
112
void
113
GMPTestRunner::RunTestGMPTestCodec3(GMPTestMonitor& aMonitor)
114
0
{
115
0
  RunTestGMPVideoEncoder::Run(aMonitor, NS_LITERAL_CSTRING(""));
116
0
}
117
118
template<class Base>
119
class RunTestGMPCrossOrigin : public Base
120
{
121
public:
122
  void Done(typename Base::GMPCodecType* aGMP, GMPVideoHost* aHost) override
123
0
  {
124
0
    EXPECT_TRUE(aGMP);
125
0
126
0
    UniquePtr<typename Base::GMPCallbackType> callback(
127
0
      new Step2(Base::mMonitor, aGMP, mShouldBeEqual));
128
0
    nsresult rv = Base::Get(mOrigin2, std::move(callback));
129
0
    EXPECT_TRUE(NS_SUCCEEDED(rv));
130
0
    if (NS_FAILED(rv)) {
131
0
      Base::mMonitor.SetFinished();
132
0
    }
133
0
  }
Unexecuted instantiation: RunTestGMPCrossOrigin<RunTestGMPVideoCodec<GMPVideoDecoderProxy, GMPVideoGetterCallback<GMPVideoDecoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoDecoder> >::Done(GMPVideoDecoderProxy*, GMPVideoHost*)
Unexecuted instantiation: RunTestGMPCrossOrigin<RunTestGMPVideoCodec<GMPVideoEncoderProxy, GMPVideoGetterCallback<GMPVideoEncoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoEncoder> >::Done(GMPVideoEncoderProxy*, GMPVideoHost*)
134
135
  static void Run(GMPTestMonitor& aMonitor, const nsCString& aOrigin1,
136
                  const nsCString& aOrigin2)
137
0
  {
138
0
    UniquePtr<typename Base::GMPCallbackType> callback(
139
0
      new RunTestGMPCrossOrigin<Base>(aMonitor, aOrigin1, aOrigin2));
140
0
    nsresult rv = Base::Get(aOrigin1, std::move(callback));
141
0
    EXPECT_TRUE(NS_SUCCEEDED(rv));
142
0
    if (NS_FAILED(rv)) {
143
0
      aMonitor.SetFinished();
144
0
    }
145
0
  }
Unexecuted instantiation: RunTestGMPCrossOrigin<RunTestGMPVideoCodec<GMPVideoDecoderProxy, GMPVideoGetterCallback<GMPVideoDecoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoDecoder> >::Run(GMPTestMonitor&, nsTString<char> const&, nsTString<char> const&)
Unexecuted instantiation: RunTestGMPCrossOrigin<RunTestGMPVideoCodec<GMPVideoEncoderProxy, GMPVideoGetterCallback<GMPVideoEncoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoEncoder> >::Run(GMPTestMonitor&, nsTString<char> const&, nsTString<char> const&)
146
147
private:
148
  RunTestGMPCrossOrigin(GMPTestMonitor& aMonitor, const nsCString& aOrigin1,
149
                        const nsCString& aOrigin2)
150
    : Base(aMonitor),
151
      mGMP(nullptr),
152
      mOrigin2(aOrigin2),
153
      mShouldBeEqual(aOrigin1.Equals(aOrigin2))
154
0
  {
155
0
  }
Unexecuted instantiation: RunTestGMPCrossOrigin<RunTestGMPVideoCodec<GMPVideoDecoderProxy, GMPVideoGetterCallback<GMPVideoDecoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoDecoder> >::RunTestGMPCrossOrigin(GMPTestMonitor&, nsTString<char> const&, nsTString<char> const&)
Unexecuted instantiation: RunTestGMPCrossOrigin<RunTestGMPVideoCodec<GMPVideoEncoderProxy, GMPVideoGetterCallback<GMPVideoEncoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoEncoder> >::RunTestGMPCrossOrigin(GMPTestMonitor&, nsTString<char> const&, nsTString<char> const&)
156
157
  class Step2 : public Base
158
  {
159
  public:
160
    Step2(GMPTestMonitor& aMonitor,
161
          typename Base::GMPCodecType* aGMP,
162
          bool aShouldBeEqual)
163
      : Base(aMonitor),
164
        mGMP(aGMP),
165
        mShouldBeEqual(aShouldBeEqual)
166
0
    {
167
0
    }
Unexecuted instantiation: RunTestGMPCrossOrigin<RunTestGMPVideoCodec<GMPVideoDecoderProxy, GMPVideoGetterCallback<GMPVideoDecoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoDecoder> >::Step2::Step2(GMPTestMonitor&, GMPVideoDecoderProxy*, bool)
Unexecuted instantiation: RunTestGMPCrossOrigin<RunTestGMPVideoCodec<GMPVideoEncoderProxy, GMPVideoGetterCallback<GMPVideoEncoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoEncoder> >::Step2::Step2(GMPTestMonitor&, GMPVideoEncoderProxy*, bool)
168
    void Done(typename Base::GMPCodecType* aGMP, GMPVideoHost* aHost) override
169
0
    {
170
0
      EXPECT_TRUE(aGMP);
171
0
      if (aGMP) {
172
0
        EXPECT_TRUE(mGMP &&
173
0
                    (mGMP->GetPluginId() == aGMP->GetPluginId()) == mShouldBeEqual);
174
0
      }
175
0
      if (mGMP) {
176
0
        mGMP->Close();
177
0
      }
178
0
      Base::Done(aGMP, aHost);
179
0
    }
Unexecuted instantiation: RunTestGMPCrossOrigin<RunTestGMPVideoCodec<GMPVideoDecoderProxy, GMPVideoGetterCallback<GMPVideoDecoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoDecoder> >::Step2::Done(GMPVideoDecoderProxy*, GMPVideoHost*)
Unexecuted instantiation: RunTestGMPCrossOrigin<RunTestGMPVideoCodec<GMPVideoEncoderProxy, GMPVideoGetterCallback<GMPVideoEncoderProxy>, &mozilla::gmp::GeckoMediaPluginService::GetGMPVideoEncoder> >::Step2::Done(GMPVideoEncoderProxy*, GMPVideoHost*)
180
181
  private:
182
    typename Base::GMPCodecType* mGMP;
183
    bool mShouldBeEqual;
184
  };
185
186
  typename Base::GMPCodecType* mGMP;
187
  nsCString mOrigin2;
188
  bool mShouldBeEqual;
189
};
190
191
typedef RunTestGMPCrossOrigin<RunTestGMPVideoDecoder>
192
  RunTestGMPVideoDecoderCrossOrigin;
193
typedef RunTestGMPCrossOrigin<RunTestGMPVideoEncoder>
194
  RunTestGMPVideoEncoderCrossOrigin;
195
196
void
197
GMPTestRunner::RunTestGMPCrossOrigin1(GMPTestMonitor& aMonitor)
198
0
{
199
0
  RunTestGMPVideoDecoderCrossOrigin::Run(
200
0
    aMonitor, NS_LITERAL_CSTRING("origin1"), NS_LITERAL_CSTRING("origin2"));
201
0
}
202
203
void
204
GMPTestRunner::RunTestGMPCrossOrigin2(GMPTestMonitor& aMonitor)
205
0
{
206
0
  RunTestGMPVideoEncoderCrossOrigin::Run(
207
0
    aMonitor, NS_LITERAL_CSTRING("origin1"), NS_LITERAL_CSTRING("origin2"));
208
0
}
209
210
void
211
GMPTestRunner::RunTestGMPCrossOrigin3(GMPTestMonitor& aMonitor)
212
0
{
213
0
  RunTestGMPVideoDecoderCrossOrigin::Run(
214
0
    aMonitor, NS_LITERAL_CSTRING("origin1"), NS_LITERAL_CSTRING("origin1"));
215
0
}
216
217
void
218
GMPTestRunner::RunTestGMPCrossOrigin4(GMPTestMonitor& aMonitor)
219
0
{
220
0
  RunTestGMPVideoEncoderCrossOrigin::Run(
221
0
    aMonitor, NS_LITERAL_CSTRING("origin1"), NS_LITERAL_CSTRING("origin1"));
222
0
}
223
224
void
225
GMPTestRunner::DoTest(void (GMPTestRunner::*aTestMethod)(GMPTestMonitor&))
226
0
{
227
0
  RefPtr<GeckoMediaPluginService> service =
228
0
    GeckoMediaPluginService::GetGeckoMediaPluginService();
229
0
  nsCOMPtr<nsIThread> thread;
230
0
  EXPECT_TRUE(NS_SUCCEEDED(service->GetThread(getter_AddRefs(thread))));
231
0
232
0
  GMPTestMonitor monitor;
233
0
  thread->Dispatch(NewRunnableMethod<GMPTestMonitor&>(
234
0
                     "GMPTestRunner::DoTest", this, aTestMethod, monitor),
235
0
                   NS_DISPATCH_NORMAL);
236
0
  monitor.AwaitFinished();
237
0
}
238
239
0
TEST(GeckoMediaPlugins, GMPTestCodec) {
240
0
  RefPtr<GMPTestRunner> runner = new GMPTestRunner();
241
0
  runner->DoTest(&GMPTestRunner::RunTestGMPTestCodec1);
242
0
  runner->DoTest(&GMPTestRunner::RunTestGMPTestCodec2);
243
0
  runner->DoTest(&GMPTestRunner::RunTestGMPTestCodec3);
244
0
}
245
246
0
TEST(GeckoMediaPlugins, GMPCrossOrigin) {
247
0
  RefPtr<GMPTestRunner> runner = new GMPTestRunner();
248
0
  runner->DoTest(&GMPTestRunner::RunTestGMPCrossOrigin1);
249
0
  runner->DoTest(&GMPTestRunner::RunTestGMPCrossOrigin2);
250
0
  runner->DoTest(&GMPTestRunner::RunTestGMPCrossOrigin3);
251
0
  runner->DoTest(&GMPTestRunner::RunTestGMPCrossOrigin4);
252
0
}