117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst/*
217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst * Copyright (C) 2016 The Android Open Source Project
317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst *
417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst * Licensed under the Apache License, Version 2.0 (the "License");
517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst * you may not use this file except in compliance with the License.
617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst * You may obtain a copy of the License at
717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst *
817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst *      http://www.apache.org/licenses/LICENSE-2.0
917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst *
1017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst * Unless required by applicable law or agreed to in writing, software
1117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst * distributed under the License is distributed on an "AS IS" BASIS,
1217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst * See the License for the specific language governing permissions and
1417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst * limitations under the License.
1517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst */
1617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
1717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst#include <unistd.h>
1817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
1917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst#include <gtest/gtest.h>
2017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst#include <binder/IServiceManager.h>
2117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst#include <binder/ProcessState.h>
2217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst#include <utils/threads.h>
2317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst#include <utils/KeyedVector.h>
2417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst#include <utils/String8.h>
2517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst#include <utils/SystemClock.h>
2617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst#include <VehiclePropertyAccessControlForTesting.h>
2717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
2817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstnamespace android {
2917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
3017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstclass VehiclePropertyAccessControlTest : public testing::Test {
3117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstpublic:
3217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    VehiclePropertyAccessControlTest() {}
3317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ~VehiclePropertyAccessControlTest() {}
3417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
3517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstpublic:
3617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static std::string xmlData;
3717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static std::string xmlData2;
3817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const int32_t prop1;
3917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const int32_t prop2;
4017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const int32_t prop3;
4117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const int32_t uid1;
4217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const int32_t uid2;
4317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const int32_t uid3;
4417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
4517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstprotected:
4617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    void SetUp() {}
4717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
4817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstprotected:
4917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    xmlDoc* doc;
5017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    VehiclePropertyAccessControlForTesting mVehiclePropertyAccessControl;
5117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst};
5217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
5317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurststd::string VehiclePropertyAccessControlTest::xmlData =
5417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "<ALLOW>"
5517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "<PROPERTY name=\"PROP1\" value=\"0xA\">"
5617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "<UID name=\"UID1\" access=\"r\" value=\"1000\"/>"
5717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "</PROPERTY>"
5817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "<PROPERTY name=\"PROP2\" value=\"0xB\">"
5917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "<UID name=\"UID2\" access=\"w\" value=\"2000\"/>"
6017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "</PROPERTY>"
6117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "<PROPERTY name=\"PROP3\" value=\"0xC\">"
6217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "<UID name=\"UID3\" access=\"rw\" value=\"3000\"/>"
6317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "</PROPERTY>"
6417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                            "</ALLOW>";
6517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
6617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstconst int32_t VehiclePropertyAccessControlTest::prop1 = 0xa;
6717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstconst int32_t VehiclePropertyAccessControlTest::prop2 = 0xb;
6817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstconst int32_t VehiclePropertyAccessControlTest::prop3 = 0xc;
6917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstconst int32_t VehiclePropertyAccessControlTest::uid1 = 1000;
7017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstconst int32_t VehiclePropertyAccessControlTest::uid2 = 2000;
7117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurstconst int32_t VehiclePropertyAccessControlTest::uid3 = 3000;
7217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
7317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam HurstTEST_F(VehiclePropertyAccessControlTest, isHexNotation) {
7417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const std::string shouldPass[] =
7517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst        {"0x01234567",
7617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst         "0x01abcdef",
7717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst         "0x01ABCDEF",
7817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst         "0x0"};
7917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
8017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const std::string shouldFail[] =
8117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst        {"0",
8217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst         "0x",
8317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst         "01234567",
8417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst         "ABCDEF01",
8517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst         "0xabi"};
8617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
8717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    for(auto& h : shouldPass) {
8817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst        ASSERT_TRUE(mVehiclePropertyAccessControl.isHexNotation(h));
8917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    }
9017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
9117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    for(auto& h : shouldFail) {
9217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst        ASSERT_FALSE(mVehiclePropertyAccessControl.isHexNotation(h));
9317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    }
9417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst}
9517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
9617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam HurstTEST_F(VehiclePropertyAccessControlTest, accessToInt) {
9717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const char* property = "property";
9817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const char* uid = "uid";
9917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    struct ShouldPassType {std::string str; int32_t value;};
10017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const struct ShouldPassType shouldPass[] = {
10117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst            {"r", VEHICLE_PROP_ACCESS_READ},
10217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst            {"w", VEHICLE_PROP_ACCESS_WRITE},
10317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst            {"rw", VEHICLE_PROP_ACCESS_READ_WRITE},
10417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst            {"wr", VEHICLE_PROP_ACCESS_READ_WRITE}
10517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    };
10617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const char* shouldFail[] = {"rr", "ww", "rww", "rwr", "", "k"};
10717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    int32_t value;
10817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
10917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    for(auto& h : shouldPass) {
11017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst        ASSERT_TRUE(mVehiclePropertyAccessControl.accessToInt(&value,
11117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst            (const xmlChar*)property, (const xmlChar*)uid,
11217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst            (const xmlChar*)h.str.c_str()));
11317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst        ASSERT_EQ(h.value, value);
11417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    }
11517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
11617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    for(auto& h : shouldFail) {
11717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst        ASSERT_FALSE(mVehiclePropertyAccessControl.accessToInt(&value,
11817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst            (const xmlChar*)property, (const xmlChar*)uid, (const xmlChar*)h));
11917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    }
12017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst}
12117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
12217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam HurstTEST_F(VehiclePropertyAccessControlTest, updateOrCreate) {
12317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    std::map<int32_t, int32_t> *accessMap;
12417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
12517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Empty the map
12617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    mVehiclePropertyAccessControl.emptyAccessControlMap();
12717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
12817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Make sure the property does not exist
12917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_FALSE(mVehiclePropertyAccessControl.getAccessToProperty(prop1,
13017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                                                                   &accessMap));
13117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
13217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Create the property and give uid read access
13317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_FALSE(mVehiclePropertyAccessControl.updateOrCreate(uid1, prop1,
13417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                                                 VEHICLE_PROP_ACCESS_READ));
13517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
13617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Make sure the property was created
13717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.getAccessToProperty(prop1,
13817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                                                                   &accessMap));
13917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
14017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Make sure uid has read access to the property
14117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_EQ((*accessMap)[uid1], VEHICLE_PROP_ACCESS_READ);
14217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
14317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Give uid2 read/write access to the property
14417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_FALSE(mVehiclePropertyAccessControl.updateOrCreate(uid2, prop1,
14517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                                                VEHICLE_PROP_ACCESS_READ_WRITE));
14617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
14717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Get the accessMap
14817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.getAccessToProperty(prop1,
14917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                                                                   &accessMap));
15017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Make sure uid2 has read/write access to the property
15117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_EQ((*accessMap)[uid2], VEHICLE_PROP_ACCESS_READ_WRITE);
15217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
15317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Make sure uid still has read access to the property
15417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_EQ((*accessMap)[uid1], VEHICLE_PROP_ACCESS_READ);
15517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
15617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Change uid access to write for property
15717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.updateOrCreate(uid1, prop1,
15817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                                                     VEHICLE_PROP_ACCESS_WRITE));
15917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
16017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Get the accessMap
16117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.getAccessToProperty(prop1,
16217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                                                                   &accessMap));
16317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
16417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Make sure uid has write access to property
16517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_EQ((*accessMap)[uid1], VEHICLE_PROP_ACCESS_WRITE);
16617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
16717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Make sure uid2 has read write access to property
16817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_EQ((*accessMap)[uid2], VEHICLE_PROP_ACCESS_READ_WRITE);
16917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst}
17017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
17117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam HurstTEST_F(VehiclePropertyAccessControlTest, populate) {
17217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    xmlNode* root_element;
17317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    std::map<int32_t, int32_t> *accessMap;
17417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
17517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Empty the map
17617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    mVehiclePropertyAccessControl.emptyAccessControlMap();
17717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
17817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    doc = xmlReadMemory(xmlData.c_str(), xmlData.length(), NULL, NULL, 0);
17917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(doc != NULL);
18017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    root_element = xmlDocGetRootElement(doc);
18117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(root_element != NULL);
18217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
18317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    bool result = mVehiclePropertyAccessControl.populate(root_element->children);
18417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
18517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(result);
18617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
18717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Get the accessMap
18817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.getAccessToProperty(prop1,
18917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                                                                  &accessMap));
19017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
19117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Make sure uid still has read access to the property
19217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_EQ((*accessMap)[uid1], VEHICLE_PROP_ACCESS_READ);
19317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
19417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Get the accessMap
19517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.getAccessToProperty(prop2,
19617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst                                                                  &accessMap));
19717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
19817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Make sure uid still has write access to the property
19917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_EQ((*accessMap)[uid2], VEHICLE_PROP_ACCESS_WRITE);
20017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
20117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.testAccess(prop1, uid1, 0));
20217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_FALSE(mVehiclePropertyAccessControl.testAccess(prop1, uid1, 1));
20317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.testAccess(prop2, uid2, 1));
20417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_FALSE(mVehiclePropertyAccessControl.testAccess(prop2, uid2, 0));
20517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.testAccess(prop3, uid3, 1));
20617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.testAccess(prop3, uid3, 0));
20717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
20817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    static const std::string dump_msg =
20917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst            "UID 1000: property 0x0000000a, access read\n"
21017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst            "UID 2000: property 0x0000000b, access write\n"
21117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst            "UID 3000: property 0x0000000c, access read/write\n";
21217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
21317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    String8 msg;
21417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    mVehiclePropertyAccessControl.dump(msg);
21517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
21617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_EQ(dump_msg.compare(msg.string()), 0);
21717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
21817954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst}
21917954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst
22017954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam HurstTEST_F(VehiclePropertyAccessControlTest, init) {
22117954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    xmlFreeDoc(doc);
22217954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    xmlCleanupParser();
22317954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    // Empty the map
22417954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    mVehiclePropertyAccessControl.emptyAccessControlMap();
22517954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst    ASSERT_TRUE(mVehiclePropertyAccessControl.init());
22617954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst}
22717954fee2501db6ae2cb3f56bf4a2ab5c6518842Sam Hurst}; // namespace android
228