1741143878b23d22cd9cb7b9cba8055179115ce17msarettpackage com.android.server.devicepolicy;
2741143878b23d22cd9cb7b9cba8055179115ce17msarett
3741143878b23d22cd9cb7b9cba8055179115ce17msarettimport static android.app.admin.SecurityLog.TAG_ADB_SHELL_CMD;
4741143878b23d22cd9cb7b9cba8055179115ce17msarett
5741143878b23d22cd9cb7b9cba8055179115ce17msarettimport android.app.admin.SecurityLog.SecurityEvent;
6741143878b23d22cd9cb7b9cba8055179115ce17msarettimport android.os.Parcel;
7741143878b23d22cd9cb7b9cba8055179115ce17msarettimport android.test.suitebuilder.annotation.SmallTest;
8741143878b23d22cd9cb7b9cba8055179115ce17msarettimport android.util.EventLog;
9741143878b23d22cd9cb7b9cba8055179115ce17msarett
10741143878b23d22cd9cb7b9cba8055179115ce17msarettimport java.io.IOException;
11a4083c97d48e8a4f88e2797d7363f141e3d42553Cary Clarkimport java.util.ArrayList;
12f7eb6fc71abd7649d65a877e7a10d1060afc0c88msarettimport java.util.List;
13909d3791f53eae590314992aad82c71fb45e9164Matt Sarett
149e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett@SmallTest
151a85ca5c908b421ea8f07798d56c4481bbc5d5afMatt Sarettpublic class SecurityEventTest extends DpmTestBase {
16da3e9ad894379713cbb66779136ca6877ccac7ddLeon Scroggins III    private static long ID = 549;
17741143878b23d22cd9cb7b9cba8055179115ce17msarett    private static String DATA = "adb shell some_command";
18741143878b23d22cd9cb7b9cba8055179115ce17msarett
19741143878b23d22cd9cb7b9cba8055179115ce17msarett    public void testSecurityEventId() {
202cc7d139786d228bb70be2b988720c4c59329d93Leon Scroggins III        SecurityEvent event = buildSecurityEvents(1 /* generate a single event */, ID).get(0);
21c5560bef14149f4c945a4536988aeba1a16adedcscroggo        assertEquals(ID, event.getId());
22c5560bef14149f4c945a4536988aeba1a16adedcscroggo        event.setId(20);
23c5560bef14149f4c945a4536988aeba1a16adedcscroggo        assertEquals(20, event.getId());
24c5560bef14149f4c945a4536988aeba1a16adedcscroggo    }
25c5560bef14149f4c945a4536988aeba1a16adedcscroggo
263d9d7a7213748761d46ade183e11aa7cb55313c1msarett    public void testSecurityEventParceling() {
27d1ec89b1aca8f37a460a425259a23275f4d9a81dmsarett        // GIVEN an event.
283d9d7a7213748761d46ade183e11aa7cb55313c1msarett        SecurityEvent event = buildSecurityEvents(1 /* generate a single event */, ID).get(0);
293d9d7a7213748761d46ade183e11aa7cb55313c1msarett        // WHEN parceling the event.
303d9d7a7213748761d46ade183e11aa7cb55313c1msarett        Parcel p = Parcel.obtain();
31d1ec89b1aca8f37a460a425259a23275f4d9a81dmsarett        p.writeParcelable(event, 0);
323d9d7a7213748761d46ade183e11aa7cb55313c1msarett        p.setDataPosition(0);
333d9d7a7213748761d46ade183e11aa7cb55313c1msarett        SecurityEvent unparceledEvent = p.readParcelable(SecurityEventTest.class.getClassLoader());
343d9d7a7213748761d46ade183e11aa7cb55313c1msarett        p.recycle();
355406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett        // THEN the event state is preserved.
3610522ff4cfa3cba45881354768f6185fc1109119msarett        assertEquals(event.getTag(), unparceledEvent.getTag());
3710522ff4cfa3cba45881354768f6185fc1109119msarett        assertEquals(event.getData(), unparceledEvent.getData());
383d9d7a7213748761d46ade183e11aa7cb55313c1msarett        assertEquals(event.getTimeNanos(), unparceledEvent.getTimeNanos());
3910522ff4cfa3cba45881354768f6185fc1109119msarett        assertEquals(event.getId(), unparceledEvent.getId());
40d1ec89b1aca8f37a460a425259a23275f4d9a81dmsarett    }
4110522ff4cfa3cba45881354768f6185fc1109119msarett
4210522ff4cfa3cba45881354768f6185fc1109119msarett    private List<SecurityEvent> buildSecurityEvents(int numEvents, long id) {
4310522ff4cfa3cba45881354768f6185fc1109119msarett        // Write an event to the EventLog.
4410522ff4cfa3cba45881354768f6185fc1109119msarett        for (int i = 0; i < numEvents; i++) {
4510522ff4cfa3cba45881354768f6185fc1109119msarett            EventLog.writeEvent(TAG_ADB_SHELL_CMD, DATA + "_" + i);
4610522ff4cfa3cba45881354768f6185fc1109119msarett        }
4710522ff4cfa3cba45881354768f6185fc1109119msarett        List<EventLog.Event> events = new ArrayList<>();
485406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett        try {
495406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett            EventLog.readEvents(new int[]{TAG_ADB_SHELL_CMD}, events);
505406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett        } catch (IOException e) {
515406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett            fail("Reading a test event from storage failed: " + e);
525406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett        }
53d1ec89b1aca8f37a460a425259a23275f4d9a81dmsarett        assertTrue("Unexpected number of events read from the log.", events.size() >= numEvents);
545406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett        // Read events generated by test, from the end of the log.
555406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett        List<SecurityEvent> securityEvents = new ArrayList<>();
565406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett        for (int i = events.size() - numEvents; i < events.size(); i++) {
575406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett          securityEvents.add(new SecurityEvent(id++, events.get(i).getBytes()));
585406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett        }
595406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett        return securityEvents;
605406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett    }
615406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett}
625406d6f39ad042e7a0a0d4ea16beca4fe2b66492msarett