10dfa752e67116940f04a988ca4a264f7140dd81fYi Jin/*
20dfa752e67116940f04a988ca4a264f7140dd81fYi Jin * Copyright (C) 2017 The Android Open Source Project
30dfa752e67116940f04a988ca4a264f7140dd81fYi Jin *
40dfa752e67116940f04a988ca4a264f7140dd81fYi Jin * Licensed under the Apache License, Version 2.0 (the "License");
50dfa752e67116940f04a988ca4a264f7140dd81fYi Jin * you may not use this file except in compliance with the License.
60dfa752e67116940f04a988ca4a264f7140dd81fYi Jin * You may obtain a copy of the License at
70dfa752e67116940f04a988ca4a264f7140dd81fYi Jin *
80dfa752e67116940f04a988ca4a264f7140dd81fYi Jin *      http://www.apache.org/licenses/LICENSE-2.0
90dfa752e67116940f04a988ca4a264f7140dd81fYi Jin *
100dfa752e67116940f04a988ca4a264f7140dd81fYi Jin * Unless required by applicable law or agreed to in writing, software
110dfa752e67116940f04a988ca4a264f7140dd81fYi Jin * distributed under the License is distributed on an "AS IS" BASIS,
120dfa752e67116940f04a988ca4a264f7140dd81fYi Jin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130dfa752e67116940f04a988ca4a264f7140dd81fYi Jin * See the License for the specific language governing permissions and
140dfa752e67116940f04a988ca4a264f7140dd81fYi Jin * limitations under the License.
150dfa752e67116940f04a988ca4a264f7140dd81fYi Jin */
160dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
170dfa752e67116940f04a988ca4a264f7140dd81fYi Jin#include "SystemPropertiesParser.h"
180dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
190dfa752e67116940f04a988ca4a264f7140dd81fYi Jin#include "frameworks/base/core/proto/android/os/system_properties.pb.h"
200dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
210dfa752e67116940f04a988ca4a264f7140dd81fYi Jin#include <android-base/file.h>
220dfa752e67116940f04a988ca4a264f7140dd81fYi Jin#include <android-base/test_utils.h>
230dfa752e67116940f04a988ca4a264f7140dd81fYi Jin#include <gmock/gmock.h>
2462c220b20b3fc431c27feac29a71d040fc8e2626Joe Onorato#include <google/protobuf/message_lite.h>
250dfa752e67116940f04a988ca4a264f7140dd81fYi Jin#include <gtest/gtest.h>
260dfa752e67116940f04a988ca4a264f7140dd81fYi Jin#include <string.h>
270dfa752e67116940f04a988ca4a264f7140dd81fYi Jin#include <fcntl.h>
280dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
290dfa752e67116940f04a988ca4a264f7140dd81fYi Jinusing namespace android::base;
300dfa752e67116940f04a988ca4a264f7140dd81fYi Jinusing namespace android::os;
310dfa752e67116940f04a988ca4a264f7140dd81fYi Jinusing namespace std;
320dfa752e67116940f04a988ca4a264f7140dd81fYi Jinusing ::testing::StrEq;
330dfa752e67116940f04a988ca4a264f7140dd81fYi Jinusing ::testing::Test;
340dfa752e67116940f04a988ca4a264f7140dd81fYi Jinusing ::testing::internal::CaptureStderr;
350dfa752e67116940f04a988ca4a264f7140dd81fYi Jinusing ::testing::internal::CaptureStdout;
360dfa752e67116940f04a988ca4a264f7140dd81fYi Jinusing ::testing::internal::GetCapturedStderr;
370dfa752e67116940f04a988ca4a264f7140dd81fYi Jinusing ::testing::internal::GetCapturedStdout;
380dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
390dfa752e67116940f04a988ca4a264f7140dd81fYi Jinclass SystemPropertiesParserTest : public Test {
400dfa752e67116940f04a988ca4a264f7140dd81fYi Jinpublic:
410dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    virtual void SetUp() override {
420dfa752e67116940f04a988ca4a264f7140dd81fYi Jin        ASSERT_TRUE(tf.fd != -1);
430dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    }
440dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
450dfa752e67116940f04a988ca4a264f7140dd81fYi Jinprotected:
460dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    TemporaryFile tf;
470dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
480dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    const string kTestPath = GetExecutableDirectory();
490dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    const string kTestDataPath = kTestPath + "/testdata/";
500dfa752e67116940f04a988ca4a264f7140dd81fYi Jin};
510dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
520dfa752e67116940f04a988ca4a264f7140dd81fYi JinTEST_F(SystemPropertiesParserTest, HasSwapInfo) {
530dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    const string testFile = kTestDataPath + "system_properties.txt";
540dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    SystemPropertiesParser parser;
550dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    SystemPropertiesProto expected;
560dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
57f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    expected.mutable_aac_drc()->set_cut(123);
58f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    expected.mutable_aaudio()->set_hw_burst_min_usec(2000);
59f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    expected.mutable_aaudio()->set_mmap_exclusive_policy(2);
60f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    expected.mutable_dalvik_vm()->set_appimageformat("lz4");
619299af93945376c4390cc24f5a0c1844997a694bYi Jin    expected.set_drm_64bit_enabled(false);
62f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    expected.mutable_init_svc()->set_adbd(
63f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin        SystemPropertiesProto_InitSvc_Status_STATUS_RUNNING);
64f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    expected.mutable_init_svc()->set_lmkd(
65f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin        SystemPropertiesProto_InitSvc_Status_STATUS_STOPPED);
669299af93945376c4390cc24f5a0c1844997a694bYi Jin    expected.set_media_mediadrmservice_enable(true);
679299af93945376c4390cc24f5a0c1844997a694bYi Jin
689299af93945376c4390cc24f5a0c1844997a694bYi Jin    SystemPropertiesProto::Ro* ro = expected.mutable_ro();
69f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_boot()->add_boottime("1BLL:85");
70f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_boot()->add_boottime("1BLE:898");
71f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_boot()->add_boottime("2BLL:0");
72f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_boot()->add_boottime("2BLE:862");
73f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_boot()->add_boottime("SW:6739");
74f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_boot()->add_boottime("KL:340");
75f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_bootimage()->set_build_date_utc(1509394807LL);
76f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_bootimage()->set_build_fingerprint(
77f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin        "google/marlin/marlin:P/MASTER/jinyithu10301320:eng/dev-keys");
78f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_hardware()->set_value("marlin");
79f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_hardware()->set_power("marlin-profile");
80f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_product()->add_cpu_abilist("arm64-v8a");
81f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_product()->add_cpu_abilist("armeabi-v7a");
82f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_product()->add_cpu_abilist("armeabi");
83f77a07df1cc71d1f25454de1b5c7da301541b837Yi Jin    ro->mutable_product()->mutable_vendor()->set_brand("google");
840dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
850dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    int fd = open(testFile.c_str(), O_RDONLY);
860dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    ASSERT_TRUE(fd != -1);
870dfa752e67116940f04a988ca4a264f7140dd81fYi Jin
880dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    CaptureStdout();
890dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    ASSERT_EQ(NO_ERROR, parser.Parse(fd, STDOUT_FILENO));
9062c220b20b3fc431c27feac29a71d040fc8e2626Joe Onorato    EXPECT_EQ(GetCapturedStdout(), expected.SerializeAsString());
910dfa752e67116940f04a988ca4a264f7140dd81fYi Jin    close(fd);
920dfa752e67116940f04a988ca4a264f7140dd81fYi Jin}
93