Add validation of db before and after modification

Add various consistency checks of the database:
- no duplicate extension SDKs
- no duplicate module requirements in one SDK
- no version requirements "moving backwards"

..with associated tests.

Also add verification of the checked in database to presubmit tests
(the build of the binarypb should also fail).

Bug: 173188089
Test: atest gen_sdk_test
Change-Id: I10436cdde1e8829065d77be53d5f10b7264a5a58
diff --git a/gen_sdk/gen_sdk_test.sh b/gen_sdk/gen_sdk_test.sh
index 80e21ca..bdf35b7 100644
--- a/gen_sdk/gen_sdk_test.sh
+++ b/gen_sdk/gen_sdk_test.sh
@@ -42,3 +42,41 @@
   diff -u0 testdata/test_extensions_db.textpb extensions_db.textpb
 }
 test_new_sdk
+
+# Verifies the tool won't allow bogus SDK updates
+function test_validate() {
+  set +e
+
+  rm -f extensions_db.textpb && echo bogus > extensions_db.textpb
+  if gen_sdk --action validate; then
+    echo "expected validate to fail on bogus db"
+    exit 1
+  fi
+
+  rm -f extensions_db.textpb && touch extensions_db.textpb
+  gen_sdk --action new_sdk --sdk 1 --modules MEDIA_PROVIDER
+  if gen_sdk --action new_sdk --sdk 1 --modules SDK_EXTENSIONS; then
+    echo "FAILED: expected duplicate sdk numbers to fail"
+    echo "DB:"
+    cat extensions_db.textpb
+    exit 1
+  fi
+
+  if gen_sdk --action validate --database testdata/dupe_req.textpb; then
+    echo "FAILED: expected duplicate module in one sdk level to fail"
+    exit 1
+  fi
+
+  if gen_sdk --action validate --database testdata/backward_req.textpb; then
+    echo "FAILED: expect version requirement going backward to fail"
+    exit 1
+  fi
+
+  set -e
+}
+test_validate
+
+function test_checked_in_db() {
+  gen_sdk --action validate --database extensions_db.textpb
+}
+test_checked_in_db