/*******************************************************************************
 * 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 Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-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)");
	}
}
