| … | … | @@ -15,10 +15,10 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../build/opencog/ |
| 15 | 15 | |
| 16 | 16 | try: |
| 17 | 17 | from opencog.atomspace import AtomSpace |
| 18 | from opencog.type_constructors import get_thread_atomspace, Predicate |
| 18 | 19 | from opencog.cogserver import ( |
| 19 | 20 | start_cogserver, |
| 20 | 21 | stop_cogserver, |
| 21 | | is_cogserver_running |
| 22 | 22 | ) |
| 23 | 23 | except ImportError as e: |
| 24 | 24 | print(f"Error importing modules: {e}") |
| … | … | @@ -26,35 +26,52 @@ except ImportError as e: |
| 26 | 26 | sys.exit(1) |
| 27 | 27 | |
| 28 | 28 | |
| 29 | # Global to track the current server node for cleanup |
| 30 | _current_server = None |
| 31 | |
| 32 | |
| 33 | def is_server_running(server_node): |
| 34 | """Check if a CogServerNode is running by querying its value.""" |
| 35 | if server_node is None: |
| 36 | return False |
| 37 | val = server_node.get_value(Predicate("*-is-running?-*")) |
| 38 | if val is None: |
| 39 | return False |
| 40 | # val is a BoolValue; check if it's true |
| 41 | return val.to_list()[0] == 1 |
| 42 | |
| 43 | |
| 29 | 44 | class TestCogServer(unittest.TestCase): |
| 30 | 45 | """Test cases for CogServer Python bindings.""" |
| 31 | 46 | |
| 32 | 47 | def setUp(self): |
| 33 | 48 | """Ensure server is stopped before each test.""" |
| 34 | | if is_cogserver_running(): |
| 49 | global _current_server |
| 50 | if _current_server is not None and is_server_running(_current_server): |
| 35 | 51 | stop_cogserver() |
| 52 | _current_server = None |
| 36 | 53 | # Small delay to ensure clean state |
| 37 | 54 | time.sleep(0.1) |
| 38 | 55 | |
| 39 | 56 | def tearDown(self): |
| 40 | 57 | """Ensure server is stopped after each test.""" |
| 41 | | if is_cogserver_running(): |
| 58 | global _current_server |
| 59 | if _current_server is not None and is_server_running(_current_server): |
| 42 | 60 | stop_cogserver() |
| 61 | _current_server = None |
| 43 | 62 | # Small delay to ensure clean shutdown |
| 44 | 63 | time.sleep(0.1) |
| 45 | 64 | |
| 46 | 65 | def test_basic_start_stop(self): |
| 47 | 66 | """Test basic server start/stop functionality.""" |
| 48 | | # Check server is not running initially |
| 49 | | self.assertFalse(is_cogserver_running(), |
| 50 | | "Server should not be running initially") |
| 67 | global _current_server |
| 51 | 68 | |
| 52 | 69 | # Start server with custom port to avoid conflicts |
| 53 | | result = start_cogserver(console_port=17550, enable_web=False, enable_mcp=False) |
| 54 | | self.assertTrue(result, "start_cogserver should return True") |
| 70 | _current_server = start_cogserver(console_port=17550, enable_web=False, enable_mcp=False) |
| 71 | self.assertIsNotNone(_current_server, "start_cogserver should return CogServerNode") |
| 55 | 72 | |
| 56 | 73 | # Check server is running |
| 57 | | self.assertTrue(is_cogserver_running(), |
| 74 | self.assertTrue(is_server_running(_current_server), |
| 58 | 75 | "Server should be running after start") |
| 59 | 76 | |
| 60 | 77 | # Stop the server |
| … | … | @@ -62,13 +79,15 @@ class TestCogServer(unittest.TestCase): |
| 62 | 79 | self.assertTrue(result, "stop_cogserver should return True") |
| 63 | 80 | |
| 64 | 81 | # Check server is stopped |
| 65 | | self.assertFalse(is_cogserver_running(), |
| 82 | self.assertFalse(is_server_running(_current_server), |
| 66 | 83 | "Server should not be running after stop") |
| 67 | 84 | |
| 68 | 85 | def test_custom_ports(self): |
| 69 | 86 | """Test server with custom port configuration.""" |
| 87 | global _current_server |
| 88 | |
| 70 | 89 | # Start server with custom ports |
| 71 | | result = start_cogserver( |
| 90 | _current_server = start_cogserver( |
| 72 | 91 | console_port=17552, |
| 73 | 92 | web_port=18581, |
| 74 | 93 | mcp_port=18889, |
| … | … | @@ -76,24 +95,26 @@ class TestCogServer(unittest.TestCase): |
| 76 | 95 | enable_web=False, # Disable web to avoid SSL issues in tests |
| 77 | 96 | enable_mcp=False |
| 78 | 97 | ) |
| 79 | | self.assertTrue(result, "Server should start with custom ports") |
| 98 | self.assertIsNotNone(_current_server, "Server should start with custom ports") |
| 80 | 99 | |
| 81 | 100 | # Check server is running |
| 82 | | self.assertTrue(is_cogserver_running(), "Server should be running") |
| 101 | self.assertTrue(is_server_running(_current_server), "Server should be running") |
| 83 | 102 | |
| 84 | 103 | # Let it run briefly |
| 85 | 104 | time.sleep(0.5) |
| 86 | 105 | |
| 87 | 106 | # Stop the server |
| 88 | 107 | stop_cogserver() |
| 89 | | self.assertFalse(is_cogserver_running(), |
| 108 | self.assertFalse(is_server_running(_current_server), |
| 90 | 109 | "Server should be stopped") |
| 91 | 110 | |
| 92 | 111 | def test_double_start_error(self): |
| 93 | 112 | """Test that starting server twice raises error.""" |
| 113 | global _current_server |
| 114 | |
| 94 | 115 | # Start server |
| 95 | | start_cogserver(console_port=17553, enable_web=False, enable_mcp=False) |
| 96 | | self.assertTrue(is_cogserver_running(), "Server should be running") |
| 116 | _current_server = start_cogserver(console_port=17553, enable_web=False, enable_mcp=False) |
| 117 | self.assertTrue(is_server_running(_current_server), "Server should be running") |
| 97 | 118 | |
| 98 | 119 | # Try to start again - should raise RuntimeError |
| 99 | 120 | with self.assertRaises(RuntimeError) as context: |
| … | … | @@ -113,16 +134,8 @@ class TestCogServer(unittest.TestCase): |
| 113 | 134 | self.assertIn("Invalid", str(context.exception)) |
| 114 | 135 | self.assertIn("port", str(context.exception)) |
| 115 | 136 | |
| 116 | | # Ensure server is not running |
| 117 | | self.assertFalse(is_cogserver_running(), |
| 118 | | "Server should not be running after error") |
| 119 | | |
| 120 | 137 | def test_stop_when_not_running(self): |
| 121 | 138 | """Test stopping server when not running.""" |
| 122 | | # Ensure server is not running |
| 123 | | self.assertFalse(is_cogserver_running(), |
| 124 | | "Server should not be running") |
| 125 | | |
| 126 | 139 | # Try to stop - should return False |
| 127 | 140 | result = stop_cogserver() |
| 128 | 141 | self.assertFalse(result, |
| … | … | @@ -131,18 +144,20 @@ class TestCogServer(unittest.TestCase): |
| 131 | 144 | |
| 132 | 145 | def test_multiple_start_stop_cycles(self): |
| 133 | 146 | """Test multiple start/stop cycles.""" |
| 147 | global _current_server |
| 148 | |
| 134 | 149 | for i in range(3): |
| 135 | 150 | # Start server |
| 136 | | result = start_cogserver(console_port=17560 + i, |
| 151 | _current_server = start_cogserver(console_port=17560 + i, |
| 137 | 152 | enable_web=False, enable_mcp=False) |
| 138 | | self.assertTrue(result, f"Server should start on cycle {i}") |
| 139 | | self.assertTrue(is_cogserver_running(), |
| 153 | self.assertIsNotNone(_current_server, f"Server should start on cycle {i}") |
| 154 | self.assertTrue(is_server_running(_current_server), |
| 140 | 155 | f"Server should be running on cycle {i}") |
| 141 | 156 | |
| 142 | 157 | # Stop server |
| 143 | 158 | result = stop_cogserver() |
| 144 | 159 | self.assertTrue(result, f"Server should stop on cycle {i}") |
| 145 | | self.assertFalse(is_cogserver_running(), |
| 160 | self.assertFalse(is_server_running(_current_server), |
| 146 | 161 | f"Server should be stopped on cycle {i}") |
| 147 | 162 | |
| 148 | 163 | # Small delay between cycles |