root/content/public/android/javatests/src/org/chromium/content/browser/ImportantFileWriterAndroidTest.java

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. loadJni
  2. checkFile
  3. Feature
  4. testAtomicWrite
  5. setUp

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.content.browser;

import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.SmallTest;

import org.chromium.base.ImportantFileWriterAndroid;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.library_loader.ProcessInitException;
import org.chromium.base.test.util.Feature;
import org.chromium.content_shell_apk.ContentShellApplication;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


/**
 * Tests for {@Link ImportantFileWriterAndroid}
 *
 * Note that this assumes that the underlying native atomic write functions
 * work, so is not attempting to test that writes are atomic. Instead it is just
 * testing that the Java code is calling the native code correctly.
 */
public class ImportantFileWriterAndroidTest extends InstrumentationTestCase {

    void loadJni() {
        getInstrumentation().runOnMainSync(new Runnable() {
            @Override
            public void run() {
                ContentShellApplication.initializeApplicationParameters();
                try {
                    LibraryLoader.ensureInitialized();
                } catch (ProcessInitException e) {
                    throw new Error(e);
                }
            }
        });
    }

    private void checkFile(File testFile, byte[] data) {
        assertTrue(testFile.exists());
        try {
            byte[] fileData = new byte[(int) testFile.length()];
            DataInputStream dis =
                    new DataInputStream(new FileInputStream(testFile));
            dis.readFully(fileData);
            dis.close();
            assertEquals("Data length wrong", data.length, fileData.length);
            for (int i = 0; i < data.length; i++) {
                assertEquals("Data byte wrong", data[i], fileData[i]);
            }
        } catch (IOException e) {
            fail("Failed to read file");
        }

    }

    @SmallTest
    @Feature({"Android-AppBase"})
    public void testAtomicWrite() {
        // Try writing a file that can't be created.
        byte[] data1 = {0,1,2,3,4,5,6,7,8,9};
        assertFalse("Writing bad file succeded",
                ImportantFileWriterAndroid.writeFileAtomically(
                        "/junk/junk", data1));
        File dir = getInstrumentation().getTargetContext().getFilesDir();
        File testFile = new File(dir, "ImportantFileTest");

        // Make sure the file doesn't already exist
        if (testFile.exists()) {
            assertTrue(testFile.delete());
        }

        // Write a new file
        assertTrue("Writing new file failed",
                ImportantFileWriterAndroid.writeFileAtomically(
                        testFile.getAbsolutePath(), data1));
        checkFile(testFile, data1);
        byte[] data2 = {10, 20, 30, 40, 50, 60, 70, 80};

        // Overwrite an existing file
        assertTrue("Writing exiting file failed",
                ImportantFileWriterAndroid.writeFileAtomically(
                        testFile.getAbsolutePath(), data2));
        checkFile(testFile, data2);

        // Done, tidy up
        assertTrue(testFile.delete());
    }

    @Override
    public void setUp() throws Exception {
        loadJni();
    }
}

/* [<][>][^][v][top][bottom][index][help] */