ImportantFileWriterAndroidTest.java revision f2477e01787aa58f445919b809d89e252beef54f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.content.browser;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.InstrumentationTestCase;
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest;
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.CommandLine;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.ImportantFileWriterAndroid;
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.base.test.util.Feature;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.app.LibraryLoader;
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)import org.chromium.content.common.ProcessInitException;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content_shell_apk.ContentShellApplication;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.io.DataInputStream;
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochimport java.io.File;
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)import java.io.FileInputStream;
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)import java.io.IOException;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.lang.Throwable;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Tests for {@Link ImportantFileWriterAndroid}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Note that this assumes that the underlying native atomic write functions
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * work, so is not attempting to test that writes are atomic. Instead it is just
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * testing that the Java code is calling the native code correctly.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochpublic class ImportantFileWriterAndroidTest extends InstrumentationTestCase {
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void loadJni() {
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        getInstrumentation().runOnMainSync(new Runnable() {
359ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            @Override
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            public void run() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ContentShellApplication.initializeApplicationParameters();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                try {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    LibraryLoader.ensureInitialized();
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                } catch (ProcessInitException e) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    throw new Error(e);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        });
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void checkFile(File testFile, byte[] data) {
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        assertTrue(testFile.exists());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        try {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            byte[] fileData = new byte[(int) testFile.length()];
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DataInputStream dis =
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    new DataInputStream(new FileInputStream(testFile));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            dis.readFully(fileData);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            dis.close();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assertEquals("Data length wrong", data.length, fileData.length);
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            for(int i = 0; i < data.length; i++) {
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                assertEquals("Data byte wrong", data[i], fileData[i]);
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            }
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        } catch (IOException e) {
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            fail("Failed to read file");
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Feature({"Android-AppBase"})
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void testAtomicWrite() {
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Try writing a file that can't be created.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        byte[] data1 = {0,1,2,3,4,5,6,7,8,9};
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assertFalse("Writing bad file succeded",
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ImportantFileWriterAndroid.writeFileAtomically(
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        "/junk/junk", data1));
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        File dir = getInstrumentation().getTargetContext().getFilesDir();
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        File testFile = new File(dir, "ImportantFileTest");
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        // Make sure the file doesn't already exist
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if(testFile.exists()) {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            assertTrue(testFile.delete());
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        // Write a new file
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        assertTrue("Writing new file failed",
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                ImportantFileWriterAndroid.writeFileAtomically(
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        testFile.getAbsolutePath(), data1));
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        checkFile(testFile, data1);
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        byte[] data2 = {10, 20, 30, 40, 50, 60, 70, 80};
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        // Overwrite an existing file
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        assertTrue("Writing exiting file failed",
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                ImportantFileWriterAndroid.writeFileAtomically(
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                        testFile.getAbsolutePath(), data2));
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        checkFile(testFile, data2);
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        // Done, tidy up
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        assertTrue(testFile.delete());
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    @Override
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    public void setUp() throws Exception {
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        loadJni();
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)