tests: Unit tests for qdev global properties handling
This tests the qdev global-properties handling code. Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
		
							parent
							
								
									35143f0164
								
							
						
					
					
						commit
						747b0cb4b5
					
				
							
								
								
									
										1
									
								
								tests/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								tests/.gitignore
									
									
									
									
										vendored
									
									
								
							@ -11,6 +11,7 @@ test-iov
 | 
				
			|||||||
test-mul64
 | 
					test-mul64
 | 
				
			||||||
test-qapi-types.[ch]
 | 
					test-qapi-types.[ch]
 | 
				
			||||||
test-qapi-visit.[ch]
 | 
					test-qapi-visit.[ch]
 | 
				
			||||||
 | 
					test-qdev-global-props
 | 
				
			||||||
test-qmp-commands.h
 | 
					test-qmp-commands.h
 | 
				
			||||||
test-qmp-commands
 | 
					test-qmp-commands
 | 
				
			||||||
test-qmp-input-strict
 | 
					test-qmp-input-strict
 | 
				
			||||||
 | 
				
			|||||||
@ -48,6 +48,7 @@ check-unit-y += tests/test-int128$(EXESUF)
 | 
				
			|||||||
# all code tested by test-int128 is inside int128.h
 | 
					# all code tested by test-int128 is inside int128.h
 | 
				
			||||||
gcov-files-test-int128-y =
 | 
					gcov-files-test-int128-y =
 | 
				
			||||||
check-unit-y += tests/test-bitops$(EXESUF)
 | 
					check-unit-y += tests/test-bitops$(EXESUF)
 | 
				
			||||||
 | 
					check-unit-y += tests/test-qdev-global-props$(EXESUF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh
 | 
					check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -123,6 +124,12 @@ tests/test-x86-cpuid$(EXESUF): tests/test-x86-cpuid.o
 | 
				
			|||||||
tests/test-xbzrle$(EXESUF): tests/test-xbzrle.o xbzrle.o page_cache.o libqemuutil.a
 | 
					tests/test-xbzrle$(EXESUF): tests/test-xbzrle.o xbzrle.o page_cache.o libqemuutil.a
 | 
				
			||||||
tests/test-cutils$(EXESUF): tests/test-cutils.o util/cutils.o
 | 
					tests/test-cutils$(EXESUF): tests/test-cutils.o util/cutils.o
 | 
				
			||||||
tests/test-int128$(EXESUF): tests/test-int128.o
 | 
					tests/test-int128$(EXESUF): tests/test-int128.o
 | 
				
			||||||
 | 
					tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \
 | 
				
			||||||
 | 
						hw/core/qdev.o hw/core/qdev-properties.o \
 | 
				
			||||||
 | 
						hw/core/irq.o \
 | 
				
			||||||
 | 
						qom/object.o qom/container.o qom/qom-qobject.o \
 | 
				
			||||||
 | 
						$(test-qapi-obj-y) \
 | 
				
			||||||
 | 
						libqemuutil.a libqemustub.a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tests/test-qapi-types.c tests/test-qapi-types.h :\
 | 
					tests/test-qapi-types.c tests/test-qapi-types.h :\
 | 
				
			||||||
$(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py
 | 
					$(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										107
									
								
								tests/test-qdev-global-props.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								tests/test-qdev-global-props.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,107 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *  Test code for qdev global-properties handling
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  Copyright (c) 2012 Red Hat Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					 * of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					 * in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					 * copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					 * furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The above copyright notice and this permission notice shall be included in
 | 
				
			||||||
 | 
					 * all copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
				
			||||||
 | 
					 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
 | 
					 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
				
			||||||
 | 
					 * THE SOFTWARE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <glib.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "hw/qdev.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TYPE_STATIC_PROPS "static_prop_type"
 | 
				
			||||||
 | 
					#define STATIC_TYPE(obj) \
 | 
				
			||||||
 | 
					    OBJECT_CHECK(MyType, (obj), TYPE_STATIC_PROPS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PROP_DEFAULT 100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct MyType {
 | 
				
			||||||
 | 
					    DeviceState parent_obj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t prop1;
 | 
				
			||||||
 | 
					    uint32_t prop2;
 | 
				
			||||||
 | 
					} MyType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Property static_props[] = {
 | 
				
			||||||
 | 
					    DEFINE_PROP_UINT32("prop1", MyType, prop1, PROP_DEFAULT),
 | 
				
			||||||
 | 
					    DEFINE_PROP_UINT32("prop2", MyType, prop2, PROP_DEFAULT),
 | 
				
			||||||
 | 
					    DEFINE_PROP_END_OF_LIST()
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void static_prop_class_init(ObjectClass *oc, void *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    DeviceClass *dc = DEVICE_CLASS(oc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dc->realize = NULL;
 | 
				
			||||||
 | 
					    dc->props = static_props;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const TypeInfo static_prop_type = {
 | 
				
			||||||
 | 
					    .name = TYPE_STATIC_PROPS,
 | 
				
			||||||
 | 
					    .parent = TYPE_DEVICE,
 | 
				
			||||||
 | 
					    .instance_size = sizeof(MyType),
 | 
				
			||||||
 | 
					    .class_init = static_prop_class_init,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Test simple static property setting to default value */
 | 
				
			||||||
 | 
					static void test_static_prop(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MyType *mt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mt = STATIC_TYPE(object_new(TYPE_STATIC_PROPS));
 | 
				
			||||||
 | 
					    qdev_init_nofail(DEVICE(mt));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_assert_cmpuint(mt->prop1, ==, PROP_DEFAULT);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Test setting of static property using global properties */
 | 
				
			||||||
 | 
					static void test_static_globalprop(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MyType *mt;
 | 
				
			||||||
 | 
					    static GlobalProperty props[] = {
 | 
				
			||||||
 | 
					        { TYPE_STATIC_PROPS, "prop1", "200" },
 | 
				
			||||||
 | 
					        {}
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qdev_prop_register_global_list(props);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mt = STATIC_TYPE(object_new(TYPE_STATIC_PROPS));
 | 
				
			||||||
 | 
					    qdev_init_nofail(DEVICE(mt));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_assert_cmpuint(mt->prop1, ==, 200);
 | 
				
			||||||
 | 
					    g_assert_cmpuint(mt->prop2, ==, PROP_DEFAULT);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_test_init(&argc, &argv, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    module_call_init(MODULE_INIT_QOM);
 | 
				
			||||||
 | 
					    type_register_static(&static_prop_type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_test_add_func("/qdev/properties/static/default", test_static_prop);
 | 
				
			||||||
 | 
					    g_test_add_func("/qdev/properties/static/global", test_static_globalprop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_test_run();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user