blob: 0ddc862a9ee5d124a051a0b8b6cf30fb1a92bf1d [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:mojom/generate.dart' as generate;
import 'package:path/path.dart' as path;
import 'package:unittest/unittest.dart';
final mojomContents = '''
[DartPackage="generated"]
module generated;
struct Transform {
// Row major order.
array<float, 16> matrix;
};
''';
final dldMojomContents1 = '''
[DartPackage="downloaded"]
module downloaded;
struct Downloaded1 {
int32 status;
};
''';
final dldMojomContents2 = '''
[DartPackage="downloaded"]
module downloaded;
struct Downloaded2 {
int32 status;
};
''';
main() async {
String mojoSdk;
if (Platform.environment['MOJO_SDK'] != null) {
mojoSdk = Platform.environment['MOJO_SDK'];
} else {
mojoSdk = path.normalize(path.join(
path.dirname(Platform.script.path), '..', '..', '..', 'public'));
}
if (!await new Directory(mojoSdk).exists()) {
fail("Could not find the Mojo SDK");
}
final scriptPath = path.dirname(Platform.script.path);
final testPackagePath = path.join(scriptPath, 'test_packages');
final testMojomPath = path.join(testPackagePath, 'mojom');
final testMojomLinkPath = path.join(scriptPath, 'mojom_link_target');
final testMojomLibPath = path.join(testMojomLinkPath, 'lib');
final fakeGeneratePath = path.join(testMojomLibPath, 'generate.dart');
final pregenPath = path.join(testPackagePath, 'pregen');
final pregenFilePath =
path.join(pregenPath, 'mojom', 'pregen', 'pregen.mojom.dart');
final additionalRootPath = path.join(scriptPath, 'additional_dir');
final additionalPath =
path.join(additionalRootPath, 'additional', 'additional.mojom.dart');
final generatedPackagePath = path.join(testPackagePath, 'generated');
final downloadedPackagePath = path.join(testPackagePath, 'downloaded');
final dotMojomsPath = path.join(downloadedPackagePath, '.mojoms');
setUp(() async {
await new File(pregenFilePath).create(recursive: true);
await new File(additionalPath).create(recursive: true);
await new File(fakeGeneratePath).create(recursive: true);
await new Link(testMojomPath).create(testMojomLibPath);
final generatedMojomFile = new File(path.join(testPackagePath, 'generated',
'mojom', 'generated', 'public', 'interfaces', 'generated.mojom'));
await generatedMojomFile.create(recursive: true);
await generatedMojomFile.writeAsString(mojomContents);
await new Directory(downloadedPackagePath).create(recursive: true);
});
tearDown(() async {
await new Directory(additionalRootPath).delete(recursive: true);
await new Directory(testPackagePath).delete(recursive: true);
await new Directory(testMojomLinkPath).delete(recursive: true);
});
group('No Download', () {
test('No-op', () async {
await generate.main(['-p', testPackagePath, '-m', mojoSdk]);
final mojomPackageDir = new Directory(testMojomPath);
final generateFile = new File(path.join(testMojomPath, 'generate.dart'));
expect(await mojomPackageDir.exists(), isTrue);
expect(await generateFile.exists(), isTrue);
});
test('Additional', () async {
await generate.main(
['-p', testPackagePath, '-m', mojoSdk, '-a', additionalRootPath]);
final mojomPackageDir = new Directory(testMojomPath);
final generateFile = new File(path.join(testMojomPath, 'generate.dart'));
final additionalFile = new File(
path.join(testMojomPath, 'additional', 'additional.mojom.dart'));
expect(await mojomPackageDir.exists(), isTrue);
expect(await generateFile.exists(), isTrue);
expect(await additionalFile.exists(), isTrue);
});
test('Generated', () async {
await generate.main(['-g', '-p', testPackagePath, '-m', mojoSdk]);
final generatedFile = new File(
path.join(generatedPackagePath, 'generated', 'generated.mojom.dart'));
expect(await generatedFile.exists(), isTrue);
});
test('All', () async {
await generate.main([
'-g',
'-p',
testPackagePath,
'-m',
mojoSdk,
'-a',
additionalRootPath
]);
final additionalFile = new File(
path.join(testMojomPath, 'additional', 'additional.mojom.dart'));
expect(await additionalFile.exists(), isTrue);
final generatedFile = new File(
path.join(generatedPackagePath, 'generated', 'generated.mojom.dart'));
expect(await generatedFile.exists(), isTrue);
});
});
group('Download', () {
var httpServer;
setUp(() async {
httpServer = await HttpServer.bind("localhost", 0);
httpServer.listen((HttpRequest request) {
String path = request.uri.path;
if (path.endsWith('path/to/mojom/download_one.mojom')) {
request.response.write(dldMojomContents1);
} else if (path.endsWith('path/to/mojom/download_two.mojom')) {
request.response.write(dldMojomContents2);
} else {
request.response.statusCode = HttpStatus.NOT_FOUND;
}
request.response.close();
});
});
tearDown(() async {
await httpServer.close();
httpServer = null;
});
test('simple', () async {
final mojomsFile = new File(dotMojomsPath);
await mojomsFile.create(recursive: true);
await mojomsFile.writeAsString(
"root: http://localhost:${httpServer.port}\n"
"path/to/mojom/download_one.mojom\n");
await generate.main(['-p', testPackagePath, '-m', mojoSdk, '-d', '-g']);
final downloadedFile = new File(path.join(
downloadedPackagePath, 'downloaded', 'download_one.mojom.dart'));
expect(await downloadedFile.exists(), isTrue);
await mojomsFile.delete();
});
test('two files', () async {
final mojomsFile = new File(dotMojomsPath);
await mojomsFile.create(recursive: true);
await mojomsFile.writeAsString(
"root: http://localhost:${httpServer.port}\n"
"path/to/mojom/download_one.mojom\n"
"path/to/mojom/download_two.mojom\n");
await generate.main(['-p', testPackagePath, '-m', mojoSdk, '-d', '-g']);
final downloaded1File = new File(path.join(
downloadedPackagePath, 'downloaded', 'download_one.mojom.dart'));
expect(await downloaded1File.exists(), isTrue);
final downloaded2File = new File(path.join(
downloadedPackagePath, 'downloaded', 'download_two.mojom.dart'));
expect(await downloaded2File.exists(), isTrue);
await mojomsFile.delete();
});
test('two roots', () async {
final mojomsFile = new File(dotMojomsPath);
await mojomsFile.create(recursive: true);
await mojomsFile.writeAsString(
"root: http://localhost:${httpServer.port}\n"
"path/to/mojom/download_one.mojom\n"
"root: http://localhost:${httpServer.port}\n"
"path/to/mojom/download_two.mojom\n");
await generate.main(['-p', testPackagePath, '-m', mojoSdk, '-d', '-g']);
final downloaded1File = new File(path.join(
downloadedPackagePath, 'downloaded', 'download_one.mojom.dart'));
expect(await downloaded1File.exists(), isTrue);
final downloaded2File = new File(path.join(
downloadedPackagePath, 'downloaded', 'download_two.mojom.dart'));
expect(await downloaded2File.exists(), isTrue);
await mojomsFile.delete();
});
test('simple-comment', () async {
final mojomsFile = new File(dotMojomsPath);
await mojomsFile.create(recursive: true);
await mojomsFile.writeAsString("# Comments are allowed\n"
" root: http://localhost:${httpServer.port}\n\n\n\n"
" # Here too\n"
" path/to/mojom/download_one.mojom\n"
"# And here\n");
await generate.main(['-p', testPackagePath, '-m', mojoSdk, '-d', '-g']);
final downloadedFile = new File(path.join(
downloadedPackagePath, 'downloaded', 'download_one.mojom.dart'));
expect(await downloadedFile.exists(), isTrue);
await mojomsFile.delete();
});
test('404', () async {
final mojomsFile = new File(dotMojomsPath);
await mojomsFile.create(recursive: true);
await mojomsFile.writeAsString(
"root: http://localhost:${httpServer.port}\n"
"blah\n");
var fail = false;
try {
await generate.main(['-p', testPackagePath, '-m', mojoSdk, '-d', '-g']);
} on generate.DownloadError {
fail = true;
}
expect(fail, isTrue);
await mojomsFile.delete();
});
});
group('Failures', () {
test('Bad Package Root', () async {
final dummyPackageRoot = path.join(scriptPath, 'dummyPackageRoot');
var fail = false;
try {
await generate.main(['-p', dummyPackageRoot, '-m', mojoSdk]);
} on generate.CommandLineError {
fail = true;
}
expect(fail, isTrue);
});
test('Non-absolute PackageRoot', () async {
final dummyPackageRoot = 'dummyPackageRoot';
var fail = false;
try {
await generate.main(['-p', dummyPackageRoot, '-m', mojoSdk]);
} on generate.CommandLineError {
fail = true;
}
expect(fail, isTrue);
});
test('Bad Additional Dir', () async {
final dummyAdditional = path.join(scriptPath, 'dummyAdditional');
var fail = false;
try {
await generate.main(
['-a', dummyAdditional, '-p', testPackagePath, '-m', mojoSdk]);
} on generate.CommandLineError {
fail = true;
}
expect(fail, isTrue);
});
test('Non-absolute Additional Dir', () async {
final dummyAdditional = 'dummyAdditional';
var fail = false;
try {
await generate.main(
['-a', dummyAdditional, '-p', testPackagePath, '-m', mojoSdk]);
} on generate.CommandLineError {
fail = true;
}
expect(fail, isTrue);
});
test('No Mojo Package', () async {
final dummyPackageRoot = path.join(scriptPath, 'dummyPackageRoot');
final dummyPackageDir = new Directory(dummyPackageRoot);
await dummyPackageDir.create(recursive: true);
var fail = false;
try {
await generate.main(['-p', dummyPackageRoot, '-m', mojoSdk]);
} on generate.CommandLineError {
fail = true;
}
await dummyPackageDir.delete(recursive: true);
expect(fail, isTrue);
});
test('Bad Mojo SDK', () async {
final dummySdk = path.join(scriptPath, 'dummySdk');
var fail = false;
try {
await generate.main(['-g', '-m', dummySdk, '-p', testPackagePath]);
} on generate.CommandLineError {
fail = true;
}
expect(fail, isTrue);
});
test('Download No Server', () async {
final mojomsFile = new File(dotMojomsPath);
await mojomsFile.create(recursive: true);
await mojomsFile.writeAsString("root: http://localhots\n"
"path/to/mojom/download_one.mojom\n");
var fail = false;
try {
await generate.main(['-p', testPackagePath, '-m', mojoSdk, '-d', '-g']);
} on generate.DownloadError {
fail = true;
}
expect(fail, isTrue);
await mojomsFile.delete();
});
test('.mojoms no root', () async {
final mojomsFile = new File(dotMojomsPath);
await mojomsFile.create(recursive: true);
await mojomsFile.writeAsString("path/to/mojom/download_one.mojom\n");
var fail = false;
try {
await generate.main(['-p', testPackagePath, '-m', mojoSdk, '-d', '-g']);
} on generate.DownloadError {
fail = true;
}
expect(fail, isTrue);
await mojomsFile.delete();
});
test('.mojoms blank root', () async {
final mojomsFile = new File(dotMojomsPath);
await mojomsFile.create(recursive: true);
await mojomsFile.writeAsString("root:\n"
"path/to/mojom/download_one.mojom\n");
var fail = false;
try {
await generate.main(['-p', testPackagePath, '-m', mojoSdk, '-d', '-g']);
} on generate.DownloadError {
fail = true;
}
expect(fail, isTrue);
await mojomsFile.delete();
});
test('.mojoms root malformed', () async {
final mojomsFile = new File(dotMojomsPath);
await mojomsFile.create(recursive: true);
await mojomsFile.writeAsString("root: gobledygook\n"
"path/to/mojom/download_one.mojom\n");
var fail = false;
try {
await generate.main(['-p', testPackagePath, '-m', mojoSdk, '-d', '-g']);
} on generate.DownloadError {
fail = true;
}
expect(fail, isTrue);
await mojomsFile.delete();
});
test('.mojoms root without mojom', () async {
final mojomsFile = new File(dotMojomsPath);
await mojomsFile.create(recursive: true);
await mojomsFile.writeAsString("root: http://localhost\n"
"root: http://localhost\n"
"path/to/mojom/download_one.mojom\n");
var fail = false;
try {
await generate.main(['-p', testPackagePath, '-m', mojoSdk, '-d', '-g']);
} on generate.DownloadError {
fail = true;
}
expect(fail, isTrue);
await mojomsFile.delete();
});
});
}