Merge "Build license_checker and test_mapping with Soong." into main
diff --git a/tools/external_crates/cargo_embargo.json b/tools/external_crates/cargo_embargo.json
index ccaf13c..6000c7d 100644
--- a/tools/external_crates/cargo_embargo.json
+++ b/tools/external_crates/cargo_embargo.json
@@ -14,18 +14,22 @@
       "add_toplevel_block": "google_metadata/cargo_embargo_protobuf.bp",
       "patch": "google_metadata/patches/Android.bp.patch"
     },
+    "license_checker": {
+      "device_supported": false
+    },
     "name_and_version": {
       "device_supported": false
     },
     "repo_config": {
       "device_supported": false
+    },
+    "test_mapping": {
+      "device_supported": false
     }
   },
   "tests": true,
   "workspace": true,
   "workspace_excludes": [
-    "crate_tool",
-    "license_checker",
-    "test_mapping"
+    "crate_tool"
   ]
 }
diff --git a/tools/external_crates/license_checker/Android.bp b/tools/external_crates/license_checker/Android.bp
new file mode 100644
index 0000000..96a6d49
--- /dev/null
+++ b/tools/external_crates/license_checker/Android.bp
@@ -0,0 +1,42 @@
+// This file is generated by cargo_embargo.
+// Do not modify this file after the first "rust_*" or "genrule" module
+// because the changes will be overridden on upgrade.
+// Content before the first "rust_*" or "genrule" module is preserved.
+
+package {
+    default_team: "trendy_team_android_rust",
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+rust_library_host {
+    name: "liblicense_checker",
+    crate_name: "license_checker",
+    cargo_env_compat: true,
+    cargo_pkg_version: "0.1.0",
+    crate_root: "src/lib.rs",
+    edition: "2021",
+    rustlibs: [
+        "libglob",
+        "libspdx",
+        "libthiserror",
+    ],
+}
+
+rust_test_host {
+    name: "license_checker_test_src_lib",
+    crate_name: "license_checker",
+    cargo_env_compat: true,
+    cargo_pkg_version: "0.1.0",
+    crate_root: "src/lib.rs",
+    test_suites: ["general-tests"],
+    auto_gen_config: true,
+    test_options: {
+        unit_test: true,
+    },
+    edition: "2021",
+    rustlibs: [
+        "libglob",
+        "libspdx",
+        "libthiserror",
+    ],
+}
diff --git a/tools/external_crates/license_checker/src/lib.rs b/tools/external_crates/license_checker/src/lib.rs
index e188e13..1e0fb2e 100644
--- a/tools/external_crates/license_checker/src/lib.rs
+++ b/tools/external_crates/license_checker/src/lib.rs
@@ -12,6 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+//! A crate for finding license files in crates that satisfy their SPDX license expressions.
+
 use std::{
     collections::{BTreeMap, BTreeSet},
     fs::read_to_string,
@@ -26,6 +28,7 @@
 mod file_name_checker;
 mod license_file_finder;
 
+#[allow(missing_docs)]
 #[derive(Error, Debug)]
 pub enum LicenseCheckerError {
     #[error("Couldn't convert filesystem path {} (lossy) to a string for globbing.", .0.to_string_lossy())]
@@ -52,12 +55,21 @@
     Unknown,
 }
 
+/// The result of license file verification, containing a set of acceptable licenses, and the
+/// corresponding license files, if present.
 #[derive(Debug)]
 pub struct LicenseState {
+    /// Unsatisfied licenses. These are licenses that are required by evaluation of SPDX license in
+    /// Cargo.toml, but for which no matching license file was found.
     pub unsatisfied: BTreeSet<LicenseReq>,
+    /// Licenses for which a license file file was found, and the path to that file.
     pub satisfied: BTreeMap<LicenseReq, PathBuf>,
 }
 
+/// Evaluates the license expression for a crate at a given path and returns a minimal set of
+/// acceptable licenses, and whether we could find a matching license file for each one.
+///
+/// Returns an error if the licensing for the crate requires us to adopt unacceptable licenses.
 pub fn find_licenses(
     crate_path: impl AsRef<Path>,
     crate_name: &str,
diff --git a/tools/external_crates/test_mapping/Android.bp b/tools/external_crates/test_mapping/Android.bp
new file mode 100644
index 0000000..2043b0a
--- /dev/null
+++ b/tools/external_crates/test_mapping/Android.bp
@@ -0,0 +1,48 @@
+// This file is generated by cargo_embargo.
+// Do not modify this file after the first "rust_*" or "genrule" module
+// because the changes will be overridden on upgrade.
+// Content before the first "rust_*" or "genrule" module is preserved.
+
+package {
+    default_team: "trendy_team_android_rust",
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+rust_library_host {
+    name: "libtest_mapping",
+    crate_name: "test_mapping",
+    cargo_env_compat: true,
+    cargo_pkg_version: "0.1.0",
+    crate_root: "src/lib.rs",
+    edition: "2021",
+    rustlibs: [
+        "libandroid_bp",
+        "libjson_strip_comments",
+        "librooted_path",
+        "libserde",
+        "libserde_json",
+        "libthiserror",
+    ],
+}
+
+rust_test_host {
+    name: "test_mapping_test_src_lib",
+    crate_name: "test_mapping",
+    cargo_env_compat: true,
+    cargo_pkg_version: "0.1.0",
+    crate_root: "src/lib.rs",
+    test_suites: ["general-tests"],
+    auto_gen_config: true,
+    test_options: {
+        unit_test: true,
+    },
+    edition: "2021",
+    rustlibs: [
+        "libandroid_bp",
+        "libjson_strip_comments",
+        "librooted_path",
+        "libserde",
+        "libserde_json",
+        "libthiserror",
+    ],
+}
diff --git a/tools/external_crates/test_mapping/src/lib.rs b/tools/external_crates/test_mapping/src/lib.rs
index b9a16db..4dc19fb 100644
--- a/tools/external_crates/test_mapping/src/lib.rs
+++ b/tools/external_crates/test_mapping/src/lib.rs
@@ -33,6 +33,7 @@
 use rooted_path::RootedPath;
 use thiserror::Error;
 
+#[allow(missing_docs)]
 #[derive(Error, Debug)]
 pub enum TestMappingError {
     #[error("Blueprint file {0} not found")]
@@ -55,10 +56,14 @@
     GrepParseError(String),
 }
 
+/// A parsed TEST_MAPPING file
 #[derive(Debug)]
 pub struct TestMapping {
+    /// The path of the crate directory.
     path: RootedPath,
+    /// The contents of TEST_MAPPING
     json: TestMappingJson,
+    /// The parsed Android.bp file
     bp: BluePrint,
 }