blob: 78ef9b3c607f770c9d81735098cbc5c4f1dae2a0 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.ahat;
import com.android.ahat.heapdump.AhatInstance;
import com.android.ahat.heapdump.AhatSnapshot;
import com.android.ahat.heapdump.Reachability;
import com.android.ahat.heapdump.Site;
import java.io.IOException;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
public class SiteTest {
@Test
public void objectsAllocatedAtKnownSites() throws IOException {
TestDump dump = TestDump.getTestDump();
AhatSnapshot snapshot = dump.getAhatSnapshot();
AhatInstance oKnownSite = dump.getDumpedAhatInstance("objectAllocatedAtKnownSite");
Site sKnownSite = oKnownSite.getSite();
assertEquals("DumpedStuff.java", sKnownSite.getFilename());
assertEquals("allocateObjectAtKnownSite", sKnownSite.getMethodName());
assertEquals(29, sKnownSite.getLineNumber());
assertSame(sKnownSite, snapshot.getSite(sKnownSite.getId()));
AhatInstance oKnownSubSite = dump.getDumpedAhatInstance("objectAllocatedAtKnownSubSite");
Site sKnownSubSite = oKnownSubSite.getSite();
assertEquals("DumpedStuff.java", sKnownSubSite.getFilename());
assertEquals("allocateObjectAtKnownSubSite", sKnownSubSite.getMethodName());
assertEquals(37, sKnownSubSite.getLineNumber());
assertSame(sKnownSubSite, snapshot.getSite(sKnownSubSite.getId()));
Site sKnownSubSiteParent = sKnownSubSite.getParent();
assertEquals("DumpedStuff.java", sKnownSubSiteParent.getFilename());
assertEquals("allocateObjectAtKnownSite", sKnownSubSiteParent.getMethodName());
assertEquals(30, sKnownSubSiteParent.getLineNumber());
assertSame(sKnownSubSiteParent, snapshot.getSite(sKnownSubSiteParent.getId()));
assertNotSame(sKnownSite, sKnownSubSiteParent);
assertSame(sKnownSite.getParent(), sKnownSubSiteParent.getParent());
Site sKnownSiteParent = sKnownSite.getParent();
assertEquals("DumpedStuff.java", sKnownSiteParent.getFilename());
assertEquals("<init>", sKnownSiteParent.getMethodName());
assertEquals(45, sKnownSiteParent.getLineNumber());
assertSame(sKnownSiteParent, snapshot.getSite(sKnownSiteParent.getId()));
AhatInstance oObfSuperSite = dump.getDumpedAhatInstance("objectAllocatedAtObfSuperSite");
Site sObfSuperSite = oObfSuperSite.getSite();
assertEquals("SuperDumpedStuff.java", sObfSuperSite.getFilename());
assertEquals("allocateObjectAtObfSuperSite", sObfSuperSite.getMethodName());
assertEquals(22, sObfSuperSite.getLineNumber());
assertSame(sObfSuperSite, snapshot.getSite(sObfSuperSite.getId()));
AhatInstance oUnObfSuperSite = dump.getDumpedAhatInstance("objectAllocatedAtUnObfSuperSite");
Site sUnObfSuperSite = oUnObfSuperSite.getSite();
assertEquals("SuperDumpedStuff.java", sUnObfSuperSite.getFilename());
assertEquals("allocateObjectAtUnObfSuperSite", sUnObfSuperSite.getMethodName());
assertEquals(26, sUnObfSuperSite.getLineNumber());
assertSame(sUnObfSuperSite, snapshot.getSite(sUnObfSuperSite.getId()));
AhatInstance oOverriddenSite = dump.getDumpedAhatInstance("objectAllocatedAtOverriddenSite");
Site sOverriddenSite = oOverriddenSite.getSite();
assertEquals("DumpedStuff.java", sOverriddenSite.getFilename());
assertEquals("allocateObjectAtOverriddenSite", sOverriddenSite.getMethodName());
assertEquals(41, sOverriddenSite.getLineNumber());
assertSame(sOverriddenSite, snapshot.getSite(sOverriddenSite.getId()));
}
@Test
public void objectsInfos() throws IOException {
// Verify that objectsInfos only include counts for --retained instances.
// We do this by counting the number of 'Reference' instances allocated at
// the Site where reachabilityReferenceChain is allocated in DumpedStuff:
//
// reachabilityReferenceChain = new Reference(
// new SoftReference(
// new Reference(
// new WeakReference(
// new SoftReference(
// new PhantomReference(new Object(), referenceQueue))))));
//
// The first instance of 'Reference' is strongly reachable, the second is
// softly reachable. So if --retained is 'strong', we should see just the
// one reference, but if --retained is 'soft', we should see both of them.
TestDump dumpStrong = TestDump.getTestDump("test-dump.hprof",
"test-dump-base.hprof",
"test-dump.map",
Reachability.STRONG);
AhatInstance refStrong = dumpStrong.getDumpedAhatInstance("reachabilityReferenceChain");
Site siteStrong = refStrong.getSite();
long numReferenceStrong = 0;
for (Site.ObjectsInfo info : siteStrong.getObjectsInfos()) {
if (info.heap == refStrong.getHeap() && info.classObj == refStrong.getClassObj()) {
numReferenceStrong = info.numInstances;
break;
}
}
assertEquals(1, numReferenceStrong);
TestDump dumpSoft = TestDump.getTestDump("test-dump.hprof",
"test-dump-base.hprof",
"test-dump.map",
Reachability.SOFT);
AhatInstance refSoft = dumpSoft.getDumpedAhatInstance("reachabilityReferenceChain");
Site siteSoft = refSoft.getSite();
long numReferenceSoft = 0;
for (Site.ObjectsInfo info : siteSoft.getObjectsInfos()) {
if (info.heap == refSoft.getHeap() && info.classObj == refSoft.getClassObj()) {
numReferenceSoft = info.numInstances;
break;
}
}
assertEquals(2, numReferenceSoft);
}
}