from paraview.simple import *
from paraview import servermanager

import time

# Make sure the test driver know that process has properly started
print "Process started"
errors = 0

#-------------------- Helpers methods ----------------
def getHost(url):
   return url.split(':')[1][2:]

def getScheme(url):
   return url.split(':')[0]

def getPort(url):
   return int(url.split(':')[2])
#--------------------

print "Start multi-server testing"

options = servermanager.vtkProcessModule.GetProcessModule().GetOptions()
available_server_urls = options.GetServerURL().split('|')
built_in_connection = servermanager.ActiveConnection

# Test if the built-in connection is here
if (len(servermanager.Connections) != 1):
  errors += 1
  print "Error pvpython should be connected to a built-in session. Currently connected to ", servermanager.Connections

url = available_server_urls[0]
print "Connect to first server ", url
server1_connection = Connect(getHost(url), getPort(url))

# Test that we have one more connection
if (len(servermanager.Connections) != 2):
  errors += 1
  print "Error pvpython should be connected to a built-in session + one remote one. Currently connected to ", servermanager.Connections

url = available_server_urls[1]
print "Connect to second server ", url
server2_connection = Connect(getHost(url), getPort(url))

# Test that we have one more connection
if (len(servermanager.Connections) != 3):
  errors += 1
  print "Error pvpython should be connected to a built-in session + two remote one. Currently connected to ", servermanager.Connections

url = available_server_urls[2]
print "Connect to third server ", url
server3_connection = Connect(getHost(url), getPort(url))

# Test that we have one more connection
if (len(servermanager.Connections) != 4):
  errors += 1
  print "Error pvpython should be connected to a built-in session + three remote one. Currently connected to ", servermanager.Connections

print "Available connections: ", servermanager.Connections

# Test that last created connection is the active one
if ( servermanager.ActiveConnection != server3_connection):
  errors += 1
  print "Error Invalid active connection. Expected ", server3_connection, " and got ", servermanager.ActiveConnection

# ------- Do the proper RemoteSourceProxy testing --------------

# Create a set of sphere across the remote sessions
SetActiveConnection(server1_connection, globals())
rSphere1 = Sphere(ThetaResolution=10, PhiResolution=10)
rSphere1.UpdatePipeline()
size1 = rSphere1.GetDataInformation().GetNumberOfPoints()

SetActiveConnection(server2_connection, globals())
rSphere2 = Sphere(ThetaResolution=11, PhiResolution=11)
rSphere2.UpdatePipeline()
size2 = rSphere2.GetDataInformation().GetNumberOfPoints()

SetActiveConnection(server3_connection, globals())
rSphere3 = Sphere(ThetaResolution=12, PhiResolution=12)
rSphere3.UpdatePipeline()
size3 = rSphere3.GetDataInformation().GetNumberOfPoints()

# Create remote source on the built-in session
SetActiveConnection(built_in_connection, globals())
remoteProxy = RemoteSourceProxy()
remoteProxy.SetExternalProxy(rSphere1, 0)
remoteProxy.UpdatePipeline()

# Test that the data in built-in is the same size as the remote one
remoteProxy.UpdatePipeline()
size = remoteProxy.GetDataInformation().GetNumberOfPoints()
if ( size1 != size ):
   errors += 1
   print "Error Invalid data size. Expected ", size1, " and got ", size
else:
   print "Found size ", size, " for server 1"

# Switch to proxy on server 2 and test size
remoteProxy.SetExternalProxy(rSphere2, 0)
remoteProxy.UpdatePipeline()
size = remoteProxy.GetDataInformation().GetNumberOfPoints()
if ( size2 != size ):
   errors += 1
   print "Error Invalid data size. Expected ", size2, " and got ", size
else:
   print "Found size ", size, " for server 2"

# Switch to proxy on server 3 and test size
remoteProxy.SetExternalProxy(rSphere3, 0)
remoteProxy.UpdatePipeline()
size = remoteProxy.GetDataInformation().GetNumberOfPoints()
if ( size3 != size ):
   errors += 1
   print "Error Invalid data size. Expected ", size3, " and got ", size
else:
   print "Found size ", size, " for server 3"

# Change data size on server 3 and make sure the change get propagated to the built-in
rSphere3.ThetaResolution = 13
rSphere3.PhiResolution = 13
rSphere3.UpdatePipeline()
size3 = rSphere3.GetDataInformation().GetNumberOfPoints()

remoteProxy.UpdatePipeline()
size = remoteProxy.GetDataInformation().GetNumberOfPoints()
if ( size3 != size ):
   errors += 1
   print "Error Invalid data size. Expected ", size3, " and got ", size
else:
   print "Found size ", size, " for server 3 after update"

# Make sure the size is not 0
if ( size == 0 or size1 == 0 or size1 == 0 or size1 == 0):
   errors += 1
   print "Error Invalid data size. None of them should be 0"

# --------------------------------------------------------------
# Disconnect and quit application...
Disconnect()
print "Available connections after disconnect: ", servermanager.Connections
Disconnect()
print "Available connections after disconnect: ", servermanager.Connections
Disconnect()
print "Available connections after disconnect: ", servermanager.Connections
Disconnect()
print "Available connections after disconnect: ", servermanager.Connections

if errors > 0:
  raise RuntimeError, "An error occured during the execution"
