pdl: Test array fields with canonical tests

Test: atest pdl_rust_generator_tests_{le,be}
(cherry picked from https://android-review.googlesource.com/q/commit:77a9a2776141cb64b8b3dc1b0c02e6e0d0867f94)
Merged-In: If5ede67315de6811f2253ef6e108dfd1a15980dd
Change-Id: If5ede67315de6811f2253ef6e108dfd1a15980dd
diff --git a/tools/pdl/src/bin/generate-canonical-tests.rs b/tools/pdl/src/bin/generate-canonical-tests.rs
index a229f74..cee3c60 100644
--- a/tools/pdl/src/bin/generate-canonical-tests.rs
+++ b/tools/pdl/src/bin/generate-canonical-tests.rs
@@ -60,6 +60,8 @@
                 eprintln!("Skipping packet {}", test_packet);
                 continue;
             }
+            eprintln!("Generating tests for packet {}", test_packet);
+
             let parse_test_name = format_ident!(
                 "test_parse_{}_vector_{}_0x{}",
                 test_packet,
@@ -104,7 +106,7 @@
                     let builder: #module::#builder_name = serde_json::from_str(#json)
                         .expect("Could not create builder from canonical JSON data");
                     let packet = builder.build();
-                    let packed = #packed;
+                    let packed: Vec<u8> = #packed;
                     assert_eq!(packet.to_vec(), packed);
                 }
             });
@@ -131,5 +133,29 @@
     let module_name = std::env::args().nth(2).expect("Need name for the generated module");
     // TODO(mgeisler): remove the `packet_names` argument when we
     // support all canonical packets.
-    generate_unit_tests(&input_path, &["Packet_Scalar_Field", "Packet_Enum_Field"], &module_name);
+    generate_unit_tests(
+        &input_path,
+        &[
+            "Packet_Scalar_Field",
+            "Packet_Enum_Field",
+            "Packet_Enum8_Field",
+            "Packet_Array_Field_ByteElement_ConstantSize",
+            "Packet_Array_Field_ByteElement_UnknownSize",
+            "Packet_Array_Field_EnumElement",
+            "Packet_Array_Field_EnumElement_ConstantSize",
+            "Packet_Array_Field_EnumElement_UnknownSize",
+            "Packet_Array_Field_ScalarElement",
+            "Packet_Array_Field_ScalarElement_ConstantSize",
+            "Packet_Array_Field_ScalarElement_UnknownSize",
+            "Packet_Array_Field_SizedElement_ConstantSize",
+            "Packet_Array_Field_SizedElement_UnknownSize",
+            "Packet_Array_Field_UnsizedElement_ConstantSize",
+            "Packet_Array_Field_UnsizedElement_UnknownSize",
+            "Packet_Array_Field_UnsizedElement_VariableCount",
+            "Packet_Array_Field_UnsizedElement_VariableSize",
+            "Packet_Size_Field",
+            "Packet_Count_Field",
+        ],
+        &module_name,
+    );
 }
diff --git a/tools/pdl/tests/canonical/be_rust_test_file.pdl b/tools/pdl/tests/canonical/be_rust_test_file.pdl
index 73dabd8..49330c6 100644
--- a/tools/pdl/tests/canonical/be_rust_test_file.pdl
+++ b/tools/pdl/tests/canonical/be_rust_test_file.pdl
@@ -41,3 +41,75 @@
     a: Enum7,
     c: 57,
 }
