[storage] Move ArrayBuffer out of test_support.

Also prepare it so that we can create a ResizeableArrayBuffer subclass.

Bug: 42096
Change-Id: I5f3be3a56c8f081bee8ccf0792c1c8fbebde67b3
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/362858
Commit-Queue: Chris Suter <csuter@google.com>
Reviewed-by: Abdulla Kamar <abdulla@google.com>
Reviewed-by: Ricardo Vargas <rvargas@google.com>
Testability-Review: Ricardo Vargas <rvargas@google.com>
diff --git a/build/unification/images/BUILD.gn b/build/unification/images/BUILD.gn
index f2e8774..e584230 100644
--- a/build/unification/images/BUILD.gn
+++ b/build/unification/images/BUILD.gn
@@ -2586,7 +2586,6 @@
 #------------------
     "//zircon/system/ulib/storage/buffer/test:storage_buffer-manifest",
 #------------------
-    "//zircon/system/ulib/storage/buffer/test_support/test:storage_buffer_test_support-manifest",
     "//zircon/system/ulib/storage/operation/test:storage_operation-manifest",
 #------------------
 #------------------
@@ -3096,7 +3095,6 @@
 #------------------
     "//zircon/system/ulib/storage/buffer/test:storage_buffer-manifest",
 #------------------
-    "//zircon/system/ulib/storage/buffer/test_support/test:storage_buffer_test_support-manifest",
     "//zircon/system/ulib/storage/operation/test:storage_operation-manifest",
 #------------------
 #------------------
diff --git a/zircon/system/ulib/BUILD.gn b/zircon/system/ulib/BUILD.gn
index 4f31424..2c527e2 100644
--- a/zircon/system/ulib/BUILD.gn
+++ b/zircon/system/ulib/BUILD.gn
@@ -394,9 +394,6 @@
     "storage/buffer",
 #------------------
 #------------------
-    "storage/buffer/test_support",
-#------------------
-#------------------
     "storage/operation",
 #------------------
 #------------------
diff --git a/zircon/system/ulib/blobfs/test/unit/blobfs_inspector_test.cc b/zircon/system/ulib/blobfs/test/unit/blobfs_inspector_test.cc
index 493c36e5..6a43f52 100644
--- a/zircon/system/ulib/blobfs/test/unit/blobfs_inspector_test.cc
+++ b/zircon/system/ulib/blobfs/test/unit/blobfs_inspector_test.cc
@@ -9,7 +9,7 @@
 
 #include <blobfs/common.h>
 #include <blobfs/format.h>
-#include <buffer/test_support/array_buffer.h>
+#include <storage/buffer/array_buffer.h>
 #include <disk_inspector/buffer_factory.h>
 #include <fs/journal/format.h>
 #include <fs/journal/initializer.h>
diff --git a/zircon/system/ulib/blobfs/test/unit/parser_test.cc b/zircon/system/ulib/blobfs/test/unit/parser_test.cc
index c6422f3..50472424 100644
--- a/zircon/system/ulib/blobfs/test/unit/parser_test.cc
+++ b/zircon/system/ulib/blobfs/test/unit/parser_test.cc
@@ -5,7 +5,7 @@
 #include "inspector/parser.h"
 
 #include <blobfs/format.h>
-#include <buffer/test_support/array_buffer.h>
+#include <storage/buffer/array_buffer.h>
 #include <fs/transaction/block_transaction.h>
 #include <zxtest/zxtest.h>
 
diff --git a/zircon/system/ulib/disk_inspector/test/loader_test.cc b/zircon/system/ulib/disk_inspector/test/loader_test.cc
index 0b45e4c..81a9f56 100644
--- a/zircon/system/ulib/disk_inspector/test/loader_test.cc
+++ b/zircon/system/ulib/disk_inspector/test/loader_test.cc
@@ -4,7 +4,7 @@
 
 #include "disk_inspector/loader.h"
 
-#include <buffer/test_support/array_buffer.h>
+#include <storage/buffer/array_buffer.h>
 #include <fs/transaction/block_transaction.h>
 #include <zxtest/zxtest.h>
 
diff --git a/zircon/system/ulib/fs/journal/test/BUILD.gn b/zircon/system/ulib/fs/journal/test/BUILD.gn
index 3e25894..9500eba 100644
--- a/zircon/system/ulib/fs/journal/test/BUILD.gn
+++ b/zircon/system/ulib/fs/journal/test/BUILD.gn
@@ -61,7 +61,6 @@
     "//zircon/public/lib/cksum",
     "//zircon/public/lib/journal",
     "//zircon/public/lib/sync",
