1package com.android.server.devicepolicy;
2
3import static android.app.admin.SecurityLog.TAG_ADB_SHELL_CMD;
4
5import android.app.admin.SecurityLog.SecurityEvent;
6import android.os.Parcel;
7import android.test.suitebuilder.annotation.SmallTest;
8import android.util.EventLog;
9
10import java.io.IOException;
11import java.util.ArrayList;
12import java.util.List;
13
14@SmallTest
15public class SecurityEventTest extends DpmTestBase {
16    private static long ID = 549;
17    private static String DATA = "adb shell some_command";
18
19    public void testSecurityEventId() {
20        SecurityEvent event = buildSecurityEvents(1 /* generate a single event */, ID).get(0);
21        assertEquals(ID, event.getId());
22        event.setId(20);
23        assertEquals(20, event.getId());
24    }
25
26    public void testSecurityEventParceling() {
27        // GIVEN an event.
28        SecurityEvent event = buildSecurityEvents(1 /* generate a single event */, ID).get(0);
29        // WHEN parceling the event.
30        Parcel p = Parcel.obtain();
31        p.writeParcelable(event, 0);
32        p.setDataPosition(0);
33        SecurityEvent unparceledEvent = p.readParcelable(SecurityEventTest.class.getClassLoader());
34        p.recycle();
35        // THEN the event state is preserved.
36        assertEquals(event.getTag(), unparceledEvent.getTag());
37        assertEquals(event.getData(), unparceledEvent.getData());
38        assertEquals(event.getTimeNanos(), unparceledEvent.getTimeNanos());
39        assertEquals(event.getId(), unparceledEvent.getId());
40    }
41
42    private List<SecurityEvent> buildSecurityEvents(int numEvents, long id) {
43        // Write an event to the EventLog.
44        for (int i = 0; i < numEvents; i++) {
45            EventLog.writeEvent(TAG_ADB_SHELL_CMD, DATA + "_" + i);
46        }
47        List<EventLog.Event> events = new ArrayList<>();
48        try {
49            EventLog.readEvents(new int[]{TAG_ADB_SHELL_CMD}, events);
50        } catch (IOException e) {
51            fail("Reading a test event from storage failed: " + e);
52        }
53        assertTrue("Unexpected number of events read from the log.", events.size() >= numEvents);
54        // Read events generated by test, from the end of the log.
55        List<SecurityEvent> securityEvents = new ArrayList<>();
56        for (int i = events.size() - numEvents; i < events.size(); i++) {
57          securityEvents.add(new SecurityEvent(id++, events.get(i).getBytes()));
58        }
59        return securityEvents;
60    }
61}
62