1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <fcntl.h> 18#include <stdio.h> 19#include <stdlib.h> 20#include <limits> 21#include <cstddef> 22#include <vector> 23 24#include "android-base/file.h" 25#include "android-base/test_utils.h" 26#include <gtest/gtest.h> 27 28#include <binder/Parcel.h> 29#include <binder/Value.h> 30#include <binder/Debug.h> 31 32using ::android::binder::Value; 33using ::android::os::PersistableBundle; 34using ::android::String16; 35using ::std::vector; 36 37#define VALUE_TYPE_TEST(T, TYPENAME, VAL) \ 38 TEST(ValueType, Handles ## TYPENAME) { \ 39 T x = VAL; \ 40 T y = T(); \ 41 Value value = VAL; \ 42 ASSERT_FALSE(value.empty()); \ 43 ASSERT_TRUE(value.is ## TYPENAME ()); \ 44 ASSERT_TRUE(value.get ## TYPENAME (&y)); \ 45 ASSERT_EQ(x, y); \ 46 ASSERT_EQ(value, Value(y)); \ 47 value.put ## TYPENAME (x); \ 48 ASSERT_EQ(value, Value(y)); \ 49 value = Value(); \ 50 ASSERT_TRUE(value.empty()); \ 51 ASSERT_NE(value, Value(y)); \ 52 value = y; \ 53 ASSERT_EQ(value, Value(x)); \ 54 } 55 56#define VALUE_TYPE_VECTOR_TEST(T, TYPENAME, VAL) \ 57 TEST(ValueType, Handles ## TYPENAME ## Vector) { \ 58 vector<T> x; \ 59 vector<T> y; \ 60 x.push_back(VAL); \ 61 x.push_back(T()); \ 62 Value value(x); \ 63 ASSERT_FALSE(value.empty()); \ 64 ASSERT_TRUE(value.is ## TYPENAME ## Vector()); \ 65 ASSERT_TRUE(value.get ## TYPENAME ## Vector(&y)); \ 66 ASSERT_EQ(x, y); \ 67 ASSERT_EQ(value, Value(y)); \ 68 value.put ## TYPENAME ## Vector(x); \ 69 ASSERT_EQ(value, Value(y)); \ 70 value = Value(); \ 71 ASSERT_TRUE(value.empty()); \ 72 ASSERT_NE(value, Value(y)); \ 73 value = y; \ 74 ASSERT_EQ(value, Value(x)); \ 75 } 76 77VALUE_TYPE_TEST(bool, Boolean, true) 78VALUE_TYPE_TEST(int32_t, Int, 31337) 79VALUE_TYPE_TEST(int64_t, Long, 13370133701337l) 80VALUE_TYPE_TEST(double, Double, 3.14159265358979323846) 81VALUE_TYPE_TEST(String16, String, String16("Lovely")) 82 83VALUE_TYPE_VECTOR_TEST(bool, Boolean, true) 84VALUE_TYPE_VECTOR_TEST(int32_t, Int, 31337) 85VALUE_TYPE_VECTOR_TEST(int64_t, Long, 13370133701337l) 86VALUE_TYPE_VECTOR_TEST(double, Double, 3.14159265358979323846) 87VALUE_TYPE_VECTOR_TEST(String16, String, String16("Lovely")) 88 89VALUE_TYPE_TEST(PersistableBundle, PersistableBundle, PersistableBundle()) 90 91TEST(ValueType, HandlesClear) { 92 Value value; 93 ASSERT_TRUE(value.empty()); 94 value.putInt(31337); 95 ASSERT_FALSE(value.empty()); 96 value.clear(); 97 ASSERT_TRUE(value.empty()); 98} 99 100TEST(ValueType, HandlesSwap) { 101 Value value_a, value_b; 102 int32_t int_x; 103 value_a.putInt(31337); 104 ASSERT_FALSE(value_a.empty()); 105 ASSERT_TRUE(value_b.empty()); 106 value_a.swap(value_b); 107 ASSERT_FALSE(value_b.empty()); 108 ASSERT_TRUE(value_a.empty()); 109 ASSERT_TRUE(value_b.getInt(&int_x)); 110 ASSERT_EQ(31337, int_x); 111} 112