[5181] | 1 | #include "enet/enet.h" |
---|
| 2 | #include "Orxonox.h" |
---|
| 3 | #include "NetworkPrereqs.h" |
---|
| 4 | #include "PacketTypes.h" |
---|
| 5 | #include "GameStateManager.h" |
---|
| 6 | #include "Synchronisable.h" |
---|
| 7 | #include "GameStateClient.h" |
---|
| 8 | #include "iostream" |
---|
| 9 | #include "core/CoreIncludes.h" |
---|
| 10 | #include "time.h" |
---|
| 11 | #include "ConnectionManager.h" |
---|
| 12 | #include "ClientInformation.h" |
---|
| 13 | #include "Synchronisable.h" |
---|
| 14 | #include <boost/thread/thread.hpp> |
---|
| 15 | #include <boost/bind.hpp> |
---|
| 16 | #include "util/Sleep.h" |
---|
| 17 | |
---|
| 18 | using namespace network; |
---|
| 19 | |
---|
| 20 | void printData( unsigned char* data, int length ) { |
---|
| 21 | for ( int i=0; i<length; i++ ) |
---|
| 22 | std::cout << (int)data[i] << " "; |
---|
| 23 | std::cout << std::endl; |
---|
| 24 | } |
---|
| 25 | |
---|
| 26 | void printGameStateCompressed( GameStateCompressed* gc ) { |
---|
| 27 | //std::cout << "=================================================" << std::endl; |
---|
| 28 | std::cout << "GameStateCompressed id:\t\t" << gc->id << std::endl; |
---|
| 29 | std::cout << "GameStateCompressed normsize:\t" << gc->normsize << std::endl; |
---|
| 30 | std::cout << "GameStateCompressed compsize:\t" << gc->compsize << std::endl; |
---|
| 31 | std::cout << "GameStateCompressed diffed:\t" << gc->diffed << std::endl; |
---|
| 32 | //std::cout << "GameState data:\t" << gc->data << std::endl; |
---|
| 33 | std::cout << "GameStateCompressed compressing rate:\t" << 100.0-((100.0/(gc->normsize))*(gc->compsize)) << "%" << std::endl; |
---|
| 34 | std::cout << "=================================================" << std::endl; |
---|
| 35 | return; |
---|
| 36 | } |
---|
| 37 | |
---|
| 38 | bool compareData( GameState* g1, GameState* g2 ) { |
---|
| 39 | if ( g1->id != g2->id ) { |
---|
| 40 | std::cout << "\t--> GameStates are not comparable -> not same id" << std::endl; |
---|
| 41 | return true; |
---|
| 42 | } |
---|
| 43 | else if ( g1->size != g2->size ) { |
---|
| 44 | std::cout << "\t--> GameStates are not the same size!!" << std::endl; |
---|
| 45 | std::cout << g1->size << " != " << g2->size << std::endl; |
---|
| 46 | } |
---|
| 47 | int length = g1->size; |
---|
| 48 | for ( int i=0; i<length; i++ ) { |
---|
| 49 | if ( g1->data[i] != g2->data[i] ) { |
---|
| 50 | std::cout << "\t--> data of both GameStates are not identical" << std::endl; |
---|
| 51 | return false; |
---|
| 52 | } |
---|
| 53 | } |
---|
| 54 | //std::cout << "\t--> GameData are identical (compareData)" << std::endl; |
---|
| 55 | return true; |
---|
| 56 | } |
---|
| 57 | |
---|
| 58 | bool compareData2( GameState* g1, GameState* g2 ) { |
---|
| 59 | int length = g1->size; |
---|
| 60 | for ( int i=0; i<length; i++ ) { |
---|
| 61 | if ( g1->data[i] != g2->data[i] ) { |
---|
| 62 | return false; |
---|
| 63 | } |
---|
| 64 | } |
---|
| 65 | //std::cout << "\t--> GameData are identical (compareData)" << std::endl; |
---|
| 66 | return true; |
---|
| 67 | } |
---|
| 68 | |
---|
| 69 | bool compareGameStates( GameState* g1, GameState* g2 ) { |
---|
| 70 | if ( g1->id != g2->id ) { |
---|
| 71 | std::cout << "\t==> GameState id's not identical (GameStateCompare)" << std::endl; |
---|
| 72 | } |
---|
| 73 | if( g1->size != g2->size ) { |
---|
| 74 | std::cout << "\t==> GameState sizes are not identical (GameStateCompare)" << std::endl; |
---|
| 75 | return false; |
---|
| 76 | } |
---|
| 77 | else if ( g1->diffed != g2->diffed ) { |
---|
| 78 | std::cout << "\t==> GameState diffed params not identical (GameStateCompare)" << std::endl; |
---|
| 79 | return false; |
---|
| 80 | } |
---|
| 81 | else if ( !compareData2( g1, g2 ) ) { |
---|
| 82 | std::cout << "\t==> GameState data are not identical (GameStateCompare)" << std::endl; |
---|
| 83 | return false; |
---|
| 84 | } |
---|
| 85 | //std::cout << "\t==> GameStates are identical (GameStateCompare)" << std::endl; |
---|
| 86 | return true; |
---|
| 87 | } |
---|
| 88 | |
---|
| 89 | void printGameState( GameState* gstate ) { |
---|
| 90 | //std::cout << "=================================================" << std::endl; |
---|
| 91 | std::cout << "GameState id:\t\t" << gstate->id << std::endl; |
---|
| 92 | std::cout << "GameState size:\t\t" << gstate->size << std::endl; |
---|
| 93 | std::cout << "GameState diffed:\t" << gstate->diffed << std::endl; |
---|
| 94 | //std::cout << "GameState data:\t" << gstate->data << std::endl; |
---|
| 95 | std::cout << "=================================================" << std::endl; |
---|
| 96 | return; |
---|
| 97 | } |
---|
| 98 | |
---|
| 99 | unsigned char* createData( int length, int mode ) { |
---|
| 100 | char* data = new char[ length ]; |
---|
| 101 | if ( mode == 1 ) { |
---|
| 102 | for ( int i=0; i<length; i++ ) |
---|
| 103 | data[i] = (char)(i%255); |
---|
| 104 | } |
---|
| 105 | else if ( mode == 2 ) { |
---|
| 106 | for ( int i=0; i<length; i++ ) { |
---|
| 107 | if ( i%98 == 0 ) data[i] = (char)(i%255); |
---|
| 108 | else data[i] = (char)0; |
---|
| 109 | } |
---|
| 110 | } |
---|
| 111 | else if ( mode == 3 ) { |
---|
| 112 | for ( int i=0; i<length; i++ ){ |
---|
| 113 | data[i] = (char)(rand()%255); |
---|
| 114 | } |
---|
| 115 | } |
---|
| 116 | else if ( mode == 4 ) { |
---|
| 117 | for ( int i=0; i<length; i++ ){ |
---|
| 118 | data[i] = (char)(rand()%127); |
---|
| 119 | } |
---|
| 120 | } |
---|
| 121 | |
---|
| 122 | //printData( data, length ); |
---|
| 123 | |
---|
| 124 | unsigned char* dat = (unsigned char*)data; |
---|
| 125 | return dat; |
---|
| 126 | } |
---|
| 127 | |
---|
| 128 | GameState* changeGameStateABit( GameState* a, int mode ) { |
---|
| 129 | int length = a->size; |
---|
| 130 | GameState* b = new GameState; |
---|
| 131 | b->id = a->id; |
---|
| 132 | b->diffed = a->diffed; |
---|
| 133 | |
---|
| 134 | if ( mode == 1 ) { |
---|
| 135 | b->data = new unsigned char[length]; |
---|
| 136 | b->size = a->size; |
---|
| 137 | for ( int i=0; i<length; i++ ) { |
---|
| 138 | if ( i%10 == 0 ) b->data[i] = rand()%255; |
---|
| 139 | else b->data[i] = a->data[i]; |
---|
| 140 | } |
---|
| 141 | } |
---|
| 142 | else if ( mode == 2 ) { |
---|
| 143 | b->data = new unsigned char[length]; |
---|
| 144 | b->size = length; |
---|
| 145 | for ( int i=0; i<length; i++ ) { |
---|
| 146 | if ( i%(rand()%((length)/11)+rand()) == 0 ) b->data[i] = (char)rand()%255; |
---|
| 147 | else b->data[i] = a->data[i]; |
---|
| 148 | } |
---|
| 149 | } |
---|
| 150 | else if ( mode == 3 ) { |
---|
| 151 | int s = length + (rand()%(length)); |
---|
| 152 | b->data = new unsigned char[s]; |
---|
| 153 | b->size = s; |
---|
| 154 | for ( int i=0; i<length; i++ ) { |
---|
| 155 | if ( i%10 == 0 ) b->data[i] = (char)rand()%255; |
---|
| 156 | else b->data[i] = a->data[i]; |
---|
| 157 | } |
---|
| 158 | for( int i=length; i<s; i++ ) { |
---|
| 159 | b->data[i] = (char)rand()%255; |
---|
| 160 | } |
---|
| 161 | } |
---|
| 162 | else if ( mode == 4 ) { |
---|
| 163 | int s = length + (rand()%(length)); |
---|
| 164 | b->data = new unsigned char[s]; |
---|
| 165 | b->size = s; |
---|
| 166 | for ( int i=0; i<length; i++ ) { |
---|
| 167 | if ( i%(rand()%(length)+rand()) == 0 ) b->data[i] = (char)rand()%255; |
---|
| 168 | else b->data[i] = a->data[i]; |
---|
| 169 | } |
---|
| 170 | for( int i=length; i<s; i++ ) { |
---|
| 171 | b->data[i] = rand()%255; |
---|
| 172 | } |
---|
| 173 | } |
---|
| 174 | else if ( mode == 5 ) { |
---|
| 175 | int s = (length)/2; |
---|
| 176 | b->data = new unsigned char[s]; |
---|
| 177 | b->size = s; |
---|
| 178 | for ( int i=0; i<s; i++ ) { |
---|
| 179 | if ( i%10 == 0 ) b->data[i] = (char)rand()%255; |
---|
| 180 | else b->data[i] = a->data[i]; |
---|
| 181 | } |
---|
| 182 | } |
---|
| 183 | |
---|
| 184 | return b; |
---|
| 185 | } |
---|
| 186 | |
---|
| 187 | void testCompression( int size, int mode ) { |
---|
| 188 | std::cout << "testing compression with: size = " << size << " ,mode = " << mode << std::endl; |
---|
| 189 | GameStateClient* g_client; |
---|
| 190 | GameStateManager* g_manager;; |
---|
| 191 | |
---|
| 192 | GameState* g_new = new GameState; |
---|
| 193 | GameState* g_old = new GameState; |
---|
| 194 | GameStateCompressed* gc = new GameStateCompressed; |
---|
| 195 | |
---|
| 196 | g_old->data = createData( size, mode ); |
---|
| 197 | g_old->size = size; |
---|
| 198 | g_old->id = 0; |
---|
| 199 | g_old->diffed = false; |
---|
| 200 | printGameState( g_old ); |
---|
| 201 | |
---|
| 202 | gc = g_manager->testCompress( g_old ); |
---|
| 203 | printGameStateCompressed( gc ); |
---|
| 204 | |
---|
| 205 | g_new = g_client->testDecompress( gc ); |
---|
| 206 | printGameState( g_new ); |
---|
| 207 | |
---|
| 208 | compareGameStates( g_new, g_old ); |
---|
| 209 | |
---|
| 210 | return; |
---|
| 211 | } |
---|
| 212 | |
---|
| 213 | void testDifferentiation( int size, int modeCreateData, int modeChangeData ) { |
---|
| 214 | std::cout << "testing diff with: size = " << size << " modeCreateData = " |
---|
| 215 | << modeCreateData << " modeChangeData = " << modeChangeData << std::endl; |
---|
| 216 | GameStateClient* g_client; |
---|
| 217 | GameStateManager* g_manager; |
---|
| 218 | |
---|
| 219 | GameState* g_undiff1 = new GameState; |
---|
| 220 | GameState* g_undiff2 = new GameState; |
---|
| 221 | GameState* g_diffed; |
---|
| 222 | GameState* g_result; |
---|
| 223 | |
---|
| 224 | g_undiff1->data = createData( size, modeCreateData ); |
---|
| 225 | g_undiff1->size = size; |
---|
| 226 | g_undiff1->id = 1; |
---|
| 227 | g_undiff1->diffed = false; |
---|
| 228 | printGameState( g_undiff1 ); |
---|
| 229 | |
---|
| 230 | g_undiff2 = changeGameStateABit( g_undiff1, modeChangeData ); |
---|
| 231 | printGameState( g_undiff2 ); |
---|
| 232 | |
---|
| 233 | if( !compareData( g_undiff1, g_undiff2 ) ) std::cout << " BUT THAT'S HOW IT HAS TO BE" << std::endl; |
---|
| 234 | |
---|
| 235 | //printData( g_undiff1->data, g_undiff1->size ); |
---|
| 236 | //printData( g_undiff2->data, g_undiff2->size ); |
---|
| 237 | |
---|
| 238 | g_diffed = g_manager->testDiff( g_undiff1, g_undiff2 ); |
---|
| 239 | printGameState( g_diffed ); |
---|
| 240 | //printData( g_diffed->data, g_diffed->size ); |
---|
| 241 | |
---|
| 242 | g_result = g_client->testUndiff( g_undiff1, g_diffed ); |
---|
| 243 | compareGameStates( g_result, g_undiff2 ); |
---|
| 244 | |
---|
| 245 | return; |
---|
| 246 | } |
---|
| 247 | |
---|
| 248 | void testCompressWithDiff( int size, int modeCreateData, int modeChangeData ) { |
---|
| 249 | std::cout << "testing CompressWithDiff with: size = " << size << " modeCreateData = " |
---|
| 250 | << modeCreateData << " modeChangeData = " << modeChangeData << std::endl; |
---|
| 251 | GameStateClient* g_client; |
---|
| 252 | GameStateManager* g_manager;; |
---|
| 253 | |
---|
| 254 | GameStateCompressed* gc = new GameStateCompressed; |
---|
| 255 | GameStateCompressed* g_compressedNoDiff; |
---|
| 256 | GameState* g_undiff1 = new GameState; |
---|
| 257 | GameState* g_undiff2 = new GameState; |
---|
| 258 | GameState* g_diffed; |
---|
| 259 | GameState* g_resultDiffed; |
---|
| 260 | GameState* g_resultUndiffed; |
---|
| 261 | |
---|
| 262 | g_undiff1->data = createData( size, modeCreateData ); |
---|
| 263 | g_undiff1->size = size; |
---|
| 264 | g_undiff1->id = 1; |
---|
| 265 | g_undiff1->diffed = false; |
---|
| 266 | |
---|
| 267 | std::cout << "---First generated Gamestate" << std::endl; |
---|
| 268 | printGameState( g_undiff1 ); |
---|
| 269 | |
---|
| 270 | g_undiff2 = changeGameStateABit( g_undiff1, modeChangeData ); |
---|
| 271 | std::cout << "---First gererated Gamestate with some changes ev. longer" << std::endl; |
---|
| 272 | printGameState( g_undiff2 ); |
---|
| 273 | |
---|
| 274 | if( !compareData( g_undiff1, g_undiff2 ) ) std::cout << " DATA not identical.. ok" << std::endl; |
---|
| 275 | |
---|
| 276 | g_diffed = g_manager->testDiff( g_undiff1, g_undiff2 ); |
---|
| 277 | std::cout << "---Diffed Gamestate not compressed" << std::endl; |
---|
| 278 | printGameState( g_diffed ); |
---|
| 279 | |
---|
| 280 | gc = g_manager->testCompress( g_diffed ); |
---|
| 281 | std::cout << "---Diffed Gamestate compressed" << std::endl; |
---|
| 282 | printGameStateCompressed( gc ); |
---|
| 283 | |
---|
| 284 | g_compressedNoDiff = g_manager->testCompress( g_undiff2 ); |
---|
| 285 | std::cout << "---Same not Diffed Gamestate compressen" << std::endl; |
---|
| 286 | printGameStateCompressed( g_compressedNoDiff ); |
---|
| 287 | |
---|
| 288 | g_resultDiffed = g_client->testDecompress( gc ); |
---|
| 289 | std::cout << "---Diffed Gamestate of above uncompressed" << std::endl; |
---|
| 290 | printGameState( g_resultDiffed ); |
---|
| 291 | |
---|
| 292 | std::cout << "---Diffed Gamestates before compressed and after uncompress comparsion" << std::endl; |
---|
| 293 | if ( compareGameStates( g_resultDiffed, g_diffed ) ) std::cout << "GAMESTATES IDENTICAL" << std::endl; |
---|
| 294 | |
---|
| 295 | g_resultUndiffed = g_client->testUndiff( g_undiff1, g_resultDiffed ); |
---|
| 296 | std::cout << "---New Gamestate of pseudo Server compared with new gamestate that Client gets" << std::endl; |
---|
| 297 | if ( compareGameStates( g_resultUndiffed, g_undiff2 ) ) std::cout << "GAMESTATES IDENTICAL" << std::endl; |
---|
| 298 | |
---|
| 299 | return; |
---|
| 300 | } |
---|
| 301 | |
---|
| 302 | bool testNCompressWithDiff( int n, int size, int modeCreateData, int modeChangeData ) { |
---|
| 303 | |
---|
| 304 | GameStateClient* g_client; |
---|
| 305 | GameStateManager* g_manager;; |
---|
| 306 | |
---|
| 307 | GameStateCompressed* gc = new GameStateCompressed; |
---|
| 308 | GameState* g_undiff1 = new GameState; |
---|
| 309 | GameState* g_undiff2 = new GameState; |
---|
| 310 | GameState* g_diffed; |
---|
| 311 | GameState* g_resultDiffed; |
---|
| 312 | GameState* g_resultUndiffed; |
---|
| 313 | |
---|
| 314 | g_undiff1->data = createData( size, modeCreateData ); |
---|
| 315 | g_undiff1->size = size; |
---|
| 316 | g_undiff1->id = 1; |
---|
| 317 | g_undiff1->diffed = false; |
---|
| 318 | //l = -1; |
---|
| 319 | g_undiff2 = changeGameStateABit( g_undiff1, modeChangeData ); |
---|
| 320 | |
---|
| 321 | while( compareData2( g_undiff1, g_undiff2 ) ) { |
---|
| 322 | delete g_undiff2->data; |
---|
| 323 | g_undiff2 = changeGameStateABit( g_undiff1, modeChangeData ); |
---|
| 324 | } |
---|
| 325 | //l = -2; |
---|
| 326 | g_diffed = g_manager->testDiff( g_undiff1, g_undiff2 ); |
---|
| 327 | gc = g_manager->testCompress( g_diffed ); |
---|
| 328 | g_resultDiffed = g_client->testDecompress( gc ); |
---|
| 329 | |
---|
| 330 | if ( !compareGameStates( g_resultDiffed, g_diffed ) ) return false; |
---|
| 331 | //l = -3; |
---|
| 332 | g_resultUndiffed = g_client->testUndiff( g_undiff1, g_resultDiffed ); |
---|
| 333 | if ( !compareGameStates( g_resultUndiffed, g_undiff2 ) ) return false; |
---|
| 334 | //l = 1; |
---|
| 335 | /*if ( gc != NULL && gc->data != NULL ) |
---|
| 336 | delete gc->data; |
---|
| 337 | //l = 2; |
---|
| 338 | //if ( gc != NULL ) |
---|
| 339 | //delete gc; |
---|
| 340 | //l = 3; |
---|
| 341 | if ( g_undiff1 != NULL && g_undiff1->data != NULL ) |
---|
| 342 | delete g_undiff1->data; |
---|
| 343 | //l = 4; |
---|
| 344 | //if ( g_undiff1 != NULL ) |
---|
| 345 | //delete g_undiff1; |
---|
| 346 | //l = 5; |
---|
| 347 | if ( g_undiff2 != NULL && g_undiff2->data ) |
---|
| 348 | delete g_undiff2->data; |
---|
| 349 | //l = 6; |
---|
| 350 | //if ( g_undiff2 != NULL ) |
---|
| 351 | //delete g_undiff2; |
---|
| 352 | //l = 7; |
---|
| 353 | if ( g_diffed != NULL && g_diffed->data ) |
---|
| 354 | //delete g_diffed->data; |
---|
| 355 | //l = 8; |
---|
| 356 | //if ( g_diffed ) |
---|
| 357 | //delete g_diffed; |
---|
| 358 | //l = 9; |
---|
| 359 | if ( g_resultDiffed != NULL && g_resultDiffed->data ) |
---|
| 360 | delete g_resultDiffed->data; |
---|
| 361 | //l = 10; |
---|
| 362 | //if ( g_resultDiffed ) |
---|
| 363 | //delete g_resultDiffed; |
---|
| 364 | //l = 11;*/ |
---|
| 365 | |
---|
| 366 | return true; |
---|
| 367 | } |
---|
| 368 | |
---|
| 369 | bool testNCompression( int n, int size, int mode ) { |
---|
| 370 | GameStateClient* g_client; |
---|
| 371 | GameStateManager* g_manager;; |
---|
| 372 | |
---|
| 373 | GameState* g_new = new GameState; |
---|
| 374 | GameState* g_old = new GameState; |
---|
| 375 | GameStateCompressed* gc = new GameStateCompressed; |
---|
| 376 | |
---|
| 377 | g_old->data = createData( size, mode ); |
---|
| 378 | g_old->size = size; |
---|
| 379 | g_old->id = 0; |
---|
| 380 | g_old->diffed = false; |
---|
| 381 | |
---|
| 382 | gc = g_manager->testCompress( g_old ); |
---|
| 383 | |
---|
| 384 | g_new = g_client->testDecompress( gc ); |
---|
| 385 | |
---|
| 386 | if ( !compareGameStates( g_new, g_old ) ) return false; |
---|
| 387 | |
---|
| 388 | |
---|
| 389 | if ( g_new != NULL && g_new->data != NULL ) |
---|
| 390 | delete g_new->data; |
---|
| 391 | |
---|
| 392 | if ( g_old != NULL && g_old->data != NULL ) |
---|
| 393 | delete g_old->data; |
---|
| 394 | |
---|
| 395 | if ( gc != NULL && gc->data ) |
---|
| 396 | delete gc->data; |
---|
| 397 | |
---|
| 398 | return true; |
---|
| 399 | } |
---|
| 400 | |
---|
| 401 | void printClientObjectMapping( ConnectionManager* cmanager, int clients ) { |
---|
| 402 | std::map<int, int>::iterator iter; |
---|
| 403 | std::map<int, int> clientsmap = cmanager->testGetClientsShip(); |
---|
| 404 | for( iter = clientsmap.begin(); iter != clientsmap.end(); iter++ ) { |
---|
| 405 | std::cout << "clientID: " << iter->first << "\t-> objectID: " << iter->second << std::endl; |
---|
| 406 | } |
---|
| 407 | return; |
---|
| 408 | } |
---|
| 409 | |
---|
| 410 | bool is( int a[], int b, int size ) { |
---|
| 411 | for ( int i=0; i<size; i++ ) { |
---|
| 412 | if ( a[i] == b ) return true; |
---|
| 413 | } |
---|
| 414 | return false; |
---|
| 415 | } |
---|
| 416 | |
---|
| 417 | void testClientObjectMapping( int clients ) { |
---|
| 418 | ConnectionManager* cmanager = new ConnectionManager(); |
---|
| 419 | int shift = 2; |
---|
| 420 | std::cout << "create a map length [clients]" << std::endl; |
---|
| 421 | for ( int i=0; i<clients; i++ ) { |
---|
| 422 | cmanager->testAddClientsShipID( i, i+shift ); |
---|
| 423 | } |
---|
| 424 | printClientObjectMapping( cmanager, clients ); |
---|
| 425 | |
---|
| 426 | std::cout << "get random client's ship id" << std::endl; |
---|
| 427 | int id; |
---|
| 428 | for ( int i=0; i<(clients/3); i++ ) { |
---|
| 429 | id = rand()%clients; |
---|
| 430 | std::cout << "client: " << id << "\t-> ship: " << cmanager->testGetClientsShipID( id ) << std::endl; |
---|
| 431 | } |
---|
| 432 | |
---|
| 433 | std::cout <<"get random ship's client id" << std::endl; |
---|
| 434 | for ( int i=0; i<(clients/3); i++ ) { |
---|
| 435 | id = (rand()%clients)+shift; |
---|
| 436 | std::cout << "ship: " << id << "\t-> client: " << cmanager->testGetObjectsClientID( id ) << std::endl; |
---|
| 437 | } |
---|
| 438 | |
---|
| 439 | std::cout << "delete random client from map" << std::endl; |
---|
| 440 | int deleted[clients/3]; |
---|
| 441 | for ( int i=0; i<(clients/3); i++ ) { |
---|
| 442 | id = rand()%clients; |
---|
| 443 | if ( !is( deleted, id, clients/3 ) ) { |
---|
| 444 | std::cout << "delete client " << id << std::endl; |
---|
| 445 | cmanager->testDeleteClientsIDReg( id ); |
---|
| 446 | } |
---|
| 447 | deleted[i] = id; |
---|
| 448 | } |
---|
| 449 | std::cout << "resulting list:" << std::endl; |
---|
| 450 | printClientObjectMapping( cmanager, clients-(clients/3)); |
---|
| 451 | |
---|
| 452 | std::cout << "delete random object from map" << std::endl; |
---|
| 453 | int jap = 0; |
---|
| 454 | while( jap < 3 ) { |
---|
| 455 | id = (rand()%clients) + shift; |
---|
| 456 | if ( !is( deleted, id, clients/3 ) ) { |
---|
| 457 | std::cout << "delete object: " << id << std::endl; |
---|
| 458 | cmanager->testDeleteObjectIDReg( id ); |
---|
| 459 | jap++; |
---|
| 460 | } |
---|
| 461 | } |
---|
| 462 | std::cout << "resulting list:" << std::endl; |
---|
| 463 | printClientObjectMapping( cmanager, clients-(clients/3)-3); |
---|
| 464 | } |
---|
| 465 | |
---|
| 466 | bool addClientTest( ENetEvent* event, ClientInformation*& head ) { |
---|
| 467 | ClientInformation *temp = head->insertBack(new ClientInformation); |
---|
| 468 | if(!temp) |
---|
| 469 | return false; |
---|
| 470 | if(temp->prev()->head) { |
---|
| 471 | temp->prev()->setID(0); |
---|
| 472 | temp->setID(1); |
---|
| 473 | } |
---|
| 474 | else |
---|
| 475 | temp->setID(temp->prev()->getID()+1); |
---|
| 476 | temp->setPeer(event->peer); |
---|
| 477 | std::cout << "added client id: " << temp->getID() << std::endl; |
---|
| 478 | |
---|
| 479 | return temp->setSynched(true); |
---|
| 480 | } |
---|
| 481 | |
---|
| 482 | void printClientInformationBox( ClientInformation* box ) { |
---|
| 483 | if(!box) |
---|
| 484 | return; |
---|
| 485 | std::cout << "ClientList: id: " << box->getID() << "\t"; |
---|
| 486 | std::cout << "g_id: " << box->getGamestateID() << " \t"; |
---|
| 487 | std::cout << "synched: " << box->getSynched() << "\t"; |
---|
| 488 | std::cout << "is head: " << box->head << std::endl; |
---|
| 489 | } |
---|
| 490 | |
---|
| 491 | void printClientInformationList( ClientInformation* list ) { |
---|
| 492 | printClientInformationBox( list ); |
---|
| 493 | list = list->next(); |
---|
| 494 | |
---|
| 495 | while( list != 0 ) { |
---|
| 496 | printClientInformationBox( list ); |
---|
| 497 | list = list->next(); |
---|
| 498 | } |
---|
| 499 | return; |
---|
| 500 | } |
---|
| 501 | |
---|
| 502 | void testClientInformation( int numberOfClients ) { |
---|
| 503 | ClientInformation* head = new ClientInformation( true ); |
---|
| 504 | ConnectionManager* connectionManager; |
---|
| 505 | ENetEvent event; |
---|
| 506 | |
---|
| 507 | for ( int i=0; i<numberOfClients; i++ ) { |
---|
| 508 | if ( !addClientTest( &event, head ) ) { |
---|
| 509 | std::cout << "addClientTest didn't work with: " << i << std::endl; |
---|
| 510 | } |
---|
| 511 | } |
---|
| 512 | std::cout << "(now id should be synched, since that works and this is test of list, this step is left out)" << std::endl; |
---|
| 513 | |
---|
| 514 | printClientInformationList( head ); |
---|
| 515 | |
---|
| 516 | std::cout << "remove some clients" << std::endl; |
---|
| 517 | if ( head->removeClient( numberOfClients/3 ) ) std::cout << "client " << numberOfClients/3 << " removed" << std::endl; |
---|
| 518 | else std::cout << "could not remove client: " << numberOfClients/3 << std::endl; |
---|
| 519 | if ( head->removeClient( numberOfClients ) ) std::cout << "client " << numberOfClients << " removed" << std::endl; |
---|
| 520 | else std::cout << "could not remove client: " << numberOfClients << std::endl; |
---|
| 521 | if ( head->removeClient( 1 ) ) std::cout << "client " << 1 << " removed" << std::endl; |
---|
| 522 | else std::cout << "could not remove client: " << 1 << std::endl; |
---|
| 523 | if ( head->removeClient( 1 ) ) std::cout << "client " << 1 << " removed a second time" << std::endl; |
---|
| 524 | else std::cout << "could not remove client: " << 1 << std::endl; |
---|
| 525 | if ( head->removeClient( numberOfClients + 100 ) ) std::cout << "client " << numberOfClients + 100 << " removed a second time" << std::endl; |
---|
| 526 | else std::cout << "could not remove client: " << numberOfClients + 100 << std::endl; |
---|
| 527 | |
---|
| 528 | printClientInformationList( head ); |
---|
| 529 | |
---|
| 530 | std::cout << "try to find some clients with findClient(..., false)" << std::endl; |
---|
| 531 | ClientInformation* temp = head->findClient( 2 ); |
---|
| 532 | printClientInformationBox( temp ); |
---|
| 533 | temp = head->findClient( numberOfClients/3 ); |
---|
| 534 | printClientInformationBox( temp ); |
---|
| 535 | temp = head->findClient( 0 ); |
---|
| 536 | printClientInformationBox( temp ); |
---|
| 537 | temp = head->findClient( 8 ); |
---|
| 538 | printClientInformationBox( temp ); |
---|
| 539 | |
---|
| 540 | std::cout << "find the same, output should be identical with above but with findClient(..., TRUE)" << std::endl; |
---|
| 541 | temp = head->findClient( 2, true ); |
---|
| 542 | printClientInformationBox( temp ); |
---|
| 543 | temp = head->findClient( numberOfClients/3, true ); |
---|
| 544 | printClientInformationBox( temp ); |
---|
| 545 | temp = head->findClient( 0, true ); |
---|
| 546 | printClientInformationBox( temp ); |
---|
| 547 | temp = head->findClient( 8, true ); |
---|
| 548 | printClientInformationBox( temp ); |
---|
| 549 | |
---|
| 550 | std::cout << "test setGamestateID" << std::endl; |
---|
| 551 | temp->setGameStateID( 8 ); |
---|
| 552 | printClientInformationBox( temp ); |
---|
| 553 | |
---|
| 554 | std::cout << "test insertAfter() and insertBefore()" << std::endl; |
---|
| 555 | ClientInformation* newInfo = new ClientInformation; |
---|
| 556 | ClientInformation* toool = new ClientInformation; |
---|
| 557 | newInfo->setGamestateID( 200 ); |
---|
| 558 | newInfo->setID( numberOfClients+2); |
---|
| 559 | newInfo->setSynched( true ); |
---|
| 560 | newInfo->setPeer( NULL ); |
---|
| 561 | toool->setGameStateID( 199 ); |
---|
| 562 | toool->setID( numberOfClients+1); |
---|
| 563 | toool->setSynched( true ); |
---|
| 564 | toool->setPeer( NULL ); |
---|
| 565 | |
---|
| 566 | //never use the same ClientInformation box in this situation |
---|
| 567 | //-> results in endless loop |
---|
| 568 | temp->insertAfter( newInfo ); |
---|
| 569 | temp->insertBefore( toool ); |
---|
| 570 | |
---|
| 571 | printClientInformationList( head ); |
---|
| 572 | return; |
---|
| 573 | } |
---|
| 574 | |
---|
| 575 | //### following stuff is to test buffer, took from PacketBufferTestExt.cc ### |
---|
| 576 | |
---|
| 577 | void write(PacketBuffer *test){ |
---|
| 578 | ENetEvent event; |
---|
| 579 | ENetPacket *packet; |
---|
| 580 | if(test->isEmpty()) |
---|
| 581 | std::cout << "buffer is empty" << std::endl; |
---|
| 582 | for(int i=0; i<10; i++){ |
---|
| 583 | std::string temp = "packet "; |
---|
| 584 | packet = enet_packet_create("packet", strlen("packet ")+1, |
---|
| 585 | ENET_PACKET_FLAG_RELIABLE); |
---|
| 586 | std::cout << i << ": pushing " << packet->data << std::endl; |
---|
| 587 | event.packet=packet; |
---|
| 588 | test->push(&event); |
---|
| 589 | if(i==5) |
---|
| 590 | usleep(200000); |
---|
| 591 | } |
---|
| 592 | test->setClosed(true); |
---|
| 593 | return; |
---|
| 594 | } |
---|
| 595 | |
---|
| 596 | void read(PacketBuffer *test){ |
---|
| 597 | //test->print(); |
---|
| 598 | // exit if the queue is closed and empty |
---|
| 599 | while(!test->isClosed() || !test->isEmpty()){ |
---|
| 600 | // only pop if the queue isn't empty |
---|
| 601 | while(!test->isEmpty()){ |
---|
| 602 | std::cout << "We popped the value " << test->pop()->data << std::endl; |
---|
| 603 | } |
---|
| 604 | } |
---|
| 605 | return; |
---|
| 606 | } |
---|
| 607 | |
---|
| 608 | void testPacketBuffer() { |
---|
| 609 | PacketBuffer test = PacketBuffer(); |
---|
| 610 | boost::thread thrd1(boost::bind(&write, &test)); |
---|
| 611 | boost::thread thrd2(boost::bind(&read, &test)); |
---|
| 612 | |
---|
| 613 | thrd1.join(); |
---|
| 614 | thrd2.join(); |
---|
| 615 | return; |
---|
| 616 | } |
---|
| 617 | |
---|
| 618 | //### end packetbuffer test stuff ### |
---|
| 619 | |
---|
| 620 | void testSynchronisable() { |
---|
| 621 | Synchronisable* synchtest; |
---|
| 622 | unsigned char* data = new unsigned char[100]; |
---|
| 623 | for( int i=0; i<100; i++ ) { |
---|
| 624 | data[i] = i%10; |
---|
| 625 | } |
---|
| 626 | //synchtest->registerVar( (const void*)data, 100, network::DATA ); |
---|
| 627 | } |
---|
| 628 | |
---|
| 629 | //######################################################################### |
---|
| 630 | //### this stuff is only a loop to chose one of the prev test functions ### |
---|
| 631 | //######################################################################### |
---|
| 632 | void displayModes() { |
---|
| 633 | std::cout << "mode datalength: length of data array to create" << std::endl; |
---|
| 634 | std::cout << "mode Data:" << std::endl; |
---|
| 635 | std::cout << "\t-1 -> array[length] with numbers length%255" << std::endl; |
---|
| 636 | std::cout << "\t-2 -> array[length] with numbers length%255, every %98 is != 0" << std::endl; |
---|
| 637 | std::cout << "\t-3 -> array[length] with random numbers (-126:127) no modulo zeros" << std::endl; |
---|
| 638 | std::cout << "\t-4 -> array[length] with random numbers (0:127) no modulo zeros" << std::endl; |
---|
| 639 | std::cout << "---------------------------------------------------------------------------------" << std::endl; |
---|
| 640 | std::cout << "mode Change:" << std::endl; |
---|
| 641 | std::cout << "\t-1 -> every %10 == 0 index is different from original" << std::endl; |
---|
| 642 | std::cout << "\t-2 -> every %(rand()%(length/11)) is different from original" << std::endl; |
---|
| 643 | std::cout << "\t-3 -> every %10 == 0 index is different and randomly longer till 2xlonger" << std::endl; |
---|
| 644 | std::cout << "\t-4 -> random differences and randomly longer" << std::endl; |
---|
| 645 | std::cout << "\t-5 -> only half as long and ever %10 == 0 index is different" << std::endl; |
---|
| 646 | } |
---|
| 647 | |
---|
| 648 | int main( int argc, char* argv[] ) { |
---|
| 649 | int a,b,c,n; |
---|
| 650 | std::string dec = "nothing"; |
---|
| 651 | std::cout << "############### START TEST (quit q) ###############" << std::endl; |
---|
| 652 | std::cout << "possible tests: " << std::endl; |
---|
| 653 | std::cout << "displayModes:\t\t modes" << std::endl; |
---|
| 654 | std::cout << "testCompression:\t tc [datalength] [mode Data]" << std::endl; |
---|
| 655 | std::cout << "testNCompression:\t tnc [#of loops] [datalength] [mode Data]" << std::endl; |
---|
| 656 | std::cout << "testDifferentiation:\t td [datalength] [mode Data] [mode Change]" << std::endl; |
---|
| 657 | std::cout << "testCompressWithDiff:\t tcd [datalength] [mode Data] [mode Change]" << std::endl; |
---|
| 658 | std::cout << "testNCompressWithDiff:\t tncd [#of loops] [datalength] [mode Data] [mode Change]" << std::endl; |
---|
| 659 | std::cout << "testClientObjectMapping: tcom [#clients]" << std::endl; |
---|
| 660 | std::cout << "testClientInformation:\t tci [#clients] (call with >10)" << std::endl; |
---|
| 661 | std::cout << "testPacketBuffer:\t tbuf (comment address assignements in PacketBuffer.cc!)" << std::endl; |
---|
| 662 | while ( dec.compare("q") != 0 ) { |
---|
| 663 | std::cin >> dec; |
---|
| 664 | if ( dec.compare("tc") == 0 ) { |
---|
| 665 | std::cin >> a; std::cin >> b; |
---|
| 666 | testCompression( a, b ); |
---|
| 667 | } |
---|
| 668 | else if ( dec.compare("td") == 0 ) { |
---|
| 669 | std::cin>> a; std::cin >> b; std::cin >> c; |
---|
| 670 | testDifferentiation( a, b, c ); |
---|
| 671 | } |
---|
| 672 | else if ( dec.compare("tcd") == 0 ) { |
---|
| 673 | std::cin>> a; std::cin >> b; std::cin >> c; |
---|
| 674 | testCompressWithDiff( a, b, c ); |
---|
| 675 | } |
---|
| 676 | else if ( dec.compare("modes") == 0 ) |
---|
| 677 | displayModes(); |
---|
| 678 | else if ( dec.compare("tcom") == 0 ) { |
---|
| 679 | std::cin>> a; |
---|
| 680 | testClientObjectMapping( a ); |
---|
| 681 | } |
---|
| 682 | else if ( dec.compare("tci") == 0 ) { |
---|
| 683 | std::cin >> a; |
---|
| 684 | testClientInformation( a ); |
---|
| 685 | } |
---|
| 686 | else if ( dec.compare("tbuf") == 0 ) { |
---|
| 687 | testPacketBuffer(); |
---|
| 688 | } |
---|
| 689 | else if ( dec.compare("tncd") == 0 ) { |
---|
| 690 | std::cin >> n; std::cin >> a; std::cin >> b; std::cin >> c; |
---|
| 691 | for ( int i=1; i<=n; i++ ) { |
---|
| 692 | std::cout << i << " s" << a << " "; |
---|
| 693 | //std::cout << "start loop test " << i << std::endl; |
---|
| 694 | if ( !testNCompressWithDiff( i, a, b, c ) ) { |
---|
| 695 | std::cout << "#COMPARSION ERROR->VERYVERY BAD" << std::endl; |
---|
| 696 | break; |
---|
| 697 | } |
---|
| 698 | } |
---|
| 699 | std::cout << "end loop comparsion test" << std::endl; |
---|
| 700 | } |
---|
| 701 | else if ( dec.compare("tnc") == 0 ) { |
---|
| 702 | std::cin >> n; std::cin >> a; std::cin >> b; |
---|
| 703 | for ( int i=1; i<=n; i++ ) { |
---|
| 704 | std::cout << i << " s" << a << " "; |
---|
| 705 | //std::cout << "start loop test " << i << std::endl; |
---|
| 706 | if ( !testNCompression( i, a, b ) ) { |
---|
| 707 | std::cout << "#COMPARSION ERROR->VERYVERY BAD" << std::endl; |
---|
| 708 | break; |
---|
| 709 | } |
---|
| 710 | } |
---|
| 711 | std::cout << "end loop comparsion test" << std::endl; |
---|
| 712 | } |
---|
| 713 | else std::cout << "invalid input" << std::endl; |
---|
| 714 | std::cout << "################## END ONE TURN ##################@" << std::endl; |
---|
| 715 | } |
---|
| 716 | return 0; |
---|
| 717 | } |
---|
| 718 | /* |
---|
| 719 | int main() { |
---|
| 720 | std::cout << "############### START TEST (quit q) ###############" << std::endl; |
---|
| 721 | testSynchronisable(); |
---|
| 722 | }*/ |
---|
| 723 | |
---|
| 724 | //######################################################################### |
---|
| 725 | //### the prev loop is only to chose one prev prev test functions ### |
---|
| 726 | //######################################################################### |
---|