Home | History | Annotate | Download | only in kernel
      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