I posted last week on the problems I had had getting the test agents and controller in a TFS2012 Standard environment talking to each other and a workaround. Well after a good few email with various people at Microsoft and other consultants at Black Marble I have a whole range of workarounds solutions.
First a reminder of my architecture, and note that this could be part of the problem, it is all running on a single Hyper-V host. Remember this is a demo rig to show the features of Standard Environments. I think it is unlikely that this problem will be seen in a more ‘realistic’ environment i.e. running on multiple boxes
The problem is that when the test agent running on the Server2008 should request the test controller (running the on VSTFS server) should call it back on either it 169.254.x.x address or on abn address obtained via DHCP from the external virtual switch. However the problem is it is requesting a call back on 127.0.0.1, as can be seen in the error log
Unable to connect to the controller on 'vstfs:6901'. The agent can connect to the controller but the controller cannot connect to the agent because of following reason: No connection could be made because the target machine actively refused it 127.0.0.1:6910. Make sure that the firewall on the test agent machine is not blocking the connection.
The root cause
It turns out the root cause of this problem was I had edited the c:\windows\system32\drivers\etc\hosts file on the test server VM to add an entry to allow a URL used in CodedUI tests to be resolved to the localhost
Solution 1 – Edit the test agent config to bind to a specific address
The first solution is the one I outlined in my previous post, tell the test agent to bind to a specific IP address. Edit
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\QTAgentService.exe.config
and added a BindTo line with the correct address for the controller to call back to the agent
// other bits …
<add key="BindTo" value="169.254.1.1"/>
The problem with this solution you need to remember to edit a config file, all seems a bit complex!
Solution 2 – Don’t resolve the test URL to localhost
Change the hosts file entry used by the CodedUI test to resolve to the actual address of the test VM e.g.
Downside here is you need to know the test agents IP address, which depending on the system in use could change, and will certainly be different on each test VM in an environment. Again all seems a bit complex and prone to human error.
Solution 3 – Add an actual loopback entry to the hosts file.
The simplest workaround which Robert Hancock at Black Marble came up with was to add a second entry to the hosts file for the name loopback
Once this was done the test agent could connect, I did not have to edit any agent config files, or know the address the agent need to bind to. By far the best solution
So thanks to all who helped get to the bottom of this surprisingly complex issue.