blob: ce6658f9e972cd8a0fbe5aafc1372c653b0bd6ed [file] [log] [blame]
/*
* Copyright (C) 2009 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 android.os.cts;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestTargets;
import dalvik.annotation.ToBeFixed;
import android.content.Context;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.ParcelFileDescriptor.AutoCloseInputStream;
import android.test.AndroidTestCase;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
@TestTargetClass(ParcelFileDescriptor.class)
public class ParcelFileDescriptorTest extends AndroidTestCase {
private static final long DURATION = 100l;
private TestThread mTestThread;
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "ParcelFileDescriptor",
args = {android.os.ParcelFileDescriptor.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "open",
args = {java.io.File.class, int.class}
)
})
public void testConstructorAndOpen() throws Exception {
ParcelFileDescriptor tempFile = makeParcelFileDescriptor(getContext());
ParcelFileDescriptor pfd = new ParcelFileDescriptor(tempFile);
AutoCloseInputStream in = new AutoCloseInputStream(pfd);
try {
// read the data that was wrote previously
assertEquals(0, in.read());
assertEquals(1, in.read());
assertEquals(2, in.read());
assertEquals(3, in.read());
} finally {
in.close();
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "fromSocket",
args = {java.net.Socket.class}
)
public void testFromSocket() throws Throwable {
final int PORT = 12222;
final int DATA = 1;
mTestThread = new TestThread(new Runnable() {
public void run() {
try {
ServerSocket ss;
ss = new ServerSocket(PORT);
Socket sSocket = ss.accept();
OutputStream out = sSocket.getOutputStream();
out.write(DATA);
Thread.sleep(DURATION);
out.close();
} catch (Exception e) {
mTestThread.setThrowable(e);
}
}
});
mTestThread.start();
Thread.sleep(DURATION);
Socket socket;
socket = new Socket(InetAddress.getLocalHost(), PORT);
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
AutoCloseInputStream in = new AutoCloseInputStream(pfd);
assertEquals(DATA, in.read());
in.close();
socket.close();
pfd.close();
mTestThread.joinAndCheck(DURATION * 2);
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "toString",
args = {}
)
public void testToString() {
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
assertNotNull(pfd.toString());
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "writeToParcel",
args = {android.os.Parcel.class, int.class}
)
public void testWriteToParcel() throws Exception {
ParcelFileDescriptor pf = makeParcelFileDescriptor(getContext());
Parcel pl = Parcel.obtain();
pf.writeToParcel(pl, ParcelFileDescriptor.PARCELABLE_WRITE_RETURN_VALUE);
pl.setDataPosition(0);
ParcelFileDescriptor pfd = ParcelFileDescriptor.CREATOR.createFromParcel(pl);
AutoCloseInputStream in = new AutoCloseInputStream(pfd);
try {
// read the data that was wrote previously
assertEquals(0, in.read());
assertEquals(1, in.read());
assertEquals(2, in.read());
assertEquals(3, in.read());
} finally {
in.close();
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
method = "close",
args = {}
)
public void testClose() throws Exception {
ParcelFileDescriptor pf = makeParcelFileDescriptor(getContext());
AutoCloseInputStream in1 = new AutoCloseInputStream(pf);
try {
assertEquals(0, in1.read());
} finally {
in1.close();
}
pf.close();
AutoCloseInputStream in2 = new AutoCloseInputStream(pf);
try {
assertEquals(0, in2.read());
fail("Failed to throw exception.");
} catch (Exception e) {
// expected
} finally {
in2.close();
}
}
@TestTargetNew(
level = TestLevel.SUFFICIENT,
method = "getStatSize",
args = {}
)
@ToBeFixed(bug="1695243", explanation="getStatSize() will return -1 if the fd is not a file,"
+ " but here it will throw IllegalArgumentException, it's not the same with javadoc.")
public void testGetStatSize() throws Exception {
ParcelFileDescriptor pf = makeParcelFileDescriptor(getContext());
assertTrue(pf.getStatSize() >= 0);
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test method: getFileDescriptor",
method = "getFileDescriptor",
args = {}
)
public void testGetFileDescriptor() {
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
assertNotNull(pfd.getFileDescriptor());
ParcelFileDescriptor p = new ParcelFileDescriptor(pfd);
assertSame(pfd.getFileDescriptor(), p.getFileDescriptor());
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test method: describeContents",
method = "describeContents",
args = {}
)
public void testDescribeContents() {
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
assertTrue((Parcelable.CONTENTS_FILE_DESCRIPTOR & pfd.describeContents()) != 0);
}
static ParcelFileDescriptor makeParcelFileDescriptor(Context con) throws Exception {
final String fileName = "testParcelFileDescriptor";
FileOutputStream fout = null;
fout = con.openFileOutput(fileName, Context.MODE_WORLD_WRITEABLE);
try {
fout.write(new byte[] { 0x0, 0x1, 0x2, 0x3 });
} finally {
fout.close();
}
File dir = con.getFilesDir();
File file = new File(dir, fileName);
ParcelFileDescriptor pf = null;
pf = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE);
return pf;
}
}