Merge "[view compiler] Remove dex_builder_test.cc"
am: 63f6a62163
Change-Id: Ib73ed6f1fee41358eabe4b93fd99fe96339c205d
This commit is contained in:
@@ -77,7 +77,6 @@ cc_test_host {
|
||||
name: "view-compiler-tests",
|
||||
defaults: ["viewcompiler_defaults"],
|
||||
srcs: [
|
||||
"dex_builder_test.cc",
|
||||
"layout_validation_test.cc",
|
||||
"util_test.cc",
|
||||
],
|
||||
|
||||
@@ -1,180 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "dex_builder.h"
|
||||
|
||||
#include "dex/art_dex_file_loader.h"
|
||||
#include "dex/dex_file.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
using namespace startop::dex;
|
||||
|
||||
// Takes a DexBuilder, encodes it into an in-memory DEX file, verifies the resulting DEX file and
|
||||
// returns whether the verification was successful.
|
||||
bool EncodeAndVerify(DexBuilder* dex_file) {
|
||||
slicer::MemView image{dex_file->CreateImage()};
|
||||
|
||||
art::ArtDexFileLoader loader;
|
||||
std::string error_msg;
|
||||
std::unique_ptr<const art::DexFile> loaded_dex_file{loader.Open(image.ptr<const uint8_t>(),
|
||||
image.size(),
|
||||
/*location=*/"",
|
||||
/*location_checksum=*/0,
|
||||
/*oat_dex_file=*/nullptr,
|
||||
/*verify=*/true,
|
||||
/*verify_checksum=*/false,
|
||||
&error_msg)};
|
||||
return loaded_dex_file != nullptr;
|
||||
}
|
||||
|
||||
// Write out and verify a DEX file that corresponds to:
|
||||
//
|
||||
// package dextest;
|
||||
// public class DexTest {
|
||||
// public static void foo() {}
|
||||
// }
|
||||
TEST(DexBuilderTest, VerifyDexWithClassMethod) {
|
||||
DexBuilder dex_file;
|
||||
|
||||
auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
|
||||
|
||||
auto method{cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Void()})};
|
||||
method.BuildReturn();
|
||||
method.Encode();
|
||||
|
||||
EXPECT_TRUE(EncodeAndVerify(&dex_file));
|
||||
}
|
||||
|
||||
// Makes sure a bad DEX class fails to verify.
|
||||
TEST(DexBuilderTest, VerifyBadDexWithClassMethod) {
|
||||
DexBuilder dex_file;
|
||||
|
||||
auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
|
||||
|
||||
// This method has the error, because methods cannot take Void() as a parameter.
|
||||
auto method{
|
||||
cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Void(), TypeDescriptor::Void()})};
|
||||
method.BuildReturn();
|
||||
method.Encode();
|
||||
|
||||
EXPECT_FALSE(EncodeAndVerify(&dex_file));
|
||||
}
|
||||
|
||||
// Write out and verify a DEX file that corresponds to:
|
||||
//
|
||||
// package dextest;
|
||||
// public class DexTest {
|
||||
// public static int foo() { return 5; }
|
||||
// }
|
||||
TEST(DexBuilderTest, VerifyDexReturn5) {
|
||||
DexBuilder dex_file;
|
||||
|
||||
auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
|
||||
|
||||
auto method{cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Int()})};
|
||||
auto r = method.MakeRegister();
|
||||
method.BuildConst4(r, 5);
|
||||
method.BuildReturn(r);
|
||||
method.Encode();
|
||||
|
||||
EXPECT_TRUE(EncodeAndVerify(&dex_file));
|
||||
}
|
||||
|
||||
// Write out and verify a DEX file that corresponds to:
|
||||
//
|
||||
// package dextest;
|
||||
// public class DexTest {
|
||||
// public static int foo(int x) { return x; }
|
||||
// }
|
||||
TEST(DexBuilderTest, VerifyDexReturnIntParam) {
|
||||
DexBuilder dex_file;
|
||||
|
||||
auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
|
||||
|
||||
auto method{
|
||||
cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Int(), TypeDescriptor::Int()})};
|
||||
method.BuildReturn(Value::Parameter(0));
|
||||
method.Encode();
|
||||
|
||||
EXPECT_TRUE(EncodeAndVerify(&dex_file));
|
||||
}
|
||||
|
||||
// Write out and verify a DEX file that corresponds to:
|
||||
//
|
||||
// package dextest;
|
||||
// public class DexTest {
|
||||
// public static int foo(String s) { return s.length(); }
|
||||
// }
|
||||
TEST(DexBuilderTest, VerifyDexCallStringLength) {
|
||||
DexBuilder dex_file;
|
||||
|
||||
auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
|
||||
|
||||
MethodBuilder method{cbuilder.CreateMethod(
|
||||
"foo", Prototype{TypeDescriptor::Int(), TypeDescriptor::FromClassname("java.lang.String")})};
|
||||
|
||||
Value result = method.MakeRegister();
|
||||
|
||||
MethodDeclData string_length =
|
||||
dex_file.GetOrDeclareMethod(TypeDescriptor::FromClassname("java.lang.String"),
|
||||
"length",
|
||||
Prototype{TypeDescriptor::Int()});
|
||||
|
||||
method.AddInstruction(Instruction::InvokeVirtual(string_length.id, result, Value::Parameter(0)));
|
||||
method.BuildReturn(result);
|
||||
|
||||
method.Encode();
|
||||
|
||||
EXPECT_TRUE(EncodeAndVerify(&dex_file));
|
||||
}
|
||||
|
||||
// Write out and verify a DEX file that corresponds to:
|
||||
//
|
||||
// package dextest;
|
||||
// public class DexTest {
|
||||
// public static int foo(String s) { return s.length(); }
|
||||
// }
|
||||
TEST(DexBuilderTest, VerifyDexCallManyRegisters) {
|
||||
DexBuilder dex_file;
|
||||
|
||||
auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
|
||||
|
||||
MethodBuilder method{cbuilder.CreateMethod(
|
||||
"foo", Prototype{TypeDescriptor::Int()})};
|
||||
|
||||
Value result = method.MakeRegister();
|
||||
|
||||
// Make a bunch of registers
|
||||
for (size_t i = 0; i < 25; ++i) {
|
||||
method.MakeRegister();
|
||||
}
|
||||
|
||||
// Now load a string literal into a register
|
||||
Value string_val = method.MakeRegister();
|
||||
method.BuildConstString(string_val, "foo");
|
||||
|
||||
MethodDeclData string_length =
|
||||
dex_file.GetOrDeclareMethod(TypeDescriptor::FromClassname("java.lang.String"),
|
||||
"length",
|
||||
Prototype{TypeDescriptor::Int()});
|
||||
|
||||
method.AddInstruction(Instruction::InvokeVirtual(string_length.id, result, string_val));
|
||||
method.BuildReturn(result);
|
||||
|
||||
method.Encode();
|
||||
|
||||
EXPECT_TRUE(EncodeAndVerify(&dex_file));
|
||||
}
|
||||
Reference in New Issue
Block a user