+
+// Array fields
+// Array element types
+
+// The parser must be able to handle bit fields with size fields
+// up to 64 bits wide.  The parser should generate a static size guard.
+packet Packet_Size_Field {
+    _size_(b): 3,
+    a: 61,
+    b: 8[],
+}
+
+
+// The parser must be able to handle bit fields with count fields
+// up to 64 bits wide.  The parser should generate a static size guard.
+packet Packet_Count_Field {
+    _count_(b): 3,
+    a: 61,
+    b: 8[],
+}
+
+packet Packet_Array_Field_ByteElement_ConstantSize {
+    array: 8[4],
+}
+
+packet Packet_Array_Field_ByteElement_UnknownSize {
+    array: 8[],
+}
+
+packet Packet_Array_Field_ScalarElement_ConstantSize {
+    array: 16[4],
+}
+
+packet Packet_Array_Field_ScalarElement_UnknownSize {
+    array: 16[],
+}
+
+packet Packet_Array_Field_EnumElement_ConstantSize {
+    array: Enum16[4],
+}
+
+packet Packet_Array_Field_EnumElement_UnknownSize {
+    array: Enum16[],
+}
+
+packet Packet_Array_Field_SizedElement_ConstantSize {
+    array: SizedStruct[4],
+}
+
+packet Packet_Array_Field_SizedElement_UnknownSize {
+    array: SizedStruct[],
+}
+
+packet Packet_Array_Field_UnsizedElement_ConstantSize {
+    array: UnsizedStruct[4],
+}
+
+packet Packet_Array_Field_UnsizedElement_VariableSize {
+    _size_(array) : 4,
+    _reserved_: 4,
+    array: UnsizedStruct[],
+}
+
+packet Packet_Array_Field_UnsizedElement_VariableCount {
+    _count_(array) : 4,
+    _reserved_: 4,
+    array: UnsizedStruct[],
+}
+
+packet Packet_Array_Field_UnsizedElement_UnknownSize {
+    array: UnsizedStruct[],
+}
diff --git a/tools/pdl/tests/canonical/le_rust_test_file.pdl b/tools/pdl/tests/canonical/le_rust_test_file.pdl
index 22c1692..50ec65b 100644
--- a/tools/pdl/tests/canonical/le_rust_test_file.pdl
+++ b/tools/pdl/tests/canonical/le_rust_test_file.pdl
@@ -41,3 +41,75 @@
     a: Enum7,
     c: 57,
 }
+
+// Array fields
+// Array element types
+
+// The parser must be able to handle bit fields with size fields
+// up to 64 bits wide.  The parser should generate a static size guard.
+packet Packet_Size_Field {
+    _size_(b): 3,
+    a: 61,
+    b: 8[],
+}
+
+
+// The parser must be able to handle bit fields with count fields
+// up to 64 bits wide.  The parser should generate a static size guard.
+packet Packet_Count_Field {
+    _count_(b): 3,
+    a: 61,
+    b: 8[],
+}
+
+packet Packet_Array_Field_ByteElement_ConstantSize {
+    array: 8[4],
+}
+
+packet Packet_Array_Field_ByteElement_UnknownSize {
+    array: 8[],
+}
+
+packet Packet_Array_Field_ScalarElement_ConstantSize {
+    array: 16[4],
+}
+
+packet Packet_Array_Field_ScalarElement_UnknownSize {
+    array: 16[],
+}
+
+packet Packet_Array_Field_EnumElement_ConstantSize {
+    array: Enum16[4],
+}
+
+packet Packet_Array_Field_EnumElement_UnknownSize {
+    array: Enum16[],
+}
+
+packet Packet_Array_Field_SizedElement_ConstantSize {
+    array: SizedStruct[4],
+}
+
+packet Packet_Array_Field_SizedElement_UnknownSize {
+    array: SizedStruct[],
+}
+
+packet Packet_Array_Field_UnsizedElement_ConstantSize {
+    array: UnsizedStruct[4],
+}
+
+packet Packet_Array_Field_UnsizedElement_VariableSize {
+    _size_(array) : 4,
+    _reserved_: 4,
+    array: UnsizedStruct[],
+}
+
+packet Packet_Array_Field_UnsizedElement_VariableCount {
+    _count_(array) : 4,
+    _reserved_: 4,
+    array: UnsizedStruct[],
+}
+
+packet Packet_Array_Field_UnsizedElement_UnknownSize {
+    array: UnsizedStruct[],
+}