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 113 114 115/* SPDX-License-Identifier: BSD-2-Clause */ /* * Copyright (C) 2019, Raspberry Pi (Trading) Limited * * md_parser.cpp - image sensor metadata parsers */ #include <assert.h> #include <map> #include <string.h> #include "md_parser.hpp" using namespace RPiController; // This function goes through the embedded data to find the offsets (not // values!), in the data block, where the values of the given registers can // subsequently be found. // Embedded data tag bytes, from Sony IMX219 datasheet but general to all SMIA // sensors, I think. #define LINE_START 0x0a #define LINE_END_TAG 0x07 #define REG_HI_BITS 0xaa #define REG_LOW_BITS 0xa5 #define REG_VALUE 0x5a/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2019, Google Inc. * * log API test */ #include <algorithm> #include <fcntl.h> #include <iostream> #include <list> #include <sstream> #include <stdio.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <libcamera/base/log.h> #include <libcamera/logging.h> #include "test.h" using namespace std; using namespace libcamera; LOG_DEFINE_CATEGORY(LogAPITest) class LogAPITest : public Test { protected: void doLogging() { logSetLevel("LogAPITest", "DEBUG"); LOG(LogAPITest, Info) << "good 1"; logSetLevel("LogAPITest", "WARN"); LOG(LogAPITest, Info) << "bad"; logSetLevel("LogAPITest", "ERROR"); LOG(LogAPITest, Error) << "good 3"; LOG(LogAPITest, Info) << "bad"; logSetLevel("LogAPITest", "WARN"); LOG(LogAPITest, Warning) << "good 5"; LOG(LogAPITest, Info) << "bad"; } int verifyOutput(istream &is) { list<int> goodList = { 1, 3, 5 }; string line; while (getline(is, line)) { if (goodList.empty()) { cout << "Too many log lines" << endl; return TestFail; } unsigned int digit = line.back() - '0'; unsigned int expect = goodList.front(); goodList.pop_front(); if (digit != expect) { cout << "Incorrect log line" << endl; return TestFail; } } if (!goodList.empty()) { cout << "Too few log lines" << endl; return TestFail; } return TestPass; } int testFile() { int fd = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR); if (fd < 0) { cerr << "Failed to open tmp log file" << endl; return TestFail; } char path[32]; snprintf(path, sizeof(path), "/proc/self/fd/%u", fd); if (logSetFile(path) < 0) { cerr << "Failed to set log file" << endl; close(fd); return TestFail; } doLogging(); char buf[1000]; memset(buf, 0, sizeof(buf)); lseek(fd, 0, SEEK_SET); if (read(fd, buf, sizeof(buf)) < 0) { cerr << "Failed to read tmp log file" << endl; close(fd); return TestFail; } close(fd); istringstream iss(buf); return verifyOutput(iss); } int testStream() { stringstream log; /* Never fails, so no need to check return value */ logSetStream(&log); doLogging(); return verifyOutput(log); } int testTarget() { logSetTarget(LoggingTargetNone); logSetLevel("LogAPITest", "DEBUG"); LOG(LogAPITest, Info) << "don't crash please"; if (!logSetTarget(LoggingTargetFile)) return TestFail; if (!logSetTarget(LoggingTargetStream)) return TestFail; return TestPass; } int run() override { int ret = testFile(); if (ret != TestPass) return TestFail; ret = testStream(); if (ret != TestPass) return TestFail; ret = testTarget(); if (ret != TestPass) return TestFail; return TestPass; } }; TEST_REGISTER(LogAPITest)