1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage tests.security.permissions;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargets;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestLevel;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetNew;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetClass;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.TestCase;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.File;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.FileDescriptor;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.FileOutputStream;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Permission;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This class tests the security permissions which are documented in
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://java.sun.com/j2se/1.5.0/docs/guide/security/permissions.html#PermsAndMethods
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for class java.io.FileInputStream and java.io.FileOutputStream
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@TestTargetClass(java.io.FileOutputStream.class)
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class JavaIoFileOutputStreamTest extends TestCase {
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SecurityManager old;
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void setUp() throws Exception {
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        old = System.getSecurityManager();
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.setUp();
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected void tearDown() throws Exception {
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.setSecurityManager(old);
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super.tearDown();
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Verifies that FileOutputStream constructor calls checkRead on security manager.",
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "FileOutputStream",
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.io.FileDescriptor.class}
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Verifies that FileOutputStream constructor calls checkRead on security manager.",
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "FileOutputStream",
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.io.File.class}
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                level = TestLevel.PARTIAL_COMPLETE,
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                notes = "Verifies that FileOutputStream constructor calls checkRead on security manager.",
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                method = "FileOutputStream",
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                args = {java.io.File.class, boolean.class}
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ),
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Verifies that FileOutputStream constructor calls checkRead on security manager.",
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "FileOutputStream",
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class}
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Verifies that FileOutputStream constructor calls checkRead on security manager.",
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "FileOutputStream",
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class, boolean.class}
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_FileOutputStream1() throws IOException {
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        class TestSecurityManager extends SecurityManager {
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            boolean called;
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String file;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            FileDescriptor fd;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            void reset(){
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                called = false;
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                file = null;
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fd = null;
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @Override
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public void checkWrite(FileDescriptor fd) {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                called = true;
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                this.fd = fd;
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                super.checkWrite(fd);
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @Override
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public void checkWrite(String file){
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                called = true;
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                this.file = file;
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                super.checkWrite(file);
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            @Override
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            public void checkPermission(Permission p) {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        long id = new java.util.Date().getTime();
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String filename = "SecurityPermissionsTest_"+id;
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        File f = File.createTempFile(filename, null);
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        f.deleteOnExit();
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        filename = f.getCanonicalPath();
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        TestSecurityManager s = new TestSecurityManager();
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        System.setSecurityManager(s);
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        s.reset();
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        FileDescriptor fd = new FileDescriptor();
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        new FileOutputStream(fd);
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("FileOutputStream(FileDescriptor) ctor must call checkWrite on security manager", s.called);
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertEquals("Argument of checkWrite is not correct", fd, s.fd);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        s.reset();
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        new FileOutputStream(f);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("FileOutputStream(File) ctor must call checkWrite on security manager", s.called);
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertEquals("Argument of checkWrite is not correct", filename, s.file);
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        s.reset();
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        new FileOutputStream(f, true);
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("FileOutputStream(File) ctor must call checkWrite on security manager", s.called);
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertEquals("Argument of checkWrite is not correct", filename, s.file);
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        s.reset();
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        new FileOutputStream(filename);
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("FileOutputStream(String) ctor must call checkWrite on security manager", s.called);
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertEquals("Argument of checkWrite is not correct", filename, s.file);
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        s.reset();
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        new FileOutputStream(filename, true);
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("FileOutputStream(String,boolean) ctor must call checkWrite on security manager", s.called);
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertEquals("Argument of checkWrite is not correct", filename, s.file);
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
150