Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aws
GitHub Repository: aws/aws-cli
Path: blob/develop/tests/unit/customizations/logs/test_startlivetail.py
1569 views
1
# Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
#
3
# Licensed under the Apache License, Version 2.0 (the "License"). You
4
# may not use this file except in compliance with the License. A copy of
5
# the License is located at
6
#
7
# http://aws.amazon.com/apache2.0/
8
#
9
# or in the "license" file accompanying this file. This file is
10
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
# ANY KIND, either express or implied. See the License for the specific
12
# language governing permissions and limitations under the License.
13
from awscli.compat import StringIO
14
from awscli.customizations.logs.startlivetail import (
15
LiveTailLogEventsCollector,
16
LiveTailSessionMetadata,
17
PrintOnlyPrinter,
18
PrintOnlyUI,
19
)
20
from awscli.testutils import mock, unittest
21
22
23
class LiveTailSessionMetadataTest(unittest.TestCase):
24
def setUp(self):
25
self.session_metadata = LiveTailSessionMetadata()
26
27
def test_metadata_update(self):
28
metadata_update = {"sampled": True}
29
self.session_metadata.update_metadata(metadata_update)
30
31
self.assertEqual(metadata_update["sampled"], self.session_metadata.is_sampled)
32
33
34
class PrintOnlyPrinterTest(unittest.TestCase):
35
def setUp(self):
36
self.output = StringIO()
37
self.log_events = []
38
self.printer = PrintOnlyPrinter(self.output, self.log_events)
39
40
def test_print_log_events(self):
41
self.log_events.extend(["First LogEvent", "Second LogEvent", "Third LogEvent"])
42
expected_msg = "\n".join(self.log_events) + "\n"
43
44
self.printer._print_log_events()
45
46
self.output.seek(0)
47
self.assertEqual(expected_msg, self.output.read())
48
self.assertEqual(0, len(self.log_events))
49
50
def test_session_interrupt_while_printing(self):
51
self.log_events.extend(["First LogEvent", "Second LogEvent", "Third LogEvent"])
52
expected_msg = "\n".join(self.log_events) + "\n"
53
54
self.printer.interrupt_session = True
55
self.printer.run()
56
57
self.output.seek(0)
58
self.assertEqual(expected_msg, self.output.read())
59
self.assertEqual(0, len(self.log_events))
60
61
def test_exception_while_printing(self):
62
self.log_events.extend(["First LogEvent", "Second LogEvent", "Third LogEvent"])
63
self.printer._print_log_events = mock.MagicMock(
64
side_effect=BrokenPipeError("BrokenPipe")
65
)
66
67
# No exception should be raised
68
self.printer.run()
69
70
71
class PrintOnlyUITest(unittest.TestCase):
72
def setUp(self):
73
self.output = StringIO()
74
self.log_events = []
75
self.ui = PrintOnlyUI(self.output, self.log_events)
76
77
def test_exit(self):
78
self.ui.exit()
79
80
self.assertEqual(True, self.ui._printer.interrupt_session)
81
82
83
class LiveTailLogEventsCollectorTest(unittest.TestCase):
84
def setUp(self):
85
self.output = StringIO()
86
self.log_events = []
87
self.response_stream = mock.Mock()
88
self.ui = PrintOnlyUI(self.output, self.log_events)
89
self.session_metadata = LiveTailSessionMetadata()
90
self.log_events_collector = LiveTailLogEventsCollector(
91
self.output,
92
self.ui,
93
self.response_stream,
94
self.log_events,
95
self.session_metadata,
96
)
97
98
def test_log_event_collection(self):
99
updates = [
100
{"sessionStart": "The session is started"},
101
{
102
"sessionUpdate": {
103
"sessionMetadata": {"sampled": False},
104
"sessionResults": [
105
{"message": "LogEvent1"},
106
{"message": "LogEvent2"},
107
],
108
}
109
},
110
]
111
self.response_stream.__iter__ = mock.MagicMock(return_value=iter(updates))
112
113
self.log_events_collector._collect_log_events()
114
115
self.assertEqual(2, len(self.log_events))
116
self.assertEqual(["LogEvent1", "LogEvent2"], self.log_events)
117
self.assertIsNone(self.log_events_collector._exception)
118
119
def test_log_event_collection_with_unexpected_update(self):
120
updates = [{"unexpectedUpdate": "The session is started"}]
121
self.response_stream.extend(updates)
122
self.ui.exit = mock.MagicMock()
123
124
self.log_events_collector._collect_log_events()
125
126
self.assertIsNotNone(self.log_events_collector._exception)
127
128
def test_stop_with_exception(self):
129
exception_message = "SessionStreamingException"
130
self.log_events_collector._exception = Exception(exception_message)
131
132
self.log_events_collector.stop()
133
134
self.output.seek(0)
135
self.assertEqual(exception_message + "\n", self.output.read())
136
137
def test_stop_without_exception(self):
138
self.response_stream.close = mock.MagicMock()
139
140
self.log_events_collector.stop()
141
self.response_stream.close.assert_not_called()
142
143