@@ -1064,6 +1064,123 @@ def test_the_same_port(self):
1064
1064
1065
1065
self .assertIn ("Cannot start node" , str (ctx .exception ))
1066
1066
1067
+ class tagPortManagerProxy :
1068
+ sm_prev_testgres_reserve_port = None
1069
+ sm_prev_testgres_release_port = None
1070
+
1071
+ sm_DummyPortNumber = None
1072
+ sm_DummyPortMaxUsage = None
1073
+
1074
+ sm_DummyPortCurrentUsage = None
1075
+ sm_DummyPortTotalUsage = None
1076
+
1077
+ def __init__ (self , dummyPortNumber , dummyPortMaxUsage ):
1078
+ assert type (dummyPortNumber ) == int # noqa: E721
1079
+ assert type (dummyPortMaxUsage ) == int # noqa: E721
1080
+ assert dummyPortNumber >= 0
1081
+ assert dummyPortMaxUsage >= 0
1082
+
1083
+ assert __class__ .sm_prev_testgres_reserve_port is None
1084
+ assert __class__ .sm_prev_testgres_release_port is None
1085
+ assert testgres .utils .reserve_port == testgres .utils .internal__reserve_port
1086
+ assert testgres .utils .release_port == testgres .utils .internal__release_port
1087
+
1088
+ __class__ .sm_prev_testgres_reserve_port = testgres .utils .reserve_port
1089
+ __class__ .sm_prev_testgres_release_port = testgres .utils .release_port
1090
+
1091
+ testgres .utils .reserve_port = __class__ ._proxy__reserve_port
1092
+ testgres .utils .release_port = __class__ ._proxy__release_port
1093
+
1094
+ assert testgres .utils .reserve_port == __class__ ._proxy__reserve_port
1095
+ assert testgres .utils .release_port == __class__ ._proxy__release_port
1096
+
1097
+ __class__ .sm_DummyPortNumber = dummyPortNumber
1098
+ __class__ .sm_DummyPortMaxUsage = dummyPortMaxUsage
1099
+
1100
+ __class__ .sm_DummyPortCurrentUsage = 0
1101
+ __class__ .sm_DummyPortTotalUsage = 0
1102
+
1103
+ def __enter__ (self ):
1104
+ return self
1105
+
1106
+ def __exit__ (self , type , value , traceback ):
1107
+ assert __class__ .sm_DummyPortCurrentUsage == 0
1108
+
1109
+ assert __class__ .sm_prev_testgres_reserve_port is not None
1110
+ assert __class__ .sm_prev_testgres_release_port is not None
1111
+
1112
+ assert testgres .utils .reserve_port == __class__ ._proxy__reserve_port
1113
+ assert testgres .utils .release_port == __class__ ._proxy__release_port
1114
+
1115
+ testgres .utils .reserve_port = __class__ .sm_prev_testgres_reserve_port
1116
+ testgres .utils .release_port = __class__ .sm_prev_testgres_release_port
1117
+
1118
+ __class__ .sm_prev_testgres_reserve_port = None
1119
+ __class__ .sm_prev_testgres_release_port = None
1120
+
1121
+ def _proxy__reserve_port ():
1122
+ assert type (__class__ .sm_DummyPortMaxUsage ) == int # noqa: E721
1123
+ assert type (__class__ .sm_DummyPortTotalUsage ) == int # noqa: E721
1124
+ assert type (__class__ .sm_DummyPortCurrentUsage ) == int # noqa: E721
1125
+ assert __class__ .sm_DummyPortTotalUsage >= 0
1126
+ assert __class__ .sm_DummyPortCurrentUsage >= 0
1127
+
1128
+ assert __class__ .sm_DummyPortTotalUsage <= __class__ .sm_DummyPortMaxUsage
1129
+ assert __class__ .sm_DummyPortCurrentUsage <= __class__ .sm_DummyPortTotalUsage
1130
+
1131
+ assert __class__ .sm_prev_testgres_reserve_port is not None
1132
+
1133
+ if __class__ .sm_DummyPortTotalUsage == __class__ .sm_DummyPortMaxUsage :
1134
+ return __class__ .sm_prev_testgres_reserve_port ()
1135
+
1136
+ __class__ .sm_DummyPortTotalUsage += 1
1137
+ __class__ .sm_DummyPortCurrentUsage += 1
1138
+ return __class__ .sm_DummyPortNumber
1139
+
1140
+ def _proxy__release_port (dummyPortNumber ):
1141
+ assert type (dummyPortNumber ) == int # noqa: E721
1142
+
1143
+ assert type (__class__ .sm_DummyPortMaxUsage ) == int # noqa: E721
1144
+ assert type (__class__ .sm_DummyPortTotalUsage ) == int # noqa: E721
1145
+ assert type (__class__ .sm_DummyPortCurrentUsage ) == int # noqa: E721
1146
+ assert __class__ .sm_DummyPortTotalUsage >= 0
1147
+ assert __class__ .sm_DummyPortCurrentUsage >= 0
1148
+
1149
+ assert __class__ .sm_DummyPortTotalUsage <= __class__ .sm_DummyPortMaxUsage
1150
+ assert __class__ .sm_DummyPortCurrentUsage <= __class__ .sm_DummyPortTotalUsage
1151
+
1152
+ assert __class__ .sm_prev_testgres_release_port is not None
1153
+
1154
+ if __class__ .sm_DummyPortCurrentUsage > 0 and dummyPortNumber == __class__ .sm_DummyPortNumber :
1155
+ assert __class__ .sm_DummyPortTotalUsage > 0
1156
+ __class__ .sm_DummyPortCurrentUsage -= 1
1157
+ return
1158
+
1159
+ return __class__ .sm_prev_testgres_release_port (dummyPortNumber )
1160
+
1161
+ def test_port_rereserve_during_node_start (self ):
1162
+ C_COUNT_OF_BAD_PORT_USAGE = 3
1163
+
1164
+ with get_new_node () as node1 :
1165
+ node1 .init ().start ()
1166
+ self .assertTrue (node1 ._should_free_port )
1167
+ self .assertEqual (type (node1 .port ), int ) # noqa: E721
1168
+ node1 .safe_psql ("SELECT 1;" )
1169
+
1170
+ with __class__ .tagPortManagerProxy (node1 .port , C_COUNT_OF_BAD_PORT_USAGE ):
1171
+ assert __class__ .tagPortManagerProxy .sm_DummyPortNumber == node1 .port
1172
+ with get_new_node () as node2 :
1173
+ self .assertTrue (node2 ._should_free_port )
1174
+ self .assertEqual (node2 .port , node1 .port )
1175
+
1176
+ node2 .init ().start ()
1177
+
1178
+ self .assertNotEqual (node2 .port , node1 .port )
1179
+ self .assertEqual (__class__ .tagPortManagerProxy .sm_DummyPortCurrentUsage , 0 )
1180
+ self .assertEqual (__class__ .tagPortManagerProxy .sm_DummyPortTotalUsage , C_COUNT_OF_BAD_PORT_USAGE )
1181
+
1182
+ node2 .safe_psql ("SELECT 1;" )
1183
+
1067
1184
def test_simple_with_bin_dir (self ):
1068
1185
with get_new_node () as node :
1069
1186
node .init ().start ()
0 commit comments