Home | History | Annotate | Download | only in dex
      1 /*
      2  * Copyright (C) 2011 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 "dex_file.h"
     18 
     19 #include <memory>
     20 
     21 #include "base64_test_util.h"
     22 #include "code_item_accessors-inl.h"
     23 #include "descriptors_names.h"
     24 #include "dex_file-inl.h"
     25 #include "dex_file_loader.h"
     26 #include "gtest/gtest.h"
     27 
     28 namespace art {
     29 
     30 class DexFileLoaderTest : public testing::Test {};
     31 
     32 static constexpr char kLocationString[] = "/a/dex/file/location";
     33 
     34 static inline std::vector<uint8_t> DecodeBase64Vec(const char* src) {
     35   std::vector<uint8_t> res;
     36   size_t size;
     37   std::unique_ptr<uint8_t[]> data(DecodeBase64(src, &size));
     38   res.resize(size);
     39   memcpy(res.data(), data.get(), size);
     40   return res;
     41 }
     42 
     43 // Although this is the same content logically as the Nested test dex,
     44 // the DexFileHeader test is sensitive to subtle changes in the
     45 // contents due to the checksum etc, so we embed the exact input here.
     46 //
     47 // class Nested {
     48 //     class Inner {
     49 //     }
     50 // }
     51 static const char kRawDex[] =
     52   "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
     53   "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
     54   "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
     55   "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
     56   "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
     57   "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
     58   "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
     59   "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
     60   "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
     61   "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
     62   "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
     63   "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
     64   "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
     65   "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
     66   "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
     67   "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
     68 
     69 // kRawDex{38,39,40,41} are dex'ed versions of the following Java source :
     70 //
     71 // public class Main {
     72 //     public static void main(String[] foo) {
     73 //     }
     74 // }
     75 //
     76 // The dex file was manually edited to change its dex version code to 38
     77 // or 39, respectively.
     78 static const char kRawDex38[] =
     79   "ZGV4CjAzOAC4OovJlJ1089ikzK6asMf/f8qp3Kve5VsgAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAI"
     80   "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAwAQAA8AAAACIB"
     81   "AAAqAQAAMgEAAEYBAABRAQAAVAEAAFgBAABtAQAAAQAAAAIAAAAEAAAABgAAAAQAAAACAAAAAAAA"
     82   "AAUAAAACAAAAHAEAAAAAAAAAAAAAAAABAAcAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAADAAAA"
     83   "AAAAAH4BAAAAAAAAAQABAAEAAABzAQAABAAAAHAQAgAAAA4AAQABAAAAAAB4AQAAAQAAAA4AAAAB"
     84   "AAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJW"
     85   "TAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEbWFpbgABAAcOAAMBAAcOAAAAAgAAgYAE8AEBCYgCDAAA"
     86   "AAAAAAABAAAAAAAAAAEAAAAIAAAAcAAAAAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAA"
     87   "uAAAAAYAAAABAAAA0AAAAAEgAAACAAAA8AAAAAEQAAABAAAAHAEAAAIgAAAIAAAAIgEAAAMgAAAC"
     88   "AAAAcwEAAAAgAAABAAAAfgEAAAAQAAABAAAAjAEAAA==";
     89 
     90 static const char kRawDex39[] =
     91   "ZGV4CjAzOQC4OovJlJ1089ikzK6asMf/f8qp3Kve5VsgAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAI"
     92   "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAwAQAA8AAAACIB"
     93   "AAAqAQAAMgEAAEYBAABRAQAAVAEAAFgBAABtAQAAAQAAAAIAAAAEAAAABgAAAAQAAAACAAAAAAAA"
     94   "AAUAAAACAAAAHAEAAAAAAAAAAAAAAAABAAcAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAADAAAA"
     95   "AAAAAH4BAAAAAAAAAQABAAEAAABzAQAABAAAAHAQAgAAAA4AAQABAAAAAAB4AQAAAQAAAA4AAAAB"
     96   "AAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJW"
     97   "TAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEbWFpbgABAAcOAAMBAAcOAAAAAgAAgYAE8AEBCYgCDAAA"
     98   "AAAAAAABAAAAAAAAAAEAAAAIAAAAcAAAAAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAA"
     99   "uAAAAAYAAAABAAAA0AAAAAEgAAACAAAA8AAAAAEQAAABAAAAHAEAAAIgAAAIAAAAIgEAAAMgAAAC"
    100   "AAAAcwEAAAAgAAABAAAAfgEAAAAQAAABAAAAjAEAAA==";
    101 
    102 static const char kRawDex40[] =
    103   "ZGV4CjA0MAC4OovJlJ1089ikzK6asMf/f8qp3Kve5VsgAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAI"
    104   "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAwAQAA8AAAACIB"
    105   "AAAqAQAAMgEAAEYBAABRAQAAVAEAAFgBAABtAQAAAQAAAAIAAAAEAAAABgAAAAQAAAACAAAAAAAA"
    106   "AAUAAAACAAAAHAEAAAAAAAAAAAAAAAABAAcAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAADAAAA"
    107   "AAAAAH4BAAAAAAAAAQABAAEAAABzAQAABAAAAHAQAgAAAA4AAQABAAAAAAB4AQAAAQAAAA4AAAAB"
    108   "AAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJW"
    109   "TAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEbWFpbgABAAcOAAMBAAcOAAAAAgAAgYAE8AEBCYgCDAAA"
    110   "AAAAAAABAAAAAAAAAAEAAAAIAAAAcAAAAAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAA"
    111   "uAAAAAYAAAABAAAA0AAAAAEgAAACAAAA8AAAAAEQAAABAAAAHAEAAAIgAAAIAAAAIgEAAAMgAAAC"
    112   "AAAAcwEAAAAgAAABAAAAfgEAAAAQAAABAAAAjAEAAA==";
    113 
    114 static const char kRawDex41[] =
    115   "ZGV4CjA0MQC4OovJlJ1089ikzK6asMf/f8qp3Kve5VsgAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAI"
    116   "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAwAQAA8AAAACIB"
    117   "AAAqAQAAMgEAAEYBAABRAQAAVAEAAFgBAABtAQAAAQAAAAIAAAAEAAAABgAAAAQAAAACAAAAAAAA"
    118   "AAUAAAACAAAAHAEAAAAAAAAAAAAAAAABAAcAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAADAAAA"
    119   "AAAAAH4BAAAAAAAAAQABAAEAAABzAQAABAAAAHAQAgAAAA4AAQABAAAAAAB4AQAAAQAAAA4AAAAB"
    120   "AAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJW"
    121   "TAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEbWFpbgABAAcOAAMBAAcOAAAAAgAAgYAE8AEBCYgCDAAA"
    122   "AAAAAAABAAAAAAAAAAEAAAAIAAAAcAAAAAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAA"
    123   "uAAAAAYAAAABAAAA0AAAAAEgAAACAAAA8AAAAAEQAAABAAAAHAEAAAIgAAAIAAAAIgEAAAMgAAAC"
    124   "AAAAcwEAAAAgAAABAAAAfgEAAAAQAAABAAAAjAEAAA==";
    125 
    126 static const char kRawDexZeroLength[] =
    127   "UEsDBAoAAAAAAOhxAkkAAAAAAAAAAAAAAAALABwAY2xhc3Nlcy5kZXhVVAkAA2QNoVdnDaFXdXgL"
    128   "AAEE5AMBAASIEwAAUEsBAh4DCgAAAAAA6HECSQAAAAAAAAAAAAAAAAsAGAAAAAAAAAAAAKCBAAAA"
    129   "AGNsYXNzZXMuZGV4VVQFAANkDaFXdXgLAAEE5AMBAASIEwAAUEsFBgAAAAABAAEAUQAAAEUAAAAA"
    130   "AA==";
    131 
    132 static const char kRawZipClassesDexPresent[] =
    133   "UEsDBBQAAAAIANVRN0ms99lIMQEAACACAAALABwAY2xhc3Nlcy5kZXhVVAkAAwFj5VcUY+VXdXgL"
    134   "AAEE5AMBAASIEwAAS0mt4DIwtmDYYdV9csrcks83lpxZN2vD8f/1p1beWX3vabQCEwNDAQMDQ0WY"
    135   "iRADFPQwMjBwMEDEWYB4AhADlTEsYEAAZiDeAcRApQwXgNgAyPgApJWAtBYQGwGxGxAHAnEIEEcA"
    136   "cS4jRD0T1Fw2KM0ENZMVypZhRLIIqIMdag9CBMFnhtJ1jDA5RrBcMSPE7AIBkIl8UFGgP6Fu4IOa"
    137   "wczAZpOZl1lix8Dm45uYmWfNIOSTlViWqJ+TmJeu75+UlZpcYs3ACZLSA4kzMIYxMIX5MAhHIykL"
    138   "LinKzEu3ZmDJBSoDOZiPgRlMgv3T2MDygZGRs4OJB8n9MBoWzrAwmQD1Eyy8WZHCmg0pvBkVIGpA"
    139   "Yc4oABEHhRuTAsRMUDwwQ9WAwoJBAaIGHE5Q9aB4BgBQSwECHgMUAAAACADVUTdJrPfZSDEBAAAg"
    140   "AgAACwAYAAAAAAAAAAAAoIEAAAAAY2xhc3Nlcy5kZXhVVAUAAwFj5Vd1eAsAAQTkAwEABIgTAABQ"
    141   "SwUGAAAAAAEAAQBRAAAAdgEAAAAA";
    142 
    143 static const char kRawZipClassesDexAbsent[] =
    144   "UEsDBBQAAAAIANVRN0ms99lIMQEAACACAAAOABwAbm90Y2xhc3Nlcy5kZXhVVAkAAwFj5VcUY+VX"
    145   "dXgLAAEE5AMBAASIEwAAS0mt4DIwtmDYYdV9csrcks83lpxZN2vD8f/1p1beWX3vabQCEwNDAQMD"
    146   "Q0WYiRADFPQwMjBwMEDEWYB4AhADlTEsYEAAZiDeAcRApQwXgNgAyPgApJWAtBYQGwGxGxAHAnEI"
    147   "EEcAcS4jRD0T1Fw2KM0ENZMVypZhRLIIqIMdag9CBMFnhtJ1jDA5RrBcMSPE7AIBkIl8UFGgP6Fu"
    148   "4IOawczAZpOZl1lix8Dm45uYmWfNIOSTlViWqJ+TmJeu75+UlZpcYs3ACZLSA4kzMIYxMIX5MAhH"
    149   "IykLLinKzEu3ZmDJBSoDOZiPgRlMgv3T2MDygZGRs4OJB8n9MBoWzrAwmQD1Eyy8WZHCmg0pvBkV"
    150   "IGpAYc4oABEHhRuTAsRMUDwwQ9WAwoJBAaIGHE5Q9aB4BgBQSwECHgMUAAAACADVUTdJrPfZSDEB"
    151   "AAAgAgAADgAYAAAAAAAAAAAAoIEAAAAAbm90Y2xhc3Nlcy5kZXhVVAUAAwFj5Vd1eAsAAQTkAwEA"
    152   "BIgTAABQSwUGAAAAAAEAAQBUAAAAeQEAAAAA";
    153 
    154 static const char kRawZipThreeDexFiles[] =
    155   "UEsDBBQAAAAIAP1WN0ms99lIMQEAACACAAAMABwAY2xhc3NlczIuZGV4VVQJAAOtbOVXrWzlV3V4"
    156   "CwABBOQDAQAEiBMAAEtJreAyMLZg2GHVfXLK3JLPN5acWTdrw/H/9adW3ll972m0AhMDQwEDA0NF"
    157   "mIkQAxT0MDIwcDBAxFmAeAIQA5UxLGBAAGYg3gHEQKUMF4DYAMj4AKSVgLQWEBsBsRsQBwJxCBBH"
    158   "AHEuI0Q9E9RcNijNBDWTFcqWYUSyCKiDHWoPQgTBZ4bSdYwwOUawXDEjxOwCAZCJfFBRoD+hbuCD"
    159   "msHMwGaTmZdZYsfA5uObmJlnzSDkk5VYlqifk5iXru+flJWaXGLNwAmS0gOJMzCGMTCF+TAIRyMp"
    160   "Cy4pysxLt2ZgyQUqAzmYj4EZTIL909jA8oGRkbODiQfJ/TAaFs6wMJkA9RMsvFmRwpoNKbwZFSBq"
    161   "QGHOKAARB4UbkwLETFA8MEPVgMKCQQGiBhxOUPWgeAYAUEsDBBQAAAAIAABXN0ms99lIMQEAACAC"
    162   "AAAMABwAY2xhc3NlczMuZGV4VVQJAAOvbOVXr2zlV3V4CwABBOQDAQAEiBMAAEtJreAyMLZg2GHV"
    163   "fXLK3JLPN5acWTdrw/H/9adW3ll972m0AhMDQwEDA0NFmIkQAxT0MDIwcDBAxFmAeAIQA5UxLGBA"
    164   "AGYg3gHEQKUMF4DYAMj4AKSVgLQWEBsBsRsQBwJxCBBHAHEuI0Q9E9RcNijNBDWTFcqWYUSyCKiD"
    165   "HWoPQgTBZ4bSdYwwOUawXDEjxOwCAZCJfFBRoD+hbuCDmsHMwGaTmZdZYsfA5uObmJlnzSDkk5VY"
    166   "lqifk5iXru+flJWaXGLNwAmS0gOJMzCGMTCF+TAIRyMpCy4pysxLt2ZgyQUqAzmYj4EZTIL909jA"
    167   "8oGRkbODiQfJ/TAaFs6wMJkA9RMsvFmRwpoNKbwZFSBqQGHOKAARB4UbkwLETFA8MEPVgMKCQQGi"
    168   "BhxOUPWgeAYAUEsDBBQAAAAIANVRN0ms99lIMQEAACACAAALABwAY2xhc3Nlcy5kZXhVVAkAAwFj"
    169   "5VetbOVXdXgLAAEE5AMBAASIEwAAS0mt4DIwtmDYYdV9csrcks83lpxZN2vD8f/1p1beWX3vabQC"
    170   "EwNDAQMDQ0WYiRADFPQwMjBwMEDEWYB4AhADlTEsYEAAZiDeAcRApQwXgNgAyPgApJWAtBYQGwGx"
    171   "GxAHAnEIEEcAcS4jRD0T1Fw2KM0ENZMVypZhRLIIqIMdag9CBMFnhtJ1jDA5RrBcMSPE7AIBkIl8"
    172   "UFGgP6Fu4IOawczAZpOZl1lix8Dm45uYmWfNIOSTlViWqJ+TmJeu75+UlZpcYs3ACZLSA4kzMIYx"
    173   "MIX5MAhHIykLLinKzEu3ZmDJBSoDOZiPgRlMgv3T2MDygZGRs4OJB8n9MBoWzrAwmQD1Eyy8WZHC"
    174   "mg0pvBkVIGpAYc4oABEHhRuTAsRMUDwwQ9WAwoJBAaIGHE5Q9aB4BgBQSwECHgMUAAAACAD9VjdJ"
    175   "rPfZSDEBAAAgAgAADAAYAAAAAAAAAAAAoIEAAAAAY2xhc3NlczIuZGV4VVQFAAOtbOVXdXgLAAEE"
    176   "5AMBAASIEwAAUEsBAh4DFAAAAAgAAFc3Saz32UgxAQAAIAIAAAwAGAAAAAAAAAAAAKCBdwEAAGNs"
    177   "YXNzZXMzLmRleFVUBQADr2zlV3V4CwABBOQDAQAEiBMAAFBLAQIeAxQAAAAIANVRN0ms99lIMQEA"
    178   "ACACAAALABgAAAAAAAAAAACgge4CAABjbGFzc2VzLmRleFVUBQADAWPlV3V4CwABBOQDAQAEiBMA"
    179   "AFBLBQYAAAAAAwADAPUAAABkBAAAAAA=";
    180 
    181 static const char kRawDexBadMapOffset[] =
    182   "ZGV4CjAzNQAZKGSz85r+tXJ1I24FYi+FpQtWbXtelAmoAQAAcAAAAHhWNBIAAAAAAAAAAEAwIBAF"
    183   "AAAAcAAAAAMAAACEAAAAAQAAAJAAAAAAAAAAAAAAAAIAAACcAAAAAQAAAKwAAADcAAAAzAAAAOQA"
    184   "AADsAAAA9AAAAPkAAAANAQAAAgAAAAMAAAAEAAAABAAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAA"
    185   "AAAAAAABAAAAAQAAAAAAAAABAAAAAAAAABUBAAAAAAAAAQABAAEAAAAQAQAABAAAAHAQAQAAAA4A"
    186   "Bjxpbml0PgAGQS5qYXZhAANMQTsAEkxqYXZhL2xhbmcvT2JqZWN0OwABVgABAAcOAAAAAQAAgYAE"
    187   "zAEACwAAAAAAAAABAAAAAAAAAAEAAAAFAAAAcAAAAAIAAAADAAAAhAAAAAMAAAABAAAAkAAAAAUA"
    188   "AAACAAAAnAAAAAYAAAABAAAArAAAAAEgAAABAAAAzAAAAAIgAAAFAAAA5AAAAAMgAAABAAAAEAEA"
    189   "AAAgAAABAAAAFQEAAAAQAAABAAAAIAEAAA==";
    190 
    191 static const char kRawDexDebugInfoLocalNullType[] =
    192     "ZGV4CjAzNQA+Kwj2g6OZMH88OvK9Ey6ycdIsFCt18ED8AQAAcAAAAHhWNBIAAAAAAAAAAHQBAAAI"
    193     "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAMAQAA8AAAABwB"
    194     "AAAkAQAALAEAAC8BAAA0AQAASAEAAEsBAABOAQAAAgAAAAMAAAAEAAAABQAAAAIAAAAAAAAAAAAA"
    195     "AAUAAAADAAAAAAAAAAEAAQAAAAAAAQAAAAYAAAACAAEAAAAAAAEAAAABAAAAAgAAAAAAAAABAAAA"
    196     "AAAAAGMBAAAAAAAAAQABAAEAAABUAQAABAAAAHAQAgAAAA4AAgABAAAAAABZAQAAAgAAABIQDwAG"
    197     "PGluaXQ+AAZBLmphdmEAAUkAA0xBOwASTGphdmEvbGFuZy9PYmplY3Q7AAFWAAFhAAR0aGlzAAEA"
    198     "Bw4AAwAHDh4DAAcAAAAAAQEAgYAE8AEBAIgCAAAACwAAAAAAAAABAAAAAAAAAAEAAAAIAAAAcAAA"
    199     "AAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAAuAAAAAYAAAABAAAA0AAAAAEgAAACAAAA"
    200     "8AAAAAIgAAAIAAAAHAEAAAMgAAACAAAAVAEAAAAgAAABAAAAYwEAAAAQAAABAAAAdAEAAA==";
    201 
    202 static void DecodeDexFile(const char* base64, std::vector<uint8_t>* dex_bytes) {
    203   // decode base64
    204   CHECK(base64 != nullptr);
    205   *dex_bytes = DecodeBase64Vec(base64);
    206   CHECK_NE(dex_bytes->size(), 0u);
    207 }
    208 
    209 static bool OpenDexFilesBase64(const char* base64,
    210                                const char* location,
    211                                std::vector<uint8_t>* dex_bytes,
    212                                std::vector<std::unique_ptr<const DexFile>>* dex_files,
    213                                std::string* error_msg) {
    214   DecodeDexFile(base64, dex_bytes);
    215 
    216   // read dex file(s)
    217   static constexpr bool kVerifyChecksum = true;
    218   std::vector<std::unique_ptr<const DexFile>> tmp;
    219   const DexFileLoader dex_file_loader;
    220   bool success = dex_file_loader.OpenAll(dex_bytes->data(),
    221                                          dex_bytes->size(),
    222                                          location,
    223                                          /* verify */ true,
    224                                          kVerifyChecksum,
    225                                          error_msg,
    226                                          dex_files);
    227   return success;
    228 }
    229 
    230 static std::unique_ptr<const DexFile> OpenDexFileBase64(const char* base64,
    231                                                         const char* location,
    232                                                         std::vector<uint8_t>* dex_bytes) {
    233   // read dex files.
    234   std::string error_msg;
    235   std::vector<std::unique_ptr<const DexFile>> dex_files;
    236   bool success = OpenDexFilesBase64(base64, location, dex_bytes, &dex_files, &error_msg);
    237   CHECK(success) << error_msg;
    238   EXPECT_EQ(1U, dex_files.size());
    239   return std::move(dex_files[0]);
    240 }
    241 
    242 static std::unique_ptr<const DexFile> OpenDexFileInMemoryBase64(const char* base64,
    243                                                                 const char* location,
    244                                                                 uint32_t location_checksum,
    245                                                                 bool expect_success,
    246                                                                 std::vector<uint8_t>* dex_bytes) {
    247   DecodeDexFile(base64, dex_bytes);
    248 
    249   std::string error_message;
    250   const DexFileLoader dex_file_loader;
    251   std::unique_ptr<const DexFile> dex_file(dex_file_loader.Open(dex_bytes->data(),
    252                                                                dex_bytes->size(),
    253                                                                location,
    254                                                                location_checksum,
    255                                                                /* oat_dex_file */ nullptr,
    256                                                                /* verify */ true,
    257                                                                /* verify_checksum */ true,
    258                                                                &error_message));
    259   if (expect_success) {
    260     CHECK(dex_file != nullptr) << error_message;
    261   } else {
    262     CHECK(dex_file == nullptr) << "Expected dex file open to fail.";
    263   }
    264   return dex_file;
    265 }
    266 
    267 static void ValidateDexFileHeader(std::unique_ptr<const DexFile> dex_file) {
    268   static const uint8_t kExpectedDexFileMagic[8] = {
    269     /* d */ 0x64, /* e */ 0x64, /* x */ 0x78, /* \n */ 0x0d,
    270     /* 0 */ 0x30, /* 3 */ 0x33, /* 5 */ 0x35, /* \0 */ 0x00
    271   };
    272   static const uint8_t kExpectedSha1[DexFile::kSha1DigestSize] = {
    273     0x7b, 0xb8, 0x0c, 0xd4, 0x1f, 0xd6, 0x1e, 0xc5,
    274     0x89, 0xe8, 0xbe, 0xe5, 0x18, 0x02, 0x12, 0x18,
    275     0x2e, 0xf2, 0x8c, 0x3d,
    276   };
    277 
    278   const DexFile::Header& header = dex_file->GetHeader();
    279   EXPECT_EQ(*kExpectedDexFileMagic, *header.magic_);
    280   EXPECT_EQ(0x00d87910U, header.checksum_);
    281   EXPECT_EQ(*kExpectedSha1, *header.signature_);
    282   EXPECT_EQ(904U, header.file_size_);
    283   EXPECT_EQ(112U, header.header_size_);
    284   EXPECT_EQ(0U, header.link_size_);
    285   EXPECT_EQ(0U, header.link_off_);
    286   EXPECT_EQ(15U, header.string_ids_size_);
    287   EXPECT_EQ(112U, header.string_ids_off_);
    288   EXPECT_EQ(7U, header.type_ids_size_);
    289   EXPECT_EQ(172U, header.type_ids_off_);
    290   EXPECT_EQ(2U, header.proto_ids_size_);
    291   EXPECT_EQ(200U, header.proto_ids_off_);
    292   EXPECT_EQ(1U, header.field_ids_size_);
    293   EXPECT_EQ(224U, header.field_ids_off_);
    294   EXPECT_EQ(3U, header.method_ids_size_);
    295   EXPECT_EQ(232U, header.method_ids_off_);
    296   EXPECT_EQ(2U, header.class_defs_size_);
    297   EXPECT_EQ(256U, header.class_defs_off_);
    298   EXPECT_EQ(584U, header.data_size_);
    299   EXPECT_EQ(320U, header.data_off_);
    300 
    301   EXPECT_EQ(header.checksum_, dex_file->GetLocationChecksum());
    302 }
    303 
    304 TEST_F(DexFileLoaderTest, Header) {
    305   std::vector<uint8_t> dex_bytes;
    306   std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex, kLocationString, &dex_bytes));
    307   ValidateDexFileHeader(std::move(raw));
    308 }
    309 
    310 TEST_F(DexFileLoaderTest, HeaderInMemory) {
    311   std::vector<uint8_t> dex_bytes;
    312   std::unique_ptr<const DexFile> raw =
    313       OpenDexFileInMemoryBase64(kRawDex, kLocationString, 0x00d87910U, true, &dex_bytes);
    314   ValidateDexFileHeader(std::move(raw));
    315 }
    316 
    317 TEST_F(DexFileLoaderTest, Version38Accepted) {
    318   std::vector<uint8_t> dex_bytes;
    319   std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex38, kLocationString, &dex_bytes));
    320   ASSERT_TRUE(raw.get() != nullptr);
    321 
    322   const DexFile::Header& header = raw->GetHeader();
    323   EXPECT_EQ(38u, header.GetVersion());
    324 }
    325 
    326 TEST_F(DexFileLoaderTest, Version39Accepted) {
    327   std::vector<uint8_t> dex_bytes;
    328   std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex39, kLocationString, &dex_bytes));
    329   ASSERT_TRUE(raw.get() != nullptr);
    330 
    331   const DexFile::Header& header = raw->GetHeader();
    332   EXPECT_EQ(39u, header.GetVersion());
    333 }
    334 
    335 TEST_F(DexFileLoaderTest, Version40Rejected) {
    336   std::vector<uint8_t> dex_bytes;
    337   DecodeDexFile(kRawDex40, &dex_bytes);
    338 
    339   static constexpr bool kVerifyChecksum = true;
    340   std::string error_msg;
    341   std::vector<std::unique_ptr<const DexFile>> dex_files;
    342   const DexFileLoader dex_file_loader;
    343   ASSERT_FALSE(dex_file_loader.OpenAll(dex_bytes.data(),
    344                                        dex_bytes.size(),
    345                                        kLocationString,
    346                                        /* verify */ true,
    347                                        kVerifyChecksum,
    348                                        &error_msg,
    349                                        &dex_files));
    350 }
    351 
    352 TEST_F(DexFileLoaderTest, Version41Rejected) {
    353   std::vector<uint8_t> dex_bytes;
    354   DecodeDexFile(kRawDex41, &dex_bytes);
    355 
    356   static constexpr bool kVerifyChecksum = true;
    357   std::string error_msg;
    358   std::vector<std::unique_ptr<const DexFile>> dex_files;
    359   const DexFileLoader dex_file_loader;
    360   ASSERT_FALSE(dex_file_loader.OpenAll(dex_bytes.data(),
    361                                        dex_bytes.size(),
    362                                        kLocationString,
    363                                        /* verify */ true,
    364                                        kVerifyChecksum,
    365                                        &error_msg,
    366                                        &dex_files));
    367 }
    368 
    369 TEST_F(DexFileLoaderTest, ZeroLengthDexRejected) {
    370   std::vector<uint8_t> dex_bytes;
    371   DecodeDexFile(kRawDexZeroLength, &dex_bytes);
    372 
    373   static constexpr bool kVerifyChecksum = true;
    374   std::string error_msg;
    375   std::vector<std::unique_ptr<const DexFile>> dex_files;
    376   const DexFileLoader dex_file_loader;
    377   ASSERT_FALSE(dex_file_loader.OpenAll(dex_bytes.data(),
    378                                        dex_bytes.size(),
    379                                        kLocationString,
    380                                        /* verify */ true,
    381                                        kVerifyChecksum,
    382                                        &error_msg,
    383                                        &dex_files));
    384 }
    385 
    386 TEST_F(DexFileLoaderTest, GetMultiDexClassesDexName) {
    387   ASSERT_EQ("classes.dex", DexFileLoader::GetMultiDexClassesDexName(0));
    388   ASSERT_EQ("classes2.dex", DexFileLoader::GetMultiDexClassesDexName(1));
    389   ASSERT_EQ("classes3.dex", DexFileLoader::GetMultiDexClassesDexName(2));
    390   ASSERT_EQ("classes100.dex", DexFileLoader::GetMultiDexClassesDexName(99));
    391 }
    392 
    393 TEST_F(DexFileLoaderTest, GetMultiDexLocation) {
    394   std::string dex_location_str = "/system/app/framework.jar";
    395   const char* dex_location = dex_location_str.c_str();
    396   ASSERT_EQ("/system/app/framework.jar", DexFileLoader::GetMultiDexLocation(0, dex_location));
    397   ASSERT_EQ("/system/app/framework.jar!classes2.dex",
    398             DexFileLoader::GetMultiDexLocation(1, dex_location));
    399   ASSERT_EQ("/system/app/framework.jar!classes101.dex",
    400             DexFileLoader::GetMultiDexLocation(100, dex_location));
    401 }
    402 
    403 TEST(DexFileUtilsTest, GetBaseLocationAndMultiDexSuffix) {
    404   EXPECT_EQ("/foo/bar/baz.jar", DexFileLoader::GetBaseLocation("/foo/bar/baz.jar"));
    405   EXPECT_EQ("/foo/bar/baz.jar", DexFileLoader::GetBaseLocation("/foo/bar/baz.jar!classes2.dex"));
    406   EXPECT_EQ("/foo/bar/baz.jar", DexFileLoader::GetBaseLocation("/foo/bar/baz.jar!classes8.dex"));
    407   EXPECT_EQ("", DexFileLoader::GetMultiDexSuffix("/foo/bar/baz.jar"));
    408   EXPECT_EQ("!classes2.dex", DexFileLoader::GetMultiDexSuffix("/foo/bar/baz.jar!classes2.dex"));
    409   EXPECT_EQ("!classes8.dex", DexFileLoader::GetMultiDexSuffix("/foo/bar/baz.jar!classes8.dex"));
    410 }
    411 
    412 TEST_F(DexFileLoaderTest, ZipOpenClassesPresent) {
    413   std::vector<uint8_t> dex_bytes;
    414   std::vector<std::unique_ptr<const DexFile>> dex_files;
    415   std::string error_msg;
    416   ASSERT_TRUE(OpenDexFilesBase64(kRawZipClassesDexPresent,
    417                                  kLocationString,
    418                                  &dex_bytes,
    419                                  &dex_files,
    420                                  &error_msg));
    421   EXPECT_EQ(dex_files.size(), 1u);
    422 }
    423 
    424 TEST_F(DexFileLoaderTest, ZipOpenClassesAbsent) {
    425   std::vector<uint8_t> dex_bytes;
    426   std::vector<std::unique_ptr<const DexFile>> dex_files;
    427   std::string error_msg;
    428   ASSERT_FALSE(OpenDexFilesBase64(kRawZipClassesDexAbsent,
    429                                   kLocationString,
    430                                   &dex_bytes,
    431                                   &dex_files,
    432                                   &error_msg));
    433   EXPECT_EQ(dex_files.size(), 0u);
    434 }
    435 
    436 TEST_F(DexFileLoaderTest, ZipOpenThreeDexFiles) {
    437   std::vector<uint8_t> dex_bytes;
    438   std::vector<std::unique_ptr<const DexFile>> dex_files;
    439   std::string error_msg;
    440   ASSERT_TRUE(OpenDexFilesBase64(kRawZipThreeDexFiles,
    441                                  kLocationString,
    442                                  &dex_bytes,
    443                                  &dex_files,
    444                                  &error_msg));
    445   EXPECT_EQ(dex_files.size(), 3u);
    446 }
    447 
    448 TEST_F(DexFileLoaderTest, OpenDexBadMapOffset) {
    449   std::vector<uint8_t> dex_bytes;
    450   std::unique_ptr<const DexFile> raw =
    451       OpenDexFileInMemoryBase64(kRawDexBadMapOffset,
    452                                 kLocationString,
    453                                 0xb3642819U,
    454                                 false,
    455                                 &dex_bytes);
    456   EXPECT_EQ(raw, nullptr);
    457 }
    458 
    459 TEST_F(DexFileLoaderTest, GetStringWithNoIndex) {
    460   std::vector<uint8_t> dex_bytes;
    461   std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex, kLocationString, &dex_bytes));
    462   dex::TypeIndex idx;
    463   EXPECT_EQ(raw->StringByTypeIdx(idx), nullptr);
    464 }
    465 
    466 static void Callback(void* context ATTRIBUTE_UNUSED,
    467                      const DexFile::LocalInfo& entry ATTRIBUTE_UNUSED) {
    468 }
    469 
    470 TEST_F(DexFileLoaderTest, OpenDexDebugInfoLocalNullType) {
    471   std::vector<uint8_t> dex_bytes;
    472   std::unique_ptr<const DexFile> raw = OpenDexFileInMemoryBase64(kRawDexDebugInfoLocalNullType,
    473                                                                  kLocationString,
    474                                                                  0xf25f2b38U,
    475                                                                  true,
    476                                                                  &dex_bytes);
    477   const DexFile::ClassDef& class_def = raw->GetClassDef(0);
    478   constexpr uint32_t kMethodIdx = 1;
    479   const DexFile::CodeItem* code_item = raw->GetCodeItem(raw->FindCodeItemOffset(class_def,
    480                                                                                 kMethodIdx));
    481   CodeItemDebugInfoAccessor accessor(*raw, code_item, kMethodIdx);
    482   ASSERT_TRUE(accessor.DecodeDebugLocalInfo(true, 1, Callback, nullptr));
    483 }
    484 
    485 }  // namespace art
    486