Skip to content

Commit

Permalink
fetchGit: add simple test for ssh fetching
Browse files Browse the repository at this point in the history
Also move tests to separate files which are auto-imported. This should allow people adding tests concurrently without introducing merge conflicts
  • Loading branch information
DavHau committed Jan 11, 2024
1 parent 572179b commit 1cccf36
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 42 deletions.
52 changes: 12 additions & 40 deletions tests/nixos/fetch-git/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -8,53 +8,25 @@

/*
Test cases
Test cases are automatically imported from ./test-cases/{name}
The following is set up automatically for each test case:
- a repo with the {name} is created on the gitea server
- a repo with the {name} is created on the client
- the client repo is configured to push to the server repo
Python variables:
- repo.path: the path to the directory of the client repo
- repo.git: the git command with the client repo as the working directory
- repo.remote: the url to the server repo
*/
testCases = [
{
name = "simple-http";
description = "can fetch a git repo via http";
script = ''
# add a file to the repo
client.succeed(f"""
echo chiang-mai > {repo.path}/thailand \
&& {repo.git} add thailand \
&& {repo.git} commit -m 'commit1'
""")
# memoize the revision
rev1 = client.succeed(f"""
{repo.git} rev-parse HEAD
""").strip()
# push to the server
client.succeed(f"""
{repo.git} push origin main
""")
# fetch the repo via nix
fetched1 = client.succeed(f"""
nix eval --impure --raw --expr "(builtins.fetchGit {repo.remote}).outPath"
""")
# check if the committed file is there
client.succeed(f"""
test -f {fetched1}/thailand
""")
# check if the revision is the same
rev1_fetched = client.succeed(f"""
nix eval --impure --raw --expr "(builtins.fetchGit {repo.remote}).rev"
""").strip()
assert rev1 == rev1_fetched
'';
}
];
testCases =
map
(testCaseName: {...}: {
imports = ["${./test-cases}/${testCaseName}"];
# ensures tests are named like their directories they are defined in
name = testCaseName;
})
(lib.attrNames (builtins.readDir ./test-cases));
}
37 changes: 37 additions & 0 deletions tests/nixos/fetch-git/test-cases/simple-http/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
description = "can fetch a git repo via ssh";
script = ''
# add a file to the repo
client.succeed(f"""
echo chiang-mai > {repo.path}/thailand \
&& {repo.git} add thailand \
&& {repo.git} commit -m 'commit1'
""")
# memoize the revision
rev1 = client.succeed(f"""
{repo.git} rev-parse HEAD
""").strip()
# push to the server
client.succeed(f"""
{repo.git} push origin main
""")
# fetch the repo via nix
fetched1 = client.succeed(f"""
nix eval --impure --raw --expr "(builtins.fetchGit {repo.remote}).outPath"
""")
# check if the committed file is there
client.succeed(f"""
test -f {fetched1}/thailand
""")
# check if the revision is the same
rev1_fetched = client.succeed(f"""
nix eval --impure --raw --expr "(builtins.fetchGit {repo.remote}).rev"
""").strip()
assert rev1 == rev1_fetched
'';
}
47 changes: 47 additions & 0 deletions tests/nixos/fetch-git/test-cases/simple-ssh/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{
description = "can fetch a git repo via http";
script = ''
# add a file to the repo
client.succeed(f"""
echo chiang-mai > {repo.path}/thailand \
&& {repo.git} add thailand \
&& {repo.git} commit -m 'commit1'
""")
# memoize the revision
rev1 = client.succeed(f"""
{repo.git} rev-parse HEAD
""").strip()
# push to the server
client.succeed(f"""
ssh root@gitea "git init --bare -b main simple-ssh" \
&& {repo.git} remote set-url origin root@gitea:simple-ssh \
&& {repo.git} push origin main
""")
# fetch the repo via nix
fetched1 = client.succeed("""
nix eval --impure --raw --expr '
(builtins.fetchGit {
url = "ssh://gitea/root/simple-ssh";
}).outPath
'
""")
# check if the committed file is there
client.succeed(f"""
test -f {fetched1}/thailand
""")
# check if the revision is the same
rev1_fetched = client.succeed("""
nix eval --impure --raw --expr '
(builtins.fetchGit {
url = "ssh://gitea/root/simple-ssh";
}).rev
'
""").strip()
assert rev1 == rev1_fetched
'';
}
41 changes: 39 additions & 2 deletions tests/nixos/fetch-git/testsupport/gitea.nix
Original file line number Diff line number Diff line change
@@ -1,4 +1,18 @@
{ lib, nixpkgs, system, ... }: {
{ lib, nixpkgs, system, pkgs, ... }: let
clientPrivateKey = pkgs.writeText "id_ed25519" ''
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACBbeWvHh/AWGWI6EIc1xlSihyXtacNQ9KeztlW/VUy8wQAAAJAwVQ5VMFUO
VQAAAAtzc2gtZWQyNTUxOQAAACBbeWvHh/AWGWI6EIc1xlSihyXtacNQ9KeztlW/VUy8wQ
AAAEB7lbfkkdkJoE+4TKHPdPQWBKLSx+J54Eg8DaTr+3KoSlt5a8eH8BYZYjoQhzXGVKKH
Je1pw1D0p7O2Vb9VTLzBAAAACGJmb0BtaW5pAQIDBAU=
-----END OPENSSH PRIVATE KEY-----
'';

clientPublicKey =
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFt5a8eH8BYZYjoQhzXGVKKHJe1pw1D0p7O2Vb9VTLzB";

in {
imports = [
../testsupport/setup.nix
];
Expand All @@ -8,8 +22,11 @@
services.gitea.settings.service.DISABLE_REGISTRATION = true;
services.gitea.settings.log.LEVEL = "Info";
services.gitea.settings.database.LOG_SQL = false;
services.openssh.enable = true;
networking.firewall.allowedTCPPorts = [ 3000 ];
environment.systemPackages = [ pkgs.gitea ];
environment.systemPackages = [ pkgs.git pkgs.gitea ];

users.users.root.openssh.authorizedKeys.keys = [clientPublicKey];

# TODO: remove this after updating to nixos-23.11
nixpkgs.pkgs = lib.mkForce (import nixpkgs {
Expand Down Expand Up @@ -59,5 +76,25 @@
git config --global gc.autodetach 0
git config --global gc.auto 0
""")
# add client's private key to ~/.ssh
client.succeed("""
mkdir -p ~/.ssh
chmod 700 ~/.ssh
cat ${clientPrivateKey} >~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
""")
client.succeed("""
echo "Host gitea" >>~/.ssh/config
echo " StrictHostKeyChecking no" >>~/.ssh/config
echo " UserKnownHostsFile /dev/null" >>~/.ssh/config
echo " User root" >>~/.ssh/config
""")
# ensure ssh from client to gitea works
client.succeed("""
ssh root@gitea true
""")
'';
}

0 comments on commit 1cccf36

Please sign in to comment.