refactor: move harmonyos project to harmony/ directory

This commit is contained in:
root
2026-04-28 16:32:04 +08:00
parent 2a42183aaa
commit e83151bd1e
120 changed files with 0 additions and 0 deletions

View File

@ -0,0 +1,5 @@
import localUnitTest from './LocalUnit.test';
export default function testsuite() {
localUnitTest();
}

View File

@ -0,0 +1,33 @@
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium';
export default function localUnitTest() {
describe('localUnitTest', () => {
// Defines a test suite. Two parameters are supported: test suite name and test suite function.
beforeAll(() => {
// Presets an action, which is performed only once before all test cases of the test suite start.
// This API supports only one parameter: preset action function.
});
beforeEach(() => {
// Presets an action, which is performed before each unit test case starts.
// The number of execution times is the same as the number of test cases defined by **it**.
// This API supports only one parameter: preset action function.
});
afterEach(() => {
// Presets a clear action, which is performed after each unit test case ends.
// The number of execution times is the same as the number of test cases defined by **it**.
// This API supports only one parameter: clear action function.
});
afterAll(() => {
// Presets a clear action, which is performed after all test cases of the test suite end.
// This API supports only one parameter: clear action function.
});
it('assertContain', 0, () => {
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
let a = 'abc';
let b = 'b';
// Defines a variety of assertion methods, which are used to declare expected boolean conditions.
expect(a).assertContain(b);
expect(a).assertEqual(a);
});
});
}

View File

@ -0,0 +1,107 @@
import { describe, it, expect } from '@ohos/hypium';
import { buildPacket } from '../../main/ets/components/tools';
import { util } from '@kit.ArkTS';
export default function packetBuilderTest() {
describe('buildPacket', () => {
describe('packet structure', () => {
it('should create packet with correct header format', 0, () => {
const packet = buildPacket(1, 2, "test");
const view = new DataView(packet);
// 验证长度字段(小端序)
const length = view.getInt32(0, true);
expect(length).assertEqual(10); // 4 (id) + 4 (type) + 5 (payload) + 1 (padding)
// 验证ID字段
const id = view.getInt32(4, true);
expect(id).assertEqual(1);
// 验证类型字段
const type = view.getInt32(8, true);
expect(type).assertEqual(2);
// 验证载荷(包含空终止符)
const payloadBytes = new Uint8Array(packet, 12, 4);
const decoder = new util.TextDecoder('utf-8');
const payload = decoder.decode(payloadBytes);
expect(payload).assertEqual("test");
// 验证填充字节
const padding = view.getUint8(16);
expect(padding).assertEqual(0);
});
it('should handle empty payload', 0, () => {
const packet = buildPacket(1, 2, "");
const view = new DataView(packet);
const length = view.getInt32(0, true);
expect(length).assertEqual(10); // 4+4+1+1
const payload = view.getUint8(12);
expect(payload).assertEqual(0); // 空终止符
});
it('should truncate payload to MAXLENGTH (1447)', 0, () => {
const longPayload = "x".repeat(2000);
const packet = buildPacket(1, 2, longPayload);
const view = new DataView(packet);
const length = view.getInt32(0, true);
// 4 + 4 + 1447 + 1 = 1456
expect(length).assertEqual(1456);
});
it('should handle payload at MAXLENGTH boundary', 0, () => {
const exactPayload = "x".repeat(1447);
const packet = buildPacket(1, 2, exactPayload);
const view = new DataView(packet);
const length = view.getInt32(0, true);
expect(length).assertEqual(1456);
});
it('should handle payload just under MAXLENGTH', 0, () => {
const payload = "x".repeat(1446);
const packet = buildPacket(1, 2, payload);
const view = new DataView(packet);
const length = view.getInt32(0, true);
expect(length).assertEqual(1455);
});
});
describe('edge cases', () => {
it('should handle special characters', 0, () => {
const packet = buildPacket(1, 2, "测试中文");
const view = new DataView(packet);
const length = view.getInt32(0, true);
// 中文字符是多字节的
expect(length > 10).assertTrue();
});
it('should handle unicode characters', 0, () => {
const packet = buildPacket(1, 2, "🎮🎮🎮");
const view = new DataView(packet);
expect(view.getInt32(4, true)).assertEqual(1);
});
it('should handle large packet IDs', 0, () => {
const packet = buildPacket(2147483647, 2, "test");
const view = new DataView(packet);
expect(view.getInt32(4, true)).assertEqual(2147483647);
});
it('should handle zero packet ID', 0, () => {
const packet = buildPacket(0, 2, "test");
const view = new DataView(packet);
expect(view.getInt32(4, true)).assertEqual(0);
});
});
});
}

