diff options
Diffstat (limited to 'songdbj/com/jcraft/jogg/Page.java')
| -rw-r--r-- | songdbj/com/jcraft/jogg/Page.java | 973 |
1 files changed, 973 insertions, 0 deletions
diff --git a/songdbj/com/jcraft/jogg/Page.java b/songdbj/com/jcraft/jogg/Page.java new file mode 100644 index 0000000..fc1add0 --- /dev/null +++ b/songdbj/com/jcraft/jogg/Page.java @@ -0,0 +1,973 @@ +/* -*-mode:java; c-basic-offset:2; -*- */ +/* JOrbis + * Copyright (C) 2000 ymnk, JCraft,Inc. + * + * Written by: 2000 ymnk<ymnk@jcraft.com> + * + * Many thanks to + * Monty <monty@xiph.org> and + * The XIPHOPHORUS Company http://www.xiph.org/ . + * JOrbis has been based on their awesome works, Vorbis codec. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * as published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package com.jcraft.jogg; + +public class Page{ + private static int[] crc_lookup=new int[256]; + static { + for(int i=0; i<crc_lookup.length; i++){ + crc_lookup[i]=crc_entry(i); + } + } + + private static int crc_entry(int index){ + int r=index<<24; + for(int i=0; i<8; i++){ + if((r& 0x80000000)!=0){ + r=(r << 1)^0x04c11db7; /* The same as the ethernet generator + polynomial, although we use an + unreflected alg and an init/final + of 0, not 0xffffffff */ + } + else{ + r<<=1; + } + } + return(r&0xffffffff); + } + + public byte[] header_base; + public int header; + public int header_len; + public byte[] body_base; + public int body; + public int body_len; + + int version(){ + return header_base[header+4]&0xff; + } + int continued(){ + return (header_base[header+5]&0x01); + } + public int bos(){ + return (header_base[header+5]&0x02); + } + public int eos(){ + return (header_base[header+5]&0x04); + } + public long granulepos(){ + long foo=header_base[header+13]&0xff; + foo=(foo<<8)|(header_base[header+12]&0xff); + foo=(foo<<8)|(header_base[header+11]&0xff); + foo=(foo<<8)|(header_base[header+10]&0xff); + foo=(foo<<8)|(header_base[header+9]&0xff); + foo=(foo<<8)|(header_base[header+8]&0xff); + foo=(foo<<8)|(header_base[header+7]&0xff); + foo=(foo<<8)|(header_base[header+6]&0xff); + return(foo); + } + public int serialno(){ + return (header_base[header+14]&0xff)| + ((header_base[header+15]&0xff)<<8)| + ((header_base[header+16]&0xff)<<16)| + ((header_base[header+17]&0xff)<<24); + } + int pageno(){ + return (header_base[header+18]&0xff)| + ((header_base[header+19]&0xff)<<8)| + ((header_base[header+20]&0xff)<<16)| + ((header_base[header+21]&0xff)<<24); + } + + void checksum(){ + int crc_reg=0; + +// for(int i=0;i<header_len;i++){ +// System.err.println("chksum: "+Integer.toHexString(header_base[header+i]&0xff)); +// } + + for(int i=0;i<header_len;i++){ + crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg>>>24)&0xff)^(header_base[header+i]&0xff)]; + } + for(int i=0;i<body_len;i++){ + crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg>>>24)&0xff)^(body_base[body+i]&0xff)]; + } + header_base[header+22]=(byte)crc_reg/*&0xff*/; + header_base[header+23]=(byte)(crc_reg>>>8)/*&0xff*/; + header_base[header+24]=(byte)(crc_reg>>>16)/*&0xff*/; + header_base[header+25]=(byte)(crc_reg>>>24)/*&0xff*/; + } + public Page copy(){ + return copy(new Page()); + } + public Page copy(Page p){ + byte[] tmp=new byte[header_len]; + System.arraycopy(header_base, header, tmp, 0, header_len); + p.header_len=header_len; + p.header_base=tmp; + p.header=0; + tmp=new byte[body_len]; + System.arraycopy(body_base, body, tmp, 0, body_len); + p.body_len=body_len; + p.body_base=tmp; + p.body=0; + return p; + } + /* + // TEST + static StreamState os_en, os_de; + static SyncState oy; + void check_page(byte[] data_base, int data, int[] _header){ + // Test data + for(int j=0;j<body_len;j++) + if(body_base[body+j]!=data_base[data+j]){ + System.err.println("body data mismatch at pos "+j+": "+data_base[data+j]+"!="+body_base[body+j]+"!\n"); + System.exit(1); + } + + // Test header + for(int j=0;j<header_len;j++){ + if((header_base[header+j]&0xff)!=_header[j]){ + System.err.println("header content mismatch at pos "+j); + for(int jj=0;jj<_header[26]+27;jj++) + System.err.print(" ("+jj+")"+Integer.toHexString(_header[jj])+":"+Integer.toHexString(header_base[header+jj])); + System.err.println(""); + System.exit(1); + } + } + if(header_len!=_header[26]+27){ + System.err.print("header length incorrect! ("+header_len+"!="+(_header[26]+27)+")"); + System.exit(1); + } + } + + void print_header(){ + System.err.println("\nHEADER:"); + System.err.println(" capture: "+ + (header_base[header+0]&0xff)+" "+ + (header_base[header+1]&0xff)+" "+ + (header_base[header+2]&0xff)+" "+ + (header_base[header+3]&0xff)+" "+ + " version: "+(header_base[header+4]&0xff)+" flags: "+ + (header_base[header+5]&0xff)); + System.err.println(" pcmpos: "+ + (((header_base[header+9]&0xff)<<24)| + ((header_base[header+8]&0xff)<<16)| + ((header_base[header+7]&0xff)<<8)| + ((header_base[header+6]&0xff)))+ + " serialno: "+ + (((header_base[header+17]&0xff)<<24)| + ((header_base[header+16]&0xff)<<16)| + ((header_base[header+15]&0xff)<<8)| + ((header_base[header+14]&0xff)))+ + " pageno: "+ + (((header_base[header+21]&0xff)<<24)| + ((header_base[header+20]&0xff)<<16)| + ((header_base[header+19]&0xff)<<8)| + ((header_base[header+18]&0xff)))); + + System.err.println(" checksum: "+ + (header_base[header+22]&0xff)+":"+ + (header_base[header+23]&0xff)+":"+ + (header_base[header+24]&0xff)+":"+ + (header_base[header+25]&0xff)+"\n segments: "+ + (header_base[header+26]&0xff)+" ("); + for(int j=27;j<header_len;j++){ + System.err.println((header_base[header+j]&0xff)+" "); + } + System.err.println(")\n"); + } + + void copy_page(){ + byte[] tmp=new byte[header_len]; + System.arraycopy(header_base, header, tmp, 0, header_len); + header_base=tmp; + header=0; + tmp=new byte[body_len]; + System.arraycopy(body_base, body, tmp, 0, body_len); + body_base=tmp; + body=0; + } + + static void test_pack(int[] pl, int[][] headers){ + byte[] data=new byte[1024*1024]; // for scripted test cases only + int inptr=0; + int outptr=0; + int deptr=0; + int depacket=0; + int pcm_pos=7; + int packets,pageno=0,pageout=0; + int eosflag=0; + int bosflag=0; + + os_en.reset(); + os_de.reset(); + oy.reset(); + + for(packets=0;;packets++){ + if(pl[packets]==-1)break; + } + + for(int i=0;i<packets;i++){ + // construct a test packet + Packet op=new Packet(); + int len=pl[i]; + op.packet_base=data; + op.packet=inptr; + op.bytes=len; + op.e_o_s=(pl[i+1]<0?1:0); + op.granulepos=pcm_pos; + + pcm_pos+=1024; + + for(int j=0;j<len;j++){ + data[inptr++]=(byte)(i+j); + } + + // submit the test packet + os_en.packetin(op); + + // retrieve any finished pages + { + Page og=new Page(); + + while(os_en.pageout(og)!=0){ + // We have a page. Check it carefully + //System.err.print(pageno+", "); + if(headers[pageno]==null){ + System.err.println("coded too many pages!"); + System.exit(1); + } + og.check_page(data, outptr, headers[pageno]); + + outptr+=og.body_len; + pageno++; + +//System.err.println("1# pageno="+pageno+", pageout="+pageout); + + // have a complete page; submit it to sync/decode + + { + Page og_de=new Page(); + Packet op_de=new Packet(); + int index=oy.buffer(og.header_len+og.body_len); + byte[] buf=oy.data; + System.arraycopy(og.header_base, og.header, buf, index, og.header_len); + System.arraycopy(og.body_base, og.body, buf, index+og.header_len, og.body_len); + oy.wrote(og.header_len+og.body_len); + +//System.err.println("2# pageno="+pageno+", pageout="+pageout); + + while(oy.pageout(og_de)>0){ + // got a page. Happy happy. Verify that it's good. + + og_de.check_page(data, deptr, headers[pageout]); + deptr+=og_de.body_len; + pageout++; + + // submit it to deconstitution + os_de.pagein(og_de); + + // packets out? + while(os_de.packetout(op_de)>0){ + + // verify the packet! + // check data + boolean check=false; + for(int ii=0; ii<op_de.bytes; ii++){ + if(data[depacket+ii]!=op_de.packet_base[op_de.packet+ii]){ + check=true; + break; + } + } + if(check){ + System.err.println("packet data mismatch in decode! pos="+ + depacket); + System.exit(1); + } + + // check bos flag + if(bosflag==0 && op_de.b_o_s==0){ + System.err.println("b_o_s flag not set on packet!"); + System.exit(1); + } + if(bosflag!=0 && op_de.b_o_s!=0){ + System.err.println("b_o_s flag incorrectly set on packet!"); + System.exit(1); + } + + bosflag=1; + depacket+=op_de.bytes; + + // check eos flag + if(eosflag!=0){ + System.err.println("Multiple decoded packets with eos flag!"); + System.exit(1); + } + + if(op_de.e_o_s!=0)eosflag=1; + + // check pcmpos flag + if(op_de.granulepos!=-1){ + System.err.print(" pcm:"+op_de.granulepos+" "); + } + } + } + } + } + } + } + //free(data); + if(headers[pageno]!=null){ + System.err.println("did not write last page!"); + System.exit(1); + } + if(headers[pageout]!=null){ + System.err.println("did not decode last page!"); + System.exit(1); + } + if(inptr!=outptr){ + System.err.println("encoded page data incomplete!"); + System.exit(1); + } + if(inptr!=deptr){ + System.err.println("decoded page data incomplete!"); + System.exit(1); + } + if(inptr!=depacket){ + System.err.println("decoded packet data incomplete!"); + System.exit(1); + } + if(eosflag==0){ + System.err.println("Never got a packet with EOS set!"); + } + System.err.println("ok."); + } + + static void error(){ + System.err.println("error!"); + System.exit(1); + } + public static void main(String[] arg){ + + os_en=new StreamState(0x04030201); + os_de=new StreamState(0x04030201); + + oy=new SyncState(); + + // Exercise each code path in the framing code. Also verify that + // the checksums are working. + + { + // 17 only + int[] packets={17, -1}; + int[] head1={0x4f,0x67,0x67,0x53,0,0x06, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x15,0xed,0xec,0x91, + 1, + 17}; + int[][] headret={head1, null}; + + System.err.print("testing single page encoding... "); + test_pack(packets,headret); + } + + { + // 17, 254, 255, 256, 500, 510, 600 byte, pad + int[] packets={17, 254, 255, 256, 500, 510, 600, -1}; + int[] head1={0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x59,0x10,0x6c,0x2c, + 1, + 17}; + int[] head2={0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x89,0x33,0x85,0xce, + 13, + 254,255,0,255,1,255,245,255,255,0, + 255,255,90}; + int[][] headret={head1,head2,null}; + + System.err.print("testing basic page encoding... "); + test_pack(packets,headret); + } + + { + // nil packets; beginning,middle,end + int[] packets={0,17, 254, 255, 0, 256, 0, 500, 510, 600, 0, -1}; + + int[] head1={0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + int[] head2={0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x28,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x5c,0x3f,0x66,0xcb, + 17, + 17,254,255,0,0,255,1,0,255,245,255,255,0, + 255,255,90,0}; + int[][] headret={head1,head2,null}; + + System.err.print("testing basic nil packets... "); + test_pack(packets,headret); + } + + { + // large initial packet + int[] packets={4345,259,255,-1}; + + int[] head1={0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x01,0x27,0x31,0xaa, + 18, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,10}; + + int[] head2={0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x7f,0x4e,0x8a,0xd2, + 4, + 255,4,255,0}; + int[][] headret={head1,head2,null}; + + System.err.print("testing initial-packet lacing > 4k... "); + test_pack(packets,headret); + } + + { + // continuing packet test + int[] packets={0,4345,259,255,-1}; + + int[] head1={0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + + int[] head2={0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x34,0x24,0xd5,0x29, + 17, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255}; + + int[] head3={0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xc8,0xc3,0xcb,0xed, + 5, + 10,255,4,255,0}; + int[][] headret={head1,head2,head3,null}; + + System.err.print("testing single packet page span... "); + test_pack(packets,headret); + } + + // page with the 255 segment limit + { + + int[] packets={0,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,50,-1}; + + int[] head1={0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + + int[] head2={0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0xed,0x2a,0x2e,0xa7, + 255, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10}; + + int[] head3={0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x6c,0x3b,0x82,0x3d, + 1, + 50}; + int[][] headret={head1,head2,head3,null}; + + System.err.print("testing max packet segments... "); + test_pack(packets,headret); + } + + { + // packet that overspans over an entire page + + int[] packets={0,100,9000,259,255,-1}; + + int[] head1={0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + + int[] head2={0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x3c,0xd9,0x4d,0x3f, + 17, + 100,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255}; + + int[] head3={0x4f,0x67,0x67,0x53,0,0x01, + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xbd,0xd5,0xb5,0x8b, + 17, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255}; + + int[] head4={0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,3,0,0,0, + 0xef,0xdd,0x88,0xde, + 7, + 255,255,75,255,4,255,0}; + int[][] headret={head1,head2,head3,head4,null}; + + System.err.print("testing very large packets... "); + test_pack(packets,headret); + } + + { + // term only page. why not? + + int[] packets={0,100,4080,-1}; + + int[] head1={0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + + int[] head2={0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x3c,0xd9,0x4d,0x3f, + 17, + 100,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255}; + + int[] head3={0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xd4,0xe0,0x60,0xe5, + 1,0}; + + int[][] headret={head1,head2,head3,null}; + + System.err.print("testing zero data page (1 nil packet)... "); + test_pack(packets,headret); + } + + { + // build a bunch of pages for testing + byte[] data=new byte[1024*1024]; + int[] pl={0,100,4079,2956,2057,76,34,912,0,234,1000,1000,1000,300,-1}; + int inptr=0; + Page[] og=new Page[5]; + for(int i=0; i<5; i++){ + og[i]=new Page(); + } + + os_en.reset(); + + for(int i=0;pl[i]!=-1;i++){ + Packet op=new Packet(); + int len=pl[i]; + + op.packet_base=data; + op.packet=inptr; + op.bytes=len; + op.e_o_s=(pl[i+1]<0?1:0); + op.granulepos=(i+1)*1000; + + for(int j=0;j<len;j++)data[inptr++]=(byte)(i+j); + os_en.packetin(op); + } + +// free(data); + + // retrieve finished pages + for(int i=0;i<5;i++){ + if(os_en.pageout(og[i])==0){ + System.err.print("Too few pages output building sync tests!\n"); + System.exit(1); + } + og[i].copy_page(); + } + + // Test lost pages on pagein/packetout: no rollback + { + Page temp=new Page(); + Packet test=new Packet(); + + System.err.print("Testing loss of pages... "); + + oy.reset(); + os_de.reset(); + for(int i=0;i<5;i++){ + int index=oy.buffer(og[i].header_len); + System.arraycopy(og[i].header_base, og[i].header, + oy.data, index, og[i].header_len); + oy.wrote(og[i].header_len); + index=oy.buffer(og[i].body_len); + System.arraycopy(og[i].body_base, og[i].body, + oy.data, index, og[i].body_len); + oy.wrote(og[i].body_len); + } + + oy.pageout(temp); + os_de.pagein(temp); + oy.pageout(temp); + os_de.pagein(temp); + oy.pageout(temp); + + // skip + oy.pageout(temp); + os_de.pagein(temp); + + // do we get the expected results/packets? + + if(os_de.packetout(test)!=1)error(); + test.checkpacket(0,0,0); + if(os_de.packetout(test)!=1)error(); + test.checkpacket(100,1,-1); + if(os_de.packetout(test)!=1)error(); + test.checkpacket(4079,2,3000); + if(os_de.packetout(test)!=-1){ + System.err.println("Error: loss of page did not return error"); + System.exit(1); + } + if(os_de.packetout(test)!=1)error(); + test.checkpacket(76,5,-1); + if(os_de.packetout(test)!=1)error(); + test.checkpacket(34,6,-1); + System.err.println("ok."); + } + + // Test lost pages on pagein/packetout: rollback with continuation + { + Page temp=new Page(); + Packet test=new Packet(); + + System.err.print("Testing loss of pages (rollback required)... "); + + oy.reset(); + os_de.reset(); + for(int i=0;i<5;i++){ + int index=oy.buffer(og[i].header_len); + System.arraycopy(og[i].header_base, og[i].header, + oy.data, index, og[i].header_len); + oy.wrote(og[i].header_len); + index=oy.buffer(og[i].body_len); + System.arraycopy(og[i].body_base, og[i].body, + oy.data, index, og[i].body_len); + oy.wrote(og[i].body_len); + } + + oy.pageout(temp); + os_de.pagein(temp); + oy.pageout(temp); + os_de.pagein(temp); + oy.pageout(temp); + os_de.pagein(temp); + oy.pageout(temp); + // skip + oy.pageout(temp); + os_de.pagein(temp); + + // do we get the expected results/packets? + + if(os_de.packetout(test)!=1)error(); + test.checkpacket(0,0,0); + if(os_de.packetout(test)!=1)error(); + test.checkpacket(100,1,-1); + if(os_de.packetout(test)!=1)error(); + test.checkpacket(4079,2,3000); + if(os_de.packetout(test)!=1)error(); + test.checkpacket(2956,3,4000); + if(os_de.packetout(test)!=-1){ + System.err.println("Error: loss of page did not return error"); + System.exit(1); + } + if(os_de.packetout(test)!=1)error(); + test.checkpacket(300,13,14000); + System.err.println("ok."); + } + + // the rest only test sync + { + Page og_de=new Page(); + // Test fractional page inputs: incomplete capture + System.err.print("Testing sync on partial inputs... "); + oy.reset(); + int index=oy.buffer(og[1].header_len); + System.arraycopy(og[1].header_base, og[1].header, + oy.data, index, 3); + oy.wrote(3); + if(oy.pageout(og_de)>0)error(); + + // Test fractional page inputs: incomplete fixed header + index=oy.buffer(og[1].header_len); + System.arraycopy(og[1].header_base, og[1].header+3, + oy.data, index, 20); + + oy.wrote(20); + if(oy.pageout(og_de)>0)error(); + + // Test fractional page inputs: incomplete header + index=oy.buffer(og[1].header_len); + System.arraycopy(og[1].header_base, og[1].header+23, + oy.data, index, 5); + oy.wrote(5); + if(oy.pageout(og_de)>0)error(); + + // Test fractional page inputs: incomplete body + index=oy.buffer(og[1].header_len); + System.arraycopy(og[1].header_base, og[1].header+28, + oy.data, index, og[1].header_len-28); + oy.wrote(og[1].header_len-28); + if(oy.pageout(og_de)>0)error(); + + index=oy.buffer(og[1].body_len); + System.arraycopy(og[1].body_base, og[1].body, + oy.data, index, 1000); + oy.wrote(1000); + if(oy.pageout(og_de)>0)error(); + + index=oy.buffer(og[1].body_len); + System.arraycopy(og[1].body_base, og[1].body+1000, + oy.data, index, og[1].body_len-1000); + oy.wrote(og[1].body_len-1000); + if(oy.pageout(og_de)<=0)error(); + System.err.println("ok."); + } + + // Test fractional page inputs: page + incomplete capture + { + Page og_de=new Page(); + System.err.print("Testing sync on 1+partial inputs... "); + oy.reset(); + + int index=oy.buffer(og[1].header_len); + System.arraycopy(og[1].header_base, og[1].header, + oy.data, index, og[1].header_len); + oy.wrote(og[1].header_len); + + index=oy.buffer(og[1].body_len); + System.arraycopy(og[1].body_base, og[1].body, + oy.data, index, og[1].body_len); + oy.wrote(og[1].body_len); + + index=oy.buffer(og[1].header_len); + System.arraycopy(og[1].header_base, og[1].header, + oy.data, index, 20); + oy.wrote(20); + if(oy.pageout(og_de)<=0)error(); + if(oy.pageout(og_de)>0)error(); + + index=oy.buffer(og[1].header_len); + System.arraycopy(og[1].header_base, og[1].header+20, + oy.data, index, og[1].header_len-20); + oy.wrote(og[1].header_len-20); + index=oy.buffer(og[1].body_len); + System.arraycopy(og[1].body_base, og[1].body, + oy.data, index, og[1].body_len); + + oy.wrote(og[1].body_len); + if(oy.pageout(og_de)<=0)error(); + + System.err.println("ok."); + } + +// // // // // // // // // + // Test recapture: garbage + page + { + Page og_de=new Page(); + System.err.print("Testing search for capture... "); + oy.reset(); + + // 'garbage' + int index=oy.buffer(og[1].body_len); + System.arraycopy(og[1].body_base, og[1].body, + oy.data, index, og[1].body_len); + oy.wrote(og[1].body_len); + + index=oy.buffer(og[1].header_len); + System.arraycopy(og[1].header_base, og[1].header, + oy.data, index, og[1].header_len); + oy.wrote(og[1].header_len); + + index=oy.buffer(og[1].body_len); + System.arraycopy(og[1].body_base, og[1].body, + oy.data, index, og[1].body_len); + oy.wrote(og[1].body_len); + + index=oy.buffer(og[2].header_len); + System.arraycopy(og[2].header_base, og[2].header, + oy.data, index, 20); + + oy.wrote(20); + if(oy.pageout(og_de)>0)error(); + if(oy.pageout(og_de)<=0)error(); + if(oy.pageout(og_de)>0)error(); + + index=oy.buffer(og[2].header_len); + System.arraycopy(og[2].header_base, og[2].header+20, + oy.data, index, og[2].header_len-20); + oy.wrote(og[2].header_len-20); + index=oy.buffer(og[2].body_len); + System.arraycopy(og[2].body_base, og[2].body, + oy.data, index, og[2].body_len); + oy.wrote(og[2].body_len); + if(oy.pageout(og_de)<=0)error(); + + System.err.println("ok."); + } + + // Test recapture: page + garbage + page + { + Page og_de=new Page(); + System.err.print("Testing recapture... "); + oy.reset(); + + int index=oy.buffer(og[1].header_len); + System.arraycopy(og[1].header_base, og[1].header, + oy.data, index, og[1].header_len); + oy.wrote(og[1].header_len); + + index=oy.buffer(og[1].body_len); + System.arraycopy(og[1].body_base, og[1].body, + oy.data, index, og[1].body_len); + oy.wrote(og[1].body_len); + + index=oy.buffer(og[2].header_len); + System.arraycopy(og[2].header_base, og[2].header, + oy.data, index, og[2].header_len); + oy.wrote(og[2].header_len); + + index=oy.buffer(og[2].header_len); + System.arraycopy(og[2].header_base, og[2].header, + oy.data, index, og[2].header_len); + oy.wrote(og[2].header_len); + + if(oy.pageout(og_de)<=0)error(); + + index=oy.buffer(og[2].body_len); + System.arraycopy(og[2].body_base, og[2].body, + oy.data, index, og[2].body_len-5); + oy.wrote(og[2].body_len-5); + + index=oy.buffer(og[3].header_len); + System.arraycopy(og[3].header_base, og[3].header, + oy.data, index, og[3].header_len); + oy.wrote(og[3].header_len); + + index=oy.buffer(og[3].body_len); + System.arraycopy(og[3].body_base, og[3].body, + oy.data, index, og[3].body_len); + oy.wrote(og[3].body_len); + + if(oy.pageout(og_de)>0)error(); + if(oy.pageout(og_de)<=0)error(); + + System.err.println("ok."); + } + } + //return(0); + } + */ +} |