blob: d39a680b4d047a73248ae88bb4c9cfd088829122 [file] [log] [blame]
Jack Hee4787832017-01-24 22:31:18 -08001# Copyright (C) 2016 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4# use this file except in compliance with the License. You may obtain a copy of
5# the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations under
13# the License.
14import unittest
15import logging
16import os
17import sys
18import tempfile
19import shutil
20from importlib import import_module
21
22from google.protobuf import text_format
23
24from acts.libs.proto.proto_utils import compile_proto
25from acts.libs.proto.proto_utils import compile_import_proto
26
27TEST_PROTO_NAME = "acts_proto_utils_test.proto"
28TEST_PROTO_GENERATED_NAME = "acts_proto_utils_test_pb2"
29TEST_PROTO_DATA_NAME = "acts_proto_utils_test_data.txt"
30TEST_NAME = "test_name"
31TEST_ID = 42
32
33
34class BtMetricsUtilsTest(unittest.TestCase):
35 """This test class has unit tests for the implementation of everything
36 under acts.controllers.android_device.
37 """
38
39 def setUp(self):
40 # Set log_path to logging since acts logger setup is not called.
41 if not hasattr(logging, "log_path"):
42 setattr(logging, "log_path", "/tmp/logs")
43 # Creates a temp dir to be used by tests in this test class.
44 self.tmp_dir = tempfile.mkdtemp()
45
46 def tearDown(self):
47 """Removes the temp dir.
48 """
49 shutil.rmtree(self.tmp_dir)
50
51 def getResource(self, relative_path_to_test):
52 return os.path.join(
53 os.path.dirname(os.path.realpath(__file__)), relative_path_to_test)
54
55 def compare_test_entry(self, entry, name, id, nested):
56 self.assertEqual(entry.name, name)
57 self.assertEqual(entry.id, id)
58 self.assertEqual(len(entry.nested), len(nested))
59 for i in range(len(entry.nested)):
60 self.assertEqual(entry.nested[i].name, nested[i][0])
61 self.assertEqual(entry.nested[i].type, nested[i][1])
62
63 def test_compile_proto(self):
64 proto_path = self.getResource(TEST_PROTO_NAME)
65 output_module_name = compile_proto(proto_path, self.tmp_dir)
66 self.assertIsNotNone(output_module_name)
67 self.assertEqual(output_module_name, TEST_PROTO_GENERATED_NAME)
68 self.assertTrue(
69 os.path.exists(
70 os.path.join(self.tmp_dir, output_module_name) + ".py"))
71 sys.path.append(self.tmp_dir)
72 bt_metrics_utils_test_pb2 = None
73 try:
74 bt_metrics_utils_test_pb2 = import_module(output_module_name)
75 except ImportError:
76 self.fail("Cannot import generated py-proto %s" %
77 (output_module_name))
78 test_proto = bt_metrics_utils_test_pb2.TestProto()
79 test_proto_entry = test_proto.entries.add()
80 test_proto_entry.id = TEST_ID
81 test_proto_entry.name = TEST_NAME
82 self.assertEqual(test_proto.entries[0].id, TEST_ID)
83 self.assertEqual(test_proto.entries[0].name, TEST_NAME)
84
85 def test_parse_proto(self):
86 proto_path = self.getResource(TEST_PROTO_NAME)
87 output_module = compile_import_proto(self.tmp_dir, proto_path)
88 self.assertIsNotNone(output_module)
89 AAA = output_module.TestProtoEntry.NestedType.AAA
90 BBB = output_module.TestProtoEntry.NestedType.BBB
91 test_proto = output_module.TestProto()
92 proto_data_path = self.getResource(TEST_PROTO_DATA_NAME)
93 self.assertTrue(os.path.exists(proto_data_path))
94 self.assertTrue(os.path.isfile(proto_data_path))
95 with open(proto_data_path) as f:
96 text_format.Merge(f.read(), test_proto)
97 self.assertEqual(len(test_proto.entries), 2)
98 entry1 = test_proto.entries[0]
99 self.compare_test_entry(entry1, "TestName1", 42,
100 [("NestedA", AAA), ("NestedB", BBB),
101 ("NestedA", AAA)])
102 entry2 = test_proto.entries[1]
103 self.compare_test_entry(entry2, "TestName2", 43,
104 [("NestedB", BBB), ("NestedA", AAA),
105 ("NestedB", BBB)])