View File

@ -0,0 +1,92 @@
import { describe, it, expect } from '@ohos/hypium';
import { parseRCONBuffer, buildPacket } from '../../main/ets/components/tools';
export default function packetParserTest() {
describe('parseRCONBuffer', () => {
describe('valid packet parsing', () => {
it('should parse valid packet correctly', 0, () => {
const originalPacket = buildPacket(1, 2, "test");
const result = parseRCONBuffer(originalPacket);
expect(result.success).assertTrue();
expect(result.id).assertEqual(1);
expect(result.type).assertEqual(2);
expect(result.resultText).assertEqual("test");
});
it('should parse packet with long payload', 0, () => {
const longText = "a".repeat(1000);
const originalPacket = buildPacket(1, 2, longText);
const result = parseRCONBuffer(originalPacket);
expect(result.success).assertTrue();
expect(result.resultText).assertEqual(longText);
});
it('should parse packet with empty payload', 0, () => {
const originalPacket = buildPacket(1, 2, "");
const result = parseRCONBuffer(originalPacket);
expect(result.success).assertTrue();
expect(result.resultText).assertEqual("");
});
it('should parse packet with unicode payload', 0, () => {
const unicodeText = "🎮测试";
const originalPacket = buildPacket(1, 2, unicodeText);
const result = parseRCONBuffer(originalPacket);
expect(result.success).assertTrue();
expect(result.resultText).assertEqual(unicodeText);
});
});
describe('error handling', () => {
it('should fail on packet less than 12 bytes', 0, () => {
const smallBuffer = new ArrayBuffer(11);
const result = parseRCONBuffer(smallBuffer);
expect(result.success).assertFalse();
expect(result.errorCode).assertEqual("INVALID_HEADER");
});
it('should handle zero-length packet', 0, () => {
const emptyBuffer = new ArrayBuffer(0);
const result = parseRCONBuffer(emptyBuffer);
expect(result.success).assertFalse();
});
it('should handle corrupted packet', 0, () => {
const corruptedBuffer = new ArrayBuffer(20);
const view = new DataView(corruptedBuffer);
// 设置无效的长度值
view.setInt32(0, 1000, true);
const result = parseRCONBuffer(corruptedBuffer);
// 应该能处理,但可能得到不完整的结果
expect(result).not.assertNull();
});
});
describe('round-trip tests', () => {
it('should correctly round-trip standard packet', 0, () => {
const originalPacket = buildPacket(123, 2, "hello world");
const parsed = parseRCONBuffer(originalPacket);
expect(parsed.id).assertEqual(123);
expect(parsed.type).assertEqual(2);
expect(parsed.resultText).assertEqual("hello world");
});
it('should correctly round-trip authentication packet', 0, () => {
const originalPacket = buildPacket(1, 3, "password123");
const parsed = parseRCONBuffer(originalPacket);
expect(parsed.id).assertEqual(1);
expect(parsed.type).assertEqual(3);
expect(parsed.resultText).assertEqual("password123");
});
});
});
}

View File

