aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2022-02-03 18:04:43 +0100
committerJill <kokakiwi@deuxfleurs.fr>2022-02-10 17:55:50 +0100
commit5d19f3d2d73426749e6f7b69eea1dbf24fdedc6a (patch)
treee7c723b25ed01be138b718bebd335a2786f09557
parent084dcdbd3aadb8eb39ca19974623ae81d76456fc (diff)
downloadgarage-5d19f3d2d73426749e6f7b69eea1dbf24fdedc6a.tar.gz
garage-5d19f3d2d73426749e6f7b69eea1dbf24fdedc6a.zip
Add integration tests to Drone
-rw-r--r--.drone.yml21
-rw-r--r--Cargo.nix11
-rw-r--r--default.nix47
-rw-r--r--nix/common.nix4
-rw-r--r--shell.nix2
-rw-r--r--src/garage/tests/common/garage.rs8
6 files changed, 58 insertions, 35 deletions
diff --git a/.drone.yml b/.drone.yml
index ba2cada1..903be5b0 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -48,8 +48,10 @@ steps:
commands:
- nix-build --no-build-output --option log-lines 100 --argstr target x86_64-unknown-linux-musl --arg release false --argstr git_version $DRONE_COMMIT
- - name: unit tests
+ - name: unit + func tests
image: nixpkgs/nix:nixos-21.05
+ environment:
+ GARAGE_TEST_INTEGRATION_EXE: result/bin/garage
volumes:
- name: nix_store
path: /nix
@@ -62,13 +64,14 @@ steps:
--option log-lines 100 \
--argstr target x86_64-unknown-linux-musl \
--argstr compileMode test
- - ./result*/bin/garage_api*
- - ./result*/bin/garage_model*
- - ./result*/bin/garage_rpc*
- - ./result*/bin/garage_table*
- - ./result*/bin/garage_util*
- - ./result*/bin/garage_web*
- - ./result*/bin/garage*
+ - ./result/bin/garage_api-*
+ - ./result/bin/garage_model-*
+ - ./result/bin/garage_rpc-*
+ - ./result/bin/garage_table-*
+ - ./result/bin/garage_util-*
+ - ./result/bin/garage_web-*
+ - ./result/bin/garage-*
+ - ./result/bin/integration-*
- name: smoke-test
image: nixpkgs/nix:nixos-21.05
@@ -470,6 +473,6 @@ node:
---
kind: signature
-hmac: 928ea1bb59f3ac19b5ddd2a184f17b7c728cc355877c34e61b3d1b421544d4c3
+hmac: 3fc19d6f9a3555519c8405e3281b2e74289bb802f644740d5481d53df3a01fa4
...
diff --git a/Cargo.nix b/Cargo.nix
index 957f763e..d6fcf3aa 100644
--- a/Cargo.nix
+++ b/Cargo.nix
@@ -1,4 +1,4 @@
-# This file was @generated by cargo2nix 0.9.0.
+# This file was @generated by cargo2nix 0.10.0.
# It is not intended to be manually edited.
args@{
@@ -17,6 +17,9 @@ args@{
hostPlatform,
hostPlatformCpu ? null,
hostPlatformFeatures ? [],
+ target ? null,
+ codegenOpts ? null,
+ profileOpts ? null,
mkRustCrate,
rustLib,
lib,
@@ -33,12 +36,12 @@ in let
rootFeatures' = expandFeatures rootFeatures;
overridableMkRustCrate = f:
let
- drvs = genDrvsByProfile profilesByName ({ profile, profileName }: mkRustCrate ({ inherit release profile hostPlatformCpu hostPlatformFeatures; } // (f profileName)));
+ drvs = genDrvsByProfile profilesByName ({ profile, profileName }: mkRustCrate ({ inherit release profile hostPlatformCpu hostPlatformFeatures target profileOpts codegenOpts; } // (f profileName)));
in { compileMode ? null, profileName ? decideProfile compileMode release }:
let drv = drvs.${profileName}; in if compileMode == null then drv else drv.override { inherit compileMode; };
in
{
- cargo2nixVersion = "0.9.0";
+ cargo2nixVersion = "0.10.0";
workspace = {
garage_util = rustPackages.unknown.garage_util."0.6.0";
garage_rpc = rustPackages.unknown.garage_rpc."0.6.0";
@@ -2283,7 +2286,7 @@ in
];
dependencies = {
${ if hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux" then "libc" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.115" { inherit profileName; };
- ${ if hostPlatform.parsed.kernel.name == "dragonfly" || hostPlatform.parsed.kernel.name == "freebsd" || hostPlatform.parsed.kernel.name == "illumos" || hostPlatform.parsed.kernel.name == "netbsd" || hostPlatform.parsed.kernel.name == "openbsd" || hostPlatform.parsed.kernel.name == "solaris" || hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux" then "once_cell" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.8.0" { inherit profileName; };
+ ${ if hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux" || hostPlatform.parsed.kernel.name == "dragonfly" || hostPlatform.parsed.kernel.name == "freebsd" || hostPlatform.parsed.kernel.name == "illumos" || hostPlatform.parsed.kernel.name == "netbsd" || hostPlatform.parsed.kernel.name == "openbsd" || hostPlatform.parsed.kernel.name == "solaris" then "once_cell" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.8.0" { inherit profileName; };
${ if hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" || (hostPlatform.parsed.cpu.name == "aarch64" || hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l") && (hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "fuchsia" || hostPlatform.parsed.kernel.name == "linux") then "spin" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".spin."0.5.2" { inherit profileName; };
untrusted = rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.7.1" { inherit profileName; };
${ if hostPlatform.parsed.cpu.name == "wasm32" && hostPlatform.parsed.vendor.name == "unknown" && hostPlatform.parsed.kernel.name == "unknown" && hostPlatform.parsed.abi.name == "" then "web_sys" else null } = rustPackages."registry+https://github.com/rust-lang/crates.io-index".web-sys."0.3.56" { inherit profileName; };
diff --git a/default.nix b/default.nix
index 09416208..c78c37b6 100644
--- a/default.nix
+++ b/default.nix
@@ -17,13 +17,25 @@ in let
};
/*
- The following complexity should be abstracted by makePackageSet' (note the final quote).
- However its code uses deprecated features of rust-overlay that can lead to bug.
- Instead, we build our own rustChannel object with the recommended API of rust-overlay.
+ Cargo2nix is built for rustOverlay which installs Rust from Mozilla releases.
+ We want our own Rust to avoir incompatibilities, like we had with musl 1.2.0.
+ rustc was built with musl < 1.2.0 and nix shipped musl >= 1.2.0 which lead to compilation breakage.
+ So we want a Rust release that is bound to our Nix repository to avoid these problems.
+ See here for more info: https://musl.libc.org/time64.html
+ Because Cargo2nix does not support the Rust environment shipped by NixOS,
+ we emulate the structure of the Rust object created by rustOverlay.
+ In practise, rustOverlay ships rustc+cargo in a single derivation while
+ NixOS ships them in separate ones. We reunite them with symlinkJoin.
*/
- rustChannel = pkgs.rustPlatform.rust;
+ rustChannel = pkgs.symlinkJoin {
+ name ="rust-channel";
+ paths = [
+ pkgs.rustPlatform.rust.rustc
+ pkgs.rustPlatform.rust.cargo
+ ];
+ };
- overrides = pkgs.buildPackages.rustBuilder.overrides.all ++ [
+ overrides = pkgs.rustBuilder.overrides.all ++ [
/*
We want to inject the git version while keeping the build deterministic.
As we do not want to consider the .git folder as part of the input source,
@@ -57,30 +69,27 @@ in let
packageFun = import ./Cargo.nix;
+ /*
+ The following definition is not elegant as we use a low level function of Cargo2nix
+ that enables us to pass our custom rustChannel object
+ */
rustPkgs = pkgs.rustBuilder.makePackageSet {
inherit packageFun rustChannel release;
packageOverrides = overrides;
+ target = null; /* we set target to null because we want that cargo2nix computes it automatically */
buildRustPackages = pkgs.buildPackages.rustBuilder.makePackageSet {
inherit rustChannel packageFun;
packageOverrides = overrides;
+ target = null; /* we set target to null because we want that cargo2nix computes it automatically */
};
-
- localPatterns = [
- /*
- The way the default rules are written make think we match recursively, on full path, but the rules are misleading.
- In fact, the regex is only called on root elements of the crate (and not recursively).
- This behavior does not work well with our nested modules.
- We tried to build a "deny list" but negative lookup ahead are not supported on Nix.
- As a workaround, we have to register all our submodules in this allow list...
- */
- ''^(src|tests)'' # fixed default
- ''.*\.(rs|toml)$'' # fixed default
- ''^(crdt|replication|cli|helper|signature|common|ext)'' # our crate submodules
- ];
};
+
in
if compileMode == "test"
- then builtins.mapAttrs (name: value: rustPkgs.workspace.${name} { inherit compileMode; }) rustPkgs.workspace
+ then pkgs.symlinkJoin {
+ name ="garage-tests";
+ paths = builtins.map (key: rustPkgs.workspace.${key} { inherit compileMode; }) (builtins.attrNames rustPkgs.workspace);
+ }
else rustPkgs.workspace.garage { inherit compileMode; }
diff --git a/nix/common.nix b/nix/common.nix
index bf14b6c6..863aa3f1 100644
--- a/nix/common.nix
+++ b/nix/common.nix
@@ -8,12 +8,14 @@ rec {
sha256 = "1xy9zpypqfxs5gcq5dcla4bfkhxmh5nzn9dyqkr03lqycm9wg5cr";
};
cargo2nixSrc = fetchGit {
- # As of 2021-10-06
+ # As of 2022-02-03
url = "https://github.com/superboum/cargo2nix";
ref = "backward-compat";
rev = "08d963f32a774353ee8acf3f61749915875c1ec4";
};
+
+
/*
* Shared objects
*/
diff --git a/shell.nix b/shell.nix
index bb2030f2..48c76e37 100644
--- a/shell.nix
+++ b/shell.nix
@@ -76,7 +76,7 @@ function refresh_toolchain {
pkgs.rustPlatform.rust.cargo
pkgs.clippy
pkgs.rustfmt
- /* cargo2nix.packages.x86_64-linux.cargo2nix */
+ cargo2nix.packages.x86_64-linux.cargo2nix
] else [])
++
(if integration then [
diff --git a/src/garage/tests/common/garage.rs b/src/garage/tests/common/garage.rs
index 97c7a227..d9dbcc7c 100644
--- a/src/garage/tests/common/garage.rs
+++ b/src/garage/tests/common/garage.rs
@@ -1,3 +1,4 @@
+use std::env::var_os;
use std::mem::MaybeUninit;
use std::path::{Path, PathBuf};
use std::process;
@@ -203,7 +204,12 @@ pub fn instance() -> &'static Instance {
}
pub fn command(config_path: &Path) -> process::Command {
- let mut command = process::Command::new(env!("CARGO_BIN_EXE_garage"));
+ let mut command = process::Command::new(
+ var_os("GARAGE_TEST_INTEGRATION_EXE")
+ .as_ref()
+ .and_then(|e| e.to_str())
+ .unwrap_or(env!("CARGO_BIN_EXE_garage")),
+ );
command.arg("-c").arg(config_path);