xref: /aosp_15_r20/external/parameter-framework/upstream/test/functional-tests/Basic.cpp (revision c33452fb792a5495ec310a9626f2638b053af5dd)
1*c33452fbSAndroid Build Coastguard Worker /*
2*c33452fbSAndroid Build Coastguard Worker  * Copyright (c) 2015, Intel Corporation
3*c33452fbSAndroid Build Coastguard Worker  * All rights reserved.
4*c33452fbSAndroid Build Coastguard Worker  *
5*c33452fbSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without modification,
6*c33452fbSAndroid Build Coastguard Worker  * are permitted provided that the following conditions are met:
7*c33452fbSAndroid Build Coastguard Worker  *
8*c33452fbSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright notice, this
9*c33452fbSAndroid Build Coastguard Worker  * list of conditions and the following disclaimer.
10*c33452fbSAndroid Build Coastguard Worker  *
11*c33452fbSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright notice,
12*c33452fbSAndroid Build Coastguard Worker  * this list of conditions and the following disclaimer in the documentation and/or
13*c33452fbSAndroid Build Coastguard Worker  * other materials provided with the distribution.
14*c33452fbSAndroid Build Coastguard Worker  *
15*c33452fbSAndroid Build Coastguard Worker  * 3. Neither the name of the copyright holder nor the names of its contributors
16*c33452fbSAndroid Build Coastguard Worker  * may be used to endorse or promote products derived from this software without
17*c33452fbSAndroid Build Coastguard Worker  * specific prior written permission.
18*c33452fbSAndroid Build Coastguard Worker  *
19*c33452fbSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20*c33452fbSAndroid Build Coastguard Worker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21*c33452fbSAndroid Build Coastguard Worker  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22*c33452fbSAndroid Build Coastguard Worker  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23*c33452fbSAndroid Build Coastguard Worker  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24*c33452fbSAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*c33452fbSAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26*c33452fbSAndroid Build Coastguard Worker  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*c33452fbSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28*c33452fbSAndroid Build Coastguard Worker  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*c33452fbSAndroid Build Coastguard Worker  */
30*c33452fbSAndroid Build Coastguard Worker 
31*c33452fbSAndroid Build Coastguard Worker #include "Test.hpp"
32*c33452fbSAndroid Build Coastguard Worker #include "Config.hpp"
33*c33452fbSAndroid Build Coastguard Worker #include "StoreLogger.hpp"
34*c33452fbSAndroid Build Coastguard Worker #include "ParameterFramework.hpp"
35*c33452fbSAndroid Build Coastguard Worker 
36*c33452fbSAndroid Build Coastguard Worker #include <catch.hpp>
37*c33452fbSAndroid Build Coastguard Worker 
38*c33452fbSAndroid Build Coastguard Worker #include <list>
39*c33452fbSAndroid Build Coastguard Worker #include <string>
40*c33452fbSAndroid Build Coastguard Worker 
41*c33452fbSAndroid Build Coastguard Worker #include <cstdio>
42*c33452fbSAndroid Build Coastguard Worker 
43*c33452fbSAndroid Build Coastguard Worker namespace parameterFramework
44*c33452fbSAndroid Build Coastguard Worker {
45*c33452fbSAndroid Build Coastguard Worker 
46*c33452fbSAndroid Build Coastguard Worker SCENARIO_METHOD(ParameterFramework, "Default logger", "[log]")
47*c33452fbSAndroid Build Coastguard Worker {
48*c33452fbSAndroid Build Coastguard Worker     WHEN ("No logger is set") {
49*c33452fbSAndroid Build Coastguard Worker         THEN ("Start should succeed") {
50*c33452fbSAndroid Build Coastguard Worker             CHECK_NOTHROW(start());
51*c33452fbSAndroid Build Coastguard Worker         }
52*c33452fbSAndroid Build Coastguard Worker     }
53*c33452fbSAndroid Build Coastguard Worker }
54*c33452fbSAndroid Build Coastguard Worker 
55*c33452fbSAndroid Build Coastguard Worker SCENARIO_METHOD(ParameterFramework, "No Logger", "[log]")
56*c33452fbSAndroid Build Coastguard Worker {
57*c33452fbSAndroid Build Coastguard Worker     WHEN ("A nullptr logger is set") {
58*c33452fbSAndroid Build Coastguard Worker         setLogger(nullptr);
59*c33452fbSAndroid Build Coastguard Worker         THEN ("Start should succeed") {
60*c33452fbSAndroid Build Coastguard Worker             CHECK_NOTHROW(start());
61*c33452fbSAndroid Build Coastguard Worker         }
62*c33452fbSAndroid Build Coastguard Worker     }
63*c33452fbSAndroid Build Coastguard Worker }
64*c33452fbSAndroid Build Coastguard Worker 
65*c33452fbSAndroid Build Coastguard Worker SCENARIO("Logger should receive info and warnings", "[log]")
66*c33452fbSAndroid Build Coastguard Worker {
67*c33452fbSAndroid Build Coastguard Worker     GIVEN ("A logger that stores logs") {
68*c33452fbSAndroid Build Coastguard Worker         /* Instantiating logger first to ensure that its lifetime is longer than the pfw's one,
69*c33452fbSAndroid Build Coastguard Worker          * because the pfw references the logger. */
70*c33452fbSAndroid Build Coastguard Worker         StoreLogger logger{};
71*c33452fbSAndroid Build Coastguard Worker         GIVEN ("A parameter framework") {
72*c33452fbSAndroid Build Coastguard Worker             WarningPF pfw;
73*c33452fbSAndroid Build Coastguard Worker             GIVEN ("Config files that emit warnings") {
74*c33452fbSAndroid Build Coastguard Worker                 WHEN ("The record logger is set") {
75*c33452fbSAndroid Build Coastguard Worker                     pfw.setLogger(&logger);
76*c33452fbSAndroid Build Coastguard Worker                     THEN ("Start should succeed") {
77*c33452fbSAndroid Build Coastguard Worker                         REQUIRE_NOTHROW(pfw.start());
78*c33452fbSAndroid Build Coastguard Worker                         AND_THEN ("The logger should have stored info and warning log") {
79*c33452fbSAndroid Build Coastguard Worker                             using Logs = StoreLogger::Logs;
80*c33452fbSAndroid Build Coastguard Worker                             using Level = StoreLogger::Log::Level;
81*c33452fbSAndroid Build Coastguard Worker                             CHECK(logger.filter(Level::warning) != Logs{});
82*c33452fbSAndroid Build Coastguard Worker                             CHECK(logger.getLogs() != Logs{});
83*c33452fbSAndroid Build Coastguard Worker                         }
84*c33452fbSAndroid Build Coastguard Worker                     }
85*c33452fbSAndroid Build Coastguard Worker                     AND_WHEN ("A nullptr logger is set") {
86*c33452fbSAndroid Build Coastguard Worker                         pfw.setLogger(nullptr);
87*c33452fbSAndroid Build Coastguard Worker                         THEN ("Start should succeed") {
88*c33452fbSAndroid Build Coastguard Worker                             REQUIRE_NOTHROW(pfw.start());
89*c33452fbSAndroid Build Coastguard Worker                             AND_THEN ("The record logger should NOT have stored any info or "
90*c33452fbSAndroid Build Coastguard Worker                                       "warning log") {
91*c33452fbSAndroid Build Coastguard Worker                                 CHECK(logger.getLogs() == StoreLogger::Logs{});
92*c33452fbSAndroid Build Coastguard Worker                             }
93*c33452fbSAndroid Build Coastguard Worker                         }
94*c33452fbSAndroid Build Coastguard Worker                     }
95*c33452fbSAndroid Build Coastguard Worker                 }
96*c33452fbSAndroid Build Coastguard Worker             }
97*c33452fbSAndroid Build Coastguard Worker         }
98*c33452fbSAndroid Build Coastguard Worker     }
99*c33452fbSAndroid Build Coastguard Worker }
100*c33452fbSAndroid Build Coastguard Worker 
101*c33452fbSAndroid Build Coastguard Worker SCENARIO_METHOD(LazyPF, "Tuning OK", "[properties][remote interface]")
102*c33452fbSAndroid Build Coastguard Worker {
103*c33452fbSAndroid Build Coastguard Worker }
104*c33452fbSAndroid Build Coastguard Worker 
105*c33452fbSAndroid Build Coastguard Worker SCENARIO_METHOD(LazyPF, "Invalid XML configuration")
106*c33452fbSAndroid Build Coastguard Worker {
107*c33452fbSAndroid Build Coastguard Worker     for (auto &xmlT : Tests<std::string>{{"an unknown tag", "<unknown_tag/>"},
108*c33452fbSAndroid Build Coastguard Worker                                          {"an unclosed tag", "<unclosed>"}}) {
109*c33452fbSAndroid Build Coastguard Worker         auto invalidXml = xmlT.payload;
110*c33452fbSAndroid Build Coastguard Worker         GIVEN ("An invalid xml: containing " + xmlT.title) {
111*c33452fbSAndroid Build Coastguard Worker             Config::Plugins ps{};
112*c33452fbSAndroid Build Coastguard Worker             for (auto &&configT : Tests<Config>{
113*c33452fbSAndroid Build Coastguard Worker                      {"top config", {&Config::plugins, Config::Plugins{{"", {invalidXml}}}}},
114*c33452fbSAndroid Build Coastguard Worker                      {"structure", {&Config::instances, invalidXml}},
115*c33452fbSAndroid Build Coastguard Worker                      {"settings", {&Config::domains, invalidXml}}}) {
116*c33452fbSAndroid Build Coastguard Worker                 WHEN ("Used in the " + configT.title) {
117*c33452fbSAndroid Build Coastguard Worker                     create(std::move(configT.payload));
118*c33452fbSAndroid Build Coastguard Worker                     THEN ("Start should fail") {
119*c33452fbSAndroid Build Coastguard Worker                         CHECK_THROWS_AS(mPf->start(), Exception);
120*c33452fbSAndroid Build Coastguard Worker                     }
121*c33452fbSAndroid Build Coastguard Worker                 }
122*c33452fbSAndroid Build Coastguard Worker             }
123*c33452fbSAndroid Build Coastguard Worker         }
124*c33452fbSAndroid Build Coastguard Worker     }
125*c33452fbSAndroid Build Coastguard Worker }
126*c33452fbSAndroid Build Coastguard Worker 
127*c33452fbSAndroid Build Coastguard Worker SCENARIO_METHOD(LazyPF, "Plugin OK", "[properties][missing plugin policy]")
128*c33452fbSAndroid Build Coastguard Worker {
129*c33452fbSAndroid Build Coastguard Worker     for (auto &pluginNameT :
130*c33452fbSAndroid Build Coastguard Worker          Tests<std::string>{{"an non existing plugin", "libdonetexist.so"},
131*c33452fbSAndroid Build Coastguard Worker                             {"an existing library but invalid (linux) PF plugin", "libc.so.6"}}) {
132*c33452fbSAndroid Build Coastguard Worker         GIVEN ("An" + pluginNameT.title) {
133*c33452fbSAndroid Build Coastguard Worker             create({&Config::plugins, Config::Plugins{{"", {pluginNameT.payload}}}});
134*c33452fbSAndroid Build Coastguard Worker             WHEN ("The missing subsystem policy is left to default") {
135*c33452fbSAndroid Build Coastguard Worker                 THEN ("Start should fail") {
136*c33452fbSAndroid Build Coastguard Worker                     CHECK_THROWS_AS(mPf->start(), Exception);
137*c33452fbSAndroid Build Coastguard Worker                 }
138*c33452fbSAndroid Build Coastguard Worker             }
139*c33452fbSAndroid Build Coastguard Worker             WHEN ("The missing subsystem policy is set to failure") {
140*c33452fbSAndroid Build Coastguard Worker                 mPf->setFailureOnMissingSubsystem(true);
141*c33452fbSAndroid Build Coastguard Worker                 THEN ("Start should fail") {
142*c33452fbSAndroid Build Coastguard Worker                     CHECK_THROWS_AS(mPf->start(), Exception);
143*c33452fbSAndroid Build Coastguard Worker                 }
144*c33452fbSAndroid Build Coastguard Worker             }
145*c33452fbSAndroid Build Coastguard Worker             WHEN ("The missing subsystem policy is set to ignore") {
146*c33452fbSAndroid Build Coastguard Worker                 mPf->setFailureOnMissingSubsystem(false);
147*c33452fbSAndroid Build Coastguard Worker                 THEN ("Start should success") {
148*c33452fbSAndroid Build Coastguard Worker                     CHECK_NOTHROW(mPf->start());
149*c33452fbSAndroid Build Coastguard Worker                 }
150*c33452fbSAndroid Build Coastguard Worker             }
151*c33452fbSAndroid Build Coastguard Worker         }
152*c33452fbSAndroid Build Coastguard Worker     }
153*c33452fbSAndroid Build Coastguard Worker }
154*c33452fbSAndroid Build Coastguard Worker 
155*c33452fbSAndroid Build Coastguard Worker SCENARIO_METHOD(LazyPF, "Invalid domains", "[properties]")
156*c33452fbSAndroid Build Coastguard Worker {
157*c33452fbSAndroid Build Coastguard Worker     GIVEN ("An invalid domain file") {
158*c33452fbSAndroid Build Coastguard Worker         create({&Config::domains, "<Domain name='Invalid'/>"});
159*c33452fbSAndroid Build Coastguard Worker         THEN ("Start should fail") {
160*c33452fbSAndroid Build Coastguard Worker             CHECK_THROWS_AS(mPf->start(), Exception);
161*c33452fbSAndroid Build Coastguard Worker         }
162*c33452fbSAndroid Build Coastguard Worker         WHEN ("Changing failure setting load policy to ignore") {
163*c33452fbSAndroid Build Coastguard Worker             mPf->setFailureOnFailedSettingsLoad(false);
164*c33452fbSAndroid Build Coastguard Worker             THEN ("Start should succeed") {
165*c33452fbSAndroid Build Coastguard Worker                 CHECK_NOTHROW(mPf->start());
166*c33452fbSAndroid Build Coastguard Worker             }
167*c33452fbSAndroid Build Coastguard Worker         }
168*c33452fbSAndroid Build Coastguard Worker     }
169*c33452fbSAndroid Build Coastguard Worker }
170*c33452fbSAndroid Build Coastguard Worker 
171*c33452fbSAndroid Build Coastguard Worker SCENARIO_METHOD(ParameterFramework, "Raw value space")
172*c33452fbSAndroid Build Coastguard Worker {
173*c33452fbSAndroid Build Coastguard Worker     WHEN ("Raw value space is set") {
174*c33452fbSAndroid Build Coastguard Worker         setRawValueSpace(true);
175*c33452fbSAndroid Build Coastguard Worker         THEN ("Value space should be raw") {
176*c33452fbSAndroid Build Coastguard Worker             CHECK(isValueSpaceRaw() == true);
177*c33452fbSAndroid Build Coastguard Worker         }
178*c33452fbSAndroid Build Coastguard Worker     }
179*c33452fbSAndroid Build Coastguard Worker }
180*c33452fbSAndroid Build Coastguard Worker 
181*c33452fbSAndroid Build Coastguard Worker } // namespace parameterFramework
182