@ -0,0 +1,148 @@
import { describe, it, expect, beforeEach, afterEach } from '@ohos/hypium';
import { RConClient } from '../../main/ets/components/RconClient';
import { RConResult } from '../../main/ets/components/tools';
export default function rConClientTest() {
describe('RConClient', () => {
let client: RConClient;
beforeEach(() => {
client = new RConClient("127.0.0.1", 25575, "password");
});
// ===== 构造函数测试 =====
describe('constructor', () => {
it('should initialize with correct properties', 0, () => {
expect(client.isActive).assertFalse();
});
it('should accept different configurations', 0, () => {
const customClient = new RConClient("192.168.1.100", 25575, "secret");
expect(customClient.isActive).assertFalse();
});
});
// ===== setConnect 测试 =====
describe('setConnect', () => {
it('should call callback multiple times during connection', 0, () => {
let callbackCount = 0;
const results: RConResult[] = [];
client.setConnect(5000, (result: RConResult) => {
callbackCount++;
results.push(result);
});
// 注意:这是异步操作,实际测试需要等待
// 这里只是演示测试结构
});
it('should handle connection timeout', 0, () => {
let errorReceived = false;
client.setConnect(1, (result: RConResult) => {
if (!result.success && result.errorCode === "tcp_fail") {
errorReceived = true;
}
});
// 验证超时处理
});
it('should prevent concurrent connections', 0, () => {
let firstCallback = false;
let secondCallback = false;
// 第一次连接
client.setConnect(5000, (result: RConResult) => {
firstCallback = true;
});
// 第二次连接应该被拒绝
client.setConnect(5000, (result: RConResult) => {
secondCallback = true;
if (!result.success && result.errorCode === "ALREADY_CONNECTING") {
// 预期的错误
}
});
});
});
// ===== sendMessage 测试 =====
describe('sendMessage', () => {
it('should send message with correct format', 0, () => {
// 模拟已连接状态
// client.setConnect(...) 完成后
client.sendMessage("/list", 2, (result: RConResult) => {
if (result.success) {
expect(result.resultText).not.assertNull();
}
});
});
it('should handle message send errors', 0, () => {
client.sendMessage("/invalid-command", 2, (result: RConResult) => {
// 验证错误处理
});
});
it('should trigger auto-reconnect when inactive', 0, () => {
// 测试自动重连机制
});
});
// ===== resetServer 测试 =====
describe('resetServer', () => {
it('should reset server configuration', 0, () => {
let reconnectSuccessful = false;
client.resetServer("192.168.1.200", "newpassword", 25575, 5000, (result: RConResult) => {
reconnectSuccessful = result.success;
});
});
it('should update internal state after reset', 0, () => {
// 验证状态更新
});
});
// ===== setDisconnect 测试 =====
describe('setDisconnect', () => {
it('should disconnect when active', 0, () => {
// 先连接
client.setConnect(5000, (result: RConResult) => {
if (result.success && result.type === 2) {
client.setDisconnect();
expect(client.isActive).assertFalse();
}
});
});
it('should handle disconnect when not connected', 0, () => {
// 不应该抛出异常
client.setDisconnect();
expect(client.isActive).assertFalse();
});
});
// ===== 状态管理测试 =====
describe('state management', () => {
it('should track active state correctly', 0, () => {
expect(client.isActive).assertFalse();
// 连接后应该是true
client.setConnect(5000, (result: RConResult) => {
if (result.success && result.type === 2) {
expect(client.isActive).assertTrue();
}
});
});
it('should handle state after disconnect', 0, () => {
client.setDisconnect();
expect(client.isActive).assertFalse();
});
});
});
}

View File

@ -0,0 +1,87 @@
import { describe, it, expect } from '@ohos/hypium';
import { RConResult } from '../../main/ets/components/tools';
export default function rConResultTest() {
describe('RConResult', () => {
// ===== 静态方法测试 =====
describe('static result()', () => {
it('should create successful result with all parameters', 0, () => {
const data = new ArrayBuffer(10);
const result = RConResult.result(data, "test", 2, 1);
expect(result.success).assertTrue();
expect(result.resultText).assertEqual("test");
expect(result.type).assertEqual(2);
expect(result.id).assertEqual(1);
expect(result.rawData).assertEqual(data);
});
it('should create successful result with optional parameters', 0, () => {
const result = RConResult.result();
expect(result.success).assertTrue();
expect(result.rawData).assertUndefined();
expect(result.resultText).assertUndefined();
expect(result.type).assertUndefined();
expect(result.id).assertUndefined();
});
it('should create result with only data', 0, () => {
const data = new ArrayBuffer(5);
const result = RConResult.result(data);
expect(result.success).assertTrue();
expect(result.rawData).assertEqual(data);
expect(result.resultText).assertUndefined();
});
it('should create result with only string', 0, () => {
const result = RConResult.result(undefined, "hello");
expect(result.success).assertTrue();
expect(result.resultText).assertEqual("hello");
expect(result.rawData).assertUndefined();
});
});
describe('static error()', () => {
it('should create error result with code and message', 0, () => {
const result = RConResult.error("TCP_FAIL", "Connection failed");
expect(result.success).assertFalse();
expect(result.errorCode).assertEqual("TCP_FAIL");
expect(result.errorMessage).assertEqual("Connection failed");
});
it('should create error with empty strings', 0, () => {
const result = RConResult.error("", "");
expect(result.success).assertFalse();
expect(result.errorCode).assertEqual("");
expect(result.errorMessage).assertEqual("");
});
});
// ===== 边界值测试 =====
describe('edge cases', () => {
it('should handle long strings', 0, () => {
const longStr = "a".repeat(10000);
const result = RConResult.result(undefined, longStr);
expect(result.resultText).assertEqual(longStr);
});
it('should handle negative id', 0, () => {
const result = RConResult.result(undefined, undefined, undefined, -1);
expect(result.id).assertEqual(-1);
});
it('should handle negative type', 0, () => {
const result = RConResult.result(undefined, undefined, -1);
expect(result.type).assertEqual(-1);
});
});
});
}