1f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme/** 2f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * Copyright (c) 2016, The Android Open Source Project 3f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * 4f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * Licensed under the Apache License, Version 2.0 (the "License"); 5f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * you may not use this file except in compliance with the License. 6f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * You may obtain a copy of the License at 7f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * 8f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * http://www.apache.org/licenses/LICENSE-2.0 9f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * 10f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * Unless required by applicable law or agreed to in writing, software 11f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * distributed under the License is distributed on an "AS IS" BASIS, 12f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * See the License for the specific language governing permissions and 14f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme * limitations under the License. 15f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme */ 16f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 17f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemepackage com.android.server.utils; 18f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 19f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport static com.android.server.utils.PriorityDump.dump; 20f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 21f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport static org.junit.Assert.assertSame; 22f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport static org.mockito.Matchers.eq; 23f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport static org.mockito.Matchers.same; 24f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport static org.mockito.Mockito.verify; 25f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 26f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport android.platform.test.annotations.Presubmit; 27f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport android.support.test.filters.SmallTest; 28f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport com.android.server.utils.PriorityDump.PriorityDumper; 29f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 30f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport org.junit.Before; 31f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport org.junit.Test; 32f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport org.junit.runner.RunWith; 33f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport org.junit.runners.JUnit4; 34f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport org.mockito.Mock; 35f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport org.mockito.MockitoAnnotations; 36f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 37f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport java.io.FileDescriptor; 38f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemeimport java.io.PrintWriter; 39f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 40f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme@SmallTest 41f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme@Presubmit 42f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme@RunWith(JUnit4.class) 43f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Lemepublic class PriorityDumpTest { 44f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 45f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme private static final String[] EMPTY_ARGS = {}; 46f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 47f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Mock 48f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme private PriorityDumper mDumper; 49f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Mock 50f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme private PrintWriter mPw; 51f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 52f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme private final FileDescriptor mFd = FileDescriptor.err; 53f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 54f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Before 55f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void setup() { 56f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme MockitoAnnotations.initMocks(this); 57f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 58f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 59f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 60f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testNullArgs() { 61f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, null); 62f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dump(same(mFd), same(mPw), eq(null)); 63f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 64f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 65f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 66f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testNoArgs() { 67f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, EMPTY_ARGS); 68f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dump(same(mFd), same(mPw), same(EMPTY_ARGS)); 69f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 70f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 71f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 72f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testNonPriorityArgs() { 73f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme final String[] args = { 74f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--dumb_priority" 75f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }; 76f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, args); 77f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dump(same(mFd), same(mPw), same(args)); 78f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 79f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 80f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 81f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testMissingPriority() { 82f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme final String[] args = { 83f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--dump_priority" 84f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }; 85f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, args); 86f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dump(same(mFd), same(mPw), same(args)); 87f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 88f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 89f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 90f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testInvalidPriorityNoExtraArgs() { 91f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme final String[] args = { 92f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--dump_priority", "SUPER_HIGH" 93f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }; 94f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, args); 95f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dump(same(mFd), same(mPw), same(args)); 96f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 97f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 98f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 99f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testInvalidPriorityExtraArgs() { 100f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme final String[] args = { 101f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--dump_priority", "SUPER_HIGH", "--high", "--five" 102f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }; 103f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, args); 104f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dump(same(mFd), same(mPw), same(args)); 105f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 106f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 107f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 108f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testNoPriorityCallsAllMethods() { 109f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme final String[] args = { 110f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "1", "2", "3" 111f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }; 112f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 113f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme // Cannot use mDumper here because it would mock the dump() call. 114f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme final FakeDumper fakeDumper = new FakeDumper(); 115f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 116f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(fakeDumper, mFd, mPw, args); 117f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 118f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme assertSame(mFd, fakeDumper.criticalFd); 119f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme assertSame(mPw, fakeDumper.criticalPw); 120f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme assertSame(args, fakeDumper.criticalArgs); 121f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme assertSame(mFd, fakeDumper.highFd); 122f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme assertSame(mPw, fakeDumper.highPw); 123f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme assertSame(args, fakeDumper.highArgs); 124f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme assertSame(mFd, fakeDumper.normalFd); 125f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme assertSame(mPw, fakeDumper.normalPw); 126f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme assertSame(args, fakeDumper.normalArgs); 127f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 128f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 129f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 130f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testCriticalNoExtraArgs() { 131f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, new String[] { 132f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--dump_priority", "CRITICAL" 133f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }); 134f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dumpCritical(same(mFd), same(mPw), eq(EMPTY_ARGS)); 135f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 136f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 137f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 138f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testCriticalExtraArgs() { 139f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, new String[] { 140f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--dump_priority", "CRITICAL", "--high", "--five" 141f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }); 142f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dumpCritical(same(mFd), same(mPw), eq(new String[] { 143f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--high", "--five" 144f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme })); 145f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 146f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 147f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 148f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testHighNoExtraArgs() { 149f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, new String[] { 150f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--dump_priority", "HIGH" 151f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }); 152f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dumpHigh(same(mFd), same(mPw), eq(EMPTY_ARGS)); 153f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 154f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 155f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 156f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testHighExtraArgs() { 157f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, new String[] { 158f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--dump_priority", "HIGH", "--high", "--five" 159f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }); 160f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dumpHigh(same(mFd), same(mPw), eq(new String[] { 161f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--high", "--five" 162f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme })); 163f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 164f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 165f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 166f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testNormalNoExtraArgs() { 167f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, new String[] { 168f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--dump_priority", "NORMAL" 169f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }); 170f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dumpNormal(same(mFd), same(mPw), eq(EMPTY_ARGS)); 171f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 172f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 173f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Test 174f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void testNormalExtraArgs() { 175f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme dump(mDumper, mFd, mPw, new String[] { 176f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--dump_priority", "NORMAL", "--high", "--five" 177f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme }); 178f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme verify(mDumper).dumpNormal(same(mFd), same(mPw), eq(new String[] { 179f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme "--high", "--five" 180f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme })); 181f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 182f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 183f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme private final class FakeDumper implements PriorityDumper { 184f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 185f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme String[] criticalArgs, highArgs, normalArgs; 186f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme FileDescriptor criticalFd, highFd, normalFd; 187f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme PrintWriter criticalPw, highPw, normalPw; 188f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 189f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Override 190f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void dumpCritical(FileDescriptor fd, PrintWriter pw, String[] args) { 191f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme criticalFd = fd; 192f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme criticalPw = pw; 193f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme criticalArgs = args; 194f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 195f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 196f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Override 197f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void dumpHigh(FileDescriptor fd, PrintWriter pw, String[] args) { 198f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme highFd = fd; 199f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme highPw = pw; 200f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme highArgs = args; 201f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 202f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme 203f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme @Override 204f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme public void dumpNormal(FileDescriptor fd, PrintWriter pw, String[] args) { 205f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme normalFd = fd; 206f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme normalPw = pw; 207f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme normalArgs = args; 208f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 209f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme } 210f4006d9b0be123b2a4e874b89eb4a431d3d49c8bFelipe Leme} 211