-    "//zircon/public/lib/test_support",
     "//zircon/public/lib/zx",
     "//zircon/public/lib/zxtest",
   ]
diff --git a/zircon/system/ulib/fs/journal/test/inspector_parser_test.cc b/zircon/system/ulib/fs/journal/test/inspector_parser_test.cc
index d0d669c..3397076 100644
--- a/zircon/system/ulib/fs/journal/test/inspector_parser_test.cc
+++ b/zircon/system/ulib/fs/journal/test/inspector_parser_test.cc
@@ -4,9 +4,9 @@
 
 #include <inttypes.h>
 
-#include <buffer/test_support/array_buffer.h>
 #include <fs/journal/format.h>
 #include <fs/journal/internal/inspector_parser.h>
+#include <storage/buffer/array_buffer.h>
 #include <zxtest/zxtest.h>
 
 namespace fs {
diff --git a/zircon/system/ulib/fs/test_support/BUILD.gn b/zircon/system/ulib/fs/test_support/BUILD.gn
index e4417d0..913b03c 100644
--- a/zircon/system/ulib/fs/test_support/BUILD.gn
+++ b/zircon/system/ulib/fs/test_support/BUILD.gn
@@ -26,7 +26,7 @@
     "$zx/system/ulib/fs-management:headers",
     "$zx/system/ulib/fs/transaction:headers",
     "$zx/system/ulib/ramdevice-client:headers",
-    "$zx/system/ulib/storage/buffer/test_support:headers",
+    "$zx/system/ulib/storage/buffer:headers",
     "$zx/system/ulib/zxtest:headers",
   ]
 
@@ -42,7 +42,7 @@
     "$zx/system/ulib/fvm",
     "$zx/system/ulib/fzl",
     "$zx/system/ulib/ramdevice-client",
-    "$zx/system/ulib/storage/buffer/test_support",
+    "$zx/system/ulib/storage/buffer",
     "$zx/system/ulib/zircon",
     "$zx/system/ulib/zxtest",
   ]
diff --git a/zircon/system/ulib/fs/test_support/test/BUILD.gn b/zircon/system/ulib/fs/test_support/test/BUILD.gn
index bbf83b8c4..2d1036f 100644
--- a/zircon/system/ulib/fs/test_support/test/BUILD.gn
+++ b/zircon/system/ulib/fs/test_support/test/BUILD.gn
@@ -46,7 +46,6 @@
     "//zircon/public/lib/fs-management",
     "//zircon/public/lib/fs_test_support",
     "//zircon/public/lib/ramdevice-client",
-    "//zircon/public/lib/test_support",
     "//zircon/public/lib/zxtest",
   ]
   include_dirs = [ "../include" ]
diff --git a/zircon/system/ulib/minfs/test/BUILD.gn b/zircon/system/ulib/minfs/test/BUILD.gn
index 0fade07..20b583e 100644
--- a/zircon/system/ulib/minfs/test/BUILD.gn
+++ b/zircon/system/ulib/minfs/test/BUILD.gn
@@ -69,7 +69,6 @@
     "//zircon/public/lib/minfs",
     "//zircon/public/lib/safemath",
     "//zircon/public/lib/sync",
-    "//zircon/public/lib/test_support",
     "//zircon/public/lib/zircon-internal",
     "//zircon/public/lib/zxtest",
     "//zircon/system/fidl/fuchsia-minfs:c",
diff --git a/zircon/system/ulib/minfs/test/unit/loader_test.cc b/zircon/system/ulib/minfs/test/unit/loader_test.cc
index ed7f0de..36aa64c 100644
--- a/zircon/system/ulib/minfs/test/unit/loader_test.cc
+++ b/zircon/system/ulib/minfs/test/unit/loader_test.cc
@@ -4,10 +4,10 @@
 
 #include "inspector/loader.h"
 
-#include <buffer/test_support/array_buffer.h>
 #include <fs/journal/format.h>
 #include <fs/transaction/block_transaction.h>
 #include <minfs/format.h>
