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