// Copyright 2021 Code Intelligence GmbH // // 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 "jvm_tooling.h" #include #include "gtest/gtest.h" #include "tools/cpp/runfiles/runfiles.h" #ifdef _WIN32 #define ARG_SEPARATOR ";" #else #define ARG_SEPARATOR ":" #endif namespace jazzer { class JvmToolingTest : public ::testing::Test { protected: // After DestroyJavaVM() no new JVM instance can be created in the same // process, so we set up a single JVM instance for this test binary which gets // destroyed after all tests in this test suite have finished. static void SetUpTestCase() { FLAGS_jvm_args = "-Denv1=va\\" ARG_SEPARATOR "l1\\\\" ARG_SEPARATOR "-Denv2=val2"; using ::bazel::tools::cpp::runfiles::Runfiles; std::unique_ptr runfiles(Runfiles::CreateForTest()); FLAGS_cp = runfiles->Rlocation( "jazzer/launcher/testdata/fuzz_target_mocks_deploy.jar"); jvm_ = std::unique_ptr(new JVM()); } static void TearDownTestCase() { jvm_.reset(nullptr); } static std::unique_ptr jvm_; }; std::unique_ptr JvmToolingTest::jvm_ = nullptr; TEST_F(JvmToolingTest, JniProperties) { auto &env = jvm_->GetEnv(); auto property_printer_class = env.FindClass("test/PropertyPrinter"); ASSERT_NE(nullptr, property_printer_class); auto method_id = env.GetStaticMethodID(property_printer_class, "printProperty", "(Ljava/lang/String;)Ljava/lang/String;"); ASSERT_NE(nullptr, method_id); for (const auto &el : std::vector>{ {"not set property", ""}, {"env1", "va" ARG_SEPARATOR "l1\\"}, {"env2", "val2"}}) { jstring str = env.NewStringUTF(el.first.c_str()); auto ret = (jstring)env.CallStaticObjectMethod(property_printer_class, method_id, str); ASSERT_FALSE(env.ExceptionCheck()); if (el.second.empty()) { ASSERT_EQ(nullptr, ret); } else { ASSERT_NE(nullptr, ret); jboolean is_copy; ASSERT_EQ(el.second, env.GetStringUTFChars(ret, &is_copy)); } } } } // namespace jazzer