1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)package org.chromium.content.browser;
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.InstrumentationTestCase;
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest;
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.ImportantFileWriterAndroid;
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import org.chromium.base.library_loader.LibraryLoader;
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import org.chromium.base.library_loader.ProcessInitException;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.test.util.Feature;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content_shell_apk.ContentShellApplication;
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.io.DataInputStream;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.io.File;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.io.FileInputStream;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.io.IOException;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Tests for {@Link ImportantFileWriterAndroid}
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Note that this assumes that the underlying native atomic write functions
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * work, so is not attempting to test that writes are atomic. Instead it is just
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * testing that the Java code is calling the native code correctly.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public class ImportantFileWriterAndroidTest extends InstrumentationTestCase {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void loadJni() {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        getInstrumentation().runOnMainSync(new Runnable() {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            @Override
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void run() {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ContentShellApplication.initializeApplicationParameters();
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                try {
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    LibraryLoader.ensureInitialized();
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                } catch (ProcessInitException e) {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    throw new Error(e);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private void checkFile(File testFile, byte[] data) {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue(testFile.exists());
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        try {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            byte[] fileData = new byte[(int) testFile.length()];
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            DataInputStream dis =
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    new DataInputStream(new FileInputStream(testFile));
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            dis.readFully(fileData);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            dis.close();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertEquals("Data length wrong", data.length, fileData.length);
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            for (int i = 0; i < data.length; i++) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                assertEquals("Data byte wrong", data[i], fileData[i]);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } catch (IOException e) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            fail("Failed to read file");
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @SmallTest
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Feature({"Android-AppBase"})
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void testAtomicWrite() {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Try writing a file that can't be created.
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        byte[] data1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertFalse("Writing bad file succeded",
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ImportantFileWriterAndroid.writeFileAtomically(
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "/junk/junk", data1));
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        File dir = getInstrumentation().getTargetContext().getFilesDir();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        File testFile = new File(dir, "ImportantFileTest");
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Make sure the file doesn't already exist
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (testFile.exists()) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            assertTrue(testFile.delete());
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Write a new file
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("Writing new file failed",
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ImportantFileWriterAndroid.writeFileAtomically(
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        testFile.getAbsolutePath(), data1));
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        checkFile(testFile, data1);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        byte[] data2 = {10, 20, 30, 40, 50, 60, 70, 80};
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Overwrite an existing file
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue("Writing exiting file failed",
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ImportantFileWriterAndroid.writeFileAtomically(
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        testFile.getAbsolutePath(), data2));
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        checkFile(testFile, data2);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Done, tidy up
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        assertTrue(testFile.delete());
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Override
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void setUp() throws Exception {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loadJni();
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
101