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