Add vts test for androidboot in /proc/cmdline

For devices launching with S or greater, using kernel version 5.10 or
greater, this test makes sure there are no occurences of "androidboot"
in /proc/cmdline. All of those parameters should be in /proc/bootconfig
instead.

Test: atest VtsBootconfigTest
Test: Run test against cuttlefish with 4.19 and 5.10 kernels
Test: Run test with 5.10 with added "androidboot.test=1" in cmdline to fail
Bug: 177347093

Change-Id: I1192782c4f36d4b427454a499993d4562423573a
diff --git a/vts/Android.bp b/vts/Android.bp
new file mode 100644
index 0000000..06fb911
--- /dev/null
+++ b/vts/Android.bp
@@ -0,0 +1,30 @@
+//
+// Copyright (C) 2021 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.
+
+cc_test {
+    name: "VtsBootconfigTest",
+    srcs: [
+        "VtsBootconfigTest.cpp",
+    ],
+    shared_libs: [
+      "libbase",
+      "libbpf_android",
+    ],
+    test_suites: [
+        "general-tests",
+        "vts",
+    ],
+    require_root: true,
+}
diff --git a/vts/PREUPLOAD.cfg b/vts/PREUPLOAD.cfg
new file mode 100644
index 0000000..b18ce2b
--- /dev/null
+++ b/vts/PREUPLOAD.cfg
@@ -0,0 +1,6 @@
+[Builtin Hooks]
+bpfmt = true
+clang_format = true
+
+[Builtin Hooks Options]
+clang_format = --commit ${PREUPLOAD_COMMIT} --style file --extensions c,h,cc
diff --git a/vts/TEST_MAPPING b/vts/TEST_MAPPING
new file mode 100644
index 0000000..7b10593
--- /dev/null
+++ b/vts/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "presubmit": [
+    {
+      "name": "VtsBootconfigTest"
+    }
+  ]
+}
diff --git a/vts/VtsBootconfigTest.cpp b/vts/VtsBootconfigTest.cpp
new file mode 100644
index 0000000..285c180
--- /dev/null
+++ b/vts/VtsBootconfigTest.cpp
@@ -0,0 +1,41 @@
+/**
+ * Copyright (C) 2021 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 "gtest/gtest.h"
+#include <android-base/file.h>
+#include <android-base/properties.h>
+#include "bpf/BpfUtils.h"
+
+class VtsBootconfigTest : public testing::Test {};
+
+TEST_F(VtsBootconfigTest, ProcCmdlineAndroidbootTest) {
+  // This test only applies to devices launching with S(or greater) AND with
+  // kernel version 5.10(or greater)
+  bool kernel_support = android::bpf::isAtLeastKernelVersion(5, 10, 0);
+  if (std::stoi(android::base::GetProperty("ro.product.first_api_level", "0"))
+    < __ANDROID_API_S__ || !kernel_support) {
+    GTEST_SKIP() << "Bootconfig requirements do not apply";
+  }
+
+  std::string cmdline;
+  ASSERT_TRUE(android::base::ReadFileToString("/proc/cmdline", &cmdline));
+  EXPECT_TRUE(cmdline.size() > 0);
+  EXPECT_EQ(cmdline.find("androidboot"), cmdline.npos)
+    << "\"androidboot\" parameters are not allowed in the kernel cmdline for "
+    << "devices using kernel version 5.10 or greater with Android S and beyond. "
+    << "These parameters are to be placed in bootconfig."
+    << "\n/proc/cmdline contents:\n" << cmdline;
+}