cros_extract_deps: Sort deps and rev_deps in flattened deps graph

This is to make the deps graph output more human readable.

BUG=chromium:917174
TEST=unittests

Change-Id: I20552beb98d889bb0d27efad4b3c9b519d9b926a
Reviewed-on: https://chromium-review.googlesource.com/1441911
Commit-Ready: Ned Nguyen <nednguyen@google.com>
Tested-by: Ned Nguyen <nednguyen@google.com>
Reviewed-by: Chris McDonald <cjmcdonald@chromium.org>
diff --git a/scripts/cros_extract_deps_unittest.py b/scripts/cros_extract_deps_unittest.py
new file mode 100644
index 0000000..865dfc7
--- /dev/null
+++ b/scripts/cros_extract_deps_unittest.py
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+# Copyright 2019 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Test cros_extract_deps."""
+
+from __future__ import print_function
+
+from chromite.lib import cros_test_lib
+from chromite.scripts import cros_extract_deps
+
+
+class FlattenDepTreeTest(cros_test_lib.TestCase):
+  """Tests for cros_extract_deps.FlattenDepTree."""
+
+  def testFlattenDepTreeSimple(self):
+    dep_tree = {
+        'deathstar/darthvader-2.3': {
+            'action': 'merge',
+            'deps': {
+                'deathstar/trooper-1.2': {
+                    'action': 'merge',
+                    'deps': {
+                        'weapon/blasterpistol-2.1': {
+                            'action': 'merge',
+                            'deps': {},
+                            'deptype': 'runtime',
+                        }
+                    },
+                    'deptype': 'runtime',
+                },
+                'deathstar/pilot-2.3': {
+                    'action': 'merge',
+                    'deps': {},
+                    'deptype': 'runtime',
+                },
+                'deathstar/commander-2.3': {
+                    'action': 'merge',
+                    'deps': {},
+                    'deptype': 'runtime',
+                },
+            },
+        },
+    }
+    flatten_dep_tree = {
+        'weapon/blasterpistol-2.1': {
+            'rev_deps': ['deathstar/trooper-1.2'],
+            'category': 'weapon',
+            'version': '2.1',
+            'name': 'blasterpistol',
+            'deps': [],
+            'action': 'merge',
+            'cpes': [],
+            'full_name': 'weapon/blasterpistol-2.1',
+        },
+        'deathstar/darthvader-2.3': {
+            'rev_deps': [],
+            'category': 'deathstar',
+            'version': '2.3',
+            'name': 'darthvader',
+            'deps': [
+                'deathstar/commander-2.3', 'deathstar/pilot-2.3',
+                'deathstar/trooper-1.2',
+            ],
+            'action': 'merge',
+            'cpes': [],
+            'full_name': 'deathstar/darthvader-2.3',
+        },
+        'deathstar/pilot-2.3': {
+            'rev_deps': ['deathstar/darthvader-2.3'],
+            'category': 'deathstar',
+            'version': '2.3',
+            'name': 'pilot',
+            'deps': [],
+            'action': 'merge',
+            'cpes': [],
+            'full_name': 'deathstar/pilot-2.3',
+        },
+        'deathstar/commander-2.3': {
+            'rev_deps': ['deathstar/darthvader-2.3'],
+            'category': 'deathstar',
+            'version': '2.3',
+            'name': 'commander',
+            'deps': [],
+            'action': 'merge',
+            'cpes': [],
+            'full_name': 'deathstar/commander-2.3',
+        },
+        'deathstar/trooper-1.2': {
+            'rev_deps': ['deathstar/darthvader-2.3'],
+            'category': 'deathstar',
+            'version': '1.2',
+            'name': 'trooper',
+            'deps': ['weapon/blasterpistol-2.1'],
+            'action': 'merge',
+            'cpes': [],
+            'full_name': 'deathstar/trooper-1.2',
+        }
+    }
+    self.assertEquals(
+        cros_extract_deps.FlattenDepTree(dep_tree), flatten_dep_tree)