|
1 # Copyright (c) 2012 The Chromium 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 import android_commands |
|
6 import constants |
|
7 import logging |
|
8 import os |
|
9 import subprocess |
|
10 import time |
|
11 |
|
12 |
|
13 class FakeDns(object): |
|
14 """Wrapper class for the fake_dns tool.""" |
|
15 _FAKE_DNS_PATH = constants.TEST_EXECUTABLE_DIR + '/fake_dns' |
|
16 |
|
17 def __init__(self, adb, build_type): |
|
18 """ |
|
19 Args: |
|
20 adb: the AndroidCommands to use. |
|
21 build_type: 'Release' or 'Debug'. |
|
22 """ |
|
23 self._adb = adb |
|
24 self._build_type = build_type |
|
25 self._fake_dns = None |
|
26 self._original_dns = None |
|
27 |
|
28 def _PushAndStartFakeDns(self): |
|
29 """Starts the fake_dns server that replies all name queries 127.0.0.1. |
|
30 |
|
31 Returns: |
|
32 subprocess instance connected to the fake_dns process on the device. |
|
33 """ |
|
34 self._adb.PushIfNeeded( |
|
35 os.path.join(constants.CHROME_DIR, 'out', self._build_type, 'fake_dns'), |
|
36 FakeDns._FAKE_DNS_PATH) |
|
37 return subprocess.Popen( |
|
38 ['adb', '-s', self._adb._adb.GetSerialNumber(), |
|
39 'shell', '%s -D' % FakeDns._FAKE_DNS_PATH]) |
|
40 |
|
41 def SetUp(self): |
|
42 """Configures the system to point to a DNS server that replies 127.0.0.1. |
|
43 |
|
44 This can be used in combination with the forwarder to forward all web |
|
45 traffic to a replay server. |
|
46 |
|
47 The TearDown() method will perform all cleanup. |
|
48 """ |
|
49 self._adb.RunShellCommand('ip route add 8.8.8.0/24 via 127.0.0.1 dev lo') |
|
50 self._fake_dns = self._PushAndStartFakeDns() |
|
51 self._original_dns = self._adb.RunShellCommand('getprop net.dns1')[0] |
|
52 self._adb.RunShellCommand('setprop net.dns1 127.0.0.1') |
|
53 time.sleep(2) # Time for server to start and the setprop to take effect. |
|
54 |
|
55 def TearDown(self): |
|
56 """Shuts down the fake_dns.""" |
|
57 if self._fake_dns: |
|
58 if not self._original_dns or self._original_dns == '127.0.0.1': |
|
59 logging.warning('Bad original DNS, falling back to Google DNS.') |
|
60 self._original_dns = '8.8.8.8' |
|
61 self._adb.RunShellCommand('setprop net.dns1 %s' % self._original_dns) |
|
62 self._fake_dns.kill() |
|
63 self._adb.RunShellCommand('ip route del 8.8.8.0/24 via 127.0.0.1 dev lo') |