+#include <storage/buffer/array_buffer.h>
 #include <zxtest/zxtest.h>
 
 namespace minfs {
diff --git a/zircon/system/ulib/minfs/test/unit/parser_test.cc b/zircon/system/ulib/minfs/test/unit/parser_test.cc
index 4e2d362..f589bdb 100644
--- a/zircon/system/ulib/minfs/test/unit/parser_test.cc
+++ b/zircon/system/ulib/minfs/test/unit/parser_test.cc
@@ -4,9 +4,9 @@
 
 #include "inspector/parser.h"
 
-#include <buffer/test_support/array_buffer.h>
 #include <fs/transaction/block_transaction.h>
 #include <minfs/format.h>
+#include <storage/buffer/array_buffer.h>
 #include <zxtest/zxtest.h>
 
 namespace minfs {
diff --git a/zircon/system/ulib/storage/buffer/BUILD.gn b/zircon/system/ulib/storage/buffer/BUILD.gn
index ec691f0..dae62ca 100644
--- a/zircon/system/ulib/storage/buffer/BUILD.gn
+++ b/zircon/system/ulib/storage/buffer/BUILD.gn
@@ -12,9 +12,10 @@
     "storage/buffer/ring_buffer.h",
     "storage/buffer/vmo_buffer.h",
     "storage/buffer/vmoid_registry.h",
+    "storage/buffer/array_buffer.h",
   ]
   host = true
-  sources = []
+  sources = [ "array_buffer.cc" ]
   static = true
 
   if (is_fuchsia) {
diff --git a/zircon/system/ulib/storage/buffer/test_support/array_buffer.cc b/zircon/system/ulib/storage/buffer/array_buffer.cc
similarity index 69%
rename from zircon/system/ulib/storage/buffer/test_support/array_buffer.cc
rename to zircon/system/ulib/storage/buffer/array_buffer.cc
index 085352b..4bb1d3c 100644
--- a/zircon/system/ulib/storage/buffer/test_support/array_buffer.cc
+++ b/zircon/system/ulib/storage/buffer/array_buffer.cc
@@ -2,25 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "buffer/test_support/array_buffer.h"
+#include "storage/buffer/array_buffer.h"
 
 #include <zircon/assert.h>
 
 namespace storage {
 
 ArrayBuffer::ArrayBuffer(size_t capacity, uint32_t block_size)
-    : block_size_(block_size), capacity_(capacity) {
-  if (capacity > 0) {
-    buffer_ = std::make_unique<char[]>(block_size * capacity);
-  }
-}
+    : buffer_(block_size * capacity), block_size_(block_size) {}
 
 void* ArrayBuffer::Data(size_t index) {
   return const_cast<void*>(const_cast<const ArrayBuffer*>(this)->Data(index));
 }
 
 const void* ArrayBuffer::Data(size_t index) const {
-  ZX_DEBUG_ASSERT(index < capacity_);
+  ZX_DEBUG_ASSERT(index < capacity());
   return &buffer_[index * block_size_];
 }
 
diff --git a/zircon/system/ulib/storage/buffer/test_support/include/buffer/test_support/array_buffer.h b/zircon/system/ulib/storage/buffer/include/storage/buffer/array_buffer.h
similarity index 72%
rename from zircon/system/ulib/storage/buffer/test_support/include/buffer/test_support/array_buffer.h
rename to zircon/system/ulib/storage/buffer/include/storage/buffer/array_buffer.h
index a258602..1706ccb 100644
--- a/zircon/system/ulib/storage/buffer/test_support/include/buffer/test_support/array_buffer.h
+++ b/zircon/system/ulib/storage/buffer/include/storage/buffer/array_buffer.h
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BUFFER_TEST_SUPPORT_ARRAY_BUFFER_H_
-#define BUFFER_TEST_SUPPORT_ARRAY_BUFFER_H_
+#ifndef STORAGE_BUFFER_ARRAY_BUFFER_H_
+#define STORAGE_BUFFER_ARRAY_BUFFER_H_
 
-#include <array>
+#include <vector>
 
 #include <storage/buffer/block_buffer.h>
 
 namespace storage {
 
 // Block buffer backed by a heap array.
-class ArrayBuffer final : public BlockBuffer {
+class ArrayBuffer : public BlockBuffer {
  public:
   explicit ArrayBuffer(size_t capacity, uint32_t block_size);
   ArrayBuffer(const ArrayBuffer&) = delete;
@@ -22,19 +22,21 @@
   ~ArrayBuffer() = default;
 
   // BlockBuffer interface:
-  size_t capacity() const final { return capacity_; }
+  size_t capacity() const final { return buffer_.size() / block_size_; }
   uint32_t BlockSize() const final { return block_size_; }
   vmoid_t vmoid() const final { return BLOCK_VMOID_INVALID; }
   zx_handle_t Vmo() const final { return ZX_HANDLE_INVALID; }
   void* Data(size_t index) final;
   const void* Data(size_t index) const final;
 
+ protected:
+  std::vector<uint8_t>& buffer() { return buffer_; }
+
  private:
-  std::unique_ptr<char[]> buffer_;
+  std::vector<uint8_t> buffer_;
   uint32_t block_size_ = 0;
-  size_t capacity_ = 0;
 };
 
 }  // namespace storage
 
-#endif  // BUFFER_TEST_SUPPORT_ARRAY_BUFFER_H_
+#endif  // STORAGE_BUFFER_ARRAY_BUFFER_H_
diff --git a/zircon/system/ulib/storage/buffer/test_support/test/array_buffer_test.cc b/zircon/system/ulib/storage/buffer/test/array_buffer_test.cc
similarity index 95%
rename from zircon/system/ulib/storage/buffer/test_support/test/array_buffer_test.cc
rename to zircon/system/ulib/storage/buffer/test/array_buffer_test.cc
index b4a4dfa..72d5c92 100644
--- a/zircon/system/ulib/storage/buffer/test_support/test/array_buffer_test.cc
+++ b/zircon/system/ulib/storage/buffer/test/array_buffer_test.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "buffer/test_support/array_buffer.h"
+#include "storage/buffer/array_buffer.h"
 
 #include <lib/zx/vmo.h>
 
diff --git a/zircon/system/ulib/storage/buffer/test_support/BUILD.gn b/zircon/system/ulib/storage/buffer/test_support/BUILD.gn
deleted file mode 100644
index 7d9b5cf..0000000
--- a/zircon/system/ulib/storage/buffer/test_support/BUILD.gn
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2019 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-zx_library("test_support") {
-  sdk = "source"
-  sdk_headers = [ "buffer/test_support/array_buffer.h" ]
-  testonly = true
-  sources = [ "array_buffer.cc" ]
-  static = true
-
-  public_deps = [
-    "$zx/system/ulib/storage/buffer:headers",
-    "$zx/system/ulib/zx:headers",
-  ]
-  deps = [
-    "$zx/system/ulib/zircon",
-    "$zx/system/ulib/zx",
-  ]
-}
diff --git a/zircon/system/ulib/storage/buffer/test_support/test/BUILD.gn b/zircon/system/ulib/storage/buffer/test_support/test/BUILD.gn
deleted file mode 100644
index c65b2f8..0000000
--- a/zircon/system/ulib/storage/buffer/test_support/test/BUILD.gn
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright 2020 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-##########################################
-# Though under //zircon, this build file #
-# is meant to be used in the Fuchsia GN  #
-# build.                                 #
-# See fxb/36139.                         #
-##########################################
-
-assert(!defined(zx) || zx != "/",
-       "This file can only be used in the Fuchsia GN build.")
-
-import("//build/test.gni")
-import("//build/unification/images/migrated_manifest.gni")
-
-group("test") {
-  testonly = true
-  deps = [ ":storage_buffer_test_support" ]
-}
-
-test("storage_buffer_test_support") {
-  # Dependent manifests unfortunately cannot be marked as `testonly`.
-  # TODO(44278): Remove when converting this file to proper GN build idioms.
-  if (is_fuchsia) {
-    testonly = false
-  }
-  if (is_fuchsia) {
-    configs += [ "//build/unification/config:zircon-migrated" ]
-  }
-  if (is_fuchsia) {
-    fdio_config = [ "//build/config/fuchsia:fdio_config" ]
-    if (configs + fdio_config - fdio_config != configs) {
-      configs -= fdio_config
-    }
-  }
-  output_name = "storage-buffer-test-support-test"
-  test_group = "storage"
-  sources = [ "array_buffer_test.cc" ]
-  deps = [
-    "//zircon/public/lib/fdio",
-    "//zircon/public/lib/test_support",
-    "//zircon/public/lib/zxtest",
-  ]
-}
-
-migrated_manifest("storage_buffer_test_support-manifest") {
-  deps = [ ":storage_buffer_test_support" ]
-}