oto/apps/runner/test/oto_agent_config_test.dart
toki e418925e61 feat(control-plane): runner 등록 계약을 연결한다
OTO Server가 runner 등록 상태를 직접 소유하고 Dart runner가 Server registration 계약으로 전환되어야 Control Plane 분리 마이그레이션을 이어갈 수 있다.
2026-06-05 15:34:17 +09:00

322 lines
7.8 KiB
Dart

import 'dart:io';
import 'package:test/test.dart';
import 'package:oto/oto/agent/agent_config.dart';
void main() {
const validBootstrapYaml = '''
agent:
id: "agent-123"
alias: "my-test-agent"
enrollment_token: "token-abc-456"
edge:
url: "https://edge.toki-labs.com:8443"
runtime:
install_dir: "/usr/local/bin"
workspace_root: "/home/user/.oto/workspace"
log_dir: "/home/user/.oto/logs"
''';
const validServerYaml = '''
agent:
id: "agent-123"
alias: "my-test-agent"
enrollment_token: "token-abc-456"
server:
url: "https://oto-core.toki-labs.com:8443"
runtime:
install_dir: "/usr/local/bin"
workspace_root: "/home/user/.oto/workspace"
log_dir: "/home/user/.oto/logs"
''';
const validBootstrapYamlNoAlias = '''
agent:
id: "agent-123"
alias: ""
enrollment_token: "token-abc-456"
edge:
url: "https://edge.toki-labs.com:8443"
runtime:
install_dir: "/usr/local/bin"
workspace_root: "/home/user/.oto/workspace"
log_dir: "/home/user/.oto/logs"
''';
const validBootstrapYamlMissingAlias = '''
agent:
id: "agent-123"
enrollment_token: "token-abc-456"
edge:
url: "https://edge.toki-labs.com:8443"
runtime:
install_dir: "/usr/local/bin"
workspace_root: "/home/user/.oto/workspace"
log_dir: "/home/user/.oto/logs"
''';
test('AgentConfig parses bootstrap config yaml', () {
final config = AgentConfig.fromYamlContent(validBootstrapYaml);
expect(config.agent.id, 'agent-123');
expect(config.agent.alias, 'my-test-agent');
expect(config.agent.enrollmentToken, 'token-abc-456');
expect(config.edge.url, 'https://edge.toki-labs.com:8443');
expect(config.runtime.installDir, '/usr/local/bin');
expect(config.runtime.workspaceRoot, '/home/user/.oto/workspace');
expect(config.runtime.logDir, '/home/user/.oto/logs');
});
test('AgentConfig parses server section as standard connection config', () {
final config = AgentConfig.fromYamlContent(validServerYaml);
expect(config.agent.id, 'agent-123');
expect(config.server.url, 'https://oto-core.toki-labs.com:8443');
expect(config.edge.url, 'https://oto-core.toki-labs.com:8443');
});
test('AgentConfig preserves empty alias', () {
final config = AgentConfig.fromYamlContent(validBootstrapYamlNoAlias);
expect(config.agent.id, 'agent-123');
expect(config.agent.alias, '');
expect(config.agent.enrollmentToken, 'token-abc-456');
});
test('AgentConfig parses missing alias as null', () {
final config = AgentConfig.fromYamlContent(validBootstrapYamlMissingAlias);
expect(config.agent.id, 'agent-123');
expect(config.agent.alias, isNull);
expect(config.agent.enrollmentToken, 'token-abc-456');
});
test('AgentConfig rejects missing required values', () {
const missingAgentId = '''
agent:
alias: "my-test-agent"
enrollment_token: "token-abc-456"
edge:
url: "https://edge.toki-labs.com:8443"
runtime:
install_dir: "/usr/local/bin"
workspace_root: "/home/user/.oto/workspace"
log_dir: "/home/user/.oto/logs"
''';
expect(
() => AgentConfig.fromYamlContent(missingAgentId),
throwsA(
isA<AgentConfigException>().having(
(e) => e.message,
'message',
contains('agent.id'),
),
),
);
const missingEnrollmentToken = '''
agent:
id: "agent-123"
alias: "my-test-agent"
edge:
url: "https://edge.toki-labs.com:8443"
runtime:
install_dir: "/usr/local/bin"
workspace_root: "/home/user/.oto/workspace"
log_dir: "/home/user/.oto/logs"
''';
expect(
() => AgentConfig.fromYamlContent(missingEnrollmentToken),
throwsA(
isA<AgentConfigException>().having(
(e) => e.message,
'message',
contains('agent.enrollment_token'),
),
),
);
const missingConnection = '''
agent:
id: "agent-123"
alias: "my-test-agent"
enrollment_token: "token-abc-456"
runtime:
install_dir: "/usr/local/bin"
workspace_root: "/home/user/.oto/workspace"
log_dir: "/home/user/.oto/logs"
''';
expect(
() => AgentConfig.fromYamlContent(missingConnection),
throwsA(
isA<AgentConfigException>().having(
(e) => e.message,
'message',
contains('server'),
),
),
);
const missingServerUrl = '''
agent:
id: "agent-123"
alias: "my-test-agent"
enrollment_token: "token-abc-456"
server:
url: ""
runtime:
install_dir: "/usr/local/bin"
workspace_root: "/home/user/.oto/workspace"
log_dir: "/home/user/.oto/logs"
''';
expect(
() => AgentConfig.fromYamlContent(missingServerUrl),
throwsA(
isA<AgentConfigException>().having(
(e) => e.message,
'message',
contains('server.url'),
),
),
);
const missingEdgeUrl = '''
agent:
id: "agent-123"
alias: "my-test-agent"
enrollment_token: "token-abc-456"
edge:
url: ""
runtime:
install_dir: "/usr/local/bin"
workspace_root: "/home/user/.oto/workspace"
log_dir: "/home/user/.oto/logs"
''';
expect(
() => AgentConfig.fromYamlContent(missingEdgeUrl),
throwsA(
isA<AgentConfigException>().having(
(e) => e.message,
'message',
contains('edge.url'),
),
),
);
const missingInstallDir = '''
agent:
id: "agent-123"
alias: "my-test-agent"
enrollment_token: "token-abc-456"
edge:
url: "https://edge.toki-labs.com:8443"
runtime:
workspace_root: "/home/user/.oto/workspace"
log_dir: "/home/user/.oto/logs"
''';
expect(
() => AgentConfig.fromYamlContent(missingInstallDir),
throwsA(
isA<AgentConfigException>().having(
(e) => e.message,
'message',
contains('runtime.install_dir'),
),
),
);
});
test('AgentConfig rejects invalid field types', () {
const invalidIdYaml = '''
agent:
id: ["not-a-string"]
enrollment_token: "token-abc"
edge:
url: "http://edge"
runtime:
install_dir: "/bin"
workspace_root: "/work"
log_dir: "/log"
''';
expect(
() => AgentConfig.fromYamlContent(invalidIdYaml),
throwsA(
isA<AgentConfigException>().having(
(e) => e.message,
'message',
contains('agent.id'),
),
),
);
const invalidAliasYaml = '''
agent:
id: "agent-1"
alias: true
enrollment_token: "token-abc"
edge:
url: "http://edge"
runtime:
install_dir: "/bin"
workspace_root: "/work"
log_dir: "/log"
''';
expect(
() => AgentConfig.fromYamlContent(invalidAliasYaml),
throwsA(
isA<AgentConfigException>().having(
(e) => e.message,
'message',
contains('agent.alias'),
),
),
);
const invalidUrlYaml = '''
agent:
id: "agent-1"
enrollment_token: "token-abc"
edge:
url: 12345
runtime:
install_dir: "/bin"
workspace_root: "/work"
log_dir: "/log"
''';
expect(
() => AgentConfig.fromYamlContent(invalidUrlYaml),
throwsA(
isA<AgentConfigException>().having(
(e) => e.message,
'message',
contains('edge.url'),
),
),
);
});
test('AgentConfig fromFile reads file correctly', () {
final tempFile = File(
'${Directory.systemTemp.path}/agent_config_test_temp.yaml',
);
tempFile.writeAsStringSync(validBootstrapYaml);
try {
final config = AgentConfig.fromFile(tempFile.path);
expect(config.agent.id, 'agent-123');
expect(config.edge.url, 'https://edge.toki-labs.com:8443');
} finally {
if (tempFile.existsSync()) {
tempFile.deleteSync();
}
}
});
test('AgentConfig fromFile throws when file not found', () {
expect(
() => AgentConfig.fromFile('non_existent_file_path_1234.yaml'),
throwsA(
isA<AgentConfigException>().having(
(e) => e.message,
'message',
contains('does not exist at path'),
),
),
);
});
}