The libnvdimm unit tests will fail when they are run against the production / in-tree version of libnvdimm.ko or nfit.ko due to symbols not being mocked per nfit_test's expectation. For example, nfit_test expects acpi_evaluate_dsm() to be replaced by __wrap_acpi_evaluate_dsm() to test how acpi_nfit_ctl() responds to different stimuli. Create a test-only symbol name that nfit_test links against to cause module load failures when the wrong module is present. For example, with this change, attempts to use the wrong module will report: nfit_test: Unknown symbol libnvdimm_test (err 0)
Unified · Split
| @@ -37,10 +37,12 @@ obj-$(CONFIG_DEV_DAX_PMEM) += dax_pmem.o · 36 unmodified lines | ||
| 37 | 37 | |
| 38 | 38 | nfit-y := $(ACPI_SRC)/core.o |
| 39 | 39 | nfit-$(CONFIG_X86_MCE) += $(ACPI_SRC)/mce.o |
| 40 | +nfit-y += acpi_nfit_test.o | |
| 40 | 41 | nfit-y += config_check.o |
| 41 | 42 | |
| 42 | 43 | nd_pmem-y := $(NVDIMM_SRC)/pmem.o |
| 43 | 44 | nd_pmem-y += pmem-dax.o |
| 45 | +nd_pmem-y += pmem_test.o | |
| 44 | 46 | nd_pmem-y += config_check.o |
| 45 | 47 | |
| 46 | 48 | nd_btt-y := $(NVDIMM_SRC)/btt.o |
| @@ -57,6 +59,7 @@ dax-y += config_check.o · 10 unmodified lines | ||
| 57 | 59 | |
| 58 | 60 | device_dax-y := $(DAX_SRC)/device.o |
| 59 | 61 | device_dax-y += dax-dev.o |
| 62 | +device_dax-y += device_dax_test.o | |
| 60 | 63 | device_dax-y += config_check.o |
| 61 | 64 | |
| 62 | 65 | dax_pmem-y := $(DAX_SRC)/pmem.o |
| @@ -75,6 +78,7 @@ libnvdimm-$(CONFIG_ND_CLAIM) += $(NVDIMM_SRC)/claim.o · 12 unmodified lines | ||
| 75 | 78 | libnvdimm-$(CONFIG_BTT) += $(NVDIMM_SRC)/btt_devs.o |
| 76 | 79 | libnvdimm-$(CONFIG_NVDIMM_PFN) += $(NVDIMM_SRC)/pfn_devs.o |
| 77 | 80 | libnvdimm-$(CONFIG_NVDIMM_DAX) += $(NVDIMM_SRC)/dax_devs.o |
| 81 | +libnvdimm-y += libnvdimm_test.o | |
| 78 | 82 | libnvdimm-y += config_check.o |
| 79 | 83 | |
| 80 | 84 | obj-m += test/ |
| @@ -0,0 +1,8 @@ | ||
| 1 | +// SPDX-License-Identifier: GPL-2.0 | |
| 2 | +// Copyright(c) 2018 Intel Corporation. All rights reserved. | |
| 3 | + | |
| 4 | +#include <linux/module.h> | |
| 5 | +#include <linux/printk.h> | |
| 6 | +#include "watermark.h" | |
| 7 | + | |
| 8 | +nfit_test_watermark(acpi_nfit); | |
| @@ -0,0 +1,8 @@ | ||
| 1 | +// SPDX-License-Identifier: GPL-2.0 | |
| 2 | +// Copyright(c) 2018 Intel Corporation. All rights reserved. | |
| 3 | + | |
| 4 | +#include <linux/module.h> | |
| 5 | +#include <linux/printk.h> | |
| 6 | +#include "watermark.h" | |
| 7 | + | |
| 8 | +nfit_test_watermark(device_dax); | |
| @@ -0,0 +1,8 @@ | ||
| 1 | +// SPDX-License-Identifier: GPL-2.0 | |
| 2 | +// Copyright(c) 2018 Intel Corporation. All rights reserved. | |
| 3 | + | |
| 4 | +#include <linux/module.h> | |
| 5 | +#include <linux/printk.h> | |
| 6 | +#include "watermark.h" | |
| 7 | + | |
| 8 | +nfit_test_watermark(libnvdimm); | |
| @@ -0,0 +1,8 @@ | ||
| 1 | +// SPDX-License-Identifier: GPL-2.0 | |
| 2 | +// Copyright(c) 2018 Intel Corporation. All rights reserved. | |
| 3 | + | |
| 4 | +#include <linux/module.h> | |
| 5 | +#include <linux/printk.h> | |
| 6 | +#include "watermark.h" | |
| 7 | + | |
| 8 | +nfit_test_watermark(pmem); | |
| @@ -27,6 +27,7 @@ · 26 unmodified lines | ||
| 27 | 27 | #include <nfit.h> |
| 28 | 28 | #include <nd.h> |
| 29 | 29 | #include "nfit_test.h" |
| 30 | +#include "../watermark.h" | |
| 30 | 31 | |
| 31 | 32 | /* |
| 32 | 33 | * Generate an NFIT table to describe the following topology: |
| @@ -2545,6 +2546,11 @@ static __init int nfit_test_init(void) · 2512 unmodified lines | ||
| 2545 | 2546 | { |
| 2546 | 2547 | int rc, i; |
| 2547 | 2548 | |
| 2549 | + pmem_test(); | |
| 2550 | + libnvdimm_test(); | |
| 2551 | + acpi_nfit_test(); | |
| 2552 | + device_dax_test(); | |
| 2553 | + | |
| 2548 | 2554 | nfit_test_setup(nfit_test_lookup, nfit_test_evaluate_dsm); |
| 2549 | 2555 | |
| 2550 | 2556 | nfit_wq = create_singlethread_workqueue("nfit"); |
| @@ -0,0 +1,21 @@ | ||
| 1 | +// SPDX-License-Identifier: GPL-2.0 | |
| 2 | +// Copyright(c) 2018 Intel Corporation. All rights reserved. | |
| 3 | +#ifndef _TEST_NVDIMM_WATERMARK_H_ | |
| 4 | +#define _TEST_NVDIMM_WATERMARK_H_ | |
| 5 | +int pmem_test(void); | |
| 6 | +int libnvdimm_test(void); | |
| 7 | +int acpi_nfit_test(void); | |
| 8 | +int device_dax_test(void); | |
| 9 | + | |
| 10 | +/* | |
| 11 | + * dummy routine for nfit_test to validate it is linking to the properly | |
| 12 | + * mocked module and not the standard one from the base tree. | |
| 13 | + */ | |
| 14 | +#define nfit_test_watermark(x) \ | |
| 15 | +int x##_test(void) \ | |
| 16 | +{ \ | |
| 17 | + pr_debug("%s for nfit_test\n", KBUILD_MODNAME); \ | |
| 18 | + return 0; \ | |
| 19 | +} \ | |
| 20 | +EXPORT_SYMBOL(x##_test) | |
| 21 | +#endif /* _TEST_NVDIMM_WATERMARK_H_ */ | |