1 /*
2  * Copyright (C) 2018 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 <memory>
18 #include <sstream>
19 #include <string>
20 #include <utility>
21 #include <vector>
22 
23 #include "TestHelpers.h"
24 #include "androidfw/ApkAssets.h"
25 #include "androidfw/Idmap.h"
26 #include "gmock/gmock.h"
27 #include "gtest/gtest.h"
28 #include "idmap2/BinaryStreamVisitor.h"
29 #include "idmap2/Idmap.h"
30 
31 using ::testing::NotNull;
32 
33 namespace android::idmap2 {
34 
TEST(BinaryStreamVisitorTests,CreateBinaryStreamViaBinaryStreamVisitor)35 TEST(BinaryStreamVisitorTests, CreateBinaryStreamViaBinaryStreamVisitor) {
36   std::string raw(reinterpret_cast<const char*>(kIdmapRawData), kIdmapRawDataLen);
37   std::istringstream raw_stream(raw);
38 
39   auto result1 = Idmap::FromBinaryStream(raw_stream);
40   ASSERT_TRUE(result1);
41   const auto idmap1 = std::move(*result1);
42 
43   std::stringstream stream;
44   BinaryStreamVisitor visitor(stream);
45   idmap1->accept(&visitor);
46 
47   auto result2 = Idmap::FromBinaryStream(stream);
48   ASSERT_TRUE(result2);
49   const auto idmap2 = std::move(*result2);
50 
51   ASSERT_EQ(idmap1->GetHeader()->GetFulfilledPolicies(),
52             idmap2->GetHeader()->GetFulfilledPolicies());
53   ASSERT_EQ(idmap1->GetHeader()->GetEnforceOverlayable(),
54             idmap2->GetHeader()->GetEnforceOverlayable());
55   ASSERT_EQ(idmap1->GetHeader()->GetTargetPath(), idmap2->GetHeader()->GetTargetPath());
56   ASSERT_EQ(idmap1->GetHeader()->GetTargetCrc(), idmap2->GetHeader()->GetTargetCrc());
57   ASSERT_EQ(idmap1->GetHeader()->GetTargetPath(), idmap2->GetHeader()->GetTargetPath());
58   ASSERT_EQ(idmap1->GetData().size(), 1U);
59   ASSERT_EQ(idmap1->GetData().size(), idmap2->GetData().size());
60 
61   const std::vector<std::unique_ptr<const IdmapData>>& data_blocks1 = idmap1->GetData();
62   ASSERT_EQ(data_blocks1.size(), 1U);
63   const std::unique_ptr<const IdmapData>& data1 = data_blocks1[0];
64   ASSERT_THAT(data1, NotNull());
65 
66   const std::vector<std::unique_ptr<const IdmapData>>& data_blocks2 = idmap2->GetData();
67   ASSERT_EQ(data_blocks2.size(), 1U);
68   const std::unique_ptr<const IdmapData>& data2 = data_blocks2[0];
69   ASSERT_THAT(data2, NotNull());
70 
71   const auto& target_entries1 = data1->GetTargetEntries();
72   const auto& target_entries2 = data2->GetTargetEntries();
73   ASSERT_EQ(target_entries1.size(), target_entries2.size());
74   ASSERT_EQ(target_entries1[0].target_id, target_entries2[0].target_id);
75   ASSERT_EQ(target_entries1[0].overlay_id, target_entries2[0].overlay_id);
76 
77   ASSERT_EQ(target_entries1[1].target_id, target_entries2[1].target_id);
78   ASSERT_EQ(target_entries1[1].overlay_id, target_entries2[1].overlay_id);
79 
80   ASSERT_EQ(target_entries1[2].target_id, target_entries2[2].target_id);
81   ASSERT_EQ(target_entries1[2].overlay_id, target_entries2[2].overlay_id);
82 
83   const auto& target_inline_entries1 = data1->GetTargetInlineEntries();
84   const auto& target_inline_entries2 = data2->GetTargetInlineEntries();
85   ASSERT_EQ(target_inline_entries1.size(), target_inline_entries2.size());
86   ASSERT_EQ(target_inline_entries1[0].target_id, target_inline_entries2[0].target_id);
87   ASSERT_EQ(target_inline_entries1[0].values.begin()->second.data_type,
88       target_inline_entries2[0].values.begin()->second.data_type);
89   ASSERT_EQ(target_inline_entries1[0].values.begin()->second.data_value,
90       target_inline_entries2[0].values.begin()->second.data_value);
91 
92   const auto& overlay_entries1 = data1->GetOverlayEntries();
93   const auto& overlay_entries2 = data2->GetOverlayEntries();
94   ASSERT_EQ(overlay_entries1.size(), overlay_entries2.size());
95   ASSERT_EQ(overlay_entries1[0].overlay_id, overlay_entries2[0].overlay_id);
96   ASSERT_EQ(overlay_entries1[0].target_id, overlay_entries2[0].target_id);
97 
98   ASSERT_EQ(overlay_entries1[1].overlay_id, overlay_entries2[1].overlay_id);
99   ASSERT_EQ(overlay_entries1[1].target_id, overlay_entries2[1].target_id);
100 
101   ASSERT_EQ(overlay_entries1[2].overlay_id, overlay_entries2[2].overlay_id);
102   ASSERT_EQ(overlay_entries1[2].target_id, overlay_entries2[2].target_id);
103 }
104 
105 }  // namespace android::idmap2
106