1 #!/usr/bin/env python 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 6 import chromium_proxy_server_ex 7 import commands 8 import logging 9 import optparse 10 import os 11 import re 12 import selenium.selenium 13 import shutil 14 import subprocess 15 import sys 16 import tempfile 17 import time 18 import unittest 19 import _winreg 20 import selenium.webdriver.common.keys 21 22 from selenium import webdriver 23 from selenium.webdriver.common.keys import Keys as Keys 24 from selenium.webdriver.support.ui import WebDriverWait 25 26 class RlzTest(unittest.TestCase): 27 28 proxy_server_file = '' 29 chrome_driver_path = '' 30 31 def setUp(self): 32 """Performs necessary setup work before running each test in this class.""" 33 # Delete RLZ key Folder 34 self.deleteRegistryKey() 35 # Launch Proxy Server 36 print ('Serving clients: 127.0.0.1') 37 self.proxy_server = subprocess.Popen([ 38 'python', 39 RlzTest.proxy_server_file, 40 '--client=127.0.0.1', 41 '--port=8080', 42 '--urls=http://clients1.google.com/tools/pso/ping,www.google.com']) 43 print('\nLaunching Chrome...') 44 # Launch chrome and set proxy. 45 self.temp_data_dir = tempfile.mkdtemp() 46 self.launchChrome(self.temp_data_dir) 47 48 def tearDown(self): 49 """Kills the chrome driver after after the test method has been called.""" 50 # Terminate the chrome driver. 51 print '\nTerminating Chrome Driver...' 52 self.driver.quit() 53 54 # Kill proxy server. 55 print '\nKilling Proxy Server...' 56 subprocess.Popen.kill(self.proxy_server) 57 58 # Delete temp profile directory 59 try: 60 shutil.rmtree(self.temp_data_dir) # delete directory 61 except OSError, e: 62 if e.errno != 2: # code 2 - no such file or directory 63 raise 64 65 def launchChrome(self, data_directory): 66 """Launch chrome using chrome driver. 67 68 Args: 69 data_directory: Temp directory to store preference data. 70 """ 71 service = webdriver.chrome.service.Service(RlzTest.chrome_driver_path) 72 service.start() 73 self.driver = webdriver.Remote( 74 service.service_url, { 75 'proxy': {'proxyType': 'manual', 'httpProxy': 'localhost:8080'}, 76 'chrome.nativeEvents': True, 77 'chrome.switches': ['disable-extensions', 78 r'user-data-dir=' + data_directory]}) 79 80 def deleteRegistryKey(self): 81 """Delete RLZ key Folder from win registry.""" 82 try: 83 hkey = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 84 'Software\\Google\\Common\\Rlz') 85 except _winreg.error, err: 86 return True 87 if(hkey): 88 _winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, 89 'Software\\Google\\Common\\Rlz\\Events\\C') 90 _winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, 91 'Software\\Google\\Common\\Rlz\\StatefulEvents\\C') 92 _winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, 93 'Software\\Google\\Common\\Rlz\\Events') 94 _winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, 95 'Software\\Google\\Common\\Rlz\\StatefulEvents') 96 _winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, 97 'Software\\Google\\Common\\Rlz\\PTimes') 98 _winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, 99 'Software\\Google\\Common\\Rlz\\RLZs') 100 _winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, 101 'Software\\Google\\Common\\Rlz') 102 103 def GetKeyValueNames(self, key, subkey): 104 """Get the values for particular subkey 105 106 Args: 107 key: Key is one of the predefined HKEY_* constants. 108 subkey: It is a string that identifies the sub_key to delete. 109 """ 110 list_names = [] 111 counter = 0 112 try: 113 hkey = _winreg.OpenKey(key, subkey) 114 except _winreg.error, err: 115 return -1 116 while True: 117 try: 118 value = _winreg.EnumValue(hkey, counter) 119 list_names.append(value[0]) 120 counter += 1 121 except _winreg.error: 122 break 123 hkey.Close() 124 return list_names 125 126 def _AssertEventsInPing(self, log_file, excepted_event_list, readFile=1): 127 """ Asserts events in ping appended. 128 129 Args: 130 contents: String variable contains contents of log file. 131 excepted_event_list: List of expected events in ping. 132 readFile: Reading order for file. Default is 1 (Top to Bottom). 133 """ 134 for line in log_file[::readFile]: 135 if(re.search('events=', line)): 136 event_start = line.find('events=') 137 event_end = line.find('&rep', event_start) 138 events = line[event_start + 7 : event_end] 139 events_List = events.split(',') 140 print 'event_list',events_List 141 break 142 # Validate events in url ping. 143 for event in excepted_event_list: 144 self.assertTrue(event in events_List) 145 # Validate brand code in url ping. 146 self.assertTrue(re.search('CHMZ', line)) 147 # Print first chrome launch ping on Console. 148 start = line.find('http://clients1.google.com/tools/'+ 149 'pso/ping?as=chrome&brand=CHMZ') 150 end = line.find('http://www', start) 151 print '\nChrome Launch ping sent :\n', line[start:end] 152 153 154 def _AssertEventsInRegistry(self, excepted_reg_keys): 155 """ Asserts events reported in win registry. 156 157 Args: 158 excepted_reg_keys: List of expected events in win registry. 159 """ 160 list_key=self.GetKeyValueNames(_winreg.HKEY_CURRENT_USER, 161 'Software\Google\Common\Rlz\StatefulEvents\C') 162 print ('\nList of event reported to registry-' 163 'Software\Google\Common\Rlz\StatefulEvents:', list_key) 164 for key in excepted_reg_keys: 165 self.assertTrue(key in list_key) 166 167 def _AssertRlzValues(self, log_file, readFile=1): 168 """ Asserts RLZ values. 169 170 Args: 171 log_file: String variable contains contents of log file. 172 readFile: Reading order for file. Default is 1 (Top to Bottom). 173 """ 174 for line in log_file[::readFile]: 175 if(re.search('events=', line)): 176 event_start = line.find('rlz=') 177 event_end = line.find('&id', event_start) 178 events = line[event_start + 4 : event_end] 179 events_List = events.split(',') 180 self.assertTrue('C1:' in events_List) 181 self.assertTrue('C2:' in events_List) 182 183 def _searchFromOmnibox(self, searchString): 184 """ Asserts RLZ values. 185 186 Args: 187 searchString: Input string to be searched. 188 """ 189 self.driver.switch_to_active_element().send_keys(Keys.CONTROL + 'l') 190 self.driver.switch_to_active_element().send_keys(searchString) 191 self.driver.switch_to_active_element().send_keys(Keys.ENTER) 192 time.sleep(2) 193 194 def testRlzPingAtFirstChromeLaunch(self): 195 """Test rlz ping when chrome is launched for first time.""" 196 # Wait for 100 sec till chrome sends ping to server. 197 time.sleep(100) 198 self.driver.get('http://www.google.com') 199 200 # Open log file. 201 log_file = open( 202 os.getcwd() + '\chromium_proxy_server.log', 'r', 1).readlines() 203 204 # Validate events first chrome launch(C1I,C2I,C1S) are appended in ping. 205 excepted_events = ['C1S', 'C1I', 'C2I'] 206 self._AssertEventsInPing(log_file, excepted_events) 207 208 # Validate events in win registry. 209 excepted_reg_keys = ['C1I', 'C2I'] 210 self._AssertEventsInRegistry(excepted_reg_keys) 211 212 def testRlzPingForFirstSearch(self): 213 """Test rlz ping when first search is performed in chrome.""" 214 # Type search string in omnibox. 215 self._searchFromOmnibox('java') 216 print '\nCurrent Url before chrome ping sent:\n', self.driver.current_url 217 218 # Assert brand code 'CHMZ' is not appended in search string. 219 self.assertFalse(re.search('CHMZ', self.driver.current_url)) 220 221 # Wait for 100 sec till chrome sends ping to server. 222 time.sleep(100) 223 224 # Open log file. 225 log_file = open( 226 os.getcwd() + '\chromium_proxy_server.log', 'r', 1).readlines() 227 228 # Validate events first chrome launch(C1I,C2I,C1S) and 229 # first search(C1F) are appended in ping. 230 excepted_events = ['C1S', 'C1I', 'C2I', 'C1F'] 231 self._AssertEventsInPing(log_file, excepted_events) 232 233 # Assert C1, C2 rlz value appended in ping 234 self._AssertRlzValues(log_file) 235 236 # Type search string in omnibox after ping is sent to server. 237 self._searchFromOmnibox('java') 238 print '\nCurrent Url after chrome ping sent:\n', self.driver.current_url 239 240 # Assert brand code 'CHMZ' is appended in search string. 241 self.assertTrue(re.search('CHMZ', self.driver.current_url)) 242 243 # Validate events in win registry. 244 excepted_reg_keys=['C1I', 'C2I', 'C1F'] 245 self._AssertEventsInRegistry(excepted_reg_keys) 246 247 # Assert the log for search ping with query string/brand code appended. 248 log_file = open( 249 os.getcwd() + '\chromium_proxy_server.log', 'r', 1).readlines() 250 searchStringFound = False 251 for line in log_file[::-1]: 252 if(re.search('search?', line)): 253 self.assertTrue(re.search('java', line)) 254 self.assertTrue(re.search('CHMZ', line)) 255 print '\nChrome search ping send\n', line 256 searchStringFound = True 257 break 258 self.assertTrue(searchStringFound, 'Search Query String Not Found') 259 260 def rlzInput(): 261 proxy_server_file = raw_input("Enter Proxy Server File Name: ") 262 chrome_driver_path = raw_input("Enter chrome driver path in"+ 263 "your system(c:\\chrome\\..):") 264 return (proxy_server_file, chrome_driver_path) 265 266 if __name__ == '__main__': 267 server, driver = rlzInput() 268 RlzTest.proxy_server_file = server 269 RlzTest.chrome_driver_path = driver 270 unittest.main() 271