// 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/EmuglBackendList.h" #include "android/base/files/PathUtils.h" #include "android/base/testing/TestSystem.h" #include "android/base/testing/TestTempDir.h" #include namespace android { namespace opengl { #define ARRAYLEN(x) (sizeof(x)/sizeof(x[0])) using android::base::pj; using android::base::System; using android::base::TestTempDir; using android::base::TestSystem; static std::string makeLibSubPath(const char* name) { return pj("foo", System::kLibSubDir, name); } static void makeLibSubDir(TestTempDir* dir, const char* name) { dir->makeSubDir(makeLibSubPath(name).c_str()); } static void makeLibSubFile(TestTempDir* dir, const char* name) { dir->makeSubFile(makeLibSubPath(name).c_str()); } TEST(EmuglBackendList, init) { TestSystem testSys("foo", System::kProgramBitness, "/"); TestTempDir* myDir = testSys.getTempRoot(); myDir->makeSubDir("foo"); makeLibSubDir(myDir, ""); makeLibSubDir(myDir, "gles_first"); makeLibSubFile(myDir, "gles_second"); // should be ignored (file). makeLibSubDir(myDir, "gles_"); // should be ignored (no name). makeLibSubDir(myDir, "gles_fourth"); makeLibSubDir(myDir, "gles_fifth"); EmuglBackendList list("foo", System::kProgramBitness); // NOTE: Must appear in alphabetical order const char* const kExpected[] = { "fifth", "first", "fourth", }; const size_t kExpectedLen = ARRAYLEN(kExpected); const std::vector& names = list.names(); EXPECT_EQ(kExpectedLen, names.size()); for (size_t n = 0; n < kExpectedLen; ++n) { EXPECT_STREQ(kExpected[n], names[n].c_str()) << "#" << n; EXPECT_TRUE(list.contains(kExpected[n])); } } TEST(EmuglBackendList, getBackendLibPath) { TestSystem testSys("foo", System::kProgramBitness, "/"); TestTempDir* myDir = testSys.getTempRoot(); myDir->makeSubDir("foo"); makeLibSubDir(myDir, ""); makeLibSubDir(myDir, "gles_bar"); static const struct { EmuglBackendList::Library library; const char* libName; } kData[] = { #ifdef _WIN32 { EmuglBackendList::LIBRARY_EGL, "libEGL.dll" }, { EmuglBackendList::LIBRARY_GLESv1, "libGLES_CM.dll" }, { EmuglBackendList::LIBRARY_GLESv2, "libGLESv2.dll" }, #elif defined(__APPLE__) { EmuglBackendList::LIBRARY_EGL, "libEGL.dylib" }, { EmuglBackendList::LIBRARY_GLESv1, "libGLES_CM.dylib" }, { EmuglBackendList::LIBRARY_GLESv2, "libGLESv2.dylib" }, #else { EmuglBackendList::LIBRARY_EGL, "libEGL.so" }, { EmuglBackendList::LIBRARY_GLESv1, "libGLES_CM.so" }, { EmuglBackendList::LIBRARY_GLESv2, "libGLESv2.so" }, #endif }; const size_t kDataLen = ARRAYLEN(kData); for (size_t n = 0; n < kDataLen; ++n) { std::string file = pj("gles_bar", kData[n].libName); makeLibSubFile(myDir, file.c_str()); } auto sysdir = pj("/", "foo"); EmuglBackendList list(sysdir.c_str(), System::kProgramBitness); const std::vector& names = list.names(); EXPECT_EQ(1U, names.size()); EXPECT_STREQ("bar", names[0].c_str()); for (size_t n = 0; n < kDataLen; ++n) { std::string expected = pj("/", "foo", System::kLibSubDir, "gles_bar", kData[n].libName); std::string libdir; EXPECT_TRUE(list.getBackendLibPath("bar", kData[n].library, &libdir)); EXPECT_TRUE(list.contains("bar")); EXPECT_FALSE(list.contains("foo")); EXPECT_STREQ(expected.c_str(), libdir.c_str()); } } TEST(EmuglBackend, defaultName) { EmuglBackendList list("foo", 0); EXPECT_STREQ("auto", list.defaultName().c_str()); } } // namespace opengl } // namespace android