// Copyright 2020 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 "android/opengl/EmuglBackendScanner.h" #include "android/base/system/System.h" #include "android/base/testing/TestSystem.h" #include "android/base/testing/TestTempDir.h" #include "android/utils/path.h" #include #include #include #include #ifndef _MSC_VER #include #endif using android::base::System; using android::base::TestSystem; using android::base::TestTempDir; static void make_dir(const std::string& path) { EXPECT_EQ(0, ::android_mkdir(path.c_str(), 0755)); } static void make_subdir(const std::string& path, const char* subdir) { std::string dir = path; dir.append("/"); dir.append(subdir); make_dir(dir); } static void make_subfile(const std::string& dir, const char* file) { std::string path = dir; path.append("/"); path.append(file); int fd = ::open(path.c_str(), O_WRONLY|O_CREAT, 0755); EXPECT_GE(fd, 0); ::close(fd); } namespace android { namespace opengl { TEST(EmuglBackendScanner, noLibDir) { TestTempDir myDir("emugl_backend_scanner"); // Don't create any files std::vector names = EmuglBackendScanner::scanDir(myDir.path()); EXPECT_TRUE(names.empty()); } TEST(EmuglBackendScanner, noBackends) { TestTempDir myDir("emugl_backend_scanner"); // Create lib directory. std::string libDir(myDir.path()); libDir += "/"; libDir += System::kLibSubDir; make_dir(libDir); // Don't create any files std::vector names = EmuglBackendScanner::scanDir(myDir.path()); EXPECT_TRUE(names.empty()); } TEST(EmuglBackendScanner, listBackends) { TestSystem testSys("foo", System::kProgramBitness); TestTempDir* myDir = testSys.getTempRoot(); // Create lib directory. std::string libDir(myDir->path()); libDir += "/foo/"; make_dir(libDir); libDir += System::kLibSubDir; make_dir(libDir); // Create first backend sub-directory. // to be ignored, doesn't begin with 'gles_' make_subdir(libDir, "first"); // second entry for the backend named 'second' make_subdir(libDir, "gles_second"); // should be ignored, must have something after 'gles_' prefix. make_subdir(libDir, "gles_"); // should be ignored: is a file, not a directory. make_subfile(libDir, "gles_fourth"); // should be the first returned backend, due to alphabetical order. make_subdir(libDir, "gles_fifth"); // should be returned as the third backend, due to alphabetical order. make_subdir(libDir, "gles_sixth"); // Now check the scanner std::vector names = EmuglBackendScanner::scanDir(PATH_SEP "foo"); ASSERT_EQ(3U, names.size()); EXPECT_STREQ("fifth", names[0].c_str()); EXPECT_STREQ("second", names[1].c_str()); EXPECT_STREQ("sixth", names[2].c_str()); } TEST(EmuglBackendScanner, listBackendsWithProgramBitness) { TestSystem testSys("foo", 32); TestTempDir* myDir = testSys.getTempRoot(); myDir->makeSubDir("foo"); myDir->makeSubDir("foo/lib"); myDir->makeSubDir("foo/lib/gles_first"); myDir->makeSubDir("foo/lib/gles_second"); myDir->makeSubDir("foo/lib/gles_third"); myDir->makeSubDir("foo/lib64"); myDir->makeSubDir("foo/lib64/gles_fourth"); myDir->makeSubDir("foo/lib64/gles_fifth"); myDir->makeSubDir("foo/lib64/gles_sixth"); std::vector names = EmuglBackendScanner::scanDir(PATH_SEP "foo", 32); ASSERT_EQ(3U, names.size()); EXPECT_STREQ("first", names[0].c_str()); EXPECT_STREQ("second", names[1].c_str()); EXPECT_STREQ("third", names[2].c_str()); names = EmuglBackendScanner::scanDir(PATH_SEP "foo", 64); ASSERT_EQ(3U, names.size()); EXPECT_STREQ("fifth", names[0].c_str()); EXPECT_STREQ("fourth", names[1].c_str()); EXPECT_STREQ("sixth", names[2].c_str()); } } // namespace opengl } // namespace android