[magma] Add test MsdBuffer.MapDoesntFit

Test:
vim2:go/magma-tps#L0

Change-Id: Ib697895d24878bb4b0a13b8f775522d6ae15fa36
diff --git a/garnet/lib/magma/tests/unit_tests/test_msd_buffer.cc b/garnet/lib/magma/tests/unit_tests/test_msd_buffer.cc
index f5b63c5..2c0a434 100644
--- a/garnet/lib/magma/tests/unit_tests/test_msd_buffer.cc
+++ b/garnet/lib/magma/tests/unit_tests/test_msd_buffer.cc
@@ -7,6 +7,72 @@
 #include "platform_buffer.h"
 #include "gtest/gtest.h"
 
+namespace {
+
+class TestMsd {
+public:
+    ~TestMsd()
+    {
+        if (connection_) {
+            msd_connection_close(connection_);
+        }
+        if (device_) {
+            msd_device_destroy(device_);
+        }
+        if (driver_) {
+            msd_driver_destroy(driver_);
+        }
+    }
+
+    bool Init()
+    {
+        driver_ = msd_driver_create();
+        if (!driver_)
+            return DRETF(false, "msd_driver_create failed");
+
+        device_ = msd_driver_create_device(driver_, GetTestDeviceHandle());
+        if (!device_)
+            return DRETF(false, "msd_driver_create_device failed");
+
+        return true;
+    }
+
+    bool Connect()
+    {
+        connection_ = msd_device_open(device_, 0);
+        if (!connection_)
+            return DRETF(false, "msd_device_open failed");
+        return true;
+    }
+
+    bool CreateBuffer(uint32_t size_in_pages, msd_buffer_t** buffer_out)
+    {
+        auto platform_buf = magma::PlatformBuffer::Create(size_in_pages * PAGE_SIZE, "test");
+        if (!platform_buf)
+            return DRETF(false, "couldn't create platform buffer size_in_pages %u", size_in_pages);
+
+        uint32_t duplicate_handle;
+        if (!platform_buf->duplicate_handle(&duplicate_handle))
+            return DRETF(false, "couldn't duplicate handle");
+
+        msd_buffer_t* buffer = msd_buffer_import(duplicate_handle);
+        if (!buffer)
+            return DRETF(false, "msd_buffer_import failed");
+
+        *buffer_out = buffer;
+        return true;
+    }
+
+    msd_connection_t* connection() { return connection_; }
+
+private:
+    msd_driver_t* driver_ = nullptr;
+    msd_device_t* device_ = nullptr;
+    msd_connection_t* connection_ = nullptr;
+};
+
+} // namespace
+
 TEST(MsdBuffer, ImportAndDestroy)
 {
     auto platform_buf = magma::PlatformBuffer::Create(4096, "test");
@@ -222,3 +288,26 @@
     msd_device_destroy(device);
     msd_driver_destroy(driver);
 }
+
+TEST(MsdBuffer, MapDoesntFit)
+{
+    TestMsd test;
+    ASSERT_TRUE(test.Init());
+    ASSERT_TRUE(test.Connect());
+
+    constexpr uint32_t kBufferSizeInPages = 2;
+
+    msd_buffer_t* buffer;
+    ASSERT_TRUE(test.CreateBuffer(kBufferSizeInPages, &buffer));
+
+    constexpr uint64_t kGpuAddressSpaceSize = 1ull << 48;
+    magma_status_t status = msd_connection_map_buffer_gpu(
+        test.connection(), buffer,
+        kGpuAddressSpaceSize - kBufferSizeInPages / 2 * PAGE_SIZE, // gpu addr
+        0,                                                         // page offset
+        kBufferSizeInPages,                                        // page count
+        MAGMA_GPU_MAP_FLAG_READ | MAGMA_GPU_MAP_FLAG_WRITE);
+    EXPECT_TRUE(status == MAGMA_STATUS_INVALID_ARGS || status == MAGMA_STATUS_INTERNAL_ERROR);
+
+    msd_buffer_destroy(buffer);
+}