1 // Copyright 2014 The Android Open Source Project 2 // 3 // This software is licensed under the terms of the GNU General Public 4 // License version 2, as published by the Free Software Foundation, and 5 // may be copied, distributed, and modified under those terms. 6 // 7 // This program is distributed in the hope that it will be useful, 8 // but WITHOUT ANY WARRANTY; without even the implied warranty of 9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 // GNU General Public License for more details. 11 12 #include "android/kernel/kernel_utils.h" 13 14 #include "android/base/String.h" 15 #include "android/kernel/kernel_utils_testing.h" 16 17 #include <gtest/gtest.h> 18 19 using android::base::String; 20 21 namespace android { 22 namespace kernel { 23 24 namespace { 25 26 class ScopedDescriptionFunc { 27 public: 28 explicit ScopedDescriptionFunc(GetFileDescriptionFunction* file_func) { 29 setFileDescriptionFunction(file_func, NULL); 30 } 31 32 ScopedDescriptionFunc(GetFileDescriptionFunction* file_func, 33 void* file_opaque) { 34 setFileDescriptionFunction(file_func, file_opaque); 35 } 36 37 ~ScopedDescriptionFunc() { 38 setFileDescriptionFunction(NULL, NULL); 39 } 40 }; 41 42 } // namespace 43 44 TEST(KernelUtils, GetKernelSerialDevicePrefix) { 45 EXPECT_STREQ("ttyS", 46 android_kernelSerialDevicePrefix(KERNEL_TYPE_LEGACY)); 47 EXPECT_STREQ("ttyGF", 48 android_kernelSerialDevicePrefix(KERNEL_TYPE_3_10_OR_ABOVE)); 49 } 50 51 static bool failFunc(void* opaque, const char* path, String* text) { 52 return false; 53 } 54 55 TEST(KernelUtils, ProbeKernelTypeWithNoKernelFile) { 56 ScopedDescriptionFunc func(&failFunc); 57 58 KernelType ktype; 59 EXPECT_FALSE(android_pathProbeKernelType("/tmp/kernel", &ktype)); 60 } 61 62 struct Expectation { 63 const char* description; 64 bool result; 65 KernelType ktype; 66 67 static bool getDescriptionFunc(void* opaque, 68 const char* path, 69 String* text) { 70 const Expectation* expectation = static_cast<const Expectation*>(opaque); 71 if (!expectation->result) 72 return false; 73 text->assign(expectation->description); 74 return true; 75 } 76 }; 77 78 #ifdef _WIN32 79 #define DISABLED_ON_WIN32(x) DISABLED_ ## x 80 #else 81 #define DISABLED_ON_WIN32(x) x 82 #endif 83 84 TEST(KernelUtils, DISABLED_ON_WIN32(PathProbeKernelType)) { 85 static const Expectation kData[] = { 86 { NULL, false, KERNEL_TYPE_LEGACY }, 87 // Missing bzImage. 88 { "Linux kernel x86 boot executable raw image, version 3.10.0+", 89 false, KERNEL_TYPE_LEGACY }, 90 // Missing version 91 { "Linux kernel x86 boot executable bzImage, 3.10.0+", 92 false, KERNEL_TYPE_LEGACY }, 93 // Legacy 2.6.29 kernel 94 { "Linux kernel x86 boot executable bzImage, version 2.6.29 (foo...)", 95 true, 96 KERNEL_TYPE_LEGACY }, 97 // Legacy 3.4 98 { "Linux kernel x86 boot executable bzImage, version 3.4.1 (foo...)", 99 true, 100 KERNEL_TYPE_LEGACY }, 101 // 3.10 102 { "Linux kernel x86 boot executable bzImage, version 3.10.0+", 103 true, 104 KERNEL_TYPE_3_10_OR_ABOVE }, 105 // 3.40 106 { "Linux kernel x86 boot executable bzImage, version 3.40.0", 107 true, 108 KERNEL_TYPE_3_10_OR_ABOVE }, 109 // 4.0 110 { "Linux kernel x86 boot executable bzImage, version 4.0.9", 111 true, 112 KERNEL_TYPE_3_10_OR_ABOVE }, 113 }; 114 const size_t kDataSize = sizeof(kData) / sizeof(kData[0]); 115 static const char kKernelPath[] = "/tmp/kernel"; 116 for (size_t n = 0; n < kDataSize; ++n) { 117 KernelType kernelType; 118 const Expectation& expectation = kData[n]; 119 ScopedDescriptionFunc func(&Expectation::getDescriptionFunc, 120 (void*)&expectation); 121 EXPECT_EQ(expectation.result, 122 android_pathProbeKernelType(kKernelPath, &kernelType)) 123 << "For [" << expectation.description << "]"; 124 if (expectation.result) { 125 EXPECT_EQ(expectation.ktype, kernelType) << "For [" 126 << expectation.description << "]"; 127 } 128 } 129 } 130 131 } // namespace kernel 132 } // namespace android 133