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 5import android_commands 6import constants 7import logging 8import os 9import subprocess 10import time 11 12 13class 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') 64