Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2014 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 <androidfw/ResourceTypes.h>
     18 #include <androidfw/TypeWrappers.h>
     19 #include <utils/String8.h>
     20 
     21 #include <gtest/gtest.h>
     22 
     23 namespace android {
     24 
     25 void* createTypeData() {
     26     ResTable_type t;
     27     memset(&t, 0, sizeof(t));
     28     t.header.type = RES_TABLE_TYPE_TYPE;
     29     t.header.headerSize = sizeof(t);
     30     t.id = 1;
     31     t.entryCount = 3;
     32 
     33     uint32_t offsets[3];
     34     t.entriesStart = t.header.headerSize + sizeof(offsets);
     35     t.header.size = t.entriesStart;
     36 
     37     offsets[0] = 0;
     38     ResTable_entry e1;
     39     memset(&e1, 0, sizeof(e1));
     40     e1.size = sizeof(e1);
     41     e1.key.index = 0;
     42     t.header.size += sizeof(e1);
     43 
     44     Res_value v1;
     45     memset(&v1, 0, sizeof(v1));
     46     t.header.size += sizeof(v1);
     47 
     48     offsets[1] = ResTable_type::NO_ENTRY;
     49 
     50     offsets[2] = sizeof(e1) + sizeof(v1);
     51     ResTable_entry e2;
     52     memset(&e2, 0, sizeof(e2));
     53     e2.size = sizeof(e2);
     54     e2.key.index = 1;
     55     t.header.size += sizeof(e2);
     56 
     57     Res_value v2;
     58     memset(&v2, 0, sizeof(v2));
     59     t.header.size += sizeof(v2);
     60 
     61     uint8_t* data = (uint8_t*)malloc(t.header.size);
     62     uint8_t* p = data;
     63     memcpy(p, &t, sizeof(t));
     64     p += sizeof(t);
     65     memcpy(p, offsets, sizeof(offsets));
     66     p += sizeof(offsets);
     67     memcpy(p, &e1, sizeof(e1));
     68     p += sizeof(e1);
     69     memcpy(p, &v1, sizeof(v1));
     70     p += sizeof(v1);
     71     memcpy(p, &e2, sizeof(e2));
     72     p += sizeof(e2);
     73     memcpy(p, &v2, sizeof(v2));
     74     p += sizeof(v2);
     75     return data;
     76 }
     77 
     78 TEST(TypeVariantIteratorTest, shouldIterateOverTypeWithoutErrors) {
     79     ResTable_type* data = (ResTable_type*) createTypeData();
     80 
     81     TypeVariant v(data);
     82 
     83     TypeVariant::iterator iter = v.beginEntries();
     84     ASSERT_EQ(uint32_t(0), iter.index());
     85     ASSERT_TRUE(NULL != *iter);
     86     ASSERT_EQ(uint32_t(0), iter->key.index);
     87     ASSERT_NE(v.endEntries(), iter);
     88 
     89     iter++;
     90 
     91     ASSERT_EQ(uint32_t(1), iter.index());
     92     ASSERT_TRUE(NULL == *iter);
     93     ASSERT_NE(v.endEntries(), iter);
     94 
     95     iter++;
     96 
     97     ASSERT_EQ(uint32_t(2), iter.index());
     98     ASSERT_TRUE(NULL != *iter);
     99     ASSERT_EQ(uint32_t(1), iter->key.index);
    100     ASSERT_NE(v.endEntries(), iter);
    101 
    102     iter++;
    103 
    104     ASSERT_EQ(v.endEntries(), iter);
    105 
    106     free(data);
    107 }
    108 
    109 } // namespace android
    110