1d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin/*
2d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin * Copyright (C) 2014 The Android Open Source Project
3d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin *
4d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin * you may not use this file except in compliance with the License.
6d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin * You may obtain a copy of the License at
7d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin *
8d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin *
10d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin * Unless required by applicable law or agreed to in writing, software
11d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin * See the License for the specific language governing permissions and
14d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin * limitations under the License.
15d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin */
16d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
17d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#define LOG_TAG "Properties_test"
18d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#include <utils/Log.h>
19d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#include <gtest/gtest.h>
20d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
21d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#include <cutils/properties.h>
22d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#include <limits.h>
23d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#include <string>
24d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#include <sstream>
25d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#include <iostream>
26d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
27d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkinnamespace android {
28d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
29d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#define STRINGIFY_INNER(x) #x
30d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#define STRINGIFY(x) STRINGIFY_INNER(x)
31d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
32d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#define ASSERT_OK(x) ASSERT_EQ(0, (x))
33d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#define EXPECT_OK(x) EXPECT_EQ(0, (x))
34d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
35d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#define PROPERTY_TEST_KEY "libcutils.test.key"
36d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin#define PROPERTY_TEST_VALUE_DEFAULT "<<<default_value>>>"
37d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
38d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkintemplate <typename T>
39d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkinstatic std::string HexString(T value) {
40d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    std::stringstream ss;
41d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    ss << "0x" << std::hex << std::uppercase << value;
42d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    return ss.str();
43d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin}
44d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
45d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkintemplate <typename T>
46d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkinstatic ::testing::AssertionResult AssertEqualHex(const char *mExpr,
47d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        const char *nExpr,
48d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        T m,
49d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        T n) {
50d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    if (m == n) {
51d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        return ::testing::AssertionSuccess();
52d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
53d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
54d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    return ::testing::AssertionFailure()
55d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        << mExpr << " and " << nExpr << " (expected: " << HexString(m) <<
56d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ", actual: " << HexString(n) << ") are not equal";
57d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin}
58d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
59d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkinclass PropertiesTest : public testing::Test {
60d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkinpublic:
61d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    PropertiesTest() : mValue() {}
62d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkinprotected:
63d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    virtual void SetUp() {
64d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_OK(property_set(PROPERTY_TEST_KEY, /*value*/NULL));
65d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
66d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
67d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    virtual void TearDown() {
68d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_OK(property_set(PROPERTY_TEST_KEY, /*value*/NULL));
69d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
70d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
71d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    char mValue[PROPERTY_VALUE_MAX];
72d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
73d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    template <typename T>
74d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    static std::string ToString(T value) {
75d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        std::stringstream ss;
76d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ss << value;
77d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
78d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        return ss.str();
79d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
80d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
81d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    // Return length of property read; value is written into mValue
82d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    int SetAndGetProperty(const char* value, const char* defaultValue = PROPERTY_TEST_VALUE_DEFAULT) {
83d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_OK(property_set(PROPERTY_TEST_KEY, value)) << "value: '" << value << "'";
84d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        return property_get(PROPERTY_TEST_KEY, mValue, defaultValue);
85d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
86d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
87d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    void ResetValue(unsigned char c = 0xFF) {
88d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        for (size_t i = 0; i < ARRAY_SIZE(mValue); ++i) {
89d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin            mValue[i] = (char) c;
90d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        }
91d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
92d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin};
93d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
94d4507e9246e4855c5431cac5c3d1a9155caebc87Igor MurashkinTEST_F(PropertiesTest, SetString) {
95d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
96d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    // Null key -> unsuccessful set
97d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    {
98d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // Null key -> fails
99d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_GT(0, property_set(/*key*/NULL, PROPERTY_TEST_VALUE_DEFAULT));
100d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
101d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
102d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    // Null value -> returns default value
103d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    {
104d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // Null value -> OK , and it clears the value
105d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_OK(property_set(PROPERTY_TEST_KEY, /*value*/NULL));
106d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ResetValue();
107d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
108d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // Since the value is null, default value will be returned
109d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        int len = property_get(PROPERTY_TEST_KEY, mValue, PROPERTY_TEST_VALUE_DEFAULT);
110d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_EQ(strlen(PROPERTY_TEST_VALUE_DEFAULT), len);
111d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_STREQ(PROPERTY_TEST_VALUE_DEFAULT, mValue);
112d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
113d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
114d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    // Trivial case => get returns what was set
115d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    {
116d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        int len = SetAndGetProperty("hello_world");
117d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_EQ(strlen("hello_world"), len) << "hello_world key";
118d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_STREQ("hello_world", mValue);
119d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ResetValue();
120d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
121d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
122d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    // Set to empty string => get returns default always
123d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    {
124d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        const char* EMPTY_STRING_DEFAULT = "EMPTY_STRING";
125d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        int len = SetAndGetProperty("", EMPTY_STRING_DEFAULT);
126d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_EQ(strlen(EMPTY_STRING_DEFAULT), len) << "empty key";
127d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_STREQ(EMPTY_STRING_DEFAULT, mValue);
128d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ResetValue();
129d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
130d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
131d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    // Set to max length => get returns what was set
132d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    {
133d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        std::string maxLengthString = std::string(PROPERTY_VALUE_MAX-1, 'a');
134d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
135d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        int len = SetAndGetProperty(maxLengthString.c_str());
136d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_EQ(PROPERTY_VALUE_MAX-1, len) << "max length key";
137d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_STREQ(maxLengthString.c_str(), mValue);
138d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ResetValue();
139d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
140d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
141d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    // Set to max length + 1 => set fails
142d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    {
143d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        const char* VALID_TEST_VALUE = "VALID_VALUE";
144d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ASSERT_OK(property_set(PROPERTY_TEST_KEY, VALID_TEST_VALUE));
145d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
146d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        std::string oneLongerString = std::string(PROPERTY_VALUE_MAX, 'a');
147d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
148d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // Expect that the value set fails since it's too long
149d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_GT(0, property_set(PROPERTY_TEST_KEY, oneLongerString.c_str()));
150d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        int len = property_get(PROPERTY_TEST_KEY, mValue, PROPERTY_TEST_VALUE_DEFAULT);
151d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
152d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_EQ(strlen(VALID_TEST_VALUE), len) << "set should've failed";
153d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_STREQ(VALID_TEST_VALUE, mValue);
154d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ResetValue();
155d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
156d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin}
157d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
158d4507e9246e4855c5431cac5c3d1a9155caebc87Igor MurashkinTEST_F(PropertiesTest, GetString) {
159d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
160d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    // Try to use a default value that's too long => set fails
161d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    {
162d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ASSERT_OK(property_set(PROPERTY_TEST_KEY, ""));
163d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
164d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        std::string maxLengthString = std::string(PROPERTY_VALUE_MAX-1, 'a');
165d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        std::string oneLongerString = std::string(PROPERTY_VALUE_MAX, 'a');
166d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
167d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // Expect that the value is truncated since it's too long (by 1)
168d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        int len = property_get(PROPERTY_TEST_KEY, mValue, oneLongerString.c_str());
169d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_EQ(PROPERTY_VALUE_MAX-1, len);
170d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_STREQ(maxLengthString.c_str(), mValue);
171d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ResetValue();
172d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
173d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin}
174d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
175d4507e9246e4855c5431cac5c3d1a9155caebc87Igor MurashkinTEST_F(PropertiesTest, GetBool) {
176d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    /**
177d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin     * TRUE
178d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin     */
179d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const char *valuesTrue[] = { "1", "true", "y", "yes", "on", };
180d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    for (size_t i = 0; i < ARRAY_SIZE(valuesTrue); ++i) {
181d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ASSERT_OK(property_set(PROPERTY_TEST_KEY, valuesTrue[i]));
182d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        bool val = property_get_bool(PROPERTY_TEST_KEY, /*default_value*/false);
183d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_TRUE(val) << "Property should've been TRUE for value: '" << valuesTrue[i] << "'";
184d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
185d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
186d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    /**
187d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin     * FALSE
188d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin     */
189d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const char *valuesFalse[] = { "0", "false", "n", "no", "off", };
190d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    for (size_t i = 0; i < ARRAY_SIZE(valuesFalse); ++i) {
191d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ASSERT_OK(property_set(PROPERTY_TEST_KEY, valuesFalse[i]));
192d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        bool val = property_get_bool(PROPERTY_TEST_KEY, /*default_value*/true);
193d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_FALSE(val) << "Property shoud've been FALSE For string value: '" << valuesFalse[i] << "'";
194d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
195d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
196d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    /**
197d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin     * NEITHER
198d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin     */
199d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const char *valuesNeither[] = { "x0", "x1", "2", "-2", "True", "False", "garbage", "", " ",
200d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin            "+1", "  1  ", "  true", "  true  ", "  y  ", "  yes", "yes  ",
201d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin            "+0", "-0", "00", "  00  ", "  false", "false  ",
202d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    };
203d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    for (size_t i = 0; i < ARRAY_SIZE(valuesNeither); ++i) {
204d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ASSERT_OK(property_set(PROPERTY_TEST_KEY, valuesNeither[i]));
205d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
206d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // The default value should always be used
207d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        bool val = property_get_bool(PROPERTY_TEST_KEY, /*default_value*/true);
208d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_TRUE(val) << "Property should've been NEITHER (true) for string value: '" << valuesNeither[i] << "'";
209d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
210d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        val = property_get_bool(PROPERTY_TEST_KEY, /*default_value*/false);
211d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_FALSE(val) << "Property should've been NEITHER (false) for string value: '" << valuesNeither[i] << "'";
212d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
213d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin}
214d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
215d4507e9246e4855c5431cac5c3d1a9155caebc87Igor MurashkinTEST_F(PropertiesTest, GetInt64) {
216d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const int64_t DEFAULT_VALUE = INT64_C(0xDEADBEEFBEEFDEAD);
217d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
218d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const std::string longMaxString = ToString(INT64_MAX);
219d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const std::string longStringOverflow = longMaxString + "0";
220d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
221d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const std::string longMinString = ToString(INT64_MIN);
222d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const std::string longStringUnderflow = longMinString + "0";
223d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
224d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const char* setValues[] = {
225d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 10
226d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        "1", "2", "12345", "-1", "-2", "-12345",
227d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 16
228d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        "0xFF", "0x0FF", "0xC0FFEE",
229d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 8
230d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        "0", "01234", "07",
231d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // corner cases
232d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        "       2", "2      ", "+0", "-0", "  +0   ", longMaxString.c_str(), longMinString.c_str(),
233d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // failing cases
234d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        NULL, "", " ", "    ", "hello", "     true     ", "y",
235d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        longStringOverflow.c_str(), longStringUnderflow.c_str(),
236d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    };
237d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
238d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    int64_t getValues[] = {
239d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 10
240d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        1, 2, 12345, -1, -2, -12345,
241d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 16
242d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        0xFF, 0x0FF, 0xC0FFEE,
243d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 8
244d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        0, 01234, 07,
245d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // corner cases
246d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        2, 2, 0, 0, 0, INT64_MAX, INT64_MIN,
247d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // failing cases
248d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE,
249d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        DEFAULT_VALUE, DEFAULT_VALUE,
250d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    };
251d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
252d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    ASSERT_EQ(ARRAY_SIZE(setValues), ARRAY_SIZE(getValues));
253d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
254d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    for (size_t i = 0; i < ARRAY_SIZE(setValues); ++i) {
255d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ASSERT_OK(property_set(PROPERTY_TEST_KEY, setValues[i]));
256d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
257d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        int64_t val = property_get_int64(PROPERTY_TEST_KEY, DEFAULT_VALUE);
258d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_PRED_FORMAT2(AssertEqualHex, getValues[i], val) << "Property was set to '" << setValues[i] << "'";
259d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
260d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin}
261d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
262d4507e9246e4855c5431cac5c3d1a9155caebc87Igor MurashkinTEST_F(PropertiesTest, GetInt32) {
263d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const int32_t DEFAULT_VALUE = INT32_C(0xDEADBEEF);
264d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
265d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const std::string intMaxString = ToString(INT32_MAX);
266d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const std::string intStringOverflow = intMaxString + "0";
267d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
268d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const std::string intMinString = ToString(INT32_MIN);
269d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const std::string intStringUnderflow = intMinString + "0";
270d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
271d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    const char* setValues[] = {
272d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 10
273d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        "1", "2", "12345", "-1", "-2", "-12345",
274d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 16
275d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        "0xFF", "0x0FF", "0xC0FFEE", "0Xf00",
276d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 8
277d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        "0", "01234", "07",
278d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // corner cases
279d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        "       2", "2      ", "+0", "-0", "  +0   ", intMaxString.c_str(), intMinString.c_str(),
280d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // failing cases
281d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        NULL, "", " ", "    ", "hello", "     true     ", "y",
282d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        intStringOverflow.c_str(), intStringUnderflow.c_str(),
283d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    };
284d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
285d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    int32_t getValues[] = {
286d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 10
287d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        1, 2, 12345, -1, -2, -12345,
288d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 16
289d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        0xFF, 0x0FF, 0xC0FFEE, 0Xf00,
290d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // base 8
291d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        0, 01234, 07,
292d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // corner cases
293d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        2, 2, 0, 0, 0, INT32_MAX, INT32_MIN,
294d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        // failing cases
295d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE, DEFAULT_VALUE,
296d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        DEFAULT_VALUE, DEFAULT_VALUE,
297d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    };
298d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
299d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    ASSERT_EQ(ARRAY_SIZE(setValues), ARRAY_SIZE(getValues));
300d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
301d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    for (size_t i = 0; i < ARRAY_SIZE(setValues); ++i) {
302d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        ASSERT_OK(property_set(PROPERTY_TEST_KEY, setValues[i]));
303d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
304d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        int32_t val = property_get_int32(PROPERTY_TEST_KEY, DEFAULT_VALUE);
305d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin        EXPECT_PRED_FORMAT2(AssertEqualHex, getValues[i], val) << "Property was set to '" << setValues[i] << "'";
306d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin    }
307d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin}
308d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin
309d4507e9246e4855c5431cac5c3d1a9155caebc87Igor Murashkin} // namespace android
310