1// Copyright 2014 The Android Open Source Project
2//
3// This software is licensed under the terms of the GNU General Public
4// License version 2, as published by the Free Software Foundation, and
5// may be copied, distributed, and modified under those terms.
6//
7// This program is distributed in the hope that it will be useful,
8// but WITHOUT ANY WARRANTY; without even the implied warranty of
9// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10// GNU General Public License for more details.
11
12#include "android/utils/file_data.h"
13
14#include <gtest/gtest.h>
15
16class ScopedFileData {
17public:
18    ScopedFileData() : mStatus(0) { fileData_initEmpty(&mFileData); }
19
20    ScopedFileData(const void* buff, size_t length) {
21        mStatus = fileData_initFromMemory(&mFileData, buff, length);
22    }
23
24    explicit ScopedFileData(const ScopedFileData& other) {
25        mStatus = fileData_initFrom(&mFileData, other.ptr());
26    }
27
28    explicit ScopedFileData(const FileData* other) {
29        mStatus = fileData_initFrom(&mFileData, other);
30    }
31
32    ~ScopedFileData() { fileData_done(&mFileData); }
33
34    int status() const { return mStatus; }
35    FileData* ptr() { return &mFileData; }
36    const FileData* ptr() const { return &mFileData; }
37    FileData& operator*() { return mFileData; }
38    FileData* operator->() { return &mFileData; }
39private:
40    FileData mFileData;
41    int mStatus;
42};
43
44TEST(FileData, IsValid) {
45    EXPECT_FALSE(fileData_isValid(NULL));
46
47    FileData fakeData = { (uint8_t*)0x012345678, 12345, 23983 };
48    EXPECT_FALSE(fileData_isValid(&fakeData));
49}
50
51TEST(FileData, InitializerConstant) {
52    FileData data = FILE_DATA_INIT;
53    EXPECT_TRUE(fileData_isValid(&data));
54    EXPECT_TRUE(fileData_isEmpty(&data));
55}
56
57TEST(FileData, InitializerIsFullOfZeroes) {
58    FileData data;
59    memset(&data, 0, sizeof data);
60    EXPECT_TRUE(fileData_isEmpty(&data));
61    EXPECT_TRUE(fileData_isValid(&data));
62}
63
64TEST(FileData, EmptyInitializer) {
65    ScopedFileData data;
66    EXPECT_EQ(0, data.status());
67    EXPECT_TRUE(fileData_isEmpty(data.ptr()));
68}
69
70TEST(FileData, InitEmpty) {
71    ScopedFileData data("", 0U);
72    EXPECT_EQ(0, data.status());
73    EXPECT_TRUE(fileData_isEmpty(data.ptr()));
74    EXPECT_FALSE(data->data);
75    EXPECT_EQ(0U, data->size);
76}
77
78TEST(FileData, InitFromMemory) {
79    static const char kData[] = "Hello World!";
80    ScopedFileData data(kData, sizeof kData);
81    EXPECT_EQ(0, data.status());
82    EXPECT_NE(kData, (const char*)data->data);
83    for (size_t n = 0; n < sizeof kData; ++n) {
84        EXPECT_EQ(kData[n], data->data[n]) << "index " << n;
85    }
86}
87
88TEST(FileData, InitFromOther) {
89    static const char kData[] = "Hello World!";
90    ScopedFileData data1(kData, sizeof kData);
91    EXPECT_EQ(0, data1.status());
92
93    ScopedFileData data2(data1.ptr());
94    EXPECT_EQ(0, data2.status());
95
96    EXPECT_EQ(data1->size, data2->size);
97    EXPECT_NE(data1->data, data2->data);
98    for (size_t n = 0; n < data1->size; ++n) {
99        EXPECT_EQ(kData[n], data1->data[n]) << "index " << n;
100        EXPECT_EQ(kData[n], data2->data[n]) << "index " << n;
101    }
102}
103
104TEST(FileData, Swap) {
105    static const char kData[] = "Hello World!";
106    ScopedFileData data1(kData, sizeof kData);
107    EXPECT_EQ(0, data1.status());
108
109    ScopedFileData data2;
110    EXPECT_EQ(0, data2.status());
111    fileData_swap(data1.ptr(), data2.ptr());
112
113    EXPECT_TRUE(fileData_isEmpty(data1.ptr()));
114    EXPECT_FALSE(fileData_isEmpty(data2.ptr()));
115    EXPECT_EQ(sizeof kData, data2->size);
116    for (size_t n = 0; n < data2->size; ++n) {
117        EXPECT_EQ(kData[n], data2->data[n]) << "index " << n;
118    }
119}
120