xref: /openbmc/linux/sound/soc/soc-topology-test.c (revision 7cfb102a)
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 
snd_soc_tplg_test_init(struct kunit * test)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 
snd_soc_tplg_test_exit(struct kunit * test)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 
d_probe(struct snd_soc_component * component)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 
d_remove(struct snd_soc_component * component)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 };
108d52bbf74SAmadeusz Sławiński 
109cec9128dSAmadeusz Sławiński /* ===== TOPOLOGY TEMPLATES ================================================= */
110cec9128dSAmadeusz Sławiński 
111cec9128dSAmadeusz Sławiński // Structural representation of topology which can be generated with:
112cec9128dSAmadeusz Sławiński // $ touch empty
113cec9128dSAmadeusz Sławiński // $ alsatplg -c empty -o empty.tplg
114cec9128dSAmadeusz Sławiński // $ xxd -i empty.tplg
115cec9128dSAmadeusz Sławiński 
116cec9128dSAmadeusz Sławiński struct tplg_tmpl_001 {
117cec9128dSAmadeusz Sławiński 	struct snd_soc_tplg_hdr header;
118cec9128dSAmadeusz Sławiński 	struct snd_soc_tplg_manifest manifest;
119cec9128dSAmadeusz Sławiński } __packed;
120cec9128dSAmadeusz Sławiński 
121cec9128dSAmadeusz Sławiński static struct tplg_tmpl_001 tplg_tmpl_empty = {
122cec9128dSAmadeusz Sławiński 	.header = {
123be6be67eSAmadeusz Sławiński 		.magic = cpu_to_le32(SND_SOC_TPLG_MAGIC),
124be6be67eSAmadeusz Sławiński 		.abi = cpu_to_le32(5),
125cec9128dSAmadeusz Sławiński 		.version = 0,
126be6be67eSAmadeusz Sławiński 		.type = cpu_to_le32(SND_SOC_TPLG_TYPE_MANIFEST),
127be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr)),
128cec9128dSAmadeusz Sławiński 		.vendor_type = 0,
129be6be67eSAmadeusz Sławiński 		.payload_size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)),
130cec9128dSAmadeusz Sławiński 		.index = 0,
131be6be67eSAmadeusz Sławiński 		.count = cpu_to_le32(1),
132cec9128dSAmadeusz Sławiński 	},
133cec9128dSAmadeusz Sławiński 
134cec9128dSAmadeusz Sławiński 	.manifest = {
135be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)),
136cec9128dSAmadeusz Sławiński 		/* rest of fields is 0 */
137cec9128dSAmadeusz Sławiński 	},
138cec9128dSAmadeusz Sławiński };
139cec9128dSAmadeusz Sławiński 
1403ad8c8e9SAmadeusz Sławiński // Structural representation of topology containing SectionPCM
1413ad8c8e9SAmadeusz Sławiński 
1423ad8c8e9SAmadeusz Sławiński struct tplg_tmpl_002 {
1433ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_hdr header;
1443ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_manifest manifest;
1453ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_hdr pcm_header;
1463ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_pcm pcm;
1473ad8c8e9SAmadeusz Sławiński } __packed;
1483ad8c8e9SAmadeusz Sławiński 
1493ad8c8e9SAmadeusz Sławiński static struct tplg_tmpl_002 tplg_tmpl_with_pcm = {
1503ad8c8e9SAmadeusz Sławiński 	.header = {
151be6be67eSAmadeusz Sławiński 		.magic = cpu_to_le32(SND_SOC_TPLG_MAGIC),
152be6be67eSAmadeusz Sławiński 		.abi = cpu_to_le32(5),
1533ad8c8e9SAmadeusz Sławiński 		.version = 0,
154be6be67eSAmadeusz Sławiński 		.type = cpu_to_le32(SND_SOC_TPLG_TYPE_MANIFEST),
155be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr)),
1563ad8c8e9SAmadeusz Sławiński 		.vendor_type = 0,
157be6be67eSAmadeusz Sławiński 		.payload_size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)),
1583ad8c8e9SAmadeusz Sławiński 		.index = 0,
159be6be67eSAmadeusz Sławiński 		.count = cpu_to_le32(1),
1603ad8c8e9SAmadeusz Sławiński 	},
1613ad8c8e9SAmadeusz Sławiński 	.manifest = {
162be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_manifest)),
163be6be67eSAmadeusz Sławiński 		.pcm_elems = cpu_to_le32(1),
1643ad8c8e9SAmadeusz Sławiński 		/* rest of fields is 0 */
1653ad8c8e9SAmadeusz Sławiński 	},
1663ad8c8e9SAmadeusz Sławiński 	.pcm_header = {
167be6be67eSAmadeusz Sławiński 		.magic = cpu_to_le32(SND_SOC_TPLG_MAGIC),
168be6be67eSAmadeusz Sławiński 		.abi = cpu_to_le32(5),
1693ad8c8e9SAmadeusz Sławiński 		.version = 0,
170be6be67eSAmadeusz Sławiński 		.type = cpu_to_le32(SND_SOC_TPLG_TYPE_PCM),
171be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr)),
1723ad8c8e9SAmadeusz Sławiński 		.vendor_type = 0,
173be6be67eSAmadeusz Sławiński 		.payload_size = cpu_to_le32(sizeof(struct snd_soc_tplg_pcm)),
1743ad8c8e9SAmadeusz Sławiński 		.index = 0,
175be6be67eSAmadeusz Sławiński 		.count = cpu_to_le32(1),
1763ad8c8e9SAmadeusz Sławiński 	},
1773ad8c8e9SAmadeusz Sławiński 	.pcm = {
178be6be67eSAmadeusz Sławiński 		.size = cpu_to_le32(sizeof(struct snd_soc_tplg_pcm)),
1793ad8c8e9SAmadeusz Sławiński 		.pcm_name = "KUNIT Audio",
1803ad8c8e9SAmadeusz Sławiński 		.dai_name = "kunit-audio-dai",
1813ad8c8e9SAmadeusz Sławiński 		.pcm_id = 0,
1823ad8c8e9SAmadeusz Sławiński 		.dai_id = 0,
183be6be67eSAmadeusz Sławiński 		.playback = cpu_to_le32(1),
184be6be67eSAmadeusz Sławiński 		.capture = cpu_to_le32(1),
1853ad8c8e9SAmadeusz Sławiński 		.compress = 0,
1863ad8c8e9SAmadeusz Sławiński 		.stream = {
1873ad8c8e9SAmadeusz Sławiński 			[0] = {
188be6be67eSAmadeusz Sławiński 				.channels = cpu_to_le32(2),
1893ad8c8e9SAmadeusz Sławiński 			},
1903ad8c8e9SAmadeusz Sławiński 			[1] = {
191be6be67eSAmadeusz Sławiński 				.channels = cpu_to_le32(2),
1923ad8c8e9SAmadeusz Sławiński 			},
1933ad8c8e9SAmadeusz Sławiński 		},
1943ad8c8e9SAmadeusz Sławiński 		.num_streams = 0,
1953ad8c8e9SAmadeusz Sławiński 		.caps = {
1963ad8c8e9SAmadeusz Sławiński 			[0] = {
1973ad8c8e9SAmadeusz Sławiński 				.name = "kunit-audio-playback",
198be6be67eSAmadeusz Sławiński 				.channels_min = cpu_to_le32(2),
199be6be67eSAmadeusz Sławiński 				.channels_max = cpu_to_le32(2),
2003ad8c8e9SAmadeusz Sławiński 			},
2013ad8c8e9SAmadeusz Sławiński 			[1] = {
2023ad8c8e9SAmadeusz Sławiński 				.name = "kunit-audio-capture",
203be6be67eSAmadeusz Sławiński 				.channels_min = cpu_to_le32(2),
204be6be67eSAmadeusz Sławiński 				.channels_max = cpu_to_le32(2),
2053ad8c8e9SAmadeusz Sławiński 			},
2063ad8c8e9SAmadeusz Sławiński 		},
2073ad8c8e9SAmadeusz Sławiński 		.flag_mask = 0,
2083ad8c8e9SAmadeusz Sławiński 		.flags = 0,
2093ad8c8e9SAmadeusz Sławiński 		.priv = { 0 },
2103ad8c8e9SAmadeusz Sławiński 	},
2113ad8c8e9SAmadeusz Sławiński };
2123ad8c8e9SAmadeusz Sławiński 
213d52bbf74SAmadeusz Sławiński /* ===== TEST CASES ========================================================= */
214d52bbf74SAmadeusz Sławiński 
215d52bbf74SAmadeusz Sławiński // TEST CASE
216d52bbf74SAmadeusz Sławiński // Test passing NULL component as parameter to snd_soc_tplg_component_load
217d52bbf74SAmadeusz Sławiński 
218d52bbf74SAmadeusz Sławiński /*
219d52bbf74SAmadeusz Sławiński  * need to override generic probe function with one using NULL when calling
220d52bbf74SAmadeusz Sławiński  * topology load during component initialization, we don't need .remove
221d52bbf74SAmadeusz Sławiński  * handler as load should fail
222d52bbf74SAmadeusz Sławiński  */
d_probe_null_comp(struct snd_soc_component * component)223d52bbf74SAmadeusz Sławiński static int d_probe_null_comp(struct snd_soc_component *component)
224d52bbf74SAmadeusz Sławiński {
225d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp =
226d52bbf74SAmadeusz Sławiński 			container_of(component, struct kunit_soc_component, comp);
227d52bbf74SAmadeusz Sławiński 	int ret;
228d52bbf74SAmadeusz Sławiński 
229d52bbf74SAmadeusz Sławiński 	/* instead of passing component pointer as first argument, pass NULL here */
230d52bbf74SAmadeusz Sławiński 	ret = snd_soc_tplg_component_load(NULL, NULL, &kunit_comp->fw);
231d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret,
232d52bbf74SAmadeusz Sławiński 			    "Failed topology load");
233d52bbf74SAmadeusz Sławiński 
234d52bbf74SAmadeusz Sławiński 	return 0;
235d52bbf74SAmadeusz Sławiński }
236d52bbf74SAmadeusz Sławiński 
237d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component_null_comp = {
238d52bbf74SAmadeusz Sławiński 	.name = "sound-soc-topology-test",
239d52bbf74SAmadeusz Sławiński 	.probe = d_probe_null_comp,
240d52bbf74SAmadeusz Sławiński };
241d52bbf74SAmadeusz Sławiński 
snd_soc_tplg_test_load_with_null_comp(struct kunit * test)242d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_comp(struct kunit *test)
243d52bbf74SAmadeusz Sławiński {
244d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
245d52bbf74SAmadeusz Sławiński 	int ret;
246d52bbf74SAmadeusz Sławiński 
247d52bbf74SAmadeusz Sławiński 	/* prepare */
248d52bbf74SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
249d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
250d52bbf74SAmadeusz Sławiński 	kunit_comp->kunit = test;
251d52bbf74SAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
252d52bbf74SAmadeusz Sławiński 
253d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
254d52bbf74SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
255d52bbf74SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
256d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
257d52bbf74SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
258d52bbf74SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
259d52bbf74SAmadeusz Sławiński 
260d52bbf74SAmadeusz Sławiński 	/* run test */
261d52bbf74SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
262d52bbf74SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
263d52bbf74SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
264d52bbf74SAmadeusz Sławiński 
265d52bbf74SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component_null_comp, test_dev);
266d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
267d52bbf74SAmadeusz Sławiński 
268d52bbf74SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
269d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
270d52bbf74SAmadeusz Sławiński 
271d52bbf74SAmadeusz Sławiński 	/* cleanup */
2721892a991SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
273d52bbf74SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
274d52bbf74SAmadeusz Sławiński }
275d52bbf74SAmadeusz Sławiński 
276d52bbf74SAmadeusz Sławiński // TEST CASE
277d52bbf74SAmadeusz Sławiński // Test passing NULL ops as parameter to snd_soc_tplg_component_load
278d52bbf74SAmadeusz Sławiński 
279d52bbf74SAmadeusz Sławiński /*
280d52bbf74SAmadeusz Sławiński  * NULL ops is default case, we pass empty topology (fw), so we don't have
281d52bbf74SAmadeusz Sławiński  * anything to parse and just do nothing, which results in return 0; from
282d52bbf74SAmadeusz Sławiński  * calling soc_tplg_dapm_complete in soc_tplg_process_headers
283d52bbf74SAmadeusz Sławiński  */
snd_soc_tplg_test_load_with_null_ops(struct kunit * test)284d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_ops(struct kunit *test)
285d52bbf74SAmadeusz Sławiński {
286d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
287d52bbf74SAmadeusz Sławiński 	int ret;
288d52bbf74SAmadeusz Sławiński 
289d52bbf74SAmadeusz Sławiński 	/* prepare */
290d52bbf74SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
291d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
292d52bbf74SAmadeusz Sławiński 	kunit_comp->kunit = test;
293d52bbf74SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
294d52bbf74SAmadeusz Sławiński 
295d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
296d52bbf74SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
297d52bbf74SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
298d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
299d52bbf74SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
300d52bbf74SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
301d52bbf74SAmadeusz Sławiński 
302d52bbf74SAmadeusz Sławiński 	/* run test */
303d52bbf74SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
304d52bbf74SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
305d52bbf74SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
306d52bbf74SAmadeusz Sławiński 
307d52bbf74SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
308d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
309d52bbf74SAmadeusz Sławiński 
310d52bbf74SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
311d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
312d52bbf74SAmadeusz Sławiński 
313d52bbf74SAmadeusz Sławiński 	/* cleanup */
314*d5017d13SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
315d52bbf74SAmadeusz Sławiński 
316d52bbf74SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
317d52bbf74SAmadeusz Sławiński }
318d52bbf74SAmadeusz Sławiński 
319d52bbf74SAmadeusz Sławiński // TEST CASE
320d52bbf74SAmadeusz Sławiński // Test passing NULL fw as parameter to snd_soc_tplg_component_load
321d52bbf74SAmadeusz Sławiński 
322d52bbf74SAmadeusz Sławiński /*
323d52bbf74SAmadeusz Sławiński  * need to override generic probe function with one using NULL pointer to fw
324d52bbf74SAmadeusz Sławiński  * when calling topology load during component initialization, we don't need
325d52bbf74SAmadeusz Sławiński  * .remove handler as load should fail
326d52bbf74SAmadeusz Sławiński  */
d_probe_null_fw(struct snd_soc_component * component)327d52bbf74SAmadeusz Sławiński static int d_probe_null_fw(struct snd_soc_component *component)
328d52bbf74SAmadeusz Sławiński {
329d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp =
330d52bbf74SAmadeusz Sławiński 			container_of(component, struct kunit_soc_component, comp);
331d52bbf74SAmadeusz Sławiński 	int ret;
332d52bbf74SAmadeusz Sławiński 
333d52bbf74SAmadeusz Sławiński 	/* instead of passing fw pointer as third argument, pass NULL here */
334d52bbf74SAmadeusz Sławiński 	ret = snd_soc_tplg_component_load(component, NULL, NULL);
335d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret,
336d52bbf74SAmadeusz Sławiński 			    "Failed topology load");
337d52bbf74SAmadeusz Sławiński 
338d52bbf74SAmadeusz Sławiński 	return 0;
339d52bbf74SAmadeusz Sławiński }
340d52bbf74SAmadeusz Sławiński 
341d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component_null_fw = {
342d52bbf74SAmadeusz Sławiński 	.name = "sound-soc-topology-test",
343d52bbf74SAmadeusz Sławiński 	.probe = d_probe_null_fw,
344d52bbf74SAmadeusz Sławiński };
345d52bbf74SAmadeusz Sławiński 
snd_soc_tplg_test_load_with_null_fw(struct kunit * test)346d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_fw(struct kunit *test)
347d52bbf74SAmadeusz Sławiński {
348d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
349d52bbf74SAmadeusz Sławiński 	int ret;
350d52bbf74SAmadeusz Sławiński 
351d52bbf74SAmadeusz Sławiński 	/* prepare */
352d52bbf74SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
353d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
354d52bbf74SAmadeusz Sławiński 	kunit_comp->kunit = test;
355d52bbf74SAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
356d52bbf74SAmadeusz Sławiński 
357d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
358d52bbf74SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
359d52bbf74SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
360d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
361d52bbf74SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
362d52bbf74SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
363d52bbf74SAmadeusz Sławiński 
364d52bbf74SAmadeusz Sławiński 	/* run test */
365d52bbf74SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
366d52bbf74SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
367d52bbf74SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
368d52bbf74SAmadeusz Sławiński 
369d52bbf74SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component_null_fw, test_dev);
370d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
371d52bbf74SAmadeusz Sławiński 
372d52bbf74SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
373d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
374d52bbf74SAmadeusz Sławiński 
375d52bbf74SAmadeusz Sławiński 	/* cleanup */
376*d5017d13SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
377d52bbf74SAmadeusz Sławiński 
378d52bbf74SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
379d52bbf74SAmadeusz Sławiński }
380d52bbf74SAmadeusz Sławiński 
381cec9128dSAmadeusz Sławiński // TEST CASE
382cec9128dSAmadeusz Sławiński // Test passing "empty" topology file
snd_soc_tplg_test_load_empty_tplg(struct kunit * test)383cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg(struct kunit *test)
384cec9128dSAmadeusz Sławiński {
385cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
386cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
387cec9128dSAmadeusz Sławiński 	int size;
388cec9128dSAmadeusz Sławiński 	int ret;
389cec9128dSAmadeusz Sławiński 
390cec9128dSAmadeusz Sławiński 	/* prepare */
391cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
392cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
393cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
394cec9128dSAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
395cec9128dSAmadeusz Sławiński 
396cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
397cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
398cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
399cec9128dSAmadeusz Sławiński 
400cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
401cec9128dSAmadeusz Sławiński 
402cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
403cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
404cec9128dSAmadeusz Sławiński 
405cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
406cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
407cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
408cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
409cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
410cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
411cec9128dSAmadeusz Sławiński 
412cec9128dSAmadeusz Sławiński 	/* run test */
413cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
414cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
415cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
416cec9128dSAmadeusz Sławiński 
417cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
418cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
419cec9128dSAmadeusz Sławiński 
420cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
421cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
422cec9128dSAmadeusz Sławiński 
423cec9128dSAmadeusz Sławiński 	/* cleanup */
424*d5017d13SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
425cec9128dSAmadeusz Sławiński 
426cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
427cec9128dSAmadeusz Sławiński }
428cec9128dSAmadeusz Sławiński 
429cec9128dSAmadeusz Sławiński // TEST CASE
430cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "magic"
431cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
432cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_MAGIC + 1
snd_soc_tplg_test_load_empty_tplg_bad_magic(struct kunit * test)433cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_magic(struct kunit *test)
434cec9128dSAmadeusz Sławiński {
435cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
436cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
437cec9128dSAmadeusz Sławiński 	int size;
438cec9128dSAmadeusz Sławiński 	int ret;
439cec9128dSAmadeusz Sławiński 
440cec9128dSAmadeusz Sławiński 	/* prepare */
441cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
442cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
443cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
444cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
445cec9128dSAmadeusz Sławiński 
446cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
447cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
448cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
449cec9128dSAmadeusz Sławiński 
450cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
451cec9128dSAmadeusz Sławiński 	/*
452cec9128dSAmadeusz Sławiński 	 * override abi
453cec9128dSAmadeusz Sławiński 	 * any value != magic number is wrong
454cec9128dSAmadeusz Sławiński 	 */
455be6be67eSAmadeusz Sławiński 	data->header.magic = cpu_to_le32(SND_SOC_TPLG_MAGIC + 1);
456cec9128dSAmadeusz Sławiński 
457cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
458cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
459cec9128dSAmadeusz Sławiński 
460cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
461cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
462cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
463cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
464cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
465cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
466cec9128dSAmadeusz Sławiński 
467cec9128dSAmadeusz Sławiński 	/* run test */
468cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
469cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
470cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
471cec9128dSAmadeusz Sławiński 
472cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
473cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
474cec9128dSAmadeusz Sławiński 
475cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
476cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
477cec9128dSAmadeusz Sławiński 
478cec9128dSAmadeusz Sławiński 	/* cleanup */
479*d5017d13SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
480cec9128dSAmadeusz Sławiński 
481cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
482cec9128dSAmadeusz Sławiński }
483cec9128dSAmadeusz Sławiński 
484cec9128dSAmadeusz Sławiński // TEST CASE
485cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "abi"
486cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
487cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_ABI_VERSION + 1
snd_soc_tplg_test_load_empty_tplg_bad_abi(struct kunit * test)488cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_abi(struct kunit *test)
489cec9128dSAmadeusz Sławiński {
490cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
491cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
492cec9128dSAmadeusz Sławiński 	int size;
493cec9128dSAmadeusz Sławiński 	int ret;
494cec9128dSAmadeusz Sławiński 
495cec9128dSAmadeusz Sławiński 	/* prepare */
496cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
497cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
498cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
499cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
500cec9128dSAmadeusz Sławiński 
501cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
502cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
503cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
504cec9128dSAmadeusz Sławiński 
505cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
506cec9128dSAmadeusz Sławiński 	/*
507cec9128dSAmadeusz Sławiński 	 * override abi
508cec9128dSAmadeusz Sławiński 	 * any value != accepted range is wrong
509cec9128dSAmadeusz Sławiński 	 */
510be6be67eSAmadeusz Sławiński 	data->header.abi = cpu_to_le32(SND_SOC_TPLG_ABI_VERSION + 1);
511cec9128dSAmadeusz Sławiński 
512cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
513cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
514cec9128dSAmadeusz Sławiński 
515cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
516cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
517cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
518cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
519cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
520cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
521cec9128dSAmadeusz Sławiński 
522cec9128dSAmadeusz Sławiński 	/* run test */
523cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
524cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
525cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
526cec9128dSAmadeusz Sławiński 
527cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
528cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
529cec9128dSAmadeusz Sławiński 
530cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
531cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
532cec9128dSAmadeusz Sławiński 
533cec9128dSAmadeusz Sławiński 	/* cleanup */
534*d5017d13SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
535cec9128dSAmadeusz Sławiński 
536cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
537cec9128dSAmadeusz Sławiński }
538cec9128dSAmadeusz Sławiński 
539cec9128dSAmadeusz Sławiński // TEST CASE
540cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "size"
541cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
542cec9128dSAmadeusz Sławiński // long, so just use sizeof(struct snd_soc_tplg_hdr) + 1
snd_soc_tplg_test_load_empty_tplg_bad_size(struct kunit * test)543cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_size(struct kunit *test)
544cec9128dSAmadeusz Sławiński {
545cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
546cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
547cec9128dSAmadeusz Sławiński 	int size;
548cec9128dSAmadeusz Sławiński 	int ret;
549cec9128dSAmadeusz Sławiński 
550cec9128dSAmadeusz Sławiński 	/* prepare */
551cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
552cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
553cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
554cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
555cec9128dSAmadeusz Sławiński 
556cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
557cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
558cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
559cec9128dSAmadeusz Sławiński 
560cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
561cec9128dSAmadeusz Sławiński 	/*
562cec9128dSAmadeusz Sławiński 	 * override size
563cec9128dSAmadeusz Sławiński 	 * any value != struct size is wrong
564cec9128dSAmadeusz Sławiński 	 */
565be6be67eSAmadeusz Sławiński 	data->header.size = cpu_to_le32(sizeof(struct snd_soc_tplg_hdr) + 1);
566cec9128dSAmadeusz Sławiński 
567cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
568cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
569cec9128dSAmadeusz Sławiński 
570cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
571cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
572cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
573cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
574cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
575cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
576cec9128dSAmadeusz Sławiński 
577cec9128dSAmadeusz Sławiński 	/* run test */
578cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
579cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
580cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
581cec9128dSAmadeusz Sławiński 
582cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
583cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
584cec9128dSAmadeusz Sławiński 
585cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
586cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
587cec9128dSAmadeusz Sławiński 
588cec9128dSAmadeusz Sławiński 	/* cleanup */
589*d5017d13SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
590cec9128dSAmadeusz Sławiński 
591cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
592cec9128dSAmadeusz Sławiński }
593cec9128dSAmadeusz Sławiński 
594cec9128dSAmadeusz Sławiński // TEST CASE
595cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "payload_size"
596cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
597cec9128dSAmadeusz Sławiński // long, so just use the known wrong one
snd_soc_tplg_test_load_empty_tplg_bad_payload_size(struct kunit * test)598cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_payload_size(struct kunit *test)
599cec9128dSAmadeusz Sławiński {
600cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
601cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
602cec9128dSAmadeusz Sławiński 	int size;
603cec9128dSAmadeusz Sławiński 	int ret;
604cec9128dSAmadeusz Sławiński 
605cec9128dSAmadeusz Sławiński 	/* prepare */
606cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
607cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
608cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
609cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
610cec9128dSAmadeusz Sławiński 
611cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
612cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
613cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
614cec9128dSAmadeusz Sławiński 
615cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
616cec9128dSAmadeusz Sławiński 	/*
617cec9128dSAmadeusz Sławiński 	 * override payload size
618cec9128dSAmadeusz Sławiński 	 * there is only explicit check for 0, so check with it, other values
619cec9128dSAmadeusz Sławiński 	 * are handled by just not reading behind EOF
620cec9128dSAmadeusz Sławiński 	 */
621cec9128dSAmadeusz Sławiński 	data->header.payload_size = 0;
622cec9128dSAmadeusz Sławiński 
623cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
624cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
625cec9128dSAmadeusz Sławiński 
626cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
627cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
628cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
629cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
630cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
631cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
632cec9128dSAmadeusz Sławiński 
633cec9128dSAmadeusz Sławiński 	/* run test */
634cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
635cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
636cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
637cec9128dSAmadeusz Sławiński 
638cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
639cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
640cec9128dSAmadeusz Sławiński 
641cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
642cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
643cec9128dSAmadeusz Sławiński 
644cec9128dSAmadeusz Sławiński 	/* cleanup */
645cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
646cec9128dSAmadeusz Sławiński 
647*d5017d13SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
648cec9128dSAmadeusz Sławiński }
649cec9128dSAmadeusz Sławiński 
6503ad8c8e9SAmadeusz Sławiński // TEST CASE
6513ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition
snd_soc_tplg_test_load_pcm_tplg(struct kunit * test)6523ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg(struct kunit *test)
6533ad8c8e9SAmadeusz Sławiński {
6543ad8c8e9SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
6553ad8c8e9SAmadeusz Sławiński 	u8 *data;
6563ad8c8e9SAmadeusz Sławiński 	int size;
6573ad8c8e9SAmadeusz Sławiński 	int ret;
6583ad8c8e9SAmadeusz Sławiński 
6593ad8c8e9SAmadeusz Sławiński 	/* prepare */
6603ad8c8e9SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
6613ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
6623ad8c8e9SAmadeusz Sławiński 	kunit_comp->kunit = test;
6633ad8c8e9SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
6643ad8c8e9SAmadeusz Sławiński 
6653ad8c8e9SAmadeusz Sławiński 	size = sizeof(tplg_tmpl_with_pcm);
6663ad8c8e9SAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
6673ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
6683ad8c8e9SAmadeusz Sławiński 
6693ad8c8e9SAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm));
6703ad8c8e9SAmadeusz Sławiński 
6713ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.data = data;
6723ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.size = size;
6733ad8c8e9SAmadeusz Sławiński 
6743ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
6753ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
6763ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
6773ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
6783ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
6793ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
6803ad8c8e9SAmadeusz Sławiński 
6813ad8c8e9SAmadeusz Sławiński 	/* run test */
6823ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
6833ad8c8e9SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
6843ad8c8e9SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
6853ad8c8e9SAmadeusz Sławiński 
6863ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
6873ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
6883ad8c8e9SAmadeusz Sławiński 
6893ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
6903ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
6913ad8c8e9SAmadeusz Sławiński 
6923ad8c8e9SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
6933ad8c8e9SAmadeusz Sławiński 
6943ad8c8e9SAmadeusz Sławiński 	/* cleanup */
695*d5017d13SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
6963ad8c8e9SAmadeusz Sławiński }
6973ad8c8e9SAmadeusz Sławiński 
6983ad8c8e9SAmadeusz Sławiński // TEST CASE
6993ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition
7003ad8c8e9SAmadeusz Sławiński // with component reload
snd_soc_tplg_test_load_pcm_tplg_reload_comp(struct kunit * test)7013ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_comp(struct kunit *test)
7023ad8c8e9SAmadeusz Sławiński {
7033ad8c8e9SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
7043ad8c8e9SAmadeusz Sławiński 	u8 *data;
7053ad8c8e9SAmadeusz Sławiński 	int size;
7063ad8c8e9SAmadeusz Sławiński 	int ret;
7073ad8c8e9SAmadeusz Sławiński 	int i;
7083ad8c8e9SAmadeusz Sławiński 
7093ad8c8e9SAmadeusz Sławiński 	/* prepare */
7103ad8c8e9SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
7113ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
7123ad8c8e9SAmadeusz Sławiński 	kunit_comp->kunit = test;
7133ad8c8e9SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
7143ad8c8e9SAmadeusz Sławiński 
7153ad8c8e9SAmadeusz Sławiński 	size = sizeof(tplg_tmpl_with_pcm);
7163ad8c8e9SAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
7173ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
7183ad8c8e9SAmadeusz Sławiński 
7193ad8c8e9SAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm));
7203ad8c8e9SAmadeusz Sławiński 
7213ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.data = data;
7223ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.size = size;
7233ad8c8e9SAmadeusz Sławiński 
7243ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
7253ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
7263ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
7273ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
7283ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
7293ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
7303ad8c8e9SAmadeusz Sławiński 
7313ad8c8e9SAmadeusz Sławiński 	/* run test */
7323ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
7333ad8c8e9SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
7343ad8c8e9SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
7353ad8c8e9SAmadeusz Sławiński 
7363ad8c8e9SAmadeusz Sławiński 	for (i = 0; i < 100; i++) {
7373ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
7383ad8c8e9SAmadeusz Sławiński 		KUNIT_EXPECT_EQ(test, 0, ret);
7393ad8c8e9SAmadeusz Sławiński 
7403ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
7413ad8c8e9SAmadeusz Sławiński 		KUNIT_EXPECT_EQ(test, 0, ret);
7423ad8c8e9SAmadeusz Sławiński 
7433ad8c8e9SAmadeusz Sławiński 		snd_soc_unregister_component(test_dev);
7443ad8c8e9SAmadeusz Sławiński 	}
7453ad8c8e9SAmadeusz Sławiński 
7463ad8c8e9SAmadeusz Sławiński 	/* cleanup */
747*d5017d13SUwe Kleine-König 	snd_soc_unregister_card(&kunit_comp->card);
7483ad8c8e9SAmadeusz Sławiński }
7493ad8c8e9SAmadeusz Sławiński 
7503ad8c8e9SAmadeusz Sławiński // TEST CASE
7513ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition
7523ad8c8e9SAmadeusz Sławiński // with card reload
snd_soc_tplg_test_load_pcm_tplg_reload_card(struct kunit * test)7533ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_card(struct kunit *test)
7543ad8c8e9SAmadeusz Sławiński {
7553ad8c8e9SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
7563ad8c8e9SAmadeusz Sławiński 	u8 *data;
7573ad8c8e9SAmadeusz Sławiński 	int size;
7583ad8c8e9SAmadeusz Sławiński 	int ret;
7593ad8c8e9SAmadeusz Sławiński 	int i;
7603ad8c8e9SAmadeusz Sławiński 
7613ad8c8e9SAmadeusz Sławiński 	/* prepare */
7623ad8c8e9SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
7633ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
7643ad8c8e9SAmadeusz Sławiński 	kunit_comp->kunit = test;
7653ad8c8e9SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
7663ad8c8e9SAmadeusz Sławiński 
7673ad8c8e9SAmadeusz Sławiński 	size = sizeof(tplg_tmpl_with_pcm);
7683ad8c8e9SAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
7693ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
7703ad8c8e9SAmadeusz Sławiński 
7713ad8c8e9SAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm));
7723ad8c8e9SAmadeusz Sławiński 
7733ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.data = data;
7743ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.size = size;
7753ad8c8e9SAmadeusz Sławiński 
7763ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
7773ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
7783ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
7793ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
7803ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
7813ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
7823ad8c8e9SAmadeusz Sławiński 
7833ad8c8e9SAmadeusz Sławiński 	/* run test */
7843ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
7853ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
7863ad8c8e9SAmadeusz Sławiński 
7873ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
7883ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
7893ad8c8e9SAmadeusz Sławiński 
7903ad8c8e9SAmadeusz Sławiński 	for (i = 0; i < 100; i++) {
7913ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_register_card(&kunit_comp->card);
7923ad8c8e9SAmadeusz Sławiński 		if (ret != 0 && ret != -EPROBE_DEFER)
7933ad8c8e9SAmadeusz Sławiński 			KUNIT_FAIL(test, "Failed to register card");
7943ad8c8e9SAmadeusz Sławiński 
795*d5017d13SUwe Kleine-König 		snd_soc_unregister_card(&kunit_comp->card);
7963ad8c8e9SAmadeusz Sławiński 	}
7973ad8c8e9SAmadeusz Sławiński 
7983ad8c8e9SAmadeusz Sławiński 	/* cleanup */
7993ad8c8e9SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
8003ad8c8e9SAmadeusz Sławiński }
8013ad8c8e9SAmadeusz Sławiński 
802d52bbf74SAmadeusz Sławiński /* ===== KUNIT MODULE DEFINITIONS =========================================== */
803d52bbf74SAmadeusz Sławiński 
804d52bbf74SAmadeusz Sławiński static struct kunit_case snd_soc_tplg_test_cases[] = {
805d52bbf74SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_with_null_comp),
806d52bbf74SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_with_null_ops),
807d52bbf74SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_with_null_fw),
808cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg),
809cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_magic),
810cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_abi),
811cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_size),
812cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_payload_size),
8133ad8c8e9SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg),
8143ad8c8e9SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_comp),
8153ad8c8e9SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_card),
816d52bbf74SAmadeusz Sławiński 	{}
817d52bbf74SAmadeusz Sławiński };
818d52bbf74SAmadeusz Sławiński 
819d52bbf74SAmadeusz Sławiński static struct kunit_suite snd_soc_tplg_test_suite = {
820d52bbf74SAmadeusz Sławiński 	.name = "snd_soc_tplg_test",
821d52bbf74SAmadeusz Sławiński 	.init = snd_soc_tplg_test_init,
822d52bbf74SAmadeusz Sławiński 	.exit = snd_soc_tplg_test_exit,
823d52bbf74SAmadeusz Sławiński 	.test_cases = snd_soc_tplg_test_cases,
824d52bbf74SAmadeusz Sławiński };
825d52bbf74SAmadeusz Sławiński 
826d52bbf74SAmadeusz Sławiński kunit_test_suites(&snd_soc_tplg_test_suite);
827d52bbf74SAmadeusz Sławiński 
828d52bbf74SAmadeusz Sławiński MODULE_LICENSE("GPL");
829