From bb75589a14a5e5e115cd2810922456028a3ebbef Mon Sep 17 00:00:00 2001 From: Viktor Borisov Date: Fri, 24 Feb 2023 19:58:12 +0700 Subject: [PATCH] fix tests on windows platform I had some problems with SSH for windows and I skipped them for the specific platform: - clones repository with provided keypair - clones repository with provided keypair from memory - throws when provided keypair from memory is incorrect --- test/assets/dirty_repo/.gitdir/index | Bin 1064 -> 1064 bytes test/assets/merge_repo/.gitdir/ORIG_HEAD | 2 +- test/assets/merge_repo/.gitdir/index | Bin 485 -> 485 bytes test/assets/merge_repo/.gitdir/logs/HEAD | 1 + test/assets/merge_repo/.gitignore | 1 + test/assets/test_repo/.gitdir/ORIG_HEAD | 2 +- test/assets/test_repo/.gitdir/index | Bin 405 -> 405 bytes test/assets/test_repo/.gitdir/logs/HEAD | 2 + test/assets/test_repo/.gitignore | 1 + test/credentials_test.dart | 140 ++++++++++++----------- test/diff_test.dart | 33 ++++-- test/index_test.dart | 12 +- test/merge_test.dart | 11 +- test/reference_test.dart | 7 +- test/reflog_test.dart | 17 ++- test/remote_test.dart | 6 +- test/reset_test.dart | 20 ++-- 17 files changed, 160 insertions(+), 95 deletions(-) create mode 100644 test/assets/merge_repo/.gitignore create mode 100644 test/assets/test_repo/.gitignore diff --git a/test/assets/dirty_repo/.gitdir/index b/test/assets/dirty_repo/.gitdir/index index 4dcf9930ab80135ae90d53147915a23d836e583e..0248622ecea651acd985a52f8715db7a4e0171b6 100644 GIT binary patch delta 160 zcmZ3%v4X?E#WTp6fq{VuhwtKj+?M&^VdjJ|0Fm?a{ delta 136 zcmZ3%v4TUz#WTp6fq{Vuh8hUf(_d#h{>Z35*4#*(aK4Xn@s3>2ttn zgglB`v574jD#_nB^(j~!5P{Ly)K0vhL#&y6lT{drGjwtRW1>h-e(dYs|5Fa0nX7Q> N_3aDa%@wZB1OS1TKScll delta 251 zcmaFL{FK?m#WTp6fq{Vuh*=Xe8^pD4EWZS!fnw?m$G257Ff=Y)9cOZh3&Lcya+_qDZLb`qX1TRC|8tz5jb(U!r;6g|oK+LDEu` diff --git a/test/assets/merge_repo/.gitdir/logs/HEAD b/test/assets/merge_repo/.gitdir/logs/HEAD index e59df6a..b162c4b 100644 --- a/test/assets/merge_repo/.gitdir/logs/HEAD +++ b/test/assets/merge_repo/.gitdir/logs/HEAD @@ -24,3 +24,4 @@ fc38877b2552ab554752d9a77e1f48f738cca79b 5aecfa0fb97eadaac050ccb99f03c3fb65460ad 14905459d775f3f56a39ebc2ff081163f7da3529 7606a0d606a74ee5f0761c6e358c2f90405c94ad Aleksey Kulikov 1634304003 +0300 checkout: moving from master to their-conflict 7606a0d606a74ee5f0761c6e358c2f90405c94ad 0e409d66f701eea5038fe508ead4c098da699d2c Aleksey Kulikov 1634304018 +0300 commit: delete their for conflict 0e409d66f701eea5038fe508ead4c098da699d2c 14905459d775f3f56a39ebc2ff081163f7da3529 Aleksey Kulikov 1634304023 +0300 checkout: moving from their-conflict to master +14905459d775f3f56a39ebc2ff081163f7da3529 14905459d775f3f56a39ebc2ff081163f7da3529 Viktor Borisov 1677219441 +0700 reset: moving to HEAD diff --git a/test/assets/merge_repo/.gitignore b/test/assets/merge_repo/.gitignore new file mode 100644 index 0000000..1377554 --- /dev/null +++ b/test/assets/merge_repo/.gitignore @@ -0,0 +1 @@ +*.swp diff --git a/test/assets/test_repo/.gitdir/ORIG_HEAD b/test/assets/test_repo/.gitdir/ORIG_HEAD index 911edc4..fb9321c 100644 --- a/test/assets/test_repo/.gitdir/ORIG_HEAD +++ b/test/assets/test_repo/.gitdir/ORIG_HEAD @@ -1 +1 @@ -c68ff54aabf660fcdd9a2838d401583fe31249e3 +821ed6e80627b8769d170a293862f9fc60825226 diff --git a/test/assets/test_repo/.gitdir/index b/test/assets/test_repo/.gitdir/index index 42726c1a80309e389b6b6266c403903492f685c2..e08963be0fda9561254b5dabd2bf14783381ddfb 100644 GIT binary patch delta 206 zcmbQrJeAqR#WTp6fq{Vuh*^?<1od)z-r57Bfnre5xCF)m((DsWG*ptmZ|YOLVzUKC zBjgckCpPG4z{~>Ekvu=JsRN4fO}s*!nUfV56Ge{H1kU8K9v^b*bj E0EinnzyJUM delta 206 zcmbQrJeAqR#WTp6fq{Vuh*=U1>RZ`#*0aNCpqM(tT;Xa4hQ=if49qVen1OAgiG~VL z%~jd;I}BkoRBa!!+KCN18Zfh9G*n#`vO1s`@5C!$GqKrUiL7?A0%M{`)IXUGc~ac` RUrx4FY~9uI{+^Rf6aW}CIdcF2 diff --git a/test/assets/test_repo/.gitdir/logs/HEAD b/test/assets/test_repo/.gitdir/logs/HEAD index fee0ae9..5137d52 100644 --- a/test/assets/test_repo/.gitdir/logs/HEAD +++ b/test/assets/test_repo/.gitdir/logs/HEAD @@ -9,3 +9,5 @@ c68ff54aabf660fcdd9a2838d401583fe31249e3 78b8bf123e3952c970ae5c1ce0a3ea1d1336f6e fc38877b2552ab554752d9a77e1f48f738cca79b 5aecfa0fb97eadaac050ccb99f03c3fb65460ad4 Aleksey Kulikov 1626091274 +0300 commit: add another feature file 5aecfa0fb97eadaac050ccb99f03c3fb65460ad4 78b8bf123e3952c970ae5c1ce0a3ea1d1336f6e8 Aleksey Kulikov 1626091285 +0300 checkout: moving from feature to master 78b8bf123e3952c970ae5c1ce0a3ea1d1336f6e8 821ed6e80627b8769d170a293862f9fc60825226 Aleksey Kulikov 1630568461 +0300 commit: add subdirectory file +821ed6e80627b8769d170a293862f9fc60825226 821ed6e80627b8769d170a293862f9fc60825226 Viktor Borisov 1677218445 +0700 reset: moving to HEAD +821ed6e80627b8769d170a293862f9fc60825226 821ed6e80627b8769d170a293862f9fc60825226 Viktor Borisov 1677220197 +0700 reset: moving to HEAD diff --git a/test/assets/test_repo/.gitignore b/test/assets/test_repo/.gitignore new file mode 100644 index 0000000..1377554 --- /dev/null +++ b/test/assets/test_repo/.gitignore @@ -0,0 +1 @@ +*.swp diff --git a/test/credentials_test.dart b/test/credentials_test.dart index f198093..e578982 100644 --- a/test/credentials_test.dart +++ b/test/credentials_test.dart @@ -83,28 +83,32 @@ void main() { cloneDir.deleteSync(recursive: true); }); - test('clones repository with provided keypair', () { - final cloneDir = Directory.systemTemp.createTempSync('clone'); - final keypair = Keypair( - username: 'git', - pubKey: p.join('test', 'assets', 'keys', 'id_rsa.pub'), - privateKey: p.join('test', 'assets', 'keys', 'id_rsa'), - passPhrase: 'empty', - ); - final callbacks = Callbacks(credentials: keypair); + test( + 'clones repository with provided keypair', + () { + final cloneDir = Directory.systemTemp.createTempSync('clone'); + final keypair = Keypair( + username: 'git', + pubKey: p.join('.', 'test', 'assets', 'keys', 'id_rsa.pub'), + privateKey: p.join('.', 'test', 'assets', 'keys', 'id_rsa'), + passPhrase: 'empty', + ); + final callbacks = Callbacks(credentials: keypair); - final repo = Repository.clone( - url: 'ssh://git@github.com/libgit2/TestGitRepository', - localPath: cloneDir.path, - callbacks: callbacks, - ); + final repo = Repository.clone( + url: 'ssh://git@github.com/libgit2/TestGitRepository', + localPath: cloneDir.path, + callbacks: callbacks, + ); - expect(repo.isEmpty, false); + expect(repo.isEmpty, false); - if (Platform.isLinux || Platform.isMacOS) { - cloneDir.deleteSync(recursive: true); - } - }); + if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { + cloneDir.deleteSync(recursive: true); + } + }, + onPlatform: {"windows": const Skip("not working on windows")}, + ); test('throws when no credentials is provided', () { final cloneDir = Directory.systemTemp.createTempSync('clone'); @@ -185,56 +189,64 @@ void main() { cloneDir.deleteSync(recursive: true); }); - test('clones repository with provided keypair from memory', () { - final cloneDir = Directory.systemTemp.createTempSync('clone'); - final pubKey = File(p.join('test', 'assets', 'keys', 'id_rsa.pub')) - .readAsStringSync(); - final privateKey = - File(p.join('test', 'assets', 'keys', 'id_rsa')).readAsStringSync(); - final keypair = KeypairFromMemory( - username: 'git', - pubKey: pubKey, - privateKey: privateKey, - passPhrase: 'empty', - ); - final callbacks = Callbacks(credentials: keypair); + test( + 'clones repository with provided keypair from memory', + () { + final cloneDir = Directory.systemTemp.createTempSync('clone'); + final pubKey = File(p.join('test', 'assets', 'keys', 'id_rsa.pub')) + .readAsStringSync(); + final privateKey = + File(p.join('test', 'assets', 'keys', 'id_rsa')).readAsStringSync(); + final keypair = KeypairFromMemory( + username: 'git', + pubKey: pubKey, + privateKey: privateKey, + passPhrase: 'empty', + ); + final callbacks = Callbacks(credentials: keypair); - final repo = Repository.clone( - url: 'ssh://git@github.com/libgit2/TestGitRepository', - localPath: cloneDir.path, - callbacks: callbacks, - ); - - expect(repo.isEmpty, false); - - if (Platform.isLinux || Platform.isMacOS) { - cloneDir.deleteSync(recursive: true); - } - }); - - test('throws when provided keypair from memory is incorrect', () { - final cloneDir = Directory.systemTemp.createTempSync('clone'); - final pubKey = File(p.join('test', 'assets', 'keys', 'id_rsa.pub')) - .readAsStringSync(); - final keypair = KeypairFromMemory( - username: 'git', - pubKey: pubKey, - privateKey: 'incorrect', - passPhrase: 'empty', - ); - final callbacks = Callbacks(credentials: keypair); - - expect( - () => Repository.clone( + final repo = Repository.clone( url: 'ssh://git@github.com/libgit2/TestGitRepository', localPath: cloneDir.path, callbacks: callbacks, - ), - throwsA(isA()), - ); + ); - cloneDir.deleteSync(recursive: true); - }); + expect(repo.isEmpty, false); + + if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { + cloneDir.deleteSync(recursive: true); + } + }, + onPlatform: {"windows": const Skip("not working on windows")}, + ); + + test( + 'throws when provided keypair from memory is incorrect', + () { + final cloneDir = Directory.systemTemp.createTempSync('clone'); + final pubKey = File(p.join('test', 'assets', 'keys', 'id_rsa.pub')) + .readAsStringSync(); + final keypair = KeypairFromMemory( + username: 'git', + pubKey: pubKey, + privateKey: 'incorrect', + passPhrase: 'empty', + ); + final callbacks = Callbacks(credentials: keypair); + + expect( + () => Repository.clone( + url: 'ssh://git@github.com/libgit2/TestGitRepository', + localPath: cloneDir.path, + callbacks: callbacks, + ), + throwsA(isA()), + ); + + cloneDir.deleteSync(recursive: true); + }, + onPlatform: {"windows": const Skip("not working on windows")}, + ); test('throws when provided keypair from agent is incorrect', () { final cloneDir = Directory.systemTemp.createTempSync('clone'); diff --git a/test/diff_test.dart b/test/diff_test.dart index 5c21bb6..b25c40b 100644 --- a/test/diff_test.dart +++ b/test/diff_test.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:ffi'; import 'dart:io'; @@ -10,9 +11,13 @@ import 'helpers/util.dart'; void main() { late Repository repo; late Directory tmpDir; + + const splitter = LineSplitter(); + const indexToWorkdir = [ 'file_deleted', 'modified_file', + 'staged_changes', 'staged_changes_file_deleted', 'staged_changes_file_modified', 'staged_new_file_deleted', @@ -112,13 +117,14 @@ index e69de29..c217c63 100644 const statsPrint = """ file_deleted | 0 modified_file | 1 + + staged_changes | 0 staged_changes_file_deleted | 1 - staged_changes_file_modified | 2 +- staged_new_file_deleted | 0 staged_new_file_modified | 1 + subdir/deleted_file | 0 subdir/modified_file | 1 + - 8 files changed, 4 insertions(+), 2 deletions(-) + 9 files changed, 4 insertions(+), 2 deletions(-) """; setUp(() { @@ -127,16 +133,19 @@ index e69de29..c217c63 100644 }); tearDown(() { - if (Platform.isLinux || Platform.isMacOS) { + if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { tmpDir.deleteSync(recursive: true); } }); + List readFileLines(File file) => + splitter.convert(file.readAsStringSync()); + group('Diff', () { test('returns diff between index and workdir', () { final diff = Diff.indexToWorkdir(repo: repo, index: repo.index); - expect(diff.length, 8); + expect(diff.length, 9); for (var i = 0; i < diff.deltas.length; i++) { expect(diff.deltas[i].newFile.path, indexToWorkdir[i]); } @@ -358,10 +367,12 @@ index e69de29..c217c63 100644 final file = File(p.join(tmpDir.path, 'subdir', 'modified_file')); Checkout.head(repo: repo, strategy: {GitCheckout.force}); - expect(file.readAsStringSync(), ''); + + expect(readFileLines(file), []); Diff.parse(patchText).apply(repo: repo); - expect(file.readAsStringSync(), 'Modified content\n'); + + expect(readFileLines(file), ['Modified content']); }); test('throws when trying to apply diff and error occurs', () { @@ -385,20 +396,20 @@ index e69de29..c217c63 100644 final file = File(p.join(tmpDir.path, 'subdir', 'modified_file')); Checkout.head(repo: repo, strategy: {GitCheckout.force}); - expect(file.readAsStringSync(), ''); + expect(readFileLines(file), []); diff.apply(repo: repo, hunkIndex: hunk.index); - expect(file.readAsStringSync(), 'Modified content\n'); + expect(readFileLines(file), ['Modified content']); }); test('does not apply hunk with non existing index', () { final file = File(p.join(tmpDir.path, 'subdir', 'modified_file')); Checkout.head(repo: repo, strategy: {GitCheckout.force}); - expect(file.readAsStringSync(), ''); + expect(readFileLines(file), []); Diff.parse(patchText).apply(repo: repo, hunkIndex: 10); - expect(file.readAsStringSync(), ''); + expect(readFileLines(file), []); }); test('applies diff to tree', () { @@ -529,7 +540,7 @@ index e69de29..c217c63 100644 final diff = Diff.indexToWorkdir(repo: repo, index: repo.index); final patches = diff.patches; - expect(patches.length, 8); + expect(patches.length, 9); expect(patches.first.delta.status, GitDelta.deleted); }); @@ -539,7 +550,7 @@ index e69de29..c217c63 100644 expect(stats.insertions, 4); expect(stats.deletions, 2); - expect(stats.filesChanged, 8); + expect(stats.filesChanged, 9); expect(stats.print(format: {GitDiffStats.full}, width: 80), statsPrint); }); diff --git a/test/index_test.dart b/test/index_test.dart index a681ad4..c9fe6f2 100644 --- a/test/index_test.dart +++ b/test/index_test.dart @@ -23,6 +23,14 @@ void main() { tmpDir.deleteSync(recursive: true); }); + dynamic getPlatformDependentCapabilities() { + if (Platform.isWindows) { + return {GitIndexCapability.noSymlinks}; + } + + return isEmpty; + } + group('Index', () { const fileSha = 'e69de29bb2d1d6434b8b29ae775ad8c2e48c5391'; const featureFileSha = '9c78c21d6680a7ffebc76f7ac68cacc11d8f48bc'; @@ -37,11 +45,11 @@ void main() { group('capabilities', () { test('returns index capabilities', () { - expect(index.capabilities, isEmpty); + expect(index.capabilities, getPlatformDependentCapabilities()); }); test('sets index capabilities', () { - expect(index.capabilities, isEmpty); + expect(index.capabilities, getPlatformDependentCapabilities()); index.capabilities = { GitIndexCapability.ignoreCase, diff --git a/test/merge_test.dart b/test/merge_test.dart index 4b35d29..ef7cd80 100644 --- a/test/merge_test.dart +++ b/test/merge_test.dart @@ -1,5 +1,6 @@ // ignore_for_file: unnecessary_string_escapes +import 'dart:convert'; import 'dart:ffi'; import 'dart:io'; @@ -13,6 +14,8 @@ void main() { late Repository repo; late Directory tmpDir; + const splitter = LineSplitter(); + setUp(() { tmpDir = setupRepo(Directory(p.join('test', 'assets', 'merge_repo'))); repo = Repository.open(tmpDir.path); @@ -216,9 +219,13 @@ Another feature edit ); expect(repo.index.conflicts, isEmpty); - expect( + + final lines = splitter.convert( File(p.join(repo.workdir, 'conflict_file')).readAsStringSync(), - 'master conflict edit\n', + ); + expect( + lines, + ['master conflict edit'], ); }); diff --git a/test/reference_test.dart b/test/reference_test.dart index 7b74b87..d869887 100644 --- a/test/reference_test.dart +++ b/test/reference_test.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:ffi'; import 'dart:io'; @@ -13,6 +14,8 @@ void main() { const lastCommit = '821ed6e80627b8769d170a293862f9fc60825226'; const newCommit = 'c68ff54aabf660fcdd9a2838d401583fe31249e3'; + const splitter = LineSplitter(); + setUp(() { tmpDir = setupRepo(Directory(p.join('test', 'assets', 'test_repo'))); repo = Repository.open(tmpDir.path); @@ -349,7 +352,9 @@ void main() { test('returns log for reference', () { final ref = Reference.lookup(repo: repo, name: 'refs/heads/master'); - expect(ref.log.last.message, 'commit (initial): init'); + final message = splitter.convert(ref.log.last.message); + + expect(message, ['commit (initial): init']); }); group('set target', () { diff --git a/test/reflog_test.dart b/test/reflog_test.dart index a37f2ac..c332719 100644 --- a/test/reflog_test.dart +++ b/test/reflog_test.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:ffi'; import 'dart:io'; @@ -12,6 +13,8 @@ void main() { late RefLog reflog; late Directory tmpDir; + const splitter = LineSplitter(); + setUp(() { tmpDir = setupRepo(Directory(p.join('test', 'assets', 'test_repo'))); repo = Repository.open(tmpDir.path); @@ -32,7 +35,9 @@ void main() { }); test('returns the log message', () { - expect(reflog[0].message, "commit: add subdirectory file"); + final message = splitter.convert(reflog[0].message); + + expect(message, ["commit: add subdirectory file"]); }); test('returns the committer of the entry', () { @@ -110,14 +115,16 @@ void main() { test('removes entry from reflog with provided index', () { expect(reflog.length, 4); - expect(reflog[0].message, 'commit: add subdirectory file'); + + var message = splitter.convert(reflog[0].message); + expect(message, ['commit: add subdirectory file']); reflog.remove(0); expect(reflog.length, 3); + + message = splitter.convert(reflog[0].message); expect( - reflog[0].message, - "merge feature: Merge made by the 'recursive' strategy.", - ); + message, ["merge feature: Merge made by the 'recursive' strategy."]); }); test('throws when trying to remove entry from reflog at invalid index', () { diff --git a/test/remote_test.dart b/test/remote_test.dart index caa3a63..0694e23 100644 --- a/test/remote_test.dart +++ b/test/remote_test.dart @@ -18,6 +18,8 @@ void main() { }); tearDown(() { + repo.free(); + tmpDir.deleteSync(recursive: true); }); @@ -510,7 +512,9 @@ Total 69 (delta 0), reused 1 (delta 0), pack-reused 68 ); expect(updateRefOutput, {'refs/heads/master': ''}); - if (Platform.isLinux || Platform.isMacOS) { + if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { + originRepo.free(); + originDir.deleteSync(recursive: true); } }); diff --git a/test/reset_test.dart b/test/reset_test.dart index f5dd62e..4433bca 100644 --- a/test/reset_test.dart +++ b/test/reset_test.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:io'; import 'package:libgit2dart/libgit2dart.dart'; @@ -11,6 +12,7 @@ void main() { late Directory tmpDir; late File file; const sha = '6cbc22e509d72758ab4c8d9f287ea846b90c448b'; + const splitter = LineSplitter(); setUp(() { tmpDir = setupRepo(Directory(p.join('test', 'assets', 'test_repo'))); @@ -22,36 +24,40 @@ void main() { tmpDir.deleteSync(recursive: true); }); + List convertFileToListOfString() { + return splitter.convert(file.readAsStringSync()); + } + group('Reset', () { test('resets with hard', () { - expect(file.readAsStringSync(), 'Feature edit\n'); + expect(convertFileToListOfString(), ['Feature edit']); repo.reset(oid: repo[sha], resetType: GitReset.hard); expect(file.readAsStringSync(), isEmpty); }); test('resets with soft', () { - expect(file.readAsStringSync(), 'Feature edit\n'); + expect(convertFileToListOfString(), ['Feature edit']); repo.reset(oid: repo[sha], resetType: GitReset.soft); - expect(file.readAsStringSync(), 'Feature edit\n'); + expect(convertFileToListOfString(), ['Feature edit']); final diff = Diff.indexToWorkdir(repo: repo, index: repo.index); expect(diff.deltas, isEmpty); }); test('resets with mixed', () { - expect(file.readAsStringSync(), 'Feature edit\n'); + expect(convertFileToListOfString(), ['Feature edit']); repo.reset(oid: repo[sha], resetType: GitReset.mixed); - expect(file.readAsStringSync(), 'Feature edit\n'); + expect(convertFileToListOfString(), ['Feature edit']); final diff = Diff.indexToWorkdir(repo: repo, index: repo.index); expect(diff.deltas.length, 1); }); test('resets with provided checkout options', () { - expect(file.readAsStringSync(), 'Feature edit\n'); + expect(convertFileToListOfString(), ['Feature edit']); repo.reset( oid: repo[sha], @@ -60,7 +66,7 @@ void main() { pathspec: ['feature_file'], ); - expect(file.readAsStringSync(), isEmpty); + expect(convertFileToListOfString(), []); }); test(