""" Test complete roundtrip: Create mapping -> Upload to GeViServer -> Download -> Check Uses the existing SDK Bridge gRPC service that's already connected """ import grpc import sys sys.path.insert(0, r'C:\DEV\COPILOT\geutebruck-api\src\sdk-bridge') from GeViScopeBridge.proto import configuration_pb2, configuration_pb2_grpc def main(): print("=" * 80) print("BACKEND ROUNDTRIP TEST - Using gRPC SDK Bridge") print("=" * 80) print() # Connect to SDK Bridge channel = grpc.insecure_channel('localhost:50051') stub = configuration_pb2_grpc.ConfigurationServiceStub(channel) # Step 1: Create test mapping print("Step 1: Creating test mapping via gRPC...") mapping = configuration_pb2.ActionMappingData( name="GRPC_ROUNDTRIP_TEST", input_actions=[ configuration_pb2.ActionDefinition( action="GRPC_ROUNDTRIP_TEST", parameters=[] ) ], output_actions=[ configuration_pb2.ActionDefinition( action="PanLeft", parameters=[ configuration_pb2.ActionParameter(name="Caption", value="GSC PanLeft"), configuration_pb2.ActionParameter(name="GscServer", value="GEVISCOPE_01_UPDATED"), configuration_pb2.ActionParameter(name="PTZ head", value="101027") ] ), configuration_pb2.ActionDefinition( action="PanRight", parameters=[ configuration_pb2.ActionParameter(name="Caption", value="G-Core PanRight"), configuration_pb2.ActionParameter(name="GCoreServer", value="gscope-cdu-10"), configuration_pb2.ActionParameter(name="PTZ head", value="101028") ] ) ], enabled=True ) request = configuration_pb2.CreateActionMappingRequest(mapping=mapping) response = stub.CreateActionMapping(request) if not response.success: print(f"ERROR: Failed to create mapping: {response.error_message}") return print(f"[OK] Mapping created at offset: {response.mapping_offset}") print() # Step 2: List all mappings to see what we get back print("Step 2: Listing all mappings from GeViServer...") list_request = configuration_pb2.ListActionMappingsRequest() list_response = stub.ListActionMappings(list_request) print(f"Total mappings: {len(list_response.mappings)}") print() # Find our test mapping test_mapping = None for mapping in list_response.mappings: if mapping.name == "GRPC_ROUNDTRIP_TEST": test_mapping = mapping break if not test_mapping: print("ERROR: GRPC_ROUNDTRIP_TEST not found!") return print("[OK] Found GRPC_ROUNDTRIP_TEST mapping") print() # Step 3: Check output actions print("=" * 80) print("OUTPUT ACTIONS VERIFICATION") print("=" * 80) print() for i, action in enumerate(test_mapping.output_actions, 1): print(f"Output Action {i}:") print(f" action: {action.action}") print(f" parameters:") for param in action.parameters: print(f" {param.name}: {param.value}") print() # Check for expected values if i == 1: expected_action = "PanLeft" expected_server_param = "GscServer" expected_server_value = "GEVISCOPE_01_UPDATED" else: expected_action = "PanRight" expected_server_param = "GCoreServer" expected_server_value = "gscope-cdu-10" # Verify issues = [] if action.action != expected_action: issues.append(f"[ERROR] Expected action '{expected_action}', got '{action.action}'") param_dict = {p.name: p.value for p in action.parameters} if expected_server_param not in param_dict: issues.append(f"[ERROR] Missing '{expected_server_param}' parameter") elif param_dict[expected_server_param] != expected_server_value: issues.append(f"[ERROR] {expected_server_param}='{param_dict[expected_server_param]}', expected '{expected_server_value}'") if 'SwitchMode' in param_dict or 'VideoInput' in param_dict or 'VideoOutput' in param_dict: issues.append("[ERROR] Has invalid CrossSwitch parameters!") if issues: print(" ISSUES:") for issue in issues: print(f" {issue}") else: print(" [OK] Action is correct!") print() print("=" * 80) print("TEST COMPLETE") print("=" * 80) print() print("The mapping 'GRPC_ROUNDTRIP_TEST' has been written to GeViServer.") print("Now open GeViSet and check if the actions show as:") print(" 1. PanLeft (NOT CrossSwitch)") print(" 2. PanRight (NOT CrossSwitch)") if __name__ == '__main__': main()