diff --git a/default.nix b/default.nix
index 6a5ee5753b59b2b455afe8f1bb1e9137141f3127..fa7de3d3f58e2ff7a377407b8d43b2d81343d332 100644
--- a/default.nix
+++ b/default.nix
@@ -56,6 +56,7 @@ let self = rec {
       pkg-config
       ninja
       zeromq
+      gtest.dev
     ];
   };
   client-cpp = pkgs.stdenv.mkDerivation {
diff --git a/simgrid-simulator/meson.build b/simgrid-simulator/meson.build
index 6de27345adb2a435a692efa6ee00c762e3f0542e..c316e14762b7f50bda56bbf1fd6bf98f7cdbc04e 100644
--- a/simgrid-simulator/meson.build
+++ b/simgrid-simulator/meson.build
@@ -24,3 +24,19 @@ simulator = executable('simulator', [
   dependencies: deps,
   install: true
 )
+
+# unit tests with gtest
+if get_option('do_unit_tests')
+    gtest_dep = dependency('gtest_main', version: '>=1.8.0', required: true)
+    test_incdir = include_directories('test', 'src')
+    test_src = [
+        'test/flop_conversion.cpp',
+        'src/compute.cpp', 'src/compute.hpp'
+    ]
+    unittest = executable('simulator-unit-tester',
+        test_src,
+        dependencies: [gtest_dep],
+        include_directories: [test_incdir]
+    )
+    test('unittest', unittest)
+endif
diff --git a/simgrid-simulator/meson_options.txt b/simgrid-simulator/meson_options.txt
new file mode 100644
index 0000000000000000000000000000000000000000..618662e1df6a8928ef2bddddb35b90ccf6e552dc
--- /dev/null
+++ b/simgrid-simulator/meson_options.txt
@@ -0,0 +1,2 @@
+option('do_unit_tests', type : 'boolean', value : false,
+    description : 'Enable unit tests (requires gtest)')
diff --git a/simgrid-simulator/test/flop_conversion.cpp b/simgrid-simulator/test/flop_conversion.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..50121f40dbc2676ed91d34db6ebbe1b91c61964b
--- /dev/null
+++ b/simgrid-simulator/test/flop_conversion.cpp
@@ -0,0 +1,29 @@
+#include <gtest/gtest.h>
+
+#include "compute.hpp"
+
+void test_wrapper_flop_conversion(float desired, float actual)
+{
+    float got = desired_flops_to_simulated_flops(desired);
+    EXPECT_FLOAT_EQ(got, actual);
+}
+
+TEST(flop_conversion, small)
+{
+    test_wrapper_flop_conversion(1.0f, 1.0f);
+    test_wrapper_flop_conversion(5.0f, 5.0f);
+    test_wrapper_flop_conversion(10.0f, 10.0f);
+    test_wrapper_flop_conversion(100.0f, 100.0f);
+}
+
+TEST(flop_conversion, big)
+{
+    test_wrapper_flop_conversion(1e6, 1e6);
+    test_wrapper_flop_conversion(1e9, 1e9);
+    test_wrapper_flop_conversion(1e18, 1e18);
+}
+
+TEST(flop_conversion, wrong)
+{
+    test_wrapper_flop_conversion(1e26, 1e27);
+}