From 7cb667102d393d306ab349a680826c192d8b170b Mon Sep 17 00:00:00 2001 From: "Rubio R. C. Terra" Date: Mon, 6 Feb 2017 18:10:45 -0200 Subject: [PATCH 1/2] Adding a section explaining how to fake variadic functions --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 2526170..5a03a19 100644 --- a/README.md +++ b/README.md @@ -329,6 +329,23 @@ The fake will call your custom functions in the order specified by the SET_CUSTO macro. When the last custom fake is reached the fake will keep calling the last custom fake in the sequence. This macro works much like the SET_RETURN_SEQ macro. +## Variadic Functions + +You can fake variadic functions using the macros FAKE_VALUE_FUNC_VARARG +and FAKE_VOID_FUNC_VARARG. For instance: + + FAKE_VALUE_FUNC_VARARG(int, fprintf, FILE *, const char*, ...); + +In order to access the variadic parameters from a custom fake function, declare a +va_list parameter. For instance, a custom fake for fprintf() +could call the real fprintf() like this: + + int fprintf_custom(FILE *stream, const char *format, va_list ap) { + if (fprintf0_fake.return_val < 0) // should we fail? + return fprintf0_fake.return_val; + return vfprintf(stream, format, ap); + } + ## How do I fake a function that returns a value by reference? The basic mechanism that FFF provides you in this case is the custom_fake field described in the *Custom Return Value Delegate* example above. From 68692c712c772015e8b8ae950e853581b42305c6 Mon Sep 17 00:00:00 2001 From: usr42 Date: Mon, 6 Feb 2017 21:13:04 +0100 Subject: [PATCH 2/2] Improve vararg tests --- test/test_cases.include | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/test_cases.include b/test/test_cases.include index 9ceed49..84cef45 100644 --- a/test/test_cases.include +++ b/test/test_cases.include @@ -299,6 +299,11 @@ TEST_F(FFFTestSuite, use_void_vararg_fake_with_different_number_of_arguments) voidfunc3var("1 parameter", 1, 10); voidfunc3var("2 parameters", 2, 10, 20); voidfunc3var("3 parameters", 3, 10, 20, 30); + + ASSERT_EQ(voidfunc3var_fake.call_count, 4); + char msg[] = "3 parameters"; + ASSERT_EQ(strcmp(voidfunc3var_fake.arg0_val, msg), 0); + ASSERT_EQ(3, voidfunc3var_fake.arg1_val); } TEST_F(FFFTestSuite, use_value_vararg_fake_with_different_number_of_arguments) @@ -307,6 +312,11 @@ TEST_F(FFFTestSuite, use_value_vararg_fake_with_different_number_of_arguments) valuefunc3var("1 parameter", 1, 10); valuefunc3var("2 parameters", 2, 10, 20); valuefunc3var("3 parameters", 3, 10, 20, 30); + + ASSERT_EQ(valuefunc3var_fake.call_count, 4); + char msg[] = "3 parameters"; + ASSERT_EQ(strcmp(valuefunc3var_fake.arg0_val, msg), 0); + ASSERT_EQ(3, valuefunc3var_fake.arg1_val); } #endif /* __cplusplus */