| // 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 <gtest/gtest.h> |
| |
| #include <string> |
| #include <vector> |
| |
| #include <fcntl.h> |
| #ifndef _MSC_VER |
| #include <unistd.h> |
| #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<std::string> 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<std::string> 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<std::string> 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<std::string> 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 |