Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра Linux
Назад Отладка в ядре Вперед

Тестирующий модуль

При организации модульного тестирования (unit testing) разработчик может столкнуться с недоумением, с тем как оформлять тесты, ведь создаваемый код модуля не может быть скомпилирован для работы в пользовательском режиме. Но в этом случае в коде проектируемого модуля могут быть созданы экспортируемые точки входа вида test_01(), test_02(), ... test_MN(), а для последовательного вызова тестовых входов создан отдельный тестирующий модуль, использующий показанный ранее трюк (разовое исполнение), весь код которого умещается в единственную функцию инициализации... Пример такой реализации упрощённой до предела показан в том же архиве simple-debug.tgz:

md1.h :

	#include <linux/module.h> 
	MODULE_LICENSE( "GPL" );
	MODULE_AUTHOR( "Oleg Tsiliuric <olej@front.ru>" ); 
	extern char* test_01( void ); 
	extern char* test_02( void ); 
	static int __init init( void ); 
	module_init( init ); 

md1.c :

	#include "md1.h" 
	static char retpref[] = "this string returned from "; 
	
	char* test_01( void ) { 
	   static char res[ 80 ]; 
	   strcpy( res, retpref ); 
	   strcat( res, __FUNCTION__ ); 
	   return res; 
	}; 
	EXPORT_SYMBOL( test_01 ); 
	
	char* test_02( void ) { 
	   static char res[ 80 ]; 
	   strcpy( res, retpref ); 
	   strcat( res, __FUNCTION__ ); 
	   return res; 
	}; 
	EXPORT_SYMBOL( test_02 ); 
	
	static int __init init( void ) { 
	   return 0; 
	} 
	static void __exit exit( void ) {}
	module_exit( exit ); 

А это — полный код тестирующего модуля, который мы пишем, как описывали выше, для однократного выполнения:

mt1.c :

	#include "md1.h" 
	static int __init init( void ) { 
	   printk( "%s\n", test_01() ); 
	   printk( "%s\n", test_02() ); 
	   return -1; 
	} 

И вот как выглядит выполнение последовательности тестов проектируемого модуля:

$ sudo insmod md1.ko

$ sudo insmod mt1.ko

	insmod: error inserting 'mt1.ko': -1 Operation not permitted 

$ dmesg | tail -n2

	this string returned fron test_01 
	this string returned fron test_02 

Предыдущий раздел: Оглавление Следующий раздел:
Отдельные отладочные приёмы и трюки   Интерфейсы пространства пользователя к модулю