1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2020, Google Inc. * * results.h - Test result aggregator */ #ifndef __LC_COMPLIANCE_RESULTS_H__ #define __LC_COMPLIANCE_RESULTS_H__ #include <string> #include <utility> /* \todo Check if result aggregator can be shared with self tests in test/ */ class Results { public: enum Status { Fail, Pass, Skip, }; using Result = std::pair<Status, std::string>; Results/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2018-2019, Google Inc. * * media_device_print_test.cpp - Print out media devices */ #include <iostream> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include "libcamera/internal/media_device.h" #include "test.h" using namespace libcamera; using namespace std; /* * MediaDevicePrintTest takes all media devices found in the system and print * them out to verify correctness. * * If no accessible media device is found, the test is skipped. */ class MediaDevicePrintTest : public Test { protected: int init() { return 0; } int run(); void cleanup() {} private: int testMediaDevice(string deviceNode); void printMediaGraph(const MediaDevice &media, ostream &os); void printLinkFlags(const MediaLink *link, ostream &os); void printNode(const MediaPad *pad, ostream &os); }; void MediaDevicePrintTest::printNode(const MediaPad *pad, ostream &os) { const MediaEntity *entity = pad->entity(); os << "\"" << entity->name() << "\"[" << pad->index() << "]"; } void MediaDevicePrintTest::printLinkFlags(const MediaLink *link, ostream &os) { unsigned int flags = link->flags(); os << " ["; if (flags) { os << (flags & MEDIA_LNK_FL_ENABLED ? "ENABLED," : "") << (flags & MEDIA_LNK_FL_IMMUTABLE ? "IMMUTABLE" : ""); } os << "]\n"; } /* * For each entity in the media graph, printout links directed to its sinks * and source pads. */ void MediaDevicePrintTest::printMediaGraph(const MediaDevice &media, ostream &os) { os << "\n" << media.driver() << " - " << media.deviceNode() << "\n\n"; for (auto const &entity : media.entities()) { os << "\"" << entity->name() << "\"\n"; for (auto const &sink : entity->pads()) { if (!(sink->flags() & MEDIA_PAD_FL_SINK)) continue; os << " [" << sink->index() << "]" << ": Sink\n"; for (auto const &link : sink->links()) { os << "\t"; printNode(sink, os); os << " <- "; printNode(link->source(), os); printLinkFlags(link, os); } os << "\n"; } for (auto const &source : entity->pads()) { if (!(source->flags() & MEDIA_PAD_FL_SOURCE)) continue; os << " [" << source->index() << "]" << ": Source\n"; for (auto const &link : source->links()) { os << "\t"; printNode(source, os); os << " -> "; printNode(link->sink(), os); printLinkFlags(link, os); } os << "\n"; } } os.flush(); } /* Test a single media device. */ int MediaDevicePrintTest::testMediaDevice(const string deviceNode) { MediaDevice dev(deviceNode); int ret; ret = dev.populate(); if (ret) return ret; /* Print out the media graph. */ printMediaGraph(dev, cerr); return 0; } /* Run tests on all media devices. */ #define MAX_MEDIA_DEV 256 int MediaDevicePrintTest::run() { const string deviceNode("/dev/media"); unsigned int i; int ret = 77; /* skip test exit code */ /* * Run the test sequence on all media device found in the * system, if any. */ for (i = 0; i < MAX_MEDIA_DEV; i++) { string mediadev = deviceNode + to_string(i); struct stat pstat = {}; if (stat(mediadev.c_str(), &pstat)) continue; ret = testMediaDevice(mediadev); if (ret) return ret; } return ret; } TEST_REGISTER(MediaDevicePrintTest)