/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.update.tests.nativeTests;
import java.io.File;

import org.eclipse.update.configuration.IVolume;
import org.eclipse.update.configuration.LocalSystemInfo;
import org.eclipse.update.tests.UpdateManagerTestCase;

public class TestLocalSystemInfo extends UpdateManagerTestCase {

	/**
	 * Test the natives
	 */
	public TestLocalSystemInfo(String arg0) {
		super(arg0);
	}

	public void testNative() throws Exception {
	
		// mount point
       IVolume[] a = LocalSystemInfo.getVolumes();
        if (a==null) throw new Exception("cannot find native library");
		System.out.println("Found "+a.length+" mount points.");
		for (int i =0; i<a.length;i++){
			System.out.print("#"+i+" - "+a[i]);
			
			File root = a[i].getFile();
			String label = a[i].getLabel();
			if (label==null) label="NO LABEL";
			int type = a[i].getType();
			long size = LocalSystemInfo.getFreeSpace(root);
			System.out.println(" ->:"+label+":"+getType(type)+":"+getSize(size));
		}
	}
	
	private String getType(int type){
		switch (type) {
			case LocalSystemInfo.VOLUME_FIXED :
				return "VOLUME FIXED";
			case LocalSystemInfo.VOLUME_REMOTE :
				return "VOLUME REMOTE";
			case LocalSystemInfo.VOLUME_REMOVABLE :
				return "VOLUME REMOVABLE";
			case LocalSystemInfo.VOLUME_CDROM :
				return "VOLUME CDROM";				
			case LocalSystemInfo.VOLUME_UNKNOWN :
				return "VOLUME UNKNOWN";
			default :
				return "WRONG VOLUME INFO";
		}
	}
	
	private String getSize(long size){
		if (size==LocalSystemInfo.SIZE_UNKNOWN) return "UNKNOWN SIZE";
		
		long kb = size/(1024*1024);
		return new String(size+" ("+kb+"MB)");
	}
}
