test_nov.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. const net = require('net');
  2. class KVDBClient {
  3. constructor(host = 'localhost', port = 8080) {
  4. this.host = host;
  5. this.port = port;
  6. this.socket = null;
  7. this.connected = false;
  8. }
  9. async connect() {
  10. if (this.connected) return;
  11. return new Promise((resolve, reject) => {
  12. this.socket = new net.Socket();
  13. this.socket.setKeepAlive(true);
  14. this.socket.setNoDelay(true);
  15. const timeout = setTimeout(() => {
  16. reject(new Error('Connection timeout'));
  17. }, 5000);
  18. this.socket.connect(this.port, this.host, () => {
  19. clearTimeout(timeout);
  20. this.connected = true;
  21. resolve();
  22. });
  23. this.socket.once('error', (err) => {
  24. clearTimeout(timeout);
  25. this.connected = false;
  26. reject(err);
  27. });
  28. });
  29. }
  30. disconnect() {
  31. if (this.socket) {
  32. this.socket.destroy();
  33. this.socket = null;
  34. this.connected = false;
  35. }
  36. }
  37. sendCommand(command, debug = false) {
  38. return new Promise(async (resolve, reject) => {
  39. if (!this.socket) {
  40. try {
  41. await this.connect();
  42. } catch (err) {
  43. return reject(err);
  44. }
  45. }
  46. let response = '';
  47. const dataHandler = (data) => {
  48. response += data.toString();
  49. if (response.includes('\r')) {
  50. this.socket.removeListener('data', dataHandler);
  51. clearTimeout(timeout);
  52. const result = response.replace(/\r/g, '').trim();
  53. if (debug) {
  54. console.log(`[DEBUG] Recebido: ${result}`);
  55. }
  56. resolve(result);
  57. }
  58. };
  59. this.socket.on('data', dataHandler);
  60. const timeout = setTimeout(() => {
  61. this.socket.removeListener('data', dataHandler);
  62. reject(new Error(`Timeout após 5s`));
  63. }, 5000);
  64. if (debug) {
  65. console.log(`[DEBUG] Enviando: ${command.replace(/\r/g, '\\r')}`);
  66. }
  67. this.socket.write(command, (err) => {
  68. if (err) {
  69. this.socket.removeListener('data', dataHandler);
  70. clearTimeout(timeout);
  71. reject(err);
  72. }
  73. });
  74. });
  75. }
  76. async write(key, value) {
  77. return this.sendCommand(`write ${key}|${value}\r`);
  78. }
  79. async read(key) {
  80. return this.sendCommand(`read ${key}\r`);
  81. }
  82. async delete(key) {
  83. return this.sendCommand(`delete ${key}\r`);
  84. }
  85. async status() {
  86. return this.sendCommand(`status\r`);
  87. }
  88. async keys() {
  89. return this.sendCommand(`keys\r`);
  90. }
  91. async reads(prefix) {
  92. return this.sendCommand(`reads ${prefix}\r`);
  93. }
  94. }
  95. function generateValue(size) {
  96. return 'x'.repeat(size);
  97. }
  98. function generateKey(prefix, id) {
  99. return `${prefix}:${id}`;
  100. }
  101. async function testBasicFeatures() {
  102. console.log('\n=== TESTE 1: FUNCIONALIDADES BÁSICAS ===\n');
  103. const client = new KVDBClient();
  104. const features = {
  105. write: true,
  106. read: true,
  107. delete: true,
  108. keys: true,
  109. reads: true,
  110. status: true
  111. };
  112. try {
  113. console.log('Testando CONEXÃO...');
  114. const status = await client.status();
  115. console.log(`✓ Conexão OK. Status: ${status}\n`);
  116. console.log('Testando WRITE...');
  117. await client.write('test:1', 'valor1');
  118. console.log(`✓ Write: success`);
  119. console.log('\nTestando READ...');
  120. const readRes = await client.read('test:1');
  121. console.log(`✓ Read: ${readRes}`);
  122. console.log('\nTestando WRITE múltiplas chaves...');
  123. await client.write('test:2', 'valor2');
  124. await client.write('test:3', 'valor3');
  125. await client.write('other:1', 'outro');
  126. console.log(`✓ Múltiplas escritas concluídas`);
  127. console.log('\nTestando KEYS...');
  128. try {
  129. const keysRes = await client.keys();
  130. if (keysRes === 'error') {
  131. throw new Error('retornou error');
  132. }
  133. const keysList = keysRes.split('\n').filter(k => k.trim());
  134. console.log(`✓ Keys (${keysList.length} chaves): ${keysList.slice(0, 5).join(', ')}${keysList.length > 5 ? '...' : ''}`);
  135. } catch (err) {
  136. features.keys = false;
  137. console.log(`⊘ KEYS não suportado (${err.message}) - será ignorado nos testes`);
  138. }
  139. console.log('\nTestando READS com prefixo "test"...');
  140. try {
  141. const readsRes = await client.reads('test');
  142. if (readsRes === 'error') {
  143. throw new Error('retornou error');
  144. }
  145. const readsList = readsRes.split('\n').filter(v => v.trim());
  146. console.log(`✓ Reads (${readsList.length} valores): ${readsList.slice(0, 3).join(', ')}${readsList.length > 3 ? '...' : ''}`);
  147. } catch (err) {
  148. features.reads = false;
  149. console.log(`⊘ READS não suportado (${err.message}) - será ignorado nos testes`);
  150. }
  151. console.log('\nTestando DELETE...');
  152. try {
  153. const delRes = await client.delete('test:1');
  154. if (delRes === 'error') {
  155. throw new Error('retornou error');
  156. }
  157. console.log(`✓ Delete: ${delRes}`);
  158. console.log('Verificando se foi deletado...');
  159. const delReadRes = await client.read('test:1');
  160. if (delReadRes !== 'error') {
  161. throw new Error(`chave ainda existe com valor "${delReadRes}"`);
  162. }
  163. console.log(`✓ Chave foi deletada corretamente`);
  164. } catch (err) {
  165. features.delete = false;
  166. console.log(`⊘ DELETE não suportado (${err.message}) - será ignorado nos testes`);
  167. }
  168. console.log('\nTestando DELETE em chave inexistente...');
  169. if (features.delete) {
  170. const delNonExist = await client.delete('nao:existe');
  171. if (delNonExist !== 'error') {
  172. console.log(`⚠ DELETE deveria retornar error para chave inexistente`);
  173. } else {
  174. console.log(`✓ Delete inexistente retornou error`);
  175. }
  176. } else {
  177. console.log(`⊘ Pulado (DELETE não suportado)`);
  178. }
  179. console.log('\nTestando comando INVÁLIDO...');
  180. const invalidRes = await client.sendCommand('invalid comando\r');
  181. if (invalidRes !== 'error') {
  182. console.log(`⚠ Comando inválido deveria retornar error`);
  183. } else {
  184. console.log(`✓ Comando inválido retornou error`);
  185. }
  186. client.disconnect();
  187. console.log('\n✓✓✓ TESTES BÁSICOS CONCLUÍDOS ✓✓✓');
  188. console.log('\nFuncionalidades disponíveis:');
  189. console.log(` WRITE: ${features.write ? '✓' : '✗'}`);
  190. console.log(` READ: ${features.read ? '✓' : '✗'}`);
  191. console.log(` DELETE: ${features.delete ? '✓' : '✗'}`);
  192. console.log(` KEYS: ${features.keys ? '✓' : '✗'}`);
  193. console.log(` READS: ${features.reads ? '✓' : '✗'}`);
  194. console.log(` STATUS: ${features.status ? '✓' : '✗'}`);
  195. return features;
  196. } catch (err) {
  197. client.disconnect();
  198. console.error(`✗ ERRO FATAL: ${err.message}`);
  199. return null;
  200. }
  201. }
  202. async function testMillionRecords() {
  203. console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
  204. console.log(' TESTE 2: 1 MILHÃO DE REGISTROS');
  205. console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
  206. const client = new KVDBClient();
  207. const totalRecords = 1000000;
  208. try {
  209. await client.connect();
  210. console.log(`✓ Conexão persistente estabelecida\n`);
  211. console.log(`Iniciando escrita de ${totalRecords.toLocaleString()} registros...\n`);
  212. const writeStart = Date.now();
  213. let successCount = 0;
  214. let errorCount = 0;
  215. for (let i = 0; i < totalRecords; i++) {
  216. try {
  217. const key = generateKey('load', i);
  218. const value = `value_${i}`;
  219. await client.write(key, value);
  220. successCount++;
  221. if ((i + 1) % 10000 === 0) {
  222. const elapsed = (Date.now() - writeStart) / 1000;
  223. const rate = Math.floor((i + 1) / elapsed);
  224. const progress = ((i + 1) / totalRecords * 100).toFixed(1);
  225. process.stdout.write(`\r ${(i + 1).toLocaleString()} escritas | ${rate.toLocaleString()} ops/s | ${progress}% | erros: ${errorCount} `);
  226. }
  227. } catch (err) {
  228. errorCount++;
  229. if (errorCount < 5) {
  230. console.error(`\n Erro no registro ${i}: ${err.message}`);
  231. }
  232. if (!client.connected) {
  233. await client.connect();
  234. }
  235. }
  236. }
  237. const writeTime = (Date.now() - writeStart) / 1000;
  238. const writeRate = Math.floor(successCount / writeTime);
  239. console.log(`\n\n✓ Escrita concluída em ${writeTime.toFixed(2)}s | ${writeRate.toLocaleString()} ops/s`);
  240. console.log(` Sucessos: ${successCount.toLocaleString()} | Erros: ${errorCount}`);
  241. console.log('\nIniciando leitura e validação de todos os registros...\n');
  242. const readStart = Date.now();
  243. let readSuccess = 0;
  244. let readErrors = 0;
  245. let validationErrors = 0;
  246. for (let i = 0; i < totalRecords; i++) {
  247. try {
  248. const key = generateKey('load', i);
  249. const expectedValue = `value_${i}`;
  250. const actualValue = await client.read(key);
  251. if (actualValue !== expectedValue) {
  252. validationErrors++;
  253. if (validationErrors <= 5) {
  254. console.error(`\n Validação falhou para ${key}: esperado "${expectedValue}", recebido "${actualValue}"`);
  255. }
  256. }
  257. readSuccess++;
  258. if ((i + 1) % 10000 === 0) {
  259. const elapsed = (Date.now() - readStart) / 1000;
  260. const rate = Math.floor((i + 1) / elapsed);
  261. const progress = ((i + 1) / totalRecords * 100).toFixed(1);
  262. process.stdout.write(`\r ${(i + 1).toLocaleString()} leituras | ${rate.toLocaleString()} reads/s | ${progress}% | erros: ${readErrors} | validação: ${validationErrors} `);
  263. }
  264. } catch (err) {
  265. readErrors++;
  266. if (readErrors <= 5) {
  267. console.error(`\n Erro na leitura ${i}: ${err.message}`);
  268. }
  269. if (!client.connected) {
  270. await client.connect();
  271. }
  272. }
  273. }
  274. const readTime = (Date.now() - readStart) / 1000;
  275. const readRate = Math.floor(readSuccess / readTime);
  276. console.log(`\n\n✓ Leitura e validação concluída em ${readTime.toFixed(2)}s | ${readRate.toLocaleString()} reads/s`);
  277. console.log(` Sucessos: ${readSuccess.toLocaleString()} | Erros: ${readErrors} | Erros de validação: ${validationErrors}`);
  278. client.disconnect();
  279. console.log('\n✓ Teste de 1 milhão concluído com sucesso');
  280. return true;
  281. } catch (err) {
  282. client.disconnect();
  283. console.error(`✗ ERRO: ${err.message}`);
  284. return false;
  285. }
  286. }
  287. async function testMultipleReads(features) {
  288. if (!features.reads) {
  289. console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
  290. console.log(' TESTE 3: LEITURAS MÚLTIPLAS (READS) - PULADO');
  291. console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
  292. console.log('⊘ Comando READS não suportado pelo servidor');
  293. console.log(' Este teste compararia o desempenho de:');
  294. console.log(' - READS prefix (bulk read)');
  295. console.log(' - vs múltiplos READ individuais');
  296. return false;
  297. }
  298. console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
  299. console.log(' TESTE 3: LEITURAS MÚLTIPLAS (READS vs READ)');
  300. console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
  301. const client = new KVDBClient();
  302. const prefixes = ['user', 'product', 'order', 'session', 'cache'];
  303. const recordsPerPrefix = 1000;
  304. try {
  305. await client.connect();
  306. console.log('✓ Conexão estabelecida\n');
  307. // Preparar dados de teste
  308. console.log(`Preparando ${prefixes.length * recordsPerPrefix} registros...`);
  309. for (const prefix of prefixes) {
  310. for (let i = 0; i < recordsPerPrefix; i++) {
  311. const key = `${prefix}:${i}`;
  312. const value = `${prefix}_value_${i}`;
  313. await client.write(key, value);
  314. }
  315. console.log(` ✓ ${recordsPerPrefix} registros com prefixo "${prefix}"`);
  316. }
  317. console.log('\n' + '─'.repeat(60));
  318. // Teste 1: Usando READS (bulk)
  319. console.log('\nTeste 1: Usando READS (bulk read por prefixo)');
  320. const bulkStart = Date.now();
  321. const bulkResults = {};
  322. for (const prefix of prefixes) {
  323. const result = await client.reads(prefix);
  324. const values = result.split('\n').filter(v => v.trim());
  325. bulkResults[prefix] = values.length;
  326. console.log(` ${prefix}: ${values.length} valores em ${Date.now() - bulkStart}ms`);
  327. }
  328. const bulkTime = Date.now() - bulkStart;
  329. const bulkTotal = Object.values(bulkResults).reduce((a, b) => a + b, 0);
  330. console.log(`\n✓ READS completado: ${bulkTotal} valores em ${bulkTime}ms`);
  331. console.log(` Throughput: ${Math.floor((bulkTotal / bulkTime) * 1000)} valores/s`);
  332. // Teste 2: Usando READ individual
  333. console.log('\nTeste 2: Usando READ individual (um por um)');
  334. const individualStart = Date.now();
  335. let individualCount = 0;
  336. for (const prefix of prefixes) {
  337. const prefixStart = Date.now();
  338. for (let i = 0; i < recordsPerPrefix; i++) {
  339. const key = `${prefix}:${i}`;
  340. await client.read(key);
  341. individualCount++;
  342. }
  343. console.log(` ${prefix}: ${recordsPerPrefix} reads em ${Date.now() - prefixStart}ms`);
  344. }
  345. const individualTime = Date.now() - individualStart;
  346. console.log(`\n✓ READ individual completado: ${individualCount} leituras em ${individualTime}ms`);
  347. console.log(` Throughput: ${Math.floor((individualCount / individualTime) * 1000)} reads/s`);
  348. // Comparação
  349. console.log('\n' + '─'.repeat(60));
  350. console.log('COMPARAÇÃO DE DESEMPENHO:');
  351. console.log(` READS (bulk): ${bulkTime}ms`);
  352. console.log(` READ (individual): ${individualTime}ms`);
  353. console.log(` Diferença: ${individualTime - bulkTime}ms`);
  354. console.log(` READS é ${(individualTime / bulkTime).toFixed(2)}x mais rápido`);
  355. console.log('─'.repeat(60));
  356. client.disconnect();
  357. console.log('\n✓ Teste de leituras múltiplas concluído');
  358. return true;
  359. } catch (err) {
  360. client.disconnect();
  361. console.error(`✗ ERRO: ${err.message}`);
  362. return false;
  363. }
  364. }
  365. async function testConcurrency() {
  366. console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
  367. console.log(' TESTE 4: CONCORRÊNCIA (10 CONEXÕES x 100K = 1M REGISTROS)');
  368. console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
  369. const numConnections = 10;
  370. const recordsPerConnection = 100000;
  371. const totalRecords = numConnections * recordsPerConnection;
  372. try {
  373. console.log(`Iniciando ${numConnections} conexões paralelas...\n`);
  374. const startTime = Date.now();
  375. const connectionStats = [];
  376. const promises = [];
  377. for (let conn = 0; conn < numConnections; conn++) {
  378. const promise = (async (connectionId) => {
  379. const client = new KVDBClient();
  380. await client.connect();
  381. const connStart = Date.now();
  382. let success = 0;
  383. let errors = 0;
  384. for (let i = 0; i < recordsPerConnection; i++) {
  385. try {
  386. const key = generateKey(`conn${connectionId}`, i);
  387. const value = `conn${connectionId}_value_${i}`;
  388. await client.write(key, value);
  389. success++;
  390. if ((i + 1) % 10000 === 0) {
  391. const elapsed = (Date.now() - connStart) / 1000;
  392. const rate = Math.floor((i + 1) / elapsed);
  393. const progress = ((i + 1) / recordsPerConnection * 100).toFixed(0);
  394. console.log(` [Conn ${connectionId}] ${(i + 1).toLocaleString()} registros | ${rate.toLocaleString()} ops/s | ${progress}%`);
  395. }
  396. } catch (err) {
  397. errors++;
  398. if (!client.connected) {
  399. await client.connect();
  400. }
  401. }
  402. }
  403. const connTime = (Date.now() - connStart) / 1000;
  404. const connRate = Math.floor(success / connTime);
  405. connectionStats.push({ id: connectionId, time: connTime, rate: connRate, errors });
  406. console.log(`✓ Conexão ${connectionId} finalizada: ${connTime.toFixed(2)}s | ${connRate.toLocaleString()} ops/s | erros: ${errors}`);
  407. client.disconnect();
  408. })(conn);
  409. promises.push(promise);
  410. }
  411. await Promise.all(promises);
  412. const totalTime = (Date.now() - startTime) / 1000;
  413. const totalRate = Math.floor(totalRecords / totalTime);
  414. console.log('\n' + '─'.repeat(60));
  415. console.log(`RESULTADOS DE ESCRITA:`);
  416. console.log(` Total de registros: ${totalRecords.toLocaleString()}`);
  417. console.log(` Tempo total: ${totalTime.toFixed(2)}s`);
  418. console.log(` Throughput agregado: ${totalRate.toLocaleString()} ops/s`);
  419. console.log('─'.repeat(60));
  420. // Ranking
  421. console.log('\nRanking de Performance (escrita):');
  422. connectionStats.sort((a, b) => b.rate - a.rate);
  423. connectionStats.forEach((stat, idx) => {
  424. const position = `${idx + 1}º`.padEnd(4);
  425. console.log(` ${position} Conexão ${stat.id}: ${stat.rate.toLocaleString().padStart(8)} ops/s (${stat.time.toFixed(2)}s)`);
  426. });
  427. console.log('\nIniciando leituras e validação paralelas...\n');
  428. const readStart = Date.now();
  429. const readStats = [];
  430. const readPromises = [];
  431. for (let conn = 0; conn < numConnections; conn++) {
  432. const promise = (async (connectionId) => {
  433. const client = new KVDBClient();
  434. await client.connect();
  435. let success = 0;
  436. let errors = 0;
  437. let validationErrors = 0;
  438. const readConnStart = Date.now();
  439. for (let i = 0; i < recordsPerConnection; i++) {
  440. try {
  441. const key = generateKey(`conn${connectionId}`, i);
  442. const expectedValue = `conn${connectionId}_value_${i}`;
  443. const actualValue = await client.read(key);
  444. if (actualValue !== expectedValue) {
  445. validationErrors++;
  446. if (validationErrors <= 5) {
  447. console.error(`\n [Conn ${connectionId}] Validação falhou para ${key}: esperado "${expectedValue}", recebido "${actualValue}"`);
  448. }
  449. }
  450. success++;
  451. if ((i + 1) % 10000 === 0) {
  452. const elapsed = (Date.now() - readConnStart) / 1000;
  453. const rate = Math.floor((i + 1) / elapsed);
  454. const progress = ((i + 1) / recordsPerConnection * 100).toFixed(0);
  455. console.log(` [Conn ${connectionId}] ${(i + 1).toLocaleString()} leituras | ${rate.toLocaleString()} reads/s | ${progress}% | validação: ${validationErrors}`);
  456. }
  457. } catch (err) {
  458. errors++;
  459. if (!client.connected) {
  460. await client.connect();
  461. }
  462. }
  463. }
  464. const readConnTime = (Date.now() - readConnStart) / 1000;
  465. const readConnRate = Math.floor(success / readConnTime);
  466. readStats.push({ id: connectionId, time: readConnTime, rate: readConnRate, errors, validationErrors });
  467. console.log(`✓ Conexão ${connectionId}: ${success.toLocaleString()} leituras | ${readConnRate.toLocaleString()} reads/s | validação: ${validationErrors}`);
  468. client.disconnect();
  469. })(conn);
  470. readPromises.push(promise);
  471. }
  472. await Promise.all(readPromises);
  473. const readTime = (Date.now() - readStart) / 1000;
  474. const totalReads = numConnections * recordsPerConnection;
  475. const readTotalRate = Math.floor(totalReads / readTime);
  476. const totalValidationErrors = readStats.reduce((sum, stat) => sum + stat.validationErrors, 0);
  477. console.log('\n' + '─'.repeat(60));
  478. console.log(`RESULTADOS DE LEITURA E VALIDAÇÃO:`);
  479. console.log(` Total de leituras: ${totalReads.toLocaleString()}`);
  480. console.log(` Tempo total: ${readTime.toFixed(2)}s`);
  481. console.log(` Throughput agregado: ${readTotalRate.toLocaleString()} reads/s`);
  482. console.log(` Erros de validação: ${totalValidationErrors}`);
  483. console.log('─'.repeat(60));
  484. // Ranking de leituras
  485. console.log('\nRanking de Performance (leitura):');
  486. readStats.sort((a, b) => b.rate - a.rate);
  487. readStats.forEach((stat, idx) => {
  488. const position = `${idx + 1}º`.padEnd(4);
  489. console.log(` ${position} Conexão ${stat.id}: ${stat.rate.toLocaleString().padStart(8)} reads/s | validação: ${stat.validationErrors}`);
  490. });
  491. console.log('\n✓ Teste de concorrência concluído com sucesso');
  492. return true;
  493. } catch (err) {
  494. console.error(`✗ ERRO: ${err.message}`);
  495. return false;
  496. }
  497. }
  498. async function runAllTests() {
  499. console.log('\n╔════════════════════════════════════════════════════╗');
  500. console.log('║ PIZZAKV - SUITE DE TESTES DE PERFORMANCE ║');
  501. console.log('║ Porta: 8080 ║');
  502. console.log('╚════════════════════════════════════════════════════╝');
  503. const features = await testBasicFeatures();
  504. if (!features) {
  505. console.log('\n✗ Erro fatal nos testes básicos. Abortando...');
  506. process.exit(1);
  507. }
  508. if (!features.write || !features.read) {
  509. console.log('\n✗ WRITE e READ são obrigatórios. Abortando...');
  510. process.exit(1);
  511. }
  512. console.log('\n\nIniciando teste de 1 milhão em 3 segundos...');
  513. await new Promise(resolve => setTimeout(resolve, 3000));
  514. const success2 = await testMillionRecords();
  515. if (!success2) {
  516. console.log('\n⚠ Teste de 1M falhou, mas continuando...');
  517. }
  518. console.log('\n\nIniciando teste de leituras múltiplas em 3 segundos...');
  519. await new Promise(resolve => setTimeout(resolve, 3000));
  520. const success3 = await testMultipleReads(features);
  521. if (!success3 && features.reads) {
  522. console.log('\n⚠ Teste de leituras múltiplas falhou');
  523. }
  524. console.log('\n\nIniciando teste de concorrência em 3 segundos...');
  525. await new Promise(resolve => setTimeout(resolve, 3000));
  526. const success4 = await testConcurrency();
  527. if (!success4) {
  528. console.log('\n⚠ Teste de concorrência falhou');
  529. }
  530. console.log('\n╔════════════════════════════════════════════════════╗');
  531. console.log('║ ✓ TODOS OS TESTES CONCLUÍDOS ║');
  532. console.log('╚════════════════════════════════════════════════════╝\n');
  533. }
  534. runAllTests().catch(console.error);