Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/netwerk/test/gtest/TestPACMan.cpp
Line
Count
Source (jump to first uncovered line)
1
#include "gtest/gtest.h"
2
#include "nsServiceManagerUtils.h"
3
#include "../../../xpcom/threads/nsThreadManager.h"
4
#include "nsIDHCPClient.h"
5
#include "nsIPrefBranch.h"
6
#include "nsComponentManager.h"
7
#include "mozilla/ModuleUtils.h"
8
#include "../../base/nsPACMan.h"
9
10
11
0
#define TEST_WPAD_DHCP_OPTION "http://pac/pac.dat"
12
0
#define TEST_ASSIGNED_PAC_URL "http://assignedpac/pac.dat"
13
#define WPAD_PREF 4
14
0
#define NETWORK_PROXY_TYPE_PREF_NAME "network.proxy.type"
15
0
#define GETTING_NETWORK_PROXY_TYPE_FAILED -1
16
17
nsCString WPADOptionResult;
18
19
namespace mozilla {
20
namespace net {
21
22
nsresult
23
SetNetworkProxyType(int32_t pref)
24
0
{
25
0
  nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
26
0
27
0
  if (!prefs) {
28
0
    return NS_ERROR_FACTORY_NOT_REGISTERED;
29
0
  }
30
0
  return prefs->SetIntPref(NETWORK_PROXY_TYPE_PREF_NAME, pref);
31
0
}
32
33
nsresult
34
GetNetworkProxyType(int32_t* pref)
35
0
{
36
0
  nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
37
0
38
0
  if (!prefs) {
39
0
    return NS_ERROR_FACTORY_NOT_REGISTERED;
40
0
  }
41
0
  return prefs->GetIntPref(NETWORK_PROXY_TYPE_PREF_NAME, pref);
42
0
}
43
44
class nsTestDHCPClient final : public nsIDHCPClient
45
{
46
public:
47
  NS_DECL_THREADSAFE_ISUPPORTS
48
  NS_DECL_NSIDHCPCLIENT
49
50
0
  nsTestDHCPClient() {};
51
0
  nsresult Init(){
52
0
    return NS_OK;
53
0
  };
54
55
private:
56
0
   ~nsTestDHCPClient() {};
57
};
58
59
NS_IMETHODIMP
60
nsTestDHCPClient::GetOption(uint8_t option, nsACString & _retval)
61
0
{
62
0
  _retval.Assign(WPADOptionResult);
63
0
  return NS_OK;
64
0
}
65
66
NS_IMPL_ISUPPORTS(nsTestDHCPClient, nsIDHCPClient)
67
68
#define NS_TESTDHCPCLIENTSERVICE_CID  /* {FEBF1D69-4D7D-4891-9524-045AD18B5592} */\
69
    { 0xFEBF1D69, 0x4D7D, 0x4891, \
70
         {0x95, 0x24, 0x04, 0x5a, 0xd1, 0x8b, 0x55, 0x92 } }
71
72
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsTestDHCPClient, Init)
73
NS_DEFINE_NAMED_CID(NS_TESTDHCPCLIENTSERVICE_CID);
74
75
static const mozilla::Module::CIDEntry kSysDHCPClientCIDs[] = {
76
  { &kNS_TESTDHCPCLIENTSERVICE_CID, false, nullptr, nsTestDHCPClientConstructor },
77
  { nullptr }
78
};
79
80
static const mozilla::Module::ContractIDEntry kSysDHCPClientContracts[] = {
81
  { NS_DHCPCLIENT_CONTRACTID, &kNS_TESTDHCPCLIENTSERVICE_CID },
82
  { nullptr }
83
};
84
85
static const mozilla::Module kSysDHCPClientModule = {
86
  mozilla::Module::kVersion,
87
  kSysDHCPClientCIDs,
88
  kSysDHCPClientContracts
89
};
90
91
NSMODULE_DEFN(nsDHCPClientModule) = &kSysDHCPClientModule;
92
93
void
94
SetOptionResult(const char* result)
95
0
{
96
0
  WPADOptionResult.Assign(result);
97
0
}
98
99
class ProcessPendingEventsAction final : public Runnable
100
{
101
public:
102
0
  ProcessPendingEventsAction() : Runnable("net::ProcessPendingEventsAction") { }
103
104
  NS_IMETHOD
105
  Run() override
106
0
  {
107
0
    if (NS_HasPendingEvents(nullptr)) {
108
0
      NS_WARNING("Found pending requests on PAC thread");
109
0
      nsresult rv;
110
0
      rv = NS_ProcessPendingEvents(nullptr);
111
0
      EXPECT_EQ(NS_OK, rv);
112
0
    }
113
0
    NS_WARNING("No pending requests on PAC thread");
114
0
    return NS_OK;
115
0
  }
116
};
117
118
class TestPACMan : public ::testing::Test {
119
  protected:
120
121
    RefPtr<nsPACMan> mPACMan;
122
123
    void
124
    ProcessAllEvents()
125
0
    {
126
0
      ProcessPendingEventsOnPACThread();
127
0
      nsresult rv;
128
0
      while (NS_HasPendingEvents(nullptr)) {
129
0
        NS_WARNING("Pending events on main thread");
130
0
        rv = NS_ProcessPendingEvents(nullptr);
131
0
        ASSERT_EQ(NS_OK, rv);
132
0
        ProcessPendingEventsOnPACThread();
133
0
      }
134
0
      NS_WARNING("End of pending events on main thread");
135
0
    }
136
137
138
    // This method is used to ensure that all pending events on the main thread
139
    // and the Proxy thread are processsed.
140
    // It iterates over ProcessAllEvents because simply calling ProcessAllEvents once
141
    // did not reliably process the events on both threads on all platforms.
142
    void
143
0
    ProcessAllEventsTenTimes(){
144
0
      for (int i = 0; i < 10; i++) {
145
0
        ProcessAllEvents();
146
0
      }
147
0
    }
148
149
    virtual void
150
    SetUp()
151
0
    {
152
0
      ASSERT_EQ(NS_OK, GetNetworkProxyType(&originalNetworkProxyTypePref));
153
0
      nsFactoryEntry* factoryEntry = nsComponentManagerImpl::gComponentManager
154
0
          ->GetFactoryEntry(kNS_TESTDHCPCLIENTSERVICE_CID);
155
0
      if (factoryEntry) {
156
0
        nsresult rv = nsComponentManagerImpl::gComponentManager->UnregisterFactory(kNS_TESTDHCPCLIENTSERVICE_CID, factoryEntry->mFactory);
157
0
        ASSERT_EQ(NS_OK, rv);
158
0
      }
159
0
      nsComponentManagerImpl::gComponentManager->RegisterModule(&kSysDHCPClientModule, nullptr);
160
0
161
0
      mPACMan = new nsPACMan(nullptr);
162
0
      mPACMan->SetWPADOverDHCPEnabled(true);
163
0
      mPACMan->Init(nullptr);
164
0
      ASSERT_EQ(NS_OK, SetNetworkProxyType(WPAD_PREF));
165
0
166
0
    }
167
168
    virtual void
169
    TearDown()
170
0
    {
171
0
172
0
      mPACMan->Shutdown();
173
0
      if (originalNetworkProxyTypePref != GETTING_NETWORK_PROXY_TYPE_FAILED) {
174
0
        ASSERT_EQ(NS_OK, SetNetworkProxyType(originalNetworkProxyTypePref));
175
0
      }
176
0
    }
177
178
    nsCOMPtr<nsIDHCPClient>
179
    GetPACManDHCPCient()
180
0
    {
181
0
      return mPACMan->mDHCPClient;
182
0
    }
183
184
    void
185
    SetPACManDHCPCient(nsCOMPtr<nsIDHCPClient> aValue)
186
0
    {
187
0
       mPACMan->mDHCPClient = aValue;
188
0
    }
189
190
    void
191
    AssertPACSpecEqualTo(const char* aExpected)
192
0
    {
193
0
      ASSERT_STREQ(aExpected, mPACMan->mPACURISpec.Data());
194
0
    }
195
196
  private:
197
198
    int32_t originalNetworkProxyTypePref = GETTING_NETWORK_PROXY_TYPE_FAILED;
199
200
0
    void ProcessPendingEventsOnPACThread(){
201
0
      RefPtr<ProcessPendingEventsAction> action =
202
0
          new ProcessPendingEventsAction();
203
0
204
0
      mPACMan->DispatchToPAC(action.forget(), /*aSync =*/ true);
205
0
    }
206
};
207
208
0
TEST_F(TestPACMan, TestCreateDHCPClientAndGetOption) {
209
0
  SetOptionResult(TEST_WPAD_DHCP_OPTION);
210
0
  nsCString spec;
211
0
212
0
  GetPACManDHCPCient()->GetOption(252, spec);
213
0
214
0
  ASSERT_STREQ(TEST_WPAD_DHCP_OPTION, spec.Data());
215
0
}
216
217
0
TEST_F(TestPACMan, TestCreateDHCPClientAndGetEmptyOption) {
218
0
  SetOptionResult("");
219
0
  nsCString spec;
220
0
  spec.AssignLiteral(TEST_ASSIGNED_PAC_URL);
221
0
222
0
  GetPACManDHCPCient()->GetOption(252, spec);
223
0
224
0
  ASSERT_TRUE(spec.IsEmpty());
225
0
}
226
227
0
TEST_F(TestPACMan, WhenTheDHCPClientExistsAndDHCPIsNonEmptyDHCPOptionIsUsedAsPACUri) {
228
0
  SetOptionResult(TEST_WPAD_DHCP_OPTION);
229
0
230
0
  mPACMan->LoadPACFromURI(EmptyCString());
231
0
  ProcessAllEventsTenTimes();
232
0
233
0
  ASSERT_STREQ(TEST_WPAD_DHCP_OPTION, WPADOptionResult.Data());
234
0
  AssertPACSpecEqualTo(TEST_WPAD_DHCP_OPTION);
235
0
}
236
237
0
TEST_F(TestPACMan, WhenTheDHCPResponseIsEmptyWPADDefaultsToStandardURL) {
238
0
  SetOptionResult(EmptyCString().Data());
239
0
240
0
  mPACMan->LoadPACFromURI(EmptyCString());
241
0
  ASSERT_TRUE(NS_HasPendingEvents(nullptr));
242
0
  ProcessAllEventsTenTimes();
243
0
244
0
  ASSERT_STREQ("", WPADOptionResult.Data());
245
0
  AssertPACSpecEqualTo("http://wpad/wpad.dat");
246
0
}
247
248
0
TEST_F(TestPACMan, WhenThereIsNoDHCPClientWPADDefaultsToStandardURL) {
249
0
  SetOptionResult(TEST_WPAD_DHCP_OPTION);
250
0
  SetPACManDHCPCient(nullptr);
251
0
252
0
  mPACMan->LoadPACFromURI(EmptyCString());
253
0
  ProcessAllEventsTenTimes();
254
0
255
0
  ASSERT_STREQ(TEST_WPAD_DHCP_OPTION, WPADOptionResult.Data());
256
0
  AssertPACSpecEqualTo("http://wpad/wpad.dat");
257
0
}
258
259
0
TEST_F(TestPACMan, WhenWPADOverDHCPIsPreffedOffWPADDefaultsToStandardURL) {
260
0
  SetOptionResult(TEST_WPAD_DHCP_OPTION);
261
0
  mPACMan->SetWPADOverDHCPEnabled(false);
262
0
263
0
  mPACMan->LoadPACFromURI(EmptyCString());
264
0
  ProcessAllEventsTenTimes();
265
0
266
0
  ASSERT_STREQ(TEST_WPAD_DHCP_OPTION, WPADOptionResult.Data());
267
0
  AssertPACSpecEqualTo("http://wpad/wpad.dat");
268
0
}
269
270
0
TEST_F(TestPACMan, WhenPACUriIsSetDirectlyItIsUsedRatherThanWPAD) {
271
0
  SetOptionResult(TEST_WPAD_DHCP_OPTION);
272
0
  nsCString spec;
273
0
  spec.AssignLiteral(TEST_ASSIGNED_PAC_URL);
274
0
275
0
  mPACMan->LoadPACFromURI(spec);
276
0
  ProcessAllEventsTenTimes();
277
0
278
0
  AssertPACSpecEqualTo(TEST_ASSIGNED_PAC_URL);
279
0
}
280
281
} // namespace net
282
} // namespace mozilla