diff --git a/tests/camera2/CameraMetadataTests.cpp b/tests/camera2/CameraMetadataTests.cpp
index 722e71e..8cae619 100644
--- a/tests/camera2/CameraMetadataTests.cpp
+++ b/tests/camera2/CameraMetadataTests.cpp
@@ -70,6 +70,22 @@
         return entry.type;
     }
 
+    int GetEntryCountFromStaticTag(uint32_t tag) const {
+        const CameraMetadata& staticInfo = mDevice->info();
+        camera_metadata_ro_entry entry = staticInfo.find(tag);
+        return entry.count;
+    }
+
+    bool HasElementInArrayFromStaticTag(uint32_t tag, int32_t element) const {
+        const CameraMetadata& staticInfo = mDevice->info();
+        camera_metadata_ro_entry entry = staticInfo.find(tag);
+        for (size_t i = 0; i < entry.count; ++i) {
+            if (entry.data.i32[i] == element)
+                return true;
+        }
+        return false;
+    }
+
 protected:
 
 };
@@ -115,6 +131,50 @@
     }
 }
 
+TEST_F(CameraMetadataTest, RequiredFormats) {
+    TEST_EXTENSION_FORKING_INIT;
+
+    EXPECT_TRUE(
+        HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
+                                      HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED));
+
+    EXPECT_TRUE(
+        HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
+                                       HAL_PIXEL_FORMAT_BLOB)); // JPEG
+
+    EXPECT_TRUE(
+        HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
+                                       HAL_PIXEL_FORMAT_YCrCb_420_SP)); // NV21
+
+    EXPECT_TRUE(
+        HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
+                                       HAL_PIXEL_FORMAT_YV12));
+}
+
+TEST_F(CameraMetadataTest, SaneResolutions) {
+    TEST_EXTENSION_FORKING_INIT;
+
+    // Iff there are listed raw resolutions, the format should be available
+    int rawResolutionsCount =
+            GetEntryCountFromStaticTag(HAL_PIXEL_FORMAT_RAW_SENSOR);
+    EXPECT_EQ(rawResolutionsCount > 0,
+        HasElementInArrayFromStaticTag(ANDROID_SCALER_AVAILABLE_FORMATS,
+                                        HAL_PIXEL_FORMAT_RAW_SENSOR));
+
+    // Required processed sizes.
+    int processedSizeCount =
+           GetEntryCountFromStaticTag(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
+    EXPECT_NE(0, processedSizeCount);
+    EXPECT_EQ(0, processedSizeCount % 2); // multiple of 2 (w,h)
+
+    // Required JPEG sizes
+    int jpegSizeCount =
+            GetEntryCountFromStaticTag(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
+    EXPECT_NE(0, jpegSizeCount);
+    EXPECT_EQ(0, jpegSizeCount % 2); // multiple of 2 (w,h)
+
+}
+
 }
 }
 }
diff --git a/tests/camera2/camera2.cpp b/tests/camera2/camera2.cpp
index 64803c0..0f75070 100644
--- a/tests/camera2/camera2.cpp
+++ b/tests/camera2/camera2.cpp
@@ -393,6 +393,18 @@
 
         getResolutionList(format,
                 &rawResolutions, &rawResolutionsCount);
+
+        if (rawResolutionsCount <= 0) {
+            const ::testing::TestInfo* const test_info =
+                ::testing::UnitTest::GetInstance()->current_test_info();
+            std::cerr << "Skipping test "
+                      << test_info->test_case_name() << "."
+                      << test_info->name()
+                      << " because the optional format was not available: "
+                      << "RAW_SENSOR" << std::endl;
+            return;
+        }
+
         ASSERT_LT((size_t)0, rawResolutionsCount);
 
         // Pick first available raw resolution
@@ -515,6 +527,18 @@
 
         getResolutionList(format,
                 &rawResolutions, &rawResolutionsCount);
+
+        if (rawResolutionsCount <= 0) {
+            const ::testing::TestInfo* const test_info =
+                ::testing::UnitTest::GetInstance()->current_test_info();
+            std::cerr << "Skipping test "
+                      << test_info->test_case_name() << "."
+                      << test_info->name()
+                      << " because the optional format was not available: "
+                      << "RAW_SENSOR" << std::endl;
+            return;
+        }
+
         ASSERT_LT((uint32_t)0, rawResolutionsCount);
 
         // Pick first available raw resolution
@@ -650,7 +674,7 @@
                     i,
                     &request);
             EXPECT_EQ(NO_ERROR, res) <<
-                    "Unable to construct request from template type %d", i;
+                    "Unable to construct request from template type " << i;
             EXPECT_TRUE(request != NULL);
             EXPECT_LT((size_t)0, get_camera_metadata_entry_count(request));
             EXPECT_LT((size_t)0, get_camera_metadata_data_count(request));
