xref: /openbmc/linux/sound/soc/soc-topology-test.c (revision 1892a991886ace2c3450bec801df2cf4028a803a)
1d52bbf74SAmadeusz Sławiński // SPDX-License-Identifier: GPL-2.0-only
2d52bbf74SAmadeusz Sławiński /*
3d52bbf74SAmadeusz Sławiński  * soc-topology-test.c  --  ALSA SoC Topology Kernel Unit Tests
4d52bbf74SAmadeusz Sławiński  *
5d52bbf74SAmadeusz Sławiński  * Copyright(c) 2021 Intel Corporation. All rights reserved.
6d52bbf74SAmadeusz Sławiński  */
7d52bbf74SAmadeusz Sławiński 
8d52bbf74SAmadeusz Sławiński #include <linux/firmware.h>
9d52bbf74SAmadeusz Sławiński #include <sound/core.h>
10d52bbf74SAmadeusz Sławiński #include <sound/soc.h>
11d52bbf74SAmadeusz Sławiński #include <sound/soc-topology.h>
12d52bbf74SAmadeusz Sławiński #include <kunit/test.h>
13d52bbf74SAmadeusz Sławiński 
14d52bbf74SAmadeusz Sławiński /* ===== HELPER FUNCTIONS =================================================== */
15d52bbf74SAmadeusz Sławiński 
16d52bbf74SAmadeusz Sławiński /*
17d52bbf74SAmadeusz Sławiński  * snd_soc_component needs device to operate on (primarily for prints), create
18d52bbf74SAmadeusz Sławiński  * fake one, as we don't register with PCI or anything else
19d52bbf74SAmadeusz Sławiński  * device_driver name is used in some of the prints (fmt_single_name) so
20d52bbf74SAmadeusz Sławiński  * we also mock up minimal one
21d52bbf74SAmadeusz Sławiński  */
22d52bbf74SAmadeusz Sławiński static struct device *test_dev;
23d52bbf74SAmadeusz Sławiński 
24d52bbf74SAmadeusz Sławiński static struct device_driver test_drv = {
25d52bbf74SAmadeusz Sławiński 	.name = "sound-soc-topology-test-driver",
26d52bbf74SAmadeusz Sławiński };
27d52bbf74SAmadeusz Sławiński 
28d52bbf74SAmadeusz Sławiński static int snd_soc_tplg_test_init(struct kunit *test)
29d52bbf74SAmadeusz Sławiński {
30d52bbf74SAmadeusz Sławiński 	test_dev = root_device_register("sound-soc-topology-test");
31d52bbf74SAmadeusz Sławiński 	test_dev = get_device(test_dev);
32d52bbf74SAmadeusz Sławiński 	if (!test_dev)
33d52bbf74SAmadeusz Sławiński 		return -ENODEV;
34d52bbf74SAmadeusz Sławiński 
35d52bbf74SAmadeusz Sławiński 	test_dev->driver = &test_drv;
36d52bbf74SAmadeusz Sławiński 
37d52bbf74SAmadeusz Sławiński 	return 0;
38d52bbf74SAmadeusz Sławiński }
39d52bbf74SAmadeusz Sławiński 
40d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_exit(struct kunit *test)
41d52bbf74SAmadeusz Sławiński {
42d52bbf74SAmadeusz Sławiński 	put_device(test_dev);
43d52bbf74SAmadeusz Sławiński 	root_device_unregister(test_dev);
44d52bbf74SAmadeusz Sławiński }
45d52bbf74SAmadeusz Sławiński 
46d52bbf74SAmadeusz Sławiński /*
47d52bbf74SAmadeusz Sławiński  * helper struct we use when registering component, as we load topology during
48d52bbf74SAmadeusz Sławiński  * component probe, we need to pass struct kunit somehow to probe function, so
49d52bbf74SAmadeusz Sławiński  * we can report test result
50d52bbf74SAmadeusz Sławiński  */
51d52bbf74SAmadeusz Sławiński struct kunit_soc_component {
52d52bbf74SAmadeusz Sławiński 	struct kunit *kunit;
53d52bbf74SAmadeusz Sławiński 	int expect; /* what result we expect when loading topology */
54d52bbf74SAmadeusz Sławiński 	struct snd_soc_component comp;
55d52bbf74SAmadeusz Sławiński 	struct snd_soc_card card;
56d52bbf74SAmadeusz Sławiński 	struct firmware fw;
57d52bbf74SAmadeusz Sławiński };
58d52bbf74SAmadeusz Sławiński 
59d52bbf74SAmadeusz Sławiński static int d_probe(struct snd_soc_component *component)
60d52bbf74SAmadeusz Sławiński {
61d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp =
62d52bbf74SAmadeusz Sławiński 			container_of(component, struct kunit_soc_component, comp);
63d52bbf74SAmadeusz Sławiński 	int ret;
64d52bbf74SAmadeusz Sławiński 
65d52bbf74SAmadeusz Sławiński 	ret = snd_soc_tplg_component_load(component, NULL, &kunit_comp->fw);
66d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret,
67d52bbf74SAmadeusz Sławiński 			    "Failed topology load");
68d52bbf74SAmadeusz Sławiński 
69d52bbf74SAmadeusz Sławiński 	return 0;
70d52bbf74SAmadeusz Sławiński }
71d52bbf74SAmadeusz Sławiński 
72d52bbf74SAmadeusz Sławiński static void d_remove(struct snd_soc_component *component)
73d52bbf74SAmadeusz Sławiński {
74d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp =
75d52bbf74SAmadeusz Sławiński 			container_of(component, struct kunit_soc_component, comp);
76d52bbf74SAmadeusz Sławiński 	int ret;
77d52bbf74SAmadeusz Sławiński 
78d52bbf74SAmadeusz Sławiński 	ret = snd_soc_tplg_component_remove(component);
79d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(kunit_comp->kunit, 0, ret);
80d52bbf74SAmadeusz Sławiński }
81d52bbf74SAmadeusz Sławiński 
82d52bbf74SAmadeusz Sławiński /*
83d52bbf74SAmadeusz Sławiński  * ASoC minimal boiler plate
84d52bbf74SAmadeusz Sławiński  */
85d52bbf74SAmadeusz Sławiński SND_SOC_DAILINK_DEF(dummy, DAILINK_COMP_ARRAY(COMP_DUMMY()));
86d52bbf74SAmadeusz Sławiński 
87d52bbf74SAmadeusz Sławiński SND_SOC_DAILINK_DEF(platform, DAILINK_COMP_ARRAY(COMP_PLATFORM("sound-soc-topology-test")));
88d52bbf74SAmadeusz Sławiński 
89d52bbf74SAmadeusz Sławiński static struct snd_soc_dai_link kunit_dai_links[] = {
90d52bbf74SAmadeusz Sławiński 	{
91d52bbf74SAmadeusz Sławiński 		.name = "KUNIT Audio Port",
92d52bbf74SAmadeusz Sławiński 		.id = 0,
93d52bbf74SAmadeusz Sławiński 		.stream_name = "Audio Playback/Capture",
94d52bbf74SAmadeusz Sławiński 		.nonatomic = 1,
95d52bbf74SAmadeusz Sławiński 		.dynamic = 1,
96d52bbf74SAmadeusz Sławiński 		.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
97d52bbf74SAmadeusz Sławiński 		.dpcm_playback = 1,
98d52bbf74SAmadeusz Sławiński 		.dpcm_capture = 1,
99d52bbf74SAmadeusz Sławiński 		SND_SOC_DAILINK_REG(dummy, dummy, platform),
100d52bbf74SAmadeusz Sławiński 	},
101d52bbf74SAmadeusz Sławiński };
102d52bbf74SAmadeusz Sławiński 
103d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component = {
104d52bbf74SAmadeusz Sławiński 	.name = "sound-soc-topology-test",
105d52bbf74SAmadeusz Sławiński 	.probe = d_probe,
106d52bbf74SAmadeusz Sławiński 	.remove = d_remove,
107d52bbf74SAmadeusz Sławiński 	.non_legacy_dai_naming = 1,
108d52bbf74SAmadeusz Sławiński };
109d52bbf74SAmadeusz Sławiński 
110cec9128dSAmadeusz Sławiński /* ===== TOPOLOGY TEMPLATES ================================================= */
111cec9128dSAmadeusz Sławiński 
112cec9128dSAmadeusz Sławiński // Structural representation of topology which can be generated with:
113cec9128dSAmadeusz Sławiński // $ touch empty
114cec9128dSAmadeusz Sławiński // $ alsatplg -c empty -o empty.tplg
115cec9128dSAmadeusz Sławiński // $ xxd -i empty.tplg
116cec9128dSAmadeusz Sławiński 
117cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 {
118cec9128dSAmadeusz Sławiński 	struct snd_soc_tplg_hdr header;
119cec9128dSAmadeusz Sławiński 	struct snd_soc_tplg_manifest manifest;
120cec9128dSAmadeusz Sławiński } __packed;
121cec9128dSAmadeusz Sławiński 
122cec9128dSAmadeusz Sławiński static struct tplg_tmpl_001 tplg_tmpl_empty = {
123cec9128dSAmadeusz Sławiński 	.header = {
124be6be67eSAmadeusz Sławiński 		.magic = cpu_to_le32(SND_SOC_TPLG_MAGIC),
125be6be67eSAmadeusz Sławiński 		.abi = cpu_to_le32(5),
126cec9128dSAmadeusz Sławiński 		.version = 0,
127be6be67eSAmadeusz Sławiński 		.type = cpu_to_le32(SND_SOC_TPLG_TYPE_MANIFEST),
128be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr)),
129cec9128dSAmadeusz Sławiński 		.vendor_type = 0,
130be6be67eSAmadeusz Sławiński 		.payload_size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)),
131cec9128dSAmadeusz Sławiński 		.index = 0,
132be6be67eSAmadeusz Sławiński 		.count = cpu_to_le32(1),
133cec9128dSAmadeusz Sławiński 	},
134cec9128dSAmadeusz Sławiński 
135cec9128dSAmadeusz Sławiński 	.manifest = {
136be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)),
137cec9128dSAmadeusz Sławiński 		/* rest of fields is 0 */
138cec9128dSAmadeusz Sławiński 	},
139cec9128dSAmadeusz Sławiński };
140cec9128dSAmadeusz Sławiński 
1413ad8c8e9SAmadeusz Sławiński // Structural representation of topology containing SectionPCM
1423ad8c8e9SAmadeusz Sławiński 
1433ad8c8e9SAmadeusz Sławiński struct tplg_tmpl_002 {
1443ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_hdr header;
1453ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_manifest manifest;
1463ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_hdr pcm_header;
1473ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_pcm pcm;
1483ad8c8e9SAmadeusz Sławiński } __packed;
1493ad8c8e9SAmadeusz Sławiński 
1503ad8c8e9SAmadeusz Sławiński static struct tplg_tmpl_002 tplg_tmpl_with_pcm = {
1513ad8c8e9SAmadeusz Sławiński 	.header = {
152be6be67eSAmadeusz Sławiński 		.magic = cpu_to_le32(SND_SOC_TPLG_MAGIC),
153be6be67eSAmadeusz Sławiński 		.abi = cpu_to_le32(5),
1543ad8c8e9SAmadeusz Sławiński 		.version = 0,
155be6be67eSAmadeusz Sławiński 		.type = cpu_to_le32(SND_SOC_TPLG_TYPE_MANIFEST),
156be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr)),
1573ad8c8e9SAmadeusz Sławiński 		.vendor_type = 0,
158be6be67eSAmadeusz Sławiński 		.payload_size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)),
1593ad8c8e9SAmadeusz Sławiński 		.index = 0,
160be6be67eSAmadeusz Sławiński 		.count = cpu_to_le32(1),
1613ad8c8e9SAmadeusz Sławiński 	},
1623ad8c8e9SAmadeusz Sławiński 	.manifest = {
163be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)),
164be6be67eSAmadeusz Sławiński 		.pcm_elems = cpu_to_le32(1),
1653ad8c8e9SAmadeusz Sławiński 		/* rest of fields is 0 */
1663ad8c8e9SAmadeusz Sławiński 	},
1673ad8c8e9SAmadeusz Sławiński 	.pcm_header = {
168be6be67eSAmadeusz Sławiński 		.magic = cpu_to_le32(SND_SOC_TPLG_MAGIC),
169be6be67eSAmadeusz Sławiński 		.abi = cpu_to_le32(5),
1703ad8c8e9SAmadeusz Sławiński 		.version = 0,
171be6be67eSAmadeusz Sławiński 		.type = cpu_to_le32(SND_SOC_TPLG_TYPE_PCM),
172be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr)),
1733ad8c8e9SAmadeusz Sławiński 		.vendor_type = 0,
174be6be67eSAmadeusz Sławiński 		.payload_size = cpu_to_le32(sizeof(struct snd_soc_tplg_pcm)),
1753ad8c8e9SAmadeusz Sławiński 		.index = 0,
176be6be67eSAmadeusz Sławiński 		.count = cpu_to_le32(1),
1773ad8c8e9SAmadeusz Sławiński 	},
1783ad8c8e9SAmadeusz Sławiński 	.pcm = {
179be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_pcm)),
1803ad8c8e9SAmadeusz Sławiński 		.pcm_name = "KUNIT Audio",
1813ad8c8e9SAmadeusz Sławiński 		.dai_name = "kunit-audio-dai",
1823ad8c8e9SAmadeusz Sławiński 		.pcm_id = 0,
1833ad8c8e9SAmadeusz Sławiński 		.dai_id = 0,
184be6be67eSAmadeusz Sławiński 		.playback = cpu_to_le32(1),
185be6be67eSAmadeusz Sławiński 		.capture = cpu_to_le32(1),
1863ad8c8e9SAmadeusz Sławiński 		.compress = 0,
1873ad8c8e9SAmadeusz Sławiński 		.stream = {
1883ad8c8e9SAmadeusz Sławiński 			[0] = {
189be6be67eSAmadeusz Sławiński 				.channels = cpu_to_le32(2),
1903ad8c8e9SAmadeusz Sławiński 			},
1913ad8c8e9SAmadeusz Sławiński 			[1] = {
192be6be67eSAmadeusz Sławiński 				.channels = cpu_to_le32(2),
1933ad8c8e9SAmadeusz Sławiński 			},
1943ad8c8e9SAmadeusz Sławiński 		},
1953ad8c8e9SAmadeusz Sławiński 		.num_streams = 0,
1963ad8c8e9SAmadeusz Sławiński 		.caps = {
1973ad8c8e9SAmadeusz Sławiński 			[0] = {
1983ad8c8e9SAmadeusz Sławiński 				.name = "kunit-audio-playback",
199be6be67eSAmadeusz Sławiński 				.channels_min = cpu_to_le32(2),
200be6be67eSAmadeusz Sławiński 				.channels_max = cpu_to_le32(2),
2013ad8c8e9SAmadeusz Sławiński 			},
2023ad8c8e9SAmadeusz Sławiński 			[1] = {
2033ad8c8e9SAmadeusz Sławiński 				.name = "kunit-audio-capture",
204be6be67eSAmadeusz Sławiński 				.channels_min = cpu_to_le32(2),
205be6be67eSAmadeusz Sławiński 				.channels_max = cpu_to_le32(2),
2063ad8c8e9SAmadeusz Sławiński 			},
2073ad8c8e9SAmadeusz Sławiński 		},
2083ad8c8e9SAmadeusz Sławiński 		.flag_mask = 0,
2093ad8c8e9SAmadeusz Sławiński 		.flags = 0,
2103ad8c8e9SAmadeusz Sławiński 		.priv = { 0 },
2113ad8c8e9SAmadeusz Sławiński 	},
2123ad8c8e9SAmadeusz Sławiński };
2133ad8c8e9SAmadeusz Sławiński 
214d52bbf74SAmadeusz Sławiński /* ===== TEST CASES ========================================================= */
215d52bbf74SAmadeusz Sławiński 
216d52bbf74SAmadeusz Sławiński // TEST CASE
217d52bbf74SAmadeusz Sławiński // Test passing NULL component as parameter to snd_soc_tplg_component_load
218d52bbf74SAmadeusz Sławiński 
219d52bbf74SAmadeusz Sławiński /*
220d52bbf74SAmadeusz Sławiński  * need to override generic probe function with one using NULL when calling
221d52bbf74SAmadeusz Sławiński  * topology load during component initialization, we don't need .remove
222d52bbf74SAmadeusz Sławiński  * handler as load should fail
223d52bbf74SAmadeusz Sławiński  */
224d52bbf74SAmadeusz Sławiński static int d_probe_null_comp(struct snd_soc_component *component)
225d52bbf74SAmadeusz Sławiński {
226d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp =
227d52bbf74SAmadeusz Sławiński 			container_of(component, struct kunit_soc_component, comp);
228d52bbf74SAmadeusz Sławiński 	int ret;
229d52bbf74SAmadeusz Sławiński 
230d52bbf74SAmadeusz Sławiński 	/* instead of passing component pointer as first argument, pass NULL here */
231d52bbf74SAmadeusz Sławiński 	ret = snd_soc_tplg_component_load(NULL, NULL, &kunit_comp->fw);
232d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret,
233d52bbf74SAmadeusz Sławiński 			    "Failed topology load");
234d52bbf74SAmadeusz Sławiński 
235d52bbf74SAmadeusz Sławiński 	return 0;
236d52bbf74SAmadeusz Sławiński }
237d52bbf74SAmadeusz Sławiński 
238d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component_null_comp = {
239d52bbf74SAmadeusz Sławiński 	.name = "sound-soc-topology-test",
240d52bbf74SAmadeusz Sławiński 	.probe = d_probe_null_comp,
241d52bbf74SAmadeusz Sławiński 	.non_legacy_dai_naming = 1,
242d52bbf74SAmadeusz Sławiński };
243d52bbf74SAmadeusz Sławiński 
244d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_comp(struct kunit *test)
245d52bbf74SAmadeusz Sławiński {
246d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
247d52bbf74SAmadeusz Sławiński 	int ret;
248d52bbf74SAmadeusz Sławiński 
249d52bbf74SAmadeusz Sławiński 	/* prepare */
250d52bbf74SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
251d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
252d52bbf74SAmadeusz Sławiński 	kunit_comp->kunit = test;
253d52bbf74SAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
254d52bbf74SAmadeusz Sławiński 
255d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
256d52bbf74SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
257d52bbf74SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
258d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
259d52bbf74SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
260d52bbf74SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
261d52bbf74SAmadeusz Sławiński 
262d52bbf74SAmadeusz Sławiński 	/* run test */
263d52bbf74SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
264d52bbf74SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
265d52bbf74SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
266d52bbf74SAmadeusz Sławiński 
267d52bbf74SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component_null_comp, test_dev);
268d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
269d52bbf74SAmadeusz Sławiński 
270d52bbf74SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
271d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
272d52bbf74SAmadeusz Sławiński 
273d52bbf74SAmadeusz Sławiński 	/* cleanup */
274*1892a991SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
275d52bbf74SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
276d52bbf74SAmadeusz Sławiński }
277d52bbf74SAmadeusz Sławiński 
278d52bbf74SAmadeusz Sławiński // TEST CASE
279d52bbf74SAmadeusz Sławiński // Test passing NULL ops as parameter to snd_soc_tplg_component_load
280d52bbf74SAmadeusz Sławiński 
281d52bbf74SAmadeusz Sławiński /*
282d52bbf74SAmadeusz Sławiński  * NULL ops is default case, we pass empty topology (fw), so we don't have
283d52bbf74SAmadeusz Sławiński  * anything to parse and just do nothing, which results in return 0; from
284d52bbf74SAmadeusz Sławiński  * calling soc_tplg_dapm_complete in soc_tplg_process_headers
285d52bbf74SAmadeusz Sławiński  */
286d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_ops(struct kunit *test)
287d52bbf74SAmadeusz Sławiński {
288d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
289d52bbf74SAmadeusz Sławiński 	int ret;
290d52bbf74SAmadeusz Sławiński 
291d52bbf74SAmadeusz Sławiński 	/* prepare */
292d52bbf74SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
293d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
294d52bbf74SAmadeusz Sławiński 	kunit_comp->kunit = test;
295d52bbf74SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
296d52bbf74SAmadeusz Sławiński 
297d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
298d52bbf74SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
299d52bbf74SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
300d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
301d52bbf74SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
302d52bbf74SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
303d52bbf74SAmadeusz Sławiński 
304d52bbf74SAmadeusz Sławiński 	/* run test */
305d52bbf74SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
306d52bbf74SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
307d52bbf74SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
308d52bbf74SAmadeusz Sławiński 
309d52bbf74SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
310d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
311d52bbf74SAmadeusz Sławiński 
312d52bbf74SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
313d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
314d52bbf74SAmadeusz Sławiński 
315d52bbf74SAmadeusz Sławiński 	/* cleanup */
316d52bbf74SAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
317d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
318d52bbf74SAmadeusz Sławiński 
319d52bbf74SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
320d52bbf74SAmadeusz Sławiński }
321d52bbf74SAmadeusz Sławiński 
322d52bbf74SAmadeusz Sławiński // TEST CASE
323d52bbf74SAmadeusz Sławiński // Test passing NULL fw as parameter to snd_soc_tplg_component_load
324d52bbf74SAmadeusz Sławiński 
325d52bbf74SAmadeusz Sławiński /*
326d52bbf74SAmadeusz Sławiński  * need to override generic probe function with one using NULL pointer to fw
327d52bbf74SAmadeusz Sławiński  * when calling topology load during component initialization, we don't need
328d52bbf74SAmadeusz Sławiński  * .remove handler as load should fail
329d52bbf74SAmadeusz Sławiński  */
330d52bbf74SAmadeusz Sławiński static int d_probe_null_fw(struct snd_soc_component *component)
331d52bbf74SAmadeusz Sławiński {
332d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp =
333d52bbf74SAmadeusz Sławiński 			container_of(component, struct kunit_soc_component, comp);
334d52bbf74SAmadeusz Sławiński 	int ret;
335d52bbf74SAmadeusz Sławiński 
336d52bbf74SAmadeusz Sławiński 	/* instead of passing fw pointer as third argument, pass NULL here */
337d52bbf74SAmadeusz Sławiński 	ret = snd_soc_tplg_component_load(component, NULL, NULL);
338d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret,
339d52bbf74SAmadeusz Sławiński 			    "Failed topology load");
340d52bbf74SAmadeusz Sławiński 
341d52bbf74SAmadeusz Sławiński 	return 0;
342d52bbf74SAmadeusz Sławiński }
343d52bbf74SAmadeusz Sławiński 
344d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component_null_fw = {
345d52bbf74SAmadeusz Sławiński 	.name = "sound-soc-topology-test",
346d52bbf74SAmadeusz Sławiński 	.probe = d_probe_null_fw,
347d52bbf74SAmadeusz Sławiński 	.non_legacy_dai_naming = 1,
348d52bbf74SAmadeusz Sławiński };
349d52bbf74SAmadeusz Sławiński 
350d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_fw(struct kunit *test)
351d52bbf74SAmadeusz Sławiński {
352d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
353d52bbf74SAmadeusz Sławiński 	int ret;
354d52bbf74SAmadeusz Sławiński 
355d52bbf74SAmadeusz Sławiński 	/* prepare */
356d52bbf74SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
357d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
358d52bbf74SAmadeusz Sławiński 	kunit_comp->kunit = test;
359d52bbf74SAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
360d52bbf74SAmadeusz Sławiński 
361d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
362d52bbf74SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
363d52bbf74SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
364d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
365d52bbf74SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
366d52bbf74SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
367d52bbf74SAmadeusz Sławiński 
368d52bbf74SAmadeusz Sławiński 	/* run test */
369d52bbf74SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
370d52bbf74SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
371d52bbf74SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
372d52bbf74SAmadeusz Sławiński 
373d52bbf74SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component_null_fw, test_dev);
374d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
375d52bbf74SAmadeusz Sławiński 
376d52bbf74SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
377d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
378d52bbf74SAmadeusz Sławiński 
379d52bbf74SAmadeusz Sławiński 	/* cleanup */
380d52bbf74SAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
381d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
382d52bbf74SAmadeusz Sławiński 
383d52bbf74SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
384d52bbf74SAmadeusz Sławiński }
385d52bbf74SAmadeusz Sławiński 
386cec9128dSAmadeusz Sławiński // TEST CASE
387cec9128dSAmadeusz Sławiński // Test passing "empty" topology file
388cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg(struct kunit *test)
389cec9128dSAmadeusz Sławiński {
390cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
391cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
392cec9128dSAmadeusz Sławiński 	int size;
393cec9128dSAmadeusz Sławiński 	int ret;
394cec9128dSAmadeusz Sławiński 
395cec9128dSAmadeusz Sławiński 	/* prepare */
396cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
397cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
398cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
399cec9128dSAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
400cec9128dSAmadeusz Sławiński 
401cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
402cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
403cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
404cec9128dSAmadeusz Sławiński 
405cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
406cec9128dSAmadeusz Sławiński 
407cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
408cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
409cec9128dSAmadeusz Sławiński 
410cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
411cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
412cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
413cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
414cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
415cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
416cec9128dSAmadeusz Sławiński 
417cec9128dSAmadeusz Sławiński 	/* run test */
418cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
419cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
420cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
421cec9128dSAmadeusz Sławiński 
422cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
423cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
424cec9128dSAmadeusz Sławiński 
425cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
426cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
427cec9128dSAmadeusz Sławiński 
428cec9128dSAmadeusz Sławiński 	/* cleanup */
429cec9128dSAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
430cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
431cec9128dSAmadeusz Sławiński 
432cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
433cec9128dSAmadeusz Sławiński }
434cec9128dSAmadeusz Sławiński 
435cec9128dSAmadeusz Sławiński // TEST CASE
436cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "magic"
437cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
438cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_MAGIC + 1
439cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_magic(struct kunit *test)
440cec9128dSAmadeusz Sławiński {
441cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
442cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
443cec9128dSAmadeusz Sławiński 	int size;
444cec9128dSAmadeusz Sławiński 	int ret;
445cec9128dSAmadeusz Sławiński 
446cec9128dSAmadeusz Sławiński 	/* prepare */
447cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
448cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
449cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
450cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
451cec9128dSAmadeusz Sławiński 
452cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
453cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
454cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
455cec9128dSAmadeusz Sławiński 
456cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
457cec9128dSAmadeusz Sławiński 	/*
458cec9128dSAmadeusz Sławiński 	 * override abi
459cec9128dSAmadeusz Sławiński 	 * any value != magic number is wrong
460cec9128dSAmadeusz Sławiński 	 */
461be6be67eSAmadeusz Sławiński 	data->header.magic = cpu_to_le32(SND_SOC_TPLG_MAGIC + 1);
462cec9128dSAmadeusz Sławiński 
463cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
464cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
465cec9128dSAmadeusz Sławiński 
466cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
467cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
468cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
469cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
470cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
471cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
472cec9128dSAmadeusz Sławiński 
473cec9128dSAmadeusz Sławiński 	/* run test */
474cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
475cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
476cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
477cec9128dSAmadeusz Sławiński 
478cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
479cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
480cec9128dSAmadeusz Sławiński 
481cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
482cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
483cec9128dSAmadeusz Sławiński 
484cec9128dSAmadeusz Sławiński 	/* cleanup */
485cec9128dSAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
486cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
487cec9128dSAmadeusz Sławiński 
488cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
489cec9128dSAmadeusz Sławiński }
490cec9128dSAmadeusz Sławiński 
491cec9128dSAmadeusz Sławiński // TEST CASE
492cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "abi"
493cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
494cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_ABI_VERSION + 1
495cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_abi(struct kunit *test)
496cec9128dSAmadeusz Sławiński {
497cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
498cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
499cec9128dSAmadeusz Sławiński 	int size;
500cec9128dSAmadeusz Sławiński 	int ret;
501cec9128dSAmadeusz Sławiński 
502cec9128dSAmadeusz Sławiński 	/* prepare */
503cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
504cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
505cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
506cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
507cec9128dSAmadeusz Sławiński 
508cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
509cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
510cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
511cec9128dSAmadeusz Sławiński 
512cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
513cec9128dSAmadeusz Sławiński 	/*
514cec9128dSAmadeusz Sławiński 	 * override abi
515cec9128dSAmadeusz Sławiński 	 * any value != accepted range is wrong
516cec9128dSAmadeusz Sławiński 	 */
517be6be67eSAmadeusz Sławiński 	data->header.abi = cpu_to_le32(SND_SOC_TPLG_ABI_VERSION + 1);
518cec9128dSAmadeusz Sławiński 
519cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
520cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
521cec9128dSAmadeusz Sławiński 
522cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
523cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
524cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
525cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
526cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
527cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
528cec9128dSAmadeusz Sławiński 
529cec9128dSAmadeusz Sławiński 	/* run test */
530cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
531cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
532cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
533cec9128dSAmadeusz Sławiński 
534cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
535cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
536cec9128dSAmadeusz Sławiński 
537cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
538cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
539cec9128dSAmadeusz Sławiński 
540cec9128dSAmadeusz Sławiński 	/* cleanup */
541cec9128dSAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
542cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
543cec9128dSAmadeusz Sławiński 
544cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
545cec9128dSAmadeusz Sławiński }
546cec9128dSAmadeusz Sławiński 
547cec9128dSAmadeusz Sławiński // TEST CASE
548cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "size"
549cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
550cec9128dSAmadeusz Sławiński // long, so just use sizeof(struct snd_soc_tplg_hdr) + 1
551cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_size(struct kunit *test)
552cec9128dSAmadeusz Sławiński {
553cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
554cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
555cec9128dSAmadeusz Sławiński 	int size;
556cec9128dSAmadeusz Sławiński 	int ret;
557cec9128dSAmadeusz Sławiński 
558cec9128dSAmadeusz Sławiński 	/* prepare */
559cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
560cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
561cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
562cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
563cec9128dSAmadeusz Sławiński 
564cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
565cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
566cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
567cec9128dSAmadeusz Sławiński 
568cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
569cec9128dSAmadeusz Sławiński 	/*
570cec9128dSAmadeusz Sławiński 	 * override size
571cec9128dSAmadeusz Sławiński 	 * any value != struct size is wrong
572cec9128dSAmadeusz Sławiński 	 */
573be6be67eSAmadeusz Sławiński 	data->header.size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr) + 1);
574cec9128dSAmadeusz Sławiński 
575cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
576cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
577cec9128dSAmadeusz Sławiński 
578cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
579cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
580cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
581cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
582cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
583cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
584cec9128dSAmadeusz Sławiński 
585cec9128dSAmadeusz Sławiński 	/* run test */
586cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
587cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
588cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
589cec9128dSAmadeusz Sławiński 
590cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
591cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
592cec9128dSAmadeusz Sławiński 
593cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
594cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
595cec9128dSAmadeusz Sławiński 
596cec9128dSAmadeusz Sławiński 	/* cleanup */
597cec9128dSAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
598cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
599cec9128dSAmadeusz Sławiński 
600cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
601cec9128dSAmadeusz Sławiński }
602cec9128dSAmadeusz Sławiński 
603cec9128dSAmadeusz Sławiński // TEST CASE
604cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "payload_size"
605cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
606cec9128dSAmadeusz Sławiński // long, so just use the known wrong one
607cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_payload_size(struct kunit *test)
608cec9128dSAmadeusz Sławiński {
609cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
610cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
611cec9128dSAmadeusz Sławiński 	int size;
612cec9128dSAmadeusz Sławiński 	int ret;
613cec9128dSAmadeusz Sławiński 
614cec9128dSAmadeusz Sławiński 	/* prepare */
615cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
616cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
617cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
618cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
619cec9128dSAmadeusz Sławiński 
620cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
621cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
622cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
623cec9128dSAmadeusz Sławiński 
624cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
625cec9128dSAmadeusz Sławiński 	/*
626cec9128dSAmadeusz Sławiński 	 * override payload size
627cec9128dSAmadeusz Sławiński 	 * there is only explicit check for 0, so check with it, other values
628cec9128dSAmadeusz Sławiński 	 * are handled by just not reading behind EOF
629cec9128dSAmadeusz Sławiński 	 */
630cec9128dSAmadeusz Sławiński 	data->header.payload_size = 0;
631cec9128dSAmadeusz Sławiński 
632cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
633cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
634cec9128dSAmadeusz Sławiński 
635cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
636cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
637cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
638cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
639cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
640cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
641cec9128dSAmadeusz Sławiński 
642cec9128dSAmadeusz Sławiński 	/* run test */
643cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
644cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
645cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
646cec9128dSAmadeusz Sławiński 
647cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
648cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
649cec9128dSAmadeusz Sławiński 
650cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
651cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
652cec9128dSAmadeusz Sławiński 
653cec9128dSAmadeusz Sławiński 	/* cleanup */
654cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
655cec9128dSAmadeusz Sławiński 
656cec9128dSAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
657cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
658cec9128dSAmadeusz Sławiński }
659cec9128dSAmadeusz Sławiński 
6603ad8c8e9SAmadeusz Sławiński // TEST CASE
6613ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition
6623ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg(struct kunit *test)
6633ad8c8e9SAmadeusz Sławiński {
6643ad8c8e9SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
6653ad8c8e9SAmadeusz Sławiński 	u8 *data;
6663ad8c8e9SAmadeusz Sławiński 	int size;
6673ad8c8e9SAmadeusz Sławiński 	int ret;
6683ad8c8e9SAmadeusz Sławiński 
6693ad8c8e9SAmadeusz Sławiński 	/* prepare */
6703ad8c8e9SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
6713ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
6723ad8c8e9SAmadeusz Sławiński 	kunit_comp->kunit = test;
6733ad8c8e9SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
6743ad8c8e9SAmadeusz Sławiński 
6753ad8c8e9SAmadeusz Sławiński 	size = sizeof(tplg_tmpl_with_pcm);
6763ad8c8e9SAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
6773ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
6783ad8c8e9SAmadeusz Sławiński 
6793ad8c8e9SAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm));
6803ad8c8e9SAmadeusz Sławiński 
6813ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.data = data;
6823ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.size = size;
6833ad8c8e9SAmadeusz Sławiński 
6843ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
6853ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
6863ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
6873ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
6883ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
6893ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
6903ad8c8e9SAmadeusz Sławiński 
6913ad8c8e9SAmadeusz Sławiński 	/* run test */
6923ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
6933ad8c8e9SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
6943ad8c8e9SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
6953ad8c8e9SAmadeusz Sławiński 
6963ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
6973ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
6983ad8c8e9SAmadeusz Sławiński 
6993ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
7003ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
7013ad8c8e9SAmadeusz Sławiński 
7023ad8c8e9SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
7033ad8c8e9SAmadeusz Sławiński 
7043ad8c8e9SAmadeusz Sławiński 	/* cleanup */
7053ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
7063ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
7073ad8c8e9SAmadeusz Sławiński }
7083ad8c8e9SAmadeusz Sławiński 
7093ad8c8e9SAmadeusz Sławiński // TEST CASE
7103ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition
7113ad8c8e9SAmadeusz Sławiński // with component reload
7123ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_comp(struct kunit *test)
7133ad8c8e9SAmadeusz Sławiński {
7143ad8c8e9SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
7153ad8c8e9SAmadeusz Sławiński 	u8 *data;
7163ad8c8e9SAmadeusz Sławiński 	int size;
7173ad8c8e9SAmadeusz Sławiński 	int ret;
7183ad8c8e9SAmadeusz Sławiński 	int i;
7193ad8c8e9SAmadeusz Sławiński 
7203ad8c8e9SAmadeusz Sławiński 	/* prepare */
7213ad8c8e9SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
7223ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
7233ad8c8e9SAmadeusz Sławiński 	kunit_comp->kunit = test;
7243ad8c8e9SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
7253ad8c8e9SAmadeusz Sławiński 
7263ad8c8e9SAmadeusz Sławiński 	size = sizeof(tplg_tmpl_with_pcm);
7273ad8c8e9SAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
7283ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
7293ad8c8e9SAmadeusz Sławiński 
7303ad8c8e9SAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm));
7313ad8c8e9SAmadeusz Sławiński 
7323ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.data = data;
7333ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.size = size;
7343ad8c8e9SAmadeusz Sławiński 
7353ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
7363ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
7373ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
7383ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
7393ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
7403ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
7413ad8c8e9SAmadeusz Sławiński 
7423ad8c8e9SAmadeusz Sławiński 	/* run test */
7433ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
7443ad8c8e9SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
7453ad8c8e9SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
7463ad8c8e9SAmadeusz Sławiński 
7473ad8c8e9SAmadeusz Sławiński 	for (i = 0; i < 100; i++) {
7483ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
7493ad8c8e9SAmadeusz Sławiński 		KUNIT_EXPECT_EQ(test, 0, ret);
7503ad8c8e9SAmadeusz Sławiński 
7513ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
7523ad8c8e9SAmadeusz Sławiński 		KUNIT_EXPECT_EQ(test, 0, ret);
7533ad8c8e9SAmadeusz Sławiński 
7543ad8c8e9SAmadeusz Sławiński 		snd_soc_unregister_component(test_dev);
7553ad8c8e9SAmadeusz Sławiński 	}
7563ad8c8e9SAmadeusz Sławiński 
7573ad8c8e9SAmadeusz Sławiński 	/* cleanup */
7583ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
7593ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
7603ad8c8e9SAmadeusz Sławiński }
7613ad8c8e9SAmadeusz Sławiński 
7623ad8c8e9SAmadeusz Sławiński // TEST CASE
7633ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition
7643ad8c8e9SAmadeusz Sławiński // with card reload
7653ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_card(struct kunit *test)
7663ad8c8e9SAmadeusz Sławiński {
7673ad8c8e9SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
7683ad8c8e9SAmadeusz Sławiński 	u8 *data;
7693ad8c8e9SAmadeusz Sławiński 	int size;
7703ad8c8e9SAmadeusz Sławiński 	int ret;
7713ad8c8e9SAmadeusz Sławiński 	int i;
7723ad8c8e9SAmadeusz Sławiński 
7733ad8c8e9SAmadeusz Sławiński 	/* prepare */
7743ad8c8e9SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
7753ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
7763ad8c8e9SAmadeusz Sławiński 	kunit_comp->kunit = test;
7773ad8c8e9SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
7783ad8c8e9SAmadeusz Sławiński 
7793ad8c8e9SAmadeusz Sławiński 	size = sizeof(tplg_tmpl_with_pcm);
7803ad8c8e9SAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
7813ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
7823ad8c8e9SAmadeusz Sławiński 
7833ad8c8e9SAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm));
7843ad8c8e9SAmadeusz Sławiński 
7853ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.data = data;
7863ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.size = size;
7873ad8c8e9SAmadeusz Sławiński 
7883ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
7893ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
7903ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
7913ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
7923ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
7933ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
7943ad8c8e9SAmadeusz Sławiński 
7953ad8c8e9SAmadeusz Sławiński 	/* run test */
7963ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
7973ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
7983ad8c8e9SAmadeusz Sławiński 
7993ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
8003ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
8013ad8c8e9SAmadeusz Sławiński 
8023ad8c8e9SAmadeusz Sławiński 	for (i = 0; i < 100; i++) {
8033ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_register_card(&kunit_comp->card);
8043ad8c8e9SAmadeusz Sławiński 		if (ret != 0 && ret != -EPROBE_DEFER)
8053ad8c8e9SAmadeusz Sławiński 			KUNIT_FAIL(test, "Failed to register card");
8063ad8c8e9SAmadeusz Sławiński 
8073ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_unregister_card(&kunit_comp->card);
8083ad8c8e9SAmadeusz Sławiński 		KUNIT_EXPECT_EQ(test, 0, ret);
8093ad8c8e9SAmadeusz Sławiński 	}
8103ad8c8e9SAmadeusz Sławiński 
8113ad8c8e9SAmadeusz Sławiński 	/* cleanup */
8123ad8c8e9SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
8133ad8c8e9SAmadeusz Sławiński }
8143ad8c8e9SAmadeusz Sławiński 
815d52bbf74SAmadeusz Sławiński /* ===== KUNIT MODULE DEFINITIONS =========================================== */
816d52bbf74SAmadeusz Sławiński 
817d52bbf74SAmadeusz Sławiński static struct kunit_case snd_soc_tplg_test_cases[] = {
818d52bbf74SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_with_null_comp),
819d52bbf74SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_with_null_ops),
820d52bbf74SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_with_null_fw),
821cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg),
822cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_magic),
823cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_abi),
824cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_size),
825cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_payload_size),
8263ad8c8e9SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg),
8273ad8c8e9SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_comp),
8283ad8c8e9SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_card),
829d52bbf74SAmadeusz Sławiński 	{}
830d52bbf74SAmadeusz Sławiński };
831d52bbf74SAmadeusz Sławiński 
832d52bbf74SAmadeusz Sławiński static struct kunit_suite snd_soc_tplg_test_suite = {
833d52bbf74SAmadeusz Sławiński 	.name = "snd_soc_tplg_test",
834d52bbf74SAmadeusz Sławiński 	.init = snd_soc_tplg_test_init,
835d52bbf74SAmadeusz Sławiński 	.exit = snd_soc_tplg_test_exit,
836d52bbf74SAmadeusz Sławiński 	.test_cases = snd_soc_tplg_test_cases,
837d52bbf74SAmadeusz Sławiński };
838d52bbf74SAmadeusz Sławiński 
839d52bbf74SAmadeusz Sławiński kunit_test_suites(&snd_soc_tplg_test_suite);
840d52bbf74SAmadeusz Sławiński 
841d52bbf74SAmadeusz Sławiński MODULE_LICENSE("GPL");
842