xref: /openbmc/linux/sound/soc/soc-topology-test.c (revision 3ad8c8e9efc53d14d928b84aabe1a27dd5d3171b)
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 = {
124cec9128dSAmadeusz Sławiński 		.magic = SND_SOC_TPLG_MAGIC,
125cec9128dSAmadeusz Sławiński 		.abi = 5,
126cec9128dSAmadeusz Sławiński 		.version = 0,
127cec9128dSAmadeusz Sławiński 		.type = SND_SOC_TPLG_TYPE_MANIFEST,
128cec9128dSAmadeusz Sławiński 		.size = sizeof(struct snd_soc_tplg_hdr),
129cec9128dSAmadeusz Sławiński 		.vendor_type = 0,
130cec9128dSAmadeusz Sławiński 		.payload_size = sizeof(struct snd_soc_tplg_manifest),
131cec9128dSAmadeusz Sławiński 		.index = 0,
132cec9128dSAmadeusz Sławiński 		.count = 1,
133cec9128dSAmadeusz Sławiński 	},
134cec9128dSAmadeusz Sławiński 
135cec9128dSAmadeusz Sławiński 	.manifest = {
136cec9128dSAmadeusz Sławiński 		.size = 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 
141*3ad8c8e9SAmadeusz Sławiński // Structural representation of topology containing SectionPCM
142*3ad8c8e9SAmadeusz Sławiński 
143*3ad8c8e9SAmadeusz Sławiński struct tplg_tmpl_002 {
144*3ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_hdr header;
145*3ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_manifest manifest;
146*3ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_hdr pcm_header;
147*3ad8c8e9SAmadeusz Sławiński 	struct snd_soc_tplg_pcm pcm;
148*3ad8c8e9SAmadeusz Sławiński } __packed;
149*3ad8c8e9SAmadeusz Sławiński 
150*3ad8c8e9SAmadeusz Sławiński static struct tplg_tmpl_002 tplg_tmpl_with_pcm = {
151*3ad8c8e9SAmadeusz Sławiński 	.header = {
152*3ad8c8e9SAmadeusz Sławiński 		.magic = SND_SOC_TPLG_MAGIC,
153*3ad8c8e9SAmadeusz Sławiński 		.abi = 5,
154*3ad8c8e9SAmadeusz Sławiński 		.version = 0,
155*3ad8c8e9SAmadeusz Sławiński 		.type = SND_SOC_TPLG_TYPE_MANIFEST,
156*3ad8c8e9SAmadeusz Sławiński 		.size = sizeof(struct snd_soc_tplg_hdr),
157*3ad8c8e9SAmadeusz Sławiński 		.vendor_type = 0,
158*3ad8c8e9SAmadeusz Sławiński 		.payload_size = sizeof(struct snd_soc_tplg_manifest),
159*3ad8c8e9SAmadeusz Sławiński 		.index = 0,
160*3ad8c8e9SAmadeusz Sławiński 		.count = 1,
161*3ad8c8e9SAmadeusz Sławiński 	},
162*3ad8c8e9SAmadeusz Sławiński 	.manifest = {
163*3ad8c8e9SAmadeusz Sławiński 		.size = sizeof(struct snd_soc_tplg_manifest),
164*3ad8c8e9SAmadeusz Sławiński 		.pcm_elems = 1,
165*3ad8c8e9SAmadeusz Sławiński 		/* rest of fields is 0 */
166*3ad8c8e9SAmadeusz Sławiński 	},
167*3ad8c8e9SAmadeusz Sławiński 	.pcm_header = {
168*3ad8c8e9SAmadeusz Sławiński 		.magic = SND_SOC_TPLG_MAGIC,
169*3ad8c8e9SAmadeusz Sławiński 		.abi = 5,
170*3ad8c8e9SAmadeusz Sławiński 		.version = 0,
171*3ad8c8e9SAmadeusz Sławiński 		.type = SND_SOC_TPLG_TYPE_PCM,
172*3ad8c8e9SAmadeusz Sławiński 		.size = sizeof(struct snd_soc_tplg_hdr),
173*3ad8c8e9SAmadeusz Sławiński 		.vendor_type = 0,
174*3ad8c8e9SAmadeusz Sławiński 		.payload_size = sizeof(struct snd_soc_tplg_pcm),
175*3ad8c8e9SAmadeusz Sławiński 		.index = 0,
176*3ad8c8e9SAmadeusz Sławiński 		.count = 1,
177*3ad8c8e9SAmadeusz Sławiński 	},
178*3ad8c8e9SAmadeusz Sławiński 	.pcm = {
179*3ad8c8e9SAmadeusz Sławiński 		.size = sizeof(struct snd_soc_tplg_pcm),
180*3ad8c8e9SAmadeusz Sławiński 		.pcm_name = "KUNIT Audio",
181*3ad8c8e9SAmadeusz Sławiński 		.dai_name = "kunit-audio-dai",
182*3ad8c8e9SAmadeusz Sławiński 		.pcm_id = 0,
183*3ad8c8e9SAmadeusz Sławiński 		.dai_id = 0,
184*3ad8c8e9SAmadeusz Sławiński 		.playback = 1,
185*3ad8c8e9SAmadeusz Sławiński 		.capture = 1,
186*3ad8c8e9SAmadeusz Sławiński 		.compress = 0,
187*3ad8c8e9SAmadeusz Sławiński 		.stream = {
188*3ad8c8e9SAmadeusz Sławiński 			[0] = {
189*3ad8c8e9SAmadeusz Sławiński 				.channels = 2,
190*3ad8c8e9SAmadeusz Sławiński 			},
191*3ad8c8e9SAmadeusz Sławiński 			[1] = {
192*3ad8c8e9SAmadeusz Sławiński 				.channels = 2,
193*3ad8c8e9SAmadeusz Sławiński 			},
194*3ad8c8e9SAmadeusz Sławiński 		},
195*3ad8c8e9SAmadeusz Sławiński 		.num_streams = 0,
196*3ad8c8e9SAmadeusz Sławiński 		.caps = {
197*3ad8c8e9SAmadeusz Sławiński 			[0] = {
198*3ad8c8e9SAmadeusz Sławiński 				.name = "kunit-audio-playback",
199*3ad8c8e9SAmadeusz Sławiński 				.channels_min = 2,
200*3ad8c8e9SAmadeusz Sławiński 				.channels_max = 2,
201*3ad8c8e9SAmadeusz Sławiński 			},
202*3ad8c8e9SAmadeusz Sławiński 			[1] = {
203*3ad8c8e9SAmadeusz Sławiński 				.name = "kunit-audio-capture",
204*3ad8c8e9SAmadeusz Sławiński 				.channels_min = 2,
205*3ad8c8e9SAmadeusz Sławiński 				.channels_max = 2,
206*3ad8c8e9SAmadeusz Sławiński 			},
207*3ad8c8e9SAmadeusz Sławiński 		},
208*3ad8c8e9SAmadeusz Sławiński 		.flag_mask = 0,
209*3ad8c8e9SAmadeusz Sławiński 		.flags = 0,
210*3ad8c8e9SAmadeusz Sławiński 		.priv = { 0 },
211*3ad8c8e9SAmadeusz Sławiński 	},
212*3ad8c8e9SAmadeusz Sławiński };
213*3ad8c8e9SAmadeusz 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 */
274d52bbf74SAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
275d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
276d52bbf74SAmadeusz Sławiński 
277d52bbf74SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
278d52bbf74SAmadeusz Sławiński }
279d52bbf74SAmadeusz Sławiński 
280d52bbf74SAmadeusz Sławiński // TEST CASE
281d52bbf74SAmadeusz Sławiński // Test passing NULL ops as parameter to snd_soc_tplg_component_load
282d52bbf74SAmadeusz Sławiński 
283d52bbf74SAmadeusz Sławiński /*
284d52bbf74SAmadeusz Sławiński  * NULL ops is default case, we pass empty topology (fw), so we don't have
285d52bbf74SAmadeusz Sławiński  * anything to parse and just do nothing, which results in return 0; from
286d52bbf74SAmadeusz Sławiński  * calling soc_tplg_dapm_complete in soc_tplg_process_headers
287d52bbf74SAmadeusz Sławiński  */
288d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_ops(struct kunit *test)
289d52bbf74SAmadeusz Sławiński {
290d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
291d52bbf74SAmadeusz Sławiński 	int ret;
292d52bbf74SAmadeusz Sławiński 
293d52bbf74SAmadeusz Sławiński 	/* prepare */
294d52bbf74SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
295d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
296d52bbf74SAmadeusz Sławiński 	kunit_comp->kunit = test;
297d52bbf74SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
298d52bbf74SAmadeusz Sławiński 
299d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
300d52bbf74SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
301d52bbf74SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
302d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
303d52bbf74SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
304d52bbf74SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
305d52bbf74SAmadeusz Sławiński 
306d52bbf74SAmadeusz Sławiński 	/* run test */
307d52bbf74SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
308d52bbf74SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
309d52bbf74SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
310d52bbf74SAmadeusz Sławiński 
311d52bbf74SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
312d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
313d52bbf74SAmadeusz Sławiński 
314d52bbf74SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
315d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
316d52bbf74SAmadeusz Sławiński 
317d52bbf74SAmadeusz Sławiński 	/* cleanup */
318d52bbf74SAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
319d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
320d52bbf74SAmadeusz Sławiński 
321d52bbf74SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
322d52bbf74SAmadeusz Sławiński }
323d52bbf74SAmadeusz Sławiński 
324d52bbf74SAmadeusz Sławiński // TEST CASE
325d52bbf74SAmadeusz Sławiński // Test passing NULL fw as parameter to snd_soc_tplg_component_load
326d52bbf74SAmadeusz Sławiński 
327d52bbf74SAmadeusz Sławiński /*
328d52bbf74SAmadeusz Sławiński  * need to override generic probe function with one using NULL pointer to fw
329d52bbf74SAmadeusz Sławiński  * when calling topology load during component initialization, we don't need
330d52bbf74SAmadeusz Sławiński  * .remove handler as load should fail
331d52bbf74SAmadeusz Sławiński  */
332d52bbf74SAmadeusz Sławiński static int d_probe_null_fw(struct snd_soc_component *component)
333d52bbf74SAmadeusz Sławiński {
334d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp =
335d52bbf74SAmadeusz Sławiński 			container_of(component, struct kunit_soc_component, comp);
336d52bbf74SAmadeusz Sławiński 	int ret;
337d52bbf74SAmadeusz Sławiński 
338d52bbf74SAmadeusz Sławiński 	/* instead of passing fw pointer as third argument, pass NULL here */
339d52bbf74SAmadeusz Sławiński 	ret = snd_soc_tplg_component_load(component, NULL, NULL);
340d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ_MSG(kunit_comp->kunit, kunit_comp->expect, ret,
341d52bbf74SAmadeusz Sławiński 			    "Failed topology load");
342d52bbf74SAmadeusz Sławiński 
343d52bbf74SAmadeusz Sławiński 	return 0;
344d52bbf74SAmadeusz Sławiński }
345d52bbf74SAmadeusz Sławiński 
346d52bbf74SAmadeusz Sławiński static const struct snd_soc_component_driver test_component_null_fw = {
347d52bbf74SAmadeusz Sławiński 	.name = "sound-soc-topology-test",
348d52bbf74SAmadeusz Sławiński 	.probe = d_probe_null_fw,
349d52bbf74SAmadeusz Sławiński 	.non_legacy_dai_naming = 1,
350d52bbf74SAmadeusz Sławiński };
351d52bbf74SAmadeusz Sławiński 
352d52bbf74SAmadeusz Sławiński static void snd_soc_tplg_test_load_with_null_fw(struct kunit *test)
353d52bbf74SAmadeusz Sławiński {
354d52bbf74SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
355d52bbf74SAmadeusz Sławiński 	int ret;
356d52bbf74SAmadeusz Sławiński 
357d52bbf74SAmadeusz Sławiński 	/* prepare */
358d52bbf74SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
359d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
360d52bbf74SAmadeusz Sławiński 	kunit_comp->kunit = test;
361d52bbf74SAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
362d52bbf74SAmadeusz Sławiński 
363d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
364d52bbf74SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
365d52bbf74SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
366d52bbf74SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
367d52bbf74SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
368d52bbf74SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
369d52bbf74SAmadeusz Sławiński 
370d52bbf74SAmadeusz Sławiński 	/* run test */
371d52bbf74SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
372d52bbf74SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
373d52bbf74SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
374d52bbf74SAmadeusz Sławiński 
375d52bbf74SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component_null_fw, test_dev);
376d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
377d52bbf74SAmadeusz Sławiński 
378d52bbf74SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
379d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
380d52bbf74SAmadeusz Sławiński 
381d52bbf74SAmadeusz Sławiński 	/* cleanup */
382d52bbf74SAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
383d52bbf74SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
384d52bbf74SAmadeusz Sławiński 
385d52bbf74SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
386d52bbf74SAmadeusz Sławiński }
387d52bbf74SAmadeusz Sławiński 
388cec9128dSAmadeusz Sławiński // TEST CASE
389cec9128dSAmadeusz Sławiński // Test passing "empty" topology file
390cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg(struct kunit *test)
391cec9128dSAmadeusz Sławiński {
392cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
393cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
394cec9128dSAmadeusz Sławiński 	int size;
395cec9128dSAmadeusz Sławiński 	int ret;
396cec9128dSAmadeusz Sławiński 
397cec9128dSAmadeusz Sławiński 	/* prepare */
398cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
399cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
400cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
401cec9128dSAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
402cec9128dSAmadeusz Sławiński 
403cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
404cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
405cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
406cec9128dSAmadeusz Sławiński 
407cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
408cec9128dSAmadeusz Sławiński 
409cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
410cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
411cec9128dSAmadeusz Sławiński 
412cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
413cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
414cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
415cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
416cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
417cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
418cec9128dSAmadeusz Sławiński 
419cec9128dSAmadeusz Sławiński 	/* run test */
420cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
421cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
422cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
423cec9128dSAmadeusz Sławiński 
424cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
425cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
426cec9128dSAmadeusz Sławiński 
427cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
428cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
429cec9128dSAmadeusz Sławiński 
430cec9128dSAmadeusz Sławiński 	/* cleanup */
431cec9128dSAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
432cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
433cec9128dSAmadeusz Sławiński 
434cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
435cec9128dSAmadeusz Sławiński }
436cec9128dSAmadeusz Sławiński 
437cec9128dSAmadeusz Sławiński // TEST CASE
438cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "magic"
439cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
440cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_MAGIC + 1
441cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_magic(struct kunit *test)
442cec9128dSAmadeusz Sławiński {
443cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
444cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
445cec9128dSAmadeusz Sławiński 	int size;
446cec9128dSAmadeusz Sławiński 	int ret;
447cec9128dSAmadeusz Sławiński 
448cec9128dSAmadeusz Sławiński 	/* prepare */
449cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
450cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
451cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
452cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
453cec9128dSAmadeusz Sławiński 
454cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
455cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
456cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
457cec9128dSAmadeusz Sławiński 
458cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
459cec9128dSAmadeusz Sławiński 	/*
460cec9128dSAmadeusz Sławiński 	 * override abi
461cec9128dSAmadeusz Sławiński 	 * any value != magic number is wrong
462cec9128dSAmadeusz Sławiński 	 */
463cec9128dSAmadeusz Sławiński 	data->header.magic = SND_SOC_TPLG_MAGIC + 1;
464cec9128dSAmadeusz Sławiński 
465cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
466cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
467cec9128dSAmadeusz Sławiński 
468cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
469cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
470cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
471cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
472cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
473cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
474cec9128dSAmadeusz Sławiński 
475cec9128dSAmadeusz Sławiński 	/* run test */
476cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
477cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
478cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
479cec9128dSAmadeusz Sławiński 
480cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
481cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
482cec9128dSAmadeusz Sławiński 
483cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
484cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
485cec9128dSAmadeusz Sławiński 
486cec9128dSAmadeusz Sławiński 	/* cleanup */
487cec9128dSAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
488cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
489cec9128dSAmadeusz Sławiński 
490cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
491cec9128dSAmadeusz Sławiński }
492cec9128dSAmadeusz Sławiński 
493cec9128dSAmadeusz Sławiński // TEST CASE
494cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "abi"
495cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
496cec9128dSAmadeusz Sławiński // long, so just use SND_SOC_TPLG_ABI_VERSION + 1
497cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_abi(struct kunit *test)
498cec9128dSAmadeusz Sławiński {
499cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
500cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
501cec9128dSAmadeusz Sławiński 	int size;
502cec9128dSAmadeusz Sławiński 	int ret;
503cec9128dSAmadeusz Sławiński 
504cec9128dSAmadeusz Sławiński 	/* prepare */
505cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
506cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
507cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
508cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
509cec9128dSAmadeusz Sławiński 
510cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
511cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
512cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
513cec9128dSAmadeusz Sławiński 
514cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
515cec9128dSAmadeusz Sławiński 	/*
516cec9128dSAmadeusz Sławiński 	 * override abi
517cec9128dSAmadeusz Sławiński 	 * any value != accepted range is wrong
518cec9128dSAmadeusz Sławiński 	 */
519cec9128dSAmadeusz Sławiński 	data->header.abi = SND_SOC_TPLG_ABI_VERSION + 1;
520cec9128dSAmadeusz Sławiński 
521cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
522cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
523cec9128dSAmadeusz Sławiński 
524cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
525cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
526cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
527cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
528cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
529cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
530cec9128dSAmadeusz Sławiński 
531cec9128dSAmadeusz Sławiński 	/* run test */
532cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
533cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
534cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
535cec9128dSAmadeusz Sławiński 
536cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
537cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
538cec9128dSAmadeusz Sławiński 
539cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
540cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
541cec9128dSAmadeusz Sławiński 
542cec9128dSAmadeusz Sławiński 	/* cleanup */
543cec9128dSAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
544cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
545cec9128dSAmadeusz Sławiński 
546cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
547cec9128dSAmadeusz Sławiński }
548cec9128dSAmadeusz Sławiński 
549cec9128dSAmadeusz Sławiński // TEST CASE
550cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "size"
551cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
552cec9128dSAmadeusz Sławiński // long, so just use sizeof(struct snd_soc_tplg_hdr) + 1
553cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_size(struct kunit *test)
554cec9128dSAmadeusz Sławiński {
555cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
556cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
557cec9128dSAmadeusz Sławiński 	int size;
558cec9128dSAmadeusz Sławiński 	int ret;
559cec9128dSAmadeusz Sławiński 
560cec9128dSAmadeusz Sławiński 	/* prepare */
561cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
562cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
563cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
564cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
565cec9128dSAmadeusz Sławiński 
566cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
567cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
568cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
569cec9128dSAmadeusz Sławiński 
570cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
571cec9128dSAmadeusz Sławiński 	/*
572cec9128dSAmadeusz Sławiński 	 * override size
573cec9128dSAmadeusz Sławiński 	 * any value != struct size is wrong
574cec9128dSAmadeusz Sławiński 	 */
575cec9128dSAmadeusz Sławiński 	data->header.size = sizeof(struct snd_soc_tplg_hdr) + 1;
576cec9128dSAmadeusz Sławiński 
577cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
578cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
579cec9128dSAmadeusz Sławiński 
580cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
581cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
582cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
583cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
584cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
585cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
586cec9128dSAmadeusz Sławiński 
587cec9128dSAmadeusz Sławiński 	/* run test */
588cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
589cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
590cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
591cec9128dSAmadeusz Sławiński 
592cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
593cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
594cec9128dSAmadeusz Sławiński 
595cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
596cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
597cec9128dSAmadeusz Sławiński 
598cec9128dSAmadeusz Sławiński 	/* cleanup */
599cec9128dSAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
600cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
601cec9128dSAmadeusz Sławiński 
602cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
603cec9128dSAmadeusz Sławiński }
604cec9128dSAmadeusz Sławiński 
605cec9128dSAmadeusz Sławiński // TEST CASE
606cec9128dSAmadeusz Sławiński // Test "empty" topology file, but with bad "payload_size"
607cec9128dSAmadeusz Sławiński // In theory we could loop through all possible bad values, but it takes too
608cec9128dSAmadeusz Sławiński // long, so just use the known wrong one
609cec9128dSAmadeusz Sławiński static void snd_soc_tplg_test_load_empty_tplg_bad_payload_size(struct kunit *test)
610cec9128dSAmadeusz Sławiński {
611cec9128dSAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
612cec9128dSAmadeusz Sławiński 	struct tplg_tmpl_001 *data;
613cec9128dSAmadeusz Sławiński 	int size;
614cec9128dSAmadeusz Sławiński 	int ret;
615cec9128dSAmadeusz Sławiński 
616cec9128dSAmadeusz Sławiński 	/* prepare */
617cec9128dSAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
618cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
619cec9128dSAmadeusz Sławiński 	kunit_comp->kunit = test;
620cec9128dSAmadeusz Sławiński 	kunit_comp->expect = -EINVAL; /* expect failure */
621cec9128dSAmadeusz Sławiński 
622cec9128dSAmadeusz Sławiński 	size = sizeof(tplg_tmpl_empty);
623cec9128dSAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
624cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
625cec9128dSAmadeusz Sławiński 
626cec9128dSAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_empty, sizeof(tplg_tmpl_empty));
627cec9128dSAmadeusz Sławiński 	/*
628cec9128dSAmadeusz Sławiński 	 * override payload size
629cec9128dSAmadeusz Sławiński 	 * there is only explicit check for 0, so check with it, other values
630cec9128dSAmadeusz Sławiński 	 * are handled by just not reading behind EOF
631cec9128dSAmadeusz Sławiński 	 */
632cec9128dSAmadeusz Sławiński 	data->header.payload_size = 0;
633cec9128dSAmadeusz Sławiński 
634cec9128dSAmadeusz Sławiński 	kunit_comp->fw.data = (u8 *)data;
635cec9128dSAmadeusz Sławiński 	kunit_comp->fw.size = size;
636cec9128dSAmadeusz Sławiński 
637cec9128dSAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
638cec9128dSAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
639cec9128dSAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
640cec9128dSAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
641cec9128dSAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
642cec9128dSAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
643cec9128dSAmadeusz Sławiński 
644cec9128dSAmadeusz Sławiński 	/* run test */
645cec9128dSAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
646cec9128dSAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
647cec9128dSAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
648cec9128dSAmadeusz Sławiński 
649cec9128dSAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
650cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
651cec9128dSAmadeusz Sławiński 
652cec9128dSAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
653cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
654cec9128dSAmadeusz Sławiński 
655cec9128dSAmadeusz Sławiński 	/* cleanup */
656cec9128dSAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
657cec9128dSAmadeusz Sławiński 
658cec9128dSAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
659cec9128dSAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
660cec9128dSAmadeusz Sławiński }
661cec9128dSAmadeusz Sławiński 
662*3ad8c8e9SAmadeusz Sławiński // TEST CASE
663*3ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition
664*3ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg(struct kunit *test)
665*3ad8c8e9SAmadeusz Sławiński {
666*3ad8c8e9SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
667*3ad8c8e9SAmadeusz Sławiński 	u8 *data;
668*3ad8c8e9SAmadeusz Sławiński 	int size;
669*3ad8c8e9SAmadeusz Sławiński 	int ret;
670*3ad8c8e9SAmadeusz Sławiński 
671*3ad8c8e9SAmadeusz Sławiński 	/* prepare */
672*3ad8c8e9SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
673*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
674*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->kunit = test;
675*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
676*3ad8c8e9SAmadeusz Sławiński 
677*3ad8c8e9SAmadeusz Sławiński 	size = sizeof(tplg_tmpl_with_pcm);
678*3ad8c8e9SAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
679*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
680*3ad8c8e9SAmadeusz Sławiński 
681*3ad8c8e9SAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm));
682*3ad8c8e9SAmadeusz Sławiński 
683*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.data = data;
684*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.size = size;
685*3ad8c8e9SAmadeusz Sławiński 
686*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
687*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
688*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
689*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
690*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
691*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
692*3ad8c8e9SAmadeusz Sławiński 
693*3ad8c8e9SAmadeusz Sławiński 	/* run test */
694*3ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
695*3ad8c8e9SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
696*3ad8c8e9SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
697*3ad8c8e9SAmadeusz Sławiński 
698*3ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
699*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
700*3ad8c8e9SAmadeusz Sławiński 
701*3ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
702*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
703*3ad8c8e9SAmadeusz Sławiński 
704*3ad8c8e9SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
705*3ad8c8e9SAmadeusz Sławiński 
706*3ad8c8e9SAmadeusz Sławiński 	/* cleanup */
707*3ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
708*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
709*3ad8c8e9SAmadeusz Sławiński }
710*3ad8c8e9SAmadeusz Sławiński 
711*3ad8c8e9SAmadeusz Sławiński // TEST CASE
712*3ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition
713*3ad8c8e9SAmadeusz Sławiński // with component reload
714*3ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_comp(struct kunit *test)
715*3ad8c8e9SAmadeusz Sławiński {
716*3ad8c8e9SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
717*3ad8c8e9SAmadeusz Sławiński 	u8 *data;
718*3ad8c8e9SAmadeusz Sławiński 	int size;
719*3ad8c8e9SAmadeusz Sławiński 	int ret;
720*3ad8c8e9SAmadeusz Sławiński 	int i;
721*3ad8c8e9SAmadeusz Sławiński 
722*3ad8c8e9SAmadeusz Sławiński 	/* prepare */
723*3ad8c8e9SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
724*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
725*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->kunit = test;
726*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
727*3ad8c8e9SAmadeusz Sławiński 
728*3ad8c8e9SAmadeusz Sławiński 	size = sizeof(tplg_tmpl_with_pcm);
729*3ad8c8e9SAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
730*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
731*3ad8c8e9SAmadeusz Sławiński 
732*3ad8c8e9SAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm));
733*3ad8c8e9SAmadeusz Sławiński 
734*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.data = data;
735*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.size = size;
736*3ad8c8e9SAmadeusz Sławiński 
737*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
738*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
739*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
740*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
741*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
742*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
743*3ad8c8e9SAmadeusz Sławiński 
744*3ad8c8e9SAmadeusz Sławiński 	/* run test */
745*3ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_register_card(&kunit_comp->card);
746*3ad8c8e9SAmadeusz Sławiński 	if (ret != 0 && ret != -EPROBE_DEFER)
747*3ad8c8e9SAmadeusz Sławiński 		KUNIT_FAIL(test, "Failed to register card");
748*3ad8c8e9SAmadeusz Sławiński 
749*3ad8c8e9SAmadeusz Sławiński 	for (i = 0; i < 100; i++) {
750*3ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
751*3ad8c8e9SAmadeusz Sławiński 		KUNIT_EXPECT_EQ(test, 0, ret);
752*3ad8c8e9SAmadeusz Sławiński 
753*3ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
754*3ad8c8e9SAmadeusz Sławiński 		KUNIT_EXPECT_EQ(test, 0, ret);
755*3ad8c8e9SAmadeusz Sławiński 
756*3ad8c8e9SAmadeusz Sławiński 		snd_soc_unregister_component(test_dev);
757*3ad8c8e9SAmadeusz Sławiński 	}
758*3ad8c8e9SAmadeusz Sławiński 
759*3ad8c8e9SAmadeusz Sławiński 	/* cleanup */
760*3ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_unregister_card(&kunit_comp->card);
761*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
762*3ad8c8e9SAmadeusz Sławiński }
763*3ad8c8e9SAmadeusz Sławiński 
764*3ad8c8e9SAmadeusz Sławiński // TEST CASE
765*3ad8c8e9SAmadeusz Sławiński // Test passing topology file with PCM definition
766*3ad8c8e9SAmadeusz Sławiński // with card reload
767*3ad8c8e9SAmadeusz Sławiński static void snd_soc_tplg_test_load_pcm_tplg_reload_card(struct kunit *test)
768*3ad8c8e9SAmadeusz Sławiński {
769*3ad8c8e9SAmadeusz Sławiński 	struct kunit_soc_component *kunit_comp;
770*3ad8c8e9SAmadeusz Sławiński 	u8 *data;
771*3ad8c8e9SAmadeusz Sławiński 	int size;
772*3ad8c8e9SAmadeusz Sławiński 	int ret;
773*3ad8c8e9SAmadeusz Sławiński 	int i;
774*3ad8c8e9SAmadeusz Sławiński 
775*3ad8c8e9SAmadeusz Sławiński 	/* prepare */
776*3ad8c8e9SAmadeusz Sławiński 	kunit_comp = kunit_kzalloc(test, sizeof(*kunit_comp), GFP_KERNEL);
777*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, kunit_comp);
778*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->kunit = test;
779*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->expect = 0; /* expect success */
780*3ad8c8e9SAmadeusz Sławiński 
781*3ad8c8e9SAmadeusz Sławiński 	size = sizeof(tplg_tmpl_with_pcm);
782*3ad8c8e9SAmadeusz Sławiński 	data = kunit_kzalloc(kunit_comp->kunit, size, GFP_KERNEL);
783*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_NOT_ERR_OR_NULL(kunit_comp->kunit, data);
784*3ad8c8e9SAmadeusz Sławiński 
785*3ad8c8e9SAmadeusz Sławiński 	memcpy(data, &tplg_tmpl_with_pcm, sizeof(tplg_tmpl_with_pcm));
786*3ad8c8e9SAmadeusz Sławiński 
787*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.data = data;
788*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->fw.size = size;
789*3ad8c8e9SAmadeusz Sławiński 
790*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dev = test_dev,
791*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.name = "kunit-card",
792*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.owner = THIS_MODULE,
793*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.dai_link = kunit_dai_links,
794*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.num_links = ARRAY_SIZE(kunit_dai_links),
795*3ad8c8e9SAmadeusz Sławiński 	kunit_comp->card.fully_routed = true,
796*3ad8c8e9SAmadeusz Sławiński 
797*3ad8c8e9SAmadeusz Sławiński 	/* run test */
798*3ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_component_initialize(&kunit_comp->comp, &test_component, test_dev);
799*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
800*3ad8c8e9SAmadeusz Sławiński 
801*3ad8c8e9SAmadeusz Sławiński 	ret = snd_soc_add_component(&kunit_comp->comp, NULL, 0);
802*3ad8c8e9SAmadeusz Sławiński 	KUNIT_EXPECT_EQ(test, 0, ret);
803*3ad8c8e9SAmadeusz Sławiński 
804*3ad8c8e9SAmadeusz Sławiński 	for (i = 0; i < 100; i++) {
805*3ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_register_card(&kunit_comp->card);
806*3ad8c8e9SAmadeusz Sławiński 		if (ret != 0 && ret != -EPROBE_DEFER)
807*3ad8c8e9SAmadeusz Sławiński 			KUNIT_FAIL(test, "Failed to register card");
808*3ad8c8e9SAmadeusz Sławiński 
809*3ad8c8e9SAmadeusz Sławiński 		ret = snd_soc_unregister_card(&kunit_comp->card);
810*3ad8c8e9SAmadeusz Sławiński 		KUNIT_EXPECT_EQ(test, 0, ret);
811*3ad8c8e9SAmadeusz Sławiński 	}
812*3ad8c8e9SAmadeusz Sławiński 
813*3ad8c8e9SAmadeusz Sławiński 	/* cleanup */
814*3ad8c8e9SAmadeusz Sławiński 	snd_soc_unregister_component(test_dev);
815*3ad8c8e9SAmadeusz Sławiński }
816*3ad8c8e9SAmadeusz Sławiński 
817d52bbf74SAmadeusz Sławiński /* ===== KUNIT MODULE DEFINITIONS =========================================== */
818d52bbf74SAmadeusz Sławiński 
819d52bbf74SAmadeusz Sławiński static struct kunit_case snd_soc_tplg_test_cases[] = {
820d52bbf74SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_with_null_comp),
821d52bbf74SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_with_null_ops),
822d52bbf74SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_with_null_fw),
823cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg),
824cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_magic),
825cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_abi),
826cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_size),
827cec9128dSAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_empty_tplg_bad_payload_size),
828*3ad8c8e9SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg),
829*3ad8c8e9SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_comp),
830*3ad8c8e9SAmadeusz Sławiński 	KUNIT_CASE(snd_soc_tplg_test_load_pcm_tplg_reload_card),
831d52bbf74SAmadeusz Sławiński 	{}
832d52bbf74SAmadeusz Sławiński };
833d52bbf74SAmadeusz Sławiński 
834d52bbf74SAmadeusz Sławiński static struct kunit_suite snd_soc_tplg_test_suite = {
835d52bbf74SAmadeusz Sławiński 	.name = "snd_soc_tplg_test",
836d52bbf74SAmadeusz Sławiński 	.init = snd_soc_tplg_test_init,
837d52bbf74SAmadeusz Sławiński 	.exit = snd_soc_tplg_test_exit,
838d52bbf74SAmadeusz Sławiński 	.test_cases = snd_soc_tplg_test_cases,
839d52bbf74SAmadeusz Sławiński };
840d52bbf74SAmadeusz Sławiński 
841d52bbf74SAmadeusz Sławiński kunit_test_suites(&snd_soc_tplg_test_suite);
842d52bbf74SAmadeusz Sławiński 
843d52bbf74SAmadeusz Sławiński MODULE_LICENSE("GPL");
844