Skip to main content
Glama

Android MCP Server

""" Integration tests for the complete server initialization flow """ import os import sys import tempfile from unittest.mock import MagicMock, patch from adbdevicemanager import AdbDeviceManager # Add the parent directory to the path so we can import our modules sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) class TestServerIntegration: """Test complete server initialization scenarios""" def setup_method(self): """Setup for each test method""" self.temp_dir = tempfile.mkdtemp() self.config_file = os.path.join(self.temp_dir, "config.yaml") def _simulate_server_initialization(self, config_file_path): """ Simulate the complete server initialization process Returns: (device_manager, messages) """ import yaml messages = [] config = {} device_name = None if os.path.exists(config_file_path): try: with open(config_file_path) as f: config = yaml.safe_load(f.read()) or {} device_config = config.get("device", {}) configured_device_name = device_config.get( "name") if device_config else None if configured_device_name and configured_device_name.strip(): device_name = configured_device_name.strip() messages.append(f"Loaded config from {config_file_path}") messages.append(f"Configured device: {device_name}") else: messages.append(f"Loaded config from {config_file_path}") messages.append( "No device specified in config, will auto-select if only one device connected") except Exception as e: messages.append( f"Error loading config file {config_file_path}: {e}") raise else: messages.append( f"Config file {config_file_path} not found, using auto-selection for device") # Initialize device manager (with mocked dependencies) device_manager = AdbDeviceManager(device_name, exit_on_error=False) return device_manager, messages @patch('adbdevicemanager.AdbDeviceManager.check_adb_installed') @patch('adbdevicemanager.AdbDeviceManager.get_available_devices') @patch('adbdevicemanager.AdbClient') def test_no_config_auto_selection_success(self, mock_adb_client, mock_get_devices, mock_check_adb): """Test successful server start with no config file and single device""" # Setup mocks mock_check_adb.return_value = True mock_get_devices.return_value = ["device123"] mock_device = MagicMock() mock_adb_client.return_value.device.return_value = mock_device # Use non-existent config file non_existent_config = os.path.join(self.temp_dir, "non_existent.yaml") with patch('builtins.print') as mock_print: device_manager, messages = self._simulate_server_initialization( non_existent_config) # Verify results assert device_manager.device == mock_device assert any("not found" in msg for msg in messages) assert any("auto-selection" in msg for msg in messages) mock_print.assert_called_with( "No device specified, automatically selected: device123") @patch('adbdevicemanager.AdbDeviceManager.check_adb_installed') @patch('adbdevicemanager.AdbDeviceManager.get_available_devices') @patch('adbdevicemanager.AdbClient') def test_config_with_null_device_auto_selection(self, mock_adb_client, mock_get_devices, mock_check_adb): """Test server start with config file containing name: null""" # Setup mocks mock_check_adb.return_value = True mock_get_devices.return_value = ["device456"] mock_device = MagicMock() mock_adb_client.return_value.device.return_value = mock_device # Create config with null device name config_content = """ device: name: null """ with open(self.config_file, 'w') as f: f.write(config_content) with patch('builtins.print') as mock_print: device_manager, messages = self._simulate_server_initialization( self.config_file) # Verify results assert device_manager.device == mock_device assert any("Loaded config" in msg for msg in messages) assert any("auto-select" in msg for msg in messages) mock_print.assert_called_with( "No device specified, automatically selected: device456") @patch('adbdevicemanager.AdbDeviceManager.check_adb_installed') @patch('adbdevicemanager.AdbDeviceManager.get_available_devices') @patch('adbdevicemanager.AdbClient') def test_config_with_specific_device(self, mock_adb_client, mock_get_devices, mock_check_adb): """Test server start with config file specifying a device""" # Setup mocks mock_check_adb.return_value = True mock_get_devices.return_value = ["device123", "device456"] mock_device = MagicMock() mock_adb_client.return_value.device.return_value = mock_device # Create config with specific device name config_content = """ device: name: "device456" """ with open(self.config_file, 'w') as f: f.write(config_content) device_manager, messages = self._simulate_server_initialization( self.config_file) # Verify results assert device_manager.device == mock_device mock_adb_client.return_value.device.assert_called_once_with( "device456") assert any("Configured device: device456" in msg for msg in messages) @patch('adbdevicemanager.AdbDeviceManager.check_adb_installed') @patch('adbdevicemanager.AdbDeviceManager.get_available_devices') def test_multiple_devices_no_config_error(self, mock_get_devices, mock_check_adb): """Test server initialization fails with multiple devices and no config""" # Setup mocks mock_check_adb.return_value = True mock_get_devices.return_value = ["device123", "device456"] # Use non-existent config file non_existent_config = os.path.join(self.temp_dir, "non_existent.yaml") try: device_manager, messages = self._simulate_server_initialization( non_existent_config) assert False, "Should have raised an exception" except RuntimeError as e: assert "Multiple devices connected" in str(e) assert "device123" in str(e) assert "device456" in str(e) @patch('adbdevicemanager.AdbDeviceManager.check_adb_installed') @patch('adbdevicemanager.AdbDeviceManager.get_available_devices') def test_device_not_found_error(self, mock_get_devices, mock_check_adb): """Test server initialization fails when specified device is not found""" # Setup mocks mock_check_adb.return_value = True mock_get_devices.return_value = ["device123"] # Create config with non-existent device name config_content = """ device: name: "non-existent-device" """ with open(self.config_file, 'w') as f: f.write(config_content) try: device_manager, messages = self._simulate_server_initialization( self.config_file) assert False, "Should have raised an exception" except RuntimeError as e: assert "Device non-existent-device not found" in str(e) assert "Available devices" in str(e) def teardown_method(self): """Cleanup after each test method""" if os.path.exists(self.config_file): os.remove(self.config_file) os.rmdir(self.temp_dir)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/minhalvp/android-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server