Тестирование софта - статьи
ce076b8f

Информация об объектах, описанных в LSB


Для стандарта LSB в качестве хранилища объектов, описываемых стандартом, основной информации о них и связей между ними используется так называемая база данных стандарта LSB (LSB Specification Database). Более точно, в этой базе данных содержится информация о следующих объектах:

  • библиотеки (таблица Library);
  • классы (таблица ClassInfo);
  • интерфейсы - LSB является бинарным стандартом и описывает интерфейсы, предоставляемые каждой библиотекой. Все интерфейсы хранятся в таблице Interface и могут иметь следующие типы:
    • Function (функции);
    • Data (данные);
    • Common ("общие интерфейсы", к которым относятся stdin, stdout и им подобные);
    • Alias (интерфейсы, являющиеся синонимами других интерфейсов);
  • заголовочные файлы (таблица Header);
  • константы (таблица Constant);
  • типы данных (таблица Type);
  • команды (таблица Command; под командами здесь понимаются как встроенные команды shell, так и различные утилиты);
  • секции исполняемых файлов формата ELF (таблицы ElfSections и SectionTypes);
  • теги rpm-файлов (таблица RpmTag).

Рис.1.ER-диаграмма сущностей, описываемых стандартом LSB.

Также в базе данных хранятся связи между указанными объектами - каждая константа привязана к заголовочному файлу, в котором она объявляется, интерфейс - к библиотеке, в которой он содержится, либо к классу, если это метод класса, и т.д. ER-диаграмма существующей базы данных приведена на Рис. 1. Все сущности группируются в так называемые модули согласно своему назначению (например, модуль LSB_Сpp содержит все, относящееся к стандартной библиотеке C++, LSB_Toolkit_Qt3 - все, относящееся к библиотеке Qt3, и т.д.). Информация о форматах файлов ELF и RPM относится к модулю LSB_Core, однако база данных этого факта никак не отражает - об этом "знают" только скрипты, генерирующие текст стандарта.

Связи типа "многие ко многим" реализуются посредством использования отдельных таблиц. Самой сложной структурой обладает взаимосвязь таблиц ClassInfo и Interface. Для ее реализации используется несколько вспомогательных таблиц, содержащих информацию о виртуальных таблицах класса (таблица Vtable; каждый класс может иметь одну либо две виртуальные таблицы) и о наследовании (таблица BaseTypes реализует обычное наследование, при описании множественного наследования используется также таблица VMIBaseTypes).

Для удобства интерфейсы и классы, входящие в одну библиотеку, разбиваются на группы согласно их назначению.
Информация о таких группах, на которые разбиваются библиотеки, содержится в таблице LibGroup. Так, например, библиотека librt (функции реального времени) разделена на три группы:

  • Shared Memory Objects (функции для работы с разделяемой памятью);
  • Clock (функции для работы с часами);
  • Timers (функции для работы с таймерами).
Аналогично группируются константы и типы данных, описанные в одном заголовочном файле. Информация о таких группах содержится в таблице HeaderGroup. Так, например, файл rpc/rpc_msg.h, который содержит декларации типов и функций для работы с сообщениями, передаваемыми при удаленном вызове процедур (RPC, Remote Procedure Call), делится на следующие группы:
  • accepted_reply (типы, которые описывают ответ на rpc-запрос, принятый сервером);
  • rejected_reply (типы, которые описывают ответ на rpc-запрос, отвергнутый сервером);
  • reply_body (типы, описывающие тело ответа на rpc-запрос);
  • call_body (типы, описывающие тело rpc-запроса);
  • rpc_msg (типы, описывающие весь rpc-запрос);
  • base types (основные типы);
  • default HeaderGroup (сюда относится все, не вошедшее в перечисленные выше группы).
Заметим, что типы одной группы могут быть составными типами, определяемыми через типы других групп. Например, типы из группы rpc_msg - это структуры, содержащие тип из call_body либо reply_body и некоторые дополнительные атрибуты.

Содержание раздела