日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

surefire 拉起testng单元测试类的源码流程阅读(二)

發(fā)布時間:2023/12/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 surefire 拉起testng单元测试类的源码流程阅读(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這里是基于surefire 2.19.1版本分析的。

還是根據(jù)surefire 拉起單元測試執(zhí)行報錯的日志展示的執(zhí)行過程分析

java.lang.instrument.IllegalClassFormatException: Error while instrumenting class com/suning/imp/scheduler/ActivityDoneMonitorSchedule.at org.jacoco.agent.rt.internal_6da5971.CoverageTransformer.transform(CoverageTransformer.java:93)at sun.instrument.TransformerManager.transform(TransformerManager.java:188)at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:760)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)at java.net.URLClassLoader.access$100(URLClassLoader.java:73)at java.net.URLClassLoader$1.run(URLClassLoader.java:368)at java.net.URLClassLoader$1.run(URLClassLoader.java:362)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:361)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)at org.springframework.util.ClassUtils.forName(ClassUtils.java:258)at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:417)at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1283)at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1254)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:576)at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1331)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:341)at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:312)at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:420)at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:617)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:106)at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:57)at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:248)at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:313)at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextPrepareTestInstance(AbstractTestNGSpringContextTests.java:130)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:175)at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:107)at org.testng.TestRunner.privateRun(TestRunner.java:767)at org.testng.TestRunner.run(TestRunner.java:617)at org.testng.SuiteRunner.runTest(SuiteRunner.java:348)at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:343)at org.testng.SuiteRunner.privateRun(SuiteRunner.java:305)at org.testng.SuiteRunner.run(SuiteRunner.java:254)at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)at org.testng.TestNG.run(TestNG.java:1057)at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:281)at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:75)at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:121)at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121) Caused by: java.io.IOException: Error while instrumenting class com/suning/imp/scheduler/ActivityDoneMonitorSchedule.at org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrumentError(Instrumenter.java:160)at org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrument(Instrumenter.java:111)at org.jacoco.agent.rt.internal_6da5971.CoverageTransformer.transform(CoverageTransformer.java:91)... 62 more Caused by: java.lang.IllegalStateException: Class com/suning/imp/scheduler/ActivityDoneMonitorSchedule is already instrumented.at org.jacoco.agent.rt.internal_6da5971.core.internal.instr.InstrSupport.assertNotInstrumented(InstrSupport.java:89)at org.jacoco.agent.rt.internal_6da5971.core.internal.instr.ClassInstrumenter.visitField(ClassInstrumenter.java:55)at org.jacoco.agent.rt.internal_6da5971.asm.ClassVisitor.visitField(ClassVisitor.java:272)at org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.readField(ClassReader.java:768)at org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.accept(ClassReader.java:689)at org.jacoco.agent.rt.internal_6da5971.asm.ClassReader.accept(ClassReader.java:506)at org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrument(Instrumenter.java:84)at org.jacoco.agent.rt.internal_6da5971.core.instr.Instrumenter.instrument(Instrumenter.java:108)... 63 more

->?SuiteRunnerWorker.run -> runSuites

-> SuiteRunner.run -> privateRun ->?invokeTestMethods?

->testng.internal.TestMethodWorker.run ->?invokeTestMethods

->testng.internal.Invoker.invokeTestMethods ->?invokeMethod

->testng.internal.MethodInvocationHelper.invokeMethod

然后surefire 通過調(diào)用?booter.SurefireBooter.main

(surefire-booter.2.19.1.jar) ->?booter.ForkedBooter.runSuitesInProcess

->?booter.ForkedBooter.invokeProviderInSameClassLoader

->?surefire.testng.TestNGProvider.invoke?(surefire-testng-2.19.1)
-> surefire.testng.TestNGXmlTestSuite.execute
-> surefire.testng.TestNGExecutor.run

->?TestNG.run(testng-6.9.12)

surefireBooter類代碼:

public final class ForkedBooter {private static final long SYSTEM_EXIT_TIMEOUT_IN_SECONDS = 30;private static final long PING_TIMEOUT_IN_SECONDS = 20;private static final ScheduledExecutorService JVM_TERMINATOR = createJvmTerminator();/*** This method is invoked when Surefire is forked - this method parses and organizes the arguments passed to it and* then calls the Surefire class' run method. <p/> The system exit code will be 1 if an exception is thrown.** @param args Commandline arguments*/public static void main( String... args ){final CommandReader reader = startupMasterProcessReader();final ScheduledFuture<?> pingScheduler = listenToShutdownCommands( reader );final PrintStream originalOut = System.out;try{if ( args.length > 1 ){SystemPropertyManager.setSystemProperties( new File( args[1] ) );}File surefirePropertiesFile = new File( args[0] );InputStream stream = surefirePropertiesFile.exists() ? new FileInputStream( surefirePropertiesFile ) : null;BooterDeserializer booterDeserializer = new BooterDeserializer( stream );ProviderConfiguration providerConfiguration = booterDeserializer.deserialize();final StartupConfiguration startupConfiguration = booterDeserializer.getProviderConfiguration();TypeEncodedValue forkedTestSet = providerConfiguration.getTestForFork();boolean readTestsFromInputStream = providerConfiguration.isReadTestsFromInStream();final ClasspathConfiguration classpathConfiguration = startupConfiguration.getClasspathConfiguration();if ( startupConfiguration.isManifestOnlyJarRequestedAndUsable() ){classpathConfiguration.trickClassPathWhenManifestOnlyClasspath();}ClassLoader classLoader = Thread.currentThread().getContextClassLoader();classLoader.setDefaultAssertionStatus( classpathConfiguration.isEnableAssertions() );startupConfiguration.writeSurefireTestClasspathProperty();final Object testSet;if ( forkedTestSet != null ){testSet = forkedTestSet.getDecodedValue( classLoader );}else if ( readTestsFromInputStream ){testSet = new LazyTestsToRun( originalOut );}else{testSet = null;}try{runSuitesInProcess( testSet, startupConfiguration, providerConfiguration, originalOut );}catch ( InvocationTargetException t ){LegacyPojoStackTraceWriter stackTraceWriter =new LegacyPojoStackTraceWriter( "test subystem", "no method", t.getTargetException() );StringBuilder stringBuilder = new StringBuilder();encode( stringBuilder, stackTraceWriter, false );encodeAndWriteToOutput( ( (char) BOOTERCODE_ERROR ) + ",0," + stringBuilder + "\n" , originalOut );}catch ( Throwable t ){StackTraceWriter stackTraceWriter = new LegacyPojoStackTraceWriter( "test subystem", "no method", t );StringBuilder stringBuilder = new StringBuilder();encode( stringBuilder, stackTraceWriter, false );encodeAndWriteToOutput( ( (char) BOOTERCODE_ERROR ) + ",0," + stringBuilder + "\n", originalOut );}// Say bye.encodeAndWriteToOutput( ( (char) BOOTERCODE_BYE ) + ",0,BYE!\n", originalOut );originalOut.flush();// noinspection CallToSystemExitexit( 0, EXIT, reader, false );}catch ( Throwable t ){// Just throwing does getMessage() and a local trace - we want to call printStackTrace for a full trace// noinspection UseOfSystemOutOrSystemErrt.printStackTrace( System.err );// noinspection ProhibitedExceptionThrown,CallToSystemExitexit( 1, EXIT, reader, false );}finally{pingScheduler.cancel( true );}}private static CommandReader startupMasterProcessReader(){return CommandReader.getReader();}private static ScheduledFuture<?> listenToShutdownCommands( CommandReader reader ){reader.addShutdownListener( createExitHandler( reader ) );AtomicBoolean pingDone = new AtomicBoolean( true );reader.addNoopListener( createPingHandler( pingDone ) );return JVM_TERMINATOR.scheduleAtFixedRate( createPingJob( pingDone, reader ),0, PING_TIMEOUT_IN_SECONDS, SECONDS );}private static CommandListener createPingHandler( final AtomicBoolean pingDone ){return new CommandListener(){public void update( Command command ){pingDone.set( true );}};}private static CommandListener createExitHandler( final CommandReader reader ){return new CommandListener(){public void update( Command command ){exit( 1, command.toShutdownData(), reader, true );}};}private static Runnable createPingJob( final AtomicBoolean pingDone, final CommandReader reader ){return new Runnable(){public void run(){boolean hasPing = pingDone.getAndSet( false );if ( !hasPing ){exit( 1, KILL, reader, true );}}};}private static void encodeAndWriteToOutput( String string, PrintStream out ){byte[] encodeBytes = encodeStringForForkCommunication( string );out.write( encodeBytes, 0, encodeBytes.length );}private static void exit( int returnCode, Shutdown shutdownType, CommandReader reader, boolean stopReaderOnExit ){switch ( shutdownType ){case KILL:Runtime.getRuntime().halt( returnCode );case EXIT:if ( stopReaderOnExit ){reader.stop();}launchLastDitchDaemonShutdownThread( returnCode );System.exit( returnCode );case DEFAULT:// refers to shutdown=testset, but not used now, keeping reader opendefault:break;}}private static RunResult runSuitesInProcess( Object testSet, StartupConfiguration startupConfiguration,ProviderConfiguration providerConfiguration,PrintStream originalSystemOut )throws SurefireExecutionException, TestSetFailedException, InvocationTargetException{final ReporterFactory factory = createForkingReporterFactory( providerConfiguration, originalSystemOut );return invokeProviderInSameClassLoader( testSet, factory, providerConfiguration, true, startupConfiguration,false );}private static ReporterFactory createForkingReporterFactory( ProviderConfiguration providerConfiguration,PrintStream originalSystemOut ){final boolean trimStackTrace = providerConfiguration.getReporterConfiguration().isTrimStackTrace();return SurefireReflector.createForkingReporterFactoryInCurrentClassLoader( trimStackTrace, originalSystemOut );}private static ScheduledExecutorService createJvmTerminator(){ThreadFactory threadFactory = newDaemonThreadFactory( "last-ditch-daemon-shutdown-thread-"+ SYSTEM_EXIT_TIMEOUT_IN_SECONDS+ "sec" );ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor( 1, threadFactory );executor.setMaximumPoolSize( 1 );executor.prestartCoreThread();return executor;}@SuppressWarnings( "checkstyle:emptyblock" )private static void launchLastDitchDaemonShutdownThread( final int returnCode ){JVM_TERMINATOR.schedule( new Runnable(){public void run(){Runtime.getRuntime().halt( returnCode );}}, SYSTEM_EXIT_TIMEOUT_IN_SECONDS, SECONDS );}private static RunResult invokeProviderInSameClassLoader( Object testSet, Object factory,ProviderConfiguration providerConfiguration,boolean insideFork,StartupConfiguration startupConfig,boolean restoreStreams )throws TestSetFailedException, InvocationTargetException{final PrintStream orgSystemOut = System.out;final PrintStream orgSystemErr = System.err;// Note that System.out/System.err are also read in the "ReporterConfiguration" instatiation// in createProvider below. These are the same values as here.try{return createProviderInCurrentClassloader( startupConfig, insideFork, providerConfiguration, factory ).invoke( testSet );}finally{if ( restoreStreams && System.getSecurityManager() == null ){System.setOut( orgSystemOut );System.setErr( orgSystemErr );}}}private static SurefireProvider createProviderInCurrentClassloader( StartupConfiguration startupConfiguration1,boolean isInsideFork,ProviderConfiguration providerConfiguration,Object reporterManagerFactory1 ){BaseProviderFactory bpf = new BaseProviderFactory( (ReporterFactory) reporterManagerFactory1, isInsideFork );bpf.setTestRequest( providerConfiguration.getTestSuiteDefinition() );bpf.setReporterConfiguration( providerConfiguration.getReporterConfiguration() );ClassLoader classLoader = Thread.currentThread().getContextClassLoader();bpf.setClassLoaders( classLoader );bpf.setTestArtifactInfo( providerConfiguration.getTestArtifact() );bpf.setProviderProperties( providerConfiguration.getProviderProperties() );bpf.setRunOrderParameters( providerConfiguration.getRunOrderParameters() );bpf.setDirectoryScannerParameters( providerConfiguration.getDirScannerParams() );bpf.setMainCliOptions( providerConfiguration.getMainCliOptions() );bpf.setSkipAfterFailureCount( providerConfiguration.getSkipAfterFailureCount() );bpf.setShutdown( providerConfiguration.getShutdown() );String providerClass = startupConfiguration1.getActualClassName();return (SurefireProvider) ReflectionUtils.instantiateOneArg( classLoader, providerClass, ProviderParameters.class, bpf );} } 最關(guān)鍵的方法是上述代碼中:
private static SurefireProvider createProviderInCurrentClassloader(StartupConfiguration startupConfiguration1, boolean isInsideFork, ProviderConfiguration providerConfiguration, Object reporterManagerFactory1){BaseProviderFactory bpf = new BaseProviderFactory((ReporterFactory)reporterManagerFactory1, isInsideFork);bpf.setTestRequest(providerConfiguration.getTestSuiteDefinition());bpf.setReporterConfiguration(providerConfiguration.getReporterConfiguration());ClassLoader classLoader = Thread.currentThread().getContextClassLoader();bpf.setClassLoaders(classLoader);bpf.setTestArtifactInfo(providerConfiguration.getTestArtifact());bpf.setProviderProperties(providerConfiguration.getProviderProperties());bpf.setRunOrderParameters(providerConfiguration.getRunOrderParameters());bpf.setDirectoryScannerParameters(providerConfiguration.getDirScannerParams());bpf.setMainCliOptions(providerConfiguration.getMainCliOptions());bpf.setSkipAfterFailureCount(providerConfiguration.getSkipAfterFailureCount());bpf.setShutdown(providerConfiguration.getShutdown());String providerClass = startupConfiguration1.getActualClassName();return (SurefireProvider)ReflectionUtils.instantiateOneArg(classLoader, providerClass, ProviderParameters.class, bpf);} ReflectionUtils 來自 surefire-api.jar(2.19.1)? 代碼:

public static Object instantiateOneArg(ClassLoader classLoader, String className, Class<?> param1Class, Object param1){try{Class<?> aClass = loadClass(classLoader, className);Constructor constructor = getConstructor(aClass, new Class[] { param1Class });return constructor.newInstance(new Object[] { param1 });}catch (InvocationTargetException e){throw new SurefireReflectionException(e.getTargetException());}catch (InstantiationException e){throw new SurefireReflectionException(e);}catch (IllegalAccessException e){throw new SurefireReflectionException(e);}}public static Object instantiateTwoArgs(ClassLoader classLoader, String className, Class<?> param1Class, Object param1, Class param2Class, Object param2){try{Class<?> aClass = loadClass(classLoader, className);Constructor constructor = getConstructor(aClass, new Class[] { param1Class, param2Class });return constructor.newInstance(new Object[] { param1, param2 });}catch (InvocationTargetException e){throw new SurefireReflectionException(e.getTargetException());}catch (InstantiationException e){throw new SurefireReflectionException(e);}catch (IllegalAccessException e){throw new SurefireReflectionException(e);}}public static void invokeSetter(Object o, String name, Class<?> value1clazz, Object value){Method setter = getMethod(o, name, new Class[] { value1clazz });invokeSetter(o, setter, value);}public static Object invokeSetter(Object target, Method method, Object value){return invokeMethodWithArray(target, method, new Object[] { value });}public static Object invokeMethodWithArray(Object target, Method method, Object... args){try{return method.invoke(target, args);}catch (IllegalAccessException e){throw new SurefireReflectionException(e);}catch (InvocationTargetException e){throw new SurefireReflectionException(e.getTargetException());}}public static Object invokeMethodWithArray2(Object target, Method method, Object... args)throws InvocationTargetException{try{return method.invoke(target, args);}catch (IllegalAccessException e){throw new SurefireReflectionException(e);}}public static Object instantiateObject(String className, Class[] types, Object[] params, ClassLoader classLoader){Class<?> clazz = loadClass(classLoader, className);Constructor constructor = getConstructor(clazz, types);return newInstance(constructor, params);}public static Class<?> tryLoadClass(ClassLoader classLoader, String className){try{return classLoader.loadClass(className);}catch (NoClassDefFoundError localNoClassDefFoundError) {}catch (ClassNotFoundException localClassNotFoundException) {}return null;}public static Class<?> loadClass(ClassLoader classLoader, String className){try{return classLoader.loadClass(className);}catch (NoClassDefFoundError e){throw new SurefireReflectionException(e);}catch (ClassNotFoundException e){throw new SurefireReflectionException(e);}} public static Object newInstance(Constructor constructor, Object... params){try{return constructor.newInstance(params);}catch (InvocationTargetException e){throw new SurefireReflectionException(e);}catch (InstantiationException e){throw new SurefireReflectionException(e);}catch (IllegalAccessException e){throw new SurefireReflectionException(e);}}public static <T> T instantiate(ClassLoader classLoader, String classname, Class<T> returnType){try{Class<?> clazz = loadClass(classLoader, classname);return returnType.cast(clazz.newInstance());}catch (InstantiationException e){throw new SurefireReflectionException(e);}catch (IllegalAccessException e){throw new SurefireReflectionException(e);}}public static Object instantiateOneArg(ClassLoader classLoader, String className, Class<?> param1Class, Object param1){try{Class<?> aClass = loadClass(classLoader, className);Constructor constructor = getConstructor(aClass, new Class[] { param1Class });return constructor.newInstance(new Object[] { param1 });}catch (InvocationTargetException e){throw new SurefireReflectionException(e.getTargetException());}catch (InstantiationException e){throw new SurefireReflectionException(e);}catch (IllegalAccessException e){throw new SurefireReflectionException(e);}} 傳入的是SurefireProvider 類型,其實它是接口,代碼如下:

public abstract interface SurefireProvider {public abstract Iterable<Class<?>> getSuites();public abstract RunResult invoke(Object paramObject)throws TestSetFailedException, ReporterException, InvocationTargetException;public abstract void cancel(); } 還有一個很關(guān)鍵的接口擴(kuò)展 了 SurefireProvider ,它就是AbstractProvider 接口:

public abstract class AbstractProviderimplements SurefireProvider {private final Thread creatingThread = Thread.currentThread();public void cancel(){synchronized (this.creatingThread){if (this.creatingThread.isAlive()) {this.creatingThread.interrupt();}}} } 然后 surefire-testng.jar 中TestNGProvider代碼:

public class TestNGProviderextends AbstractProvider {private final Map<String, String> providerProperties;private final ReporterConfiguration reporterConfiguration;private final ClassLoader testClassLoader;private final ScanResult scanResult;private final TestRequest testRequest;private final ProviderParameters providerParameters;private final RunOrderCalculator runOrderCalculator;private final List<CommandLineOption> mainCliOptions;private final CommandReader commandsReader;private TestsToRun testsToRun;public TestNGProvider( ProviderParameters bootParams ){// don't start a thread in CommandReader while we are in in-plugin processcommandsReader = bootParams.isInsideFork() ? getReader().setShutdown( bootParams.getShutdown() ) : null;providerParameters = bootParams;testClassLoader = bootParams.getTestClassLoader();runOrderCalculator = bootParams.getRunOrderCalculator();providerProperties = bootParams.getProviderProperties();testRequest = bootParams.getTestRequest();reporterConfiguration = bootParams.getReporterConfiguration();scanResult = bootParams.getScanResult();mainCliOptions = bootParams.getMainCliOptions();}public RunResult invoke( Object forkTestSet )throws TestSetFailedException{if ( isFailFast() && commandsReader != null ){registerPleaseStopListener();}final ReporterFactory reporterFactory = providerParameters.getReporterFactory();final RunListener reporter = reporterFactory.createReporter();/*** {@link org.apache.maven.surefire.report.ConsoleOutputCapture#startCapture(ConsoleOutputReceiver)}* called in prior to initializing variable {@link #testsToRun}*/startCapture( (ConsoleOutputReceiver) reporter );RunResult runResult;try{if ( isTestNGXmlTestSuite( testRequest ) ){if ( commandsReader != null ){commandsReader.awaitStarted();}TestNGXmlTestSuite testNGXmlTestSuite = newXmlSuite();testNGXmlTestSuite.locateTestSets();testNGXmlTestSuite.execute( reporter );}else{if ( testsToRun == null ){if ( forkTestSet instanceof TestsToRun ){testsToRun = (TestsToRun) forkTestSet;}else if ( forkTestSet instanceof Class ){testsToRun = fromClass( (Class<?>) forkTestSet );}else{testsToRun = scanClassPath();}}if ( commandsReader != null ){registerShutdownListener( testsToRun );commandsReader.awaitStarted();}TestNGDirectoryTestSuite suite = newDirectorySuite();suite.execute( testsToRun, reporter );}}finally{runResult = reporterFactory.close();}return runResult;}boolean isTestNGXmlTestSuite( TestRequest testSuiteDefinition ){Collection<File> suiteXmlFiles = testSuiteDefinition.getSuiteXmlFiles();return !suiteXmlFiles.isEmpty() && !hasSpecificTests();}private boolean isFailFast(){return providerParameters.getSkipAfterFailureCount() > 0;}private int getSkipAfterFailureCount(){return isFailFast() ? providerParameters.getSkipAfterFailureCount() : 0;}private void registerShutdownListener( final TestsToRun testsToRun ){commandsReader.addShutdownListener( new CommandListener(){public void update( Command command ){testsToRun.markTestSetFinished();}} );}private void registerPleaseStopListener(){commandsReader.addSkipNextTestsListener( new CommandListener(){public void update( Command command ){FailFastEventsSingleton.getInstance().setSkipOnNextTest();}} );}private TestNGDirectoryTestSuite newDirectorySuite(){return new TestNGDirectoryTestSuite( testRequest.getTestSourceDirectory().toString(), providerProperties,reporterConfiguration.getReportsDirectory(), getTestFilter(),mainCliOptions, getSkipAfterFailureCount() );}private TestNGXmlTestSuite newXmlSuite(){return new TestNGXmlTestSuite( testRequest.getSuiteXmlFiles(),testRequest.getTestSourceDirectory().toString(),providerProperties,reporterConfiguration.getReportsDirectory(), getSkipAfterFailureCount() );}public Iterable<Class<?>> getSuites(){if ( isTestNGXmlTestSuite( testRequest ) ){return Collections.emptySet();}else{testsToRun = scanClassPath();return testsToRun;}}private TestsToRun scanClassPath(){final TestsToRun scanned = scanResult.applyFilter( null, testClassLoader );return runOrderCalculator.orderTestClasses( scanned );}private boolean hasSpecificTests(){TestListResolver specificTestPatterns = testRequest.getTestListResolver();return !specificTestPatterns.isEmpty() && !specificTestPatterns.isWildcard();}private TestListResolver getTestFilter(){TestListResolver filter = optionallyWildcardFilter( testRequest.getTestListResolver() );return filter.isWildcard() ? getEmptyTestListResolver() : filter;} } ProviderParameters接口代碼:
public abstract interface ProviderParameters {/*** @deprecated*/public abstract DirectoryScanner getDirectoryScanner();public abstract ScanResult getScanResult();public abstract RunOrderCalculator getRunOrderCalculator();public abstract ReporterFactory getReporterFactory();public abstract ConsoleLogger getConsoleLogger();@Deprecatedpublic abstract DirectoryScannerParameters getDirectoryScannerParameters();public abstract ReporterConfiguration getReporterConfiguration();public abstract TestRequest getTestRequest();public abstract ClassLoader getTestClassLoader();public abstract Map<String, String> getProviderProperties();public abstract TestArtifactInfo getTestArtifactInfo();public abstract List<CommandLineOption> getMainCliOptions();public abstract int getSkipAfterFailureCount();public abstract boolean isInsideFork();public abstract Shutdown getShutdown(); ScanResult接口代碼:
public abstract interface ScanResult {public abstract int size();public abstract String getClassName(int paramInt);public abstract TestsToRun applyFilter(ScannerFilter paramScannerFilter, ClassLoader paramClassLoader);public abstract List<Class<?>> getClassesSkippedByValidation(ScannerFilter paramScannerFilter, ClassLoader paramClassLoader);public abstract void writeTo(Map<String, String> paramMap); } TestsToRun代碼:

public class TestsToRunimplements Iterable<Class<?>> {private final List<Class<?>> locatedClasses;private volatile boolean finished;private int iteratedCount;public TestsToRun(Set<Class<?>> locatedClasses){this.locatedClasses = new ArrayList(locatedClasses);}public static TestsToRun fromClass(Class<?> clazz)throws TestSetFailedException{return new TestsToRun(Collections.singleton(clazz));}public Iterator<Class<?>> iterated(){return newWeakIterator();}public Iterator<Class<?>> iterator(){return new ClassesIterator(null);}private final class ClassesIteratorextends CloseableIterator<Class<?>>{private final Iterator<Class<?>> it = TestsToRun.this.locatedClasses.iterator();private int iteratedCount;private ClassesIterator() {}protected boolean isClosed(){return TestsToRun.this.isFinished();}protected boolean doHasNext(){return this.it.hasNext();}protected Class<?> doNext(){Class<?> nextTest = (Class)this.it.next();TestsToRun.this.iteratedCount = Math.max(++this.iteratedCount, TestsToRun.this.iteratedCount);return nextTest;}protected void doRemove() {}public void remove(){throw new UnsupportedOperationException("unsupported remove");}}public final void markTestSetFinished(){this.finished = true;}public final boolean isFinished(){return this.finished;}public String toString(){StringBuilder sb = new StringBuilder("TestsToRun: [");for (Class<?> clazz : this) {sb.append(' ').append(clazz.getName());}sb.append(']');return sb.toString();}public boolean containsAtLeast(int atLeast){return containsAtLeast(iterator(), atLeast);}private boolean containsAtLeast(Iterator<Class<?>> it, int atLeast){for (int i = 0; i < atLeast; i++){if (!it.hasNext()) {return false;}it.next();}return true;}public boolean containsExactly(int items){Iterator<Class<?>> it = iterator();return (containsAtLeast(it, items)) && (!it.hasNext());}public boolean allowEagerReading(){return true;}public Class<?>[] getLocatedClasses(){if (!allowEagerReading()) {throw new IllegalStateException("Cannot eagerly read");}Collection<Class<?>> result = new ArrayList();for (Class<?> clazz : this) {result.add(clazz);}return (Class[])result.toArray(new Class[result.size()]);}public Class<?> getClassByName(String className){for (Class<?> clazz : this) {if (clazz.getName().equals(className)) {return clazz;}}return null;}private Iterator<Class<?>> newWeakIterator(){final Iterator<Class<?>> it = this.locatedClasses.subList(0, this.iteratedCount).iterator();new CloseableIterator(){protected boolean isClosed(){return TestsToRun.this.isFinished();}protected boolean doHasNext(){return it.hasNext();}protected Class<?> doNext(){return (Class)it.next();}protected void doRemove() {}public void remove(){throw new UnsupportedOperationException("unsupported remove");}};} }

TestNGXmlTestSuite類代碼:

import static org.apache.maven.surefire.testng.TestNGExecutor.run;/*** Handles suite xml file definitions for TestNG.** @author jkuhnert* @author <a href='mailto:the[dot]mindstorm[at]gmail[dot]com'>Alex Popescu</a>*/ final class TestNGXmlTestSuiteextends TestSuite {private final List<File> suiteFiles;private List<String> suiteFilePaths;private final String testSourceDirectory;private final Map<String, String> options;private final File reportsDirectory;private final int skipAfterFailureCount;/*** Creates a testng testset to be configured by the specified* xml file(s). The XML files are suite definitions files according to TestNG DTD.*/TestNGXmlTestSuite( List<File> suiteFiles, String testSourceDirectory, Map<String, String> confOptions,File reportsDirectory, int skipAfterFailureCount ){this.suiteFiles = suiteFiles;this.options = confOptions;this.testSourceDirectory = testSourceDirectory;this.reportsDirectory = reportsDirectory;this.skipAfterFailureCount = skipAfterFailureCount;}void execute( RunListener reporter )throws TestSetFailedException{if ( suiteFilePaths == null ){throw new IllegalStateException( "You must call locateTestSets before calling execute" );}startTestSuite( reporter );run( suiteFilePaths, testSourceDirectory, options, reporter, reportsDirectory, skipAfterFailureCount );finishTestSuite( reporter );}void locateTestSets()throws TestSetFailedException{if ( suiteFilePaths != null ){throw new IllegalStateException( "You can't call locateTestSets twice" );}if ( suiteFiles.isEmpty() ){throw new IllegalStateException( "No suite files were specified" );}suiteFilePaths = new ArrayList<String>();for ( File suiteFile : suiteFiles ){if ( !suiteFile.isFile() ){throw new TestSetFailedException( "Suite file " + suiteFile + " is not a valid file" );}suiteFilePaths.add( suiteFile.getAbsolutePath() );}}@OverrideMap<String, String> getOptions(){return options;} } import static org.apache.maven.surefire.testng.TestNGExecutor.run; 直接執(zhí)行 TestNGExecutor.run

final class TestNGExecutor {/** The default name for a suite launched from the maven surefire plugin */private static final String DEFAULT_SUREFIRE_SUITE_NAME = "Surefire suite";/** The default name for a test launched from the maven surefire plugin */private static final String DEFAULT_SUREFIRE_TEST_NAME = "Surefire test";private static final boolean HAS_TEST_ANNOTATION_ON_CLASSPATH =tryLoadClass( TestNGExecutor.class.getClassLoader(), "org.testng.annotations.Test" ) != null;private TestNGExecutor(){throw new IllegalStateException( "not instantiable constructor" );}static void run( Iterable<Class<?>> testClasses, String testSourceDirectory,Map<String, String> options, // string,string because TestNGMapConfigurator#configure()RunListener reportManager, File reportsDirectory,TestListResolver methodFilter, List<CommandLineOption> mainCliOptions,int skipAfterFailureCount )throws TestSetFailedException{TestNG testng = new TestNG( true );Configurator configurator = getConfigurator( options.get( "testng.configurator" ) );if ( isCliDebugOrShowErrors( mainCliOptions ) ){System.out.println( "Configuring TestNG with: " + configurator.getClass().getSimpleName() );}XmlMethodSelector groupMatchingSelector = createGroupMatchingSelector( options );XmlMethodSelector methodNameFilteringSelector = createMethodNameFilteringSelector( methodFilter );Map<String, SuiteAndNamedTests> suitesNames = new HashMap<String, SuiteAndNamedTests>();List<XmlSuite> xmlSuites = new ArrayList<XmlSuite>();for ( Class<?> testClass : testClasses ){TestMetadata metadata = findTestMetadata( testClass );SuiteAndNamedTests suiteAndNamedTests = suitesNames.get( metadata.suiteName );if ( suiteAndNamedTests == null ){suiteAndNamedTests = new SuiteAndNamedTests();suiteAndNamedTests.xmlSuite.setName( metadata.suiteName );configurator.configure( suiteAndNamedTests.xmlSuite, options );xmlSuites.add( suiteAndNamedTests.xmlSuite );suitesNames.put( metadata.suiteName, suiteAndNamedTests );}XmlTest xmlTest = suiteAndNamedTests.testNameToTest.get( metadata.testName );if ( xmlTest == null ){xmlTest = new XmlTest( suiteAndNamedTests.xmlSuite );xmlTest.setName( metadata.testName );addSelector( xmlTest, groupMatchingSelector );addSelector( xmlTest, methodNameFilteringSelector );xmlTest.setXmlClasses( new ArrayList<XmlClass>() );suiteAndNamedTests.testNameToTest.put( metadata.testName, xmlTest );}xmlTest.getXmlClasses().add( new XmlClass( testClass.getName() ) );}testng.setXmlSuites( xmlSuites );configurator.configure( testng, options );postConfigure( testng, testSourceDirectory, reportManager, reportsDirectory, skipAfterFailureCount,extractVerboseLevel( options ) );testng.run();}private static boolean isCliDebugOrShowErrors( List<CommandLineOption> mainCliOptions ){return mainCliOptions.contains( CommandLineOption.LOGGING_LEVEL_DEBUG )|| mainCliOptions.contains( CommandLineOption.SHOW_ERRORS );}private static TestMetadata findTestMetadata( Class<?> testClass ){TestMetadata result = new TestMetadata();if ( HAS_TEST_ANNOTATION_ON_CLASSPATH ){Test testAnnotation = findAnnotation( testClass, Test.class );if ( null != testAnnotation ){if ( !StringUtils.isBlank( testAnnotation.suiteName() ) ){result.suiteName = testAnnotation.suiteName();}if ( !StringUtils.isBlank( testAnnotation.testName() ) ){result.testName = testAnnotation.testName();}}}return result;}private static <T extends Annotation> T findAnnotation( Class<?> clazz, Class<T> annotationType ){if ( clazz == null ){return null;}T result = clazz.getAnnotation( annotationType );if ( result != null ){return result;}return findAnnotation( clazz.getSuperclass(), annotationType );}private static class TestMetadata{private String testName = DEFAULT_SUREFIRE_TEST_NAME;private String suiteName = DEFAULT_SUREFIRE_SUITE_NAME;}private static class SuiteAndNamedTests{private XmlSuite xmlSuite = new XmlSuite();private Map<String, XmlTest> testNameToTest = new HashMap<String, XmlTest>();}private static void addSelector( XmlTest xmlTest, XmlMethodSelector selector ){if ( selector != null ){xmlTest.getMethodSelectors().add( selector );}}@SuppressWarnings( "checkstyle:magicnumber" )private static XmlMethodSelector createMethodNameFilteringSelector( TestListResolver methodFilter )throws TestSetFailedException{if ( methodFilter != null && !methodFilter.isEmpty() ){// the class is available in the testClassPathString clazzName = "org.apache.maven.surefire.testng.utils.MethodSelector";try{Class<?> clazz = Class.forName( clazzName );Method method = clazz.getMethod( "setTestListResolver", TestListResolver.class );method.invoke( null, methodFilter );}catch ( Exception e ){throw new TestSetFailedException( e.getMessage(), e );}XmlMethodSelector xms = new XmlMethodSelector();xms.setName( clazzName );// looks to need a high valuexms.setPriority( 10000 );return xms;}else{return null;}}@SuppressWarnings( "checkstyle:magicnumber" )private static XmlMethodSelector createGroupMatchingSelector( Map<String, String> options )throws TestSetFailedException{final String groups = options.get( ProviderParameterNames.TESTNG_GROUPS_PROP );final String excludedGroups = options.get( ProviderParameterNames.TESTNG_EXCLUDEDGROUPS_PROP );if ( groups == null && excludedGroups == null ){return null;}// the class is available in the testClassPathfinal String clazzName = "org.apache.maven.surefire.testng.utils.GroupMatcherMethodSelector";try{Class<?> clazz = Class.forName( clazzName );// HORRIBLE hack, but TNG doesn't allow us to setup a method selector instance directly.Method method = clazz.getMethod( "setGroups", String.class, String.class );method.invoke( null, groups, excludedGroups );}catch ( Exception e ){throw new TestSetFailedException( e.getMessage(), e );}XmlMethodSelector xms = new XmlMethodSelector();xms.setName( clazzName );// looks to need a high valuexms.setPriority( 9999 );return xms;}static void run( List<String> suiteFiles, String testSourceDirectory,Map<String, String> options, // string,string because TestNGMapConfigurator#configure()RunListener reportManager, File reportsDirectory, int skipAfterFailureCount )throws TestSetFailedException{TestNG testng = new TestNG( true );Configurator configurator = getConfigurator( options.get( "testng.configurator" ) );configurator.configure( testng, options );postConfigure( testng, testSourceDirectory, reportManager, reportsDirectory, skipAfterFailureCount,extractVerboseLevel( options ) );testng.setTestSuites( suiteFiles );testng.run();}private static Configurator getConfigurator( String className ){try{return (Configurator) Class.forName( className ).newInstance();}catch ( InstantiationException e ){throw new RuntimeException( e );}catch ( IllegalAccessException e ){throw new RuntimeException( e );}catch ( ClassNotFoundException e ){throw new RuntimeException( e );}}private static void postConfigure( TestNG testNG, String sourcePath, final RunListener reportManager,File reportsDirectory, int skipAfterFailureCount, int verboseLevel ){// 0 (default): turn off all TestNG outputtestNG.setVerbose( verboseLevel );TestNGReporter reporter = createTestNGReporter( reportManager );testNG.addListener( (Object) reporter );if ( skipAfterFailureCount > 0 ){ClassLoader cl = Thread.currentThread().getContextClassLoader();testNG.addListener( instantiate( cl, "org.apache.maven.surefire.testng.utils.FailFastNotifier",Object.class ) );testNG.addListener( new FailFastListener( createStoppable( reportManager, skipAfterFailureCount ) ) );}// FIXME: use classifier to decide if we need to pass along the source dir (only for JDK14)if ( sourcePath != null ){testNG.setSourcePath( sourcePath );}testNG.setOutputDirectory( reportsDirectory.getAbsolutePath() );}private static Stoppable createStoppable( final RunListener reportManager, int skipAfterFailureCount ){final AtomicInteger currentFaultCount = new AtomicInteger( skipAfterFailureCount );return new Stoppable(){public void fireStopEvent(){if ( countDownToZero( currentFaultCount ) ){FailFastEventsSingleton.getInstance().setSkipOnNextTest();}reportManager.testExecutionSkippedByUser();}};}// If we have access to IResultListener, return a ConfigurationAwareTestNGReporter// But don't cause NoClassDefFoundErrors if it isn't available; just return a regular TestNGReporter insteadprivate static TestNGReporter createTestNGReporter( RunListener reportManager ){try{Class.forName( "org.testng.internal.IResultListener" );Class c = Class.forName( "org.apache.maven.surefire.testng.ConfigurationAwareTestNGReporter" );@SuppressWarnings( "unchecked" ) Constructor<?> ctor = c.getConstructor( RunListener.class );return (TestNGReporter) ctor.newInstance( reportManager );}catch ( InvocationTargetException e ){throw new RuntimeException( "Bug in ConfigurationAwareTestNGReporter", e.getCause() );}catch ( ClassNotFoundException e ){return new TestNGReporter( reportManager );}catch ( Exception e ){throw new RuntimeException( "Bug in ConfigurationAwareTestNGReporter", e );}}private static int extractVerboseLevel( Map<String, String> options )throws TestSetFailedException{try{String verbose = options.get( "surefire.testng.verbose" );return verbose == null ? 0 : Integer.parseInt( verbose );}catch ( NumberFormatException e ){throw new TestSetFailedException( "Provider property 'surefire.testng.verbose' should refer to "+ "number -1 (debug mode), 0, 1 .. 10 (most detailed).", e );}} }

run 方法中直接調(diào)用

?TestNG testng = new TestNG( true );?




總結(jié)

以上是生活随笔為你收集整理的surefire 拉起testng单元测试类的源码流程阅读(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

日韩在线免费高清视频 | 久久国产精品久久精品国产演员表 | 蜜桃视频在线观看一区 | 国产精品一区二区三区在线免费观看 | 欧美一级小视频 | 黄色网在线免费观看 | 狠狠干五月天 | 国产视频在线观看免费 | 一区二区三区高清在线 | 国产成人av网站 | 国产精品免费观看视频 | 中文字幕在线观看不卡 | 婷婷综合影院 | 国产日韩视频在线播放 | 日本性生活一级片 | 天天干,天天射,天天操,天天摸 | 在线观看免费观看在线91 | 中文av资源站 | 国产黄 | 国产精品九九热 | 久久久久亚洲精品男人的天堂 | 久久精品国产免费 | 五月天激情综合 | 亚洲专区在线视频 | 91香蕉视频黄 | 久久久久北条麻妃免费看 | 久精品视频在线 | 国产成人在线观看免费 | 精品国产一区二区三区四区在线观看 | 999成人免费视频 | 97视频久久久 | av在线免费在线 | 97成人精品视频在线播放 | 一本一本久久a久久精品综合小说 | 免费看一级一片 | 天堂va在线高清一区 | 国产视频 久久久 | 国产精品久久久影视 | 亚州国产视频 | 公与妇乱理三级xxx 在线观看视频在线观看 | 成人国产综合 | 九九免费在线视频 | 亚洲精品乱码久久久久 | 久久久亚洲精华液 | 亚洲精品男人的天堂 | 在线不卡a | 国产精品v欧美精品 | www夜夜操 | av在线日韩 | 三级毛片视频 | 午夜999 | 亚洲国产精品日韩 | 国产精品九九视频 | 国产91丝袜在线播放动漫 | 国产精品综合久久久久 | 香蕉在线影院 | 在线观看国产日韩欧美 | 99精品欧美一区二区蜜桃免费 | 九九九九热精品免费视频点播观看 | 国产一区二区电影在线观看 | 免费视频在线观看网站 | 99精品在这里 | 人人爽人人舔 | 日韩三级免费观看 | 992tv在线观看 | 成人小视频在线 | 国产一区高清在线观看 | 久久神马影院 | 91 在线视频播放 | 精品久久久久一区二区国产 | 婷婷五情天综123 | 欧美日韩视频在线观看一区二区 | 国产小视频在线免费观看视频 | 欧美成人va | 中文字幕一区二区三区四区久久 | 国产剧情av在线播放 | 97超碰香蕉 | 蜜臀aⅴ国产精品久久久国产 | 国产一级小视频 | 日韩乱码中文字幕 | 欧美一性一交一乱 | 不卡的av在线| 中文字幕观看视频 | 日本久久久亚洲精品 | www.香蕉视频 | 天天色棕合合合合合合 | 久久综合中文字幕 | 久久都是精品 | 亚欧日韩av| www色综合 | 丁香六月婷婷综合 | 国产亚洲精品美女久久 | 婷婷六月激情 | av成人免费观看 | a在线观看视频 | 国产91学生粉嫩喷水 | 美女视频又黄又免费 | 五月天视频网站 | 国产91九色视频 | 成人av免费在线播放 | 久久夜色精品国产欧美一区麻豆 | 天天舔夜夜操 | 日本久久不卡视频 | 久久一及片| jizzjizzjizz亚洲 | 麻豆视频成人 | 婷婷久久五月 | 西西4444www大胆艺术 | 国产又黄又硬又爽 | 五月天中文字幕mv在线 | 亚洲欧美日韩国产精品一区午夜 | 国产黄色a | 午夜久久成人 | 婷婷丁香激情综合 | 日韩理论 | www.色com| 亚洲精品国内 | 亚洲精品美女久久久 | 国产伦精品一区二区三区在线 | 黄色三级免费看 | 久久久人人爽 | 99久久婷婷国产精品综合 | 日韩精品视频网站 | 久久久久欠精品国产毛片国产毛生 | 色亚洲激情 | 欧美伦理电影一区二区 | 久久精品视频免费播放 | 久草免费在线观看视频 | 九九久久久久久久久激情 | 亚洲五月激情 | 精品国产乱码久久久久久天美 | 久久女同性恋中文字幕 | 天天操操操操操操 | 久久久久久久久久亚洲精品 | 亚洲欧美日韩在线看 | 99久久精品免费 | 免费a v在线 | 午夜视频二区 | 日韩免费网址 | 中文字幕亚洲字幕 | 国产综合精品一区二区三区 | 欧美成人亚洲 | 美女免费电影 | 亚洲精品视频免费在线 | 天天干天天做天天操 | 国产精品久久中文字幕 | 亚洲人成精品久久久久 | 99久久精品费精品 | 热久久最新地址 | 国产原厂视频在线观看 | 最近中文字幕mv免费高清在线 | 天天av天天 | 91一区一区三区 | 亚洲激情综合 | 亚洲毛片久久 | 91在线日韩| 99热99热| 日韩理论在线播放 | 狠狠色丁香婷婷综合欧美 | 久久久久久久毛片 | 日本精品一区二区三区在线观看 | 在线播放一区二区三区 | 国产精品中文 | 久久国产精品二国产精品中国洋人 | 国产一区二区三区免费观看视频 | 在线成人观看 | 免费一级片在线 | 色婷婷免费视频 | 亚洲精品视频在线观看免费视频 | 日日干av| 国产一区免费观看 | 91中文字幕在线视频 | 亚洲永久在线 | 精品一区 精品二区 | 国产青青青 | 天天色天天色天天色 | 日韩中文在线电影 | 精品国产视频在线观看 | 97视频人人免费看 | 91在线免费看片 | 99精品国产一区二区 | 97超碰色偷偷 | bbw av| 91亚洲国产成人 | 日韩69av| 国产精品 日韩精品 | 国产精品美女久久久久久久 | 国产福利资源 | 三级动态视频在线观看 | 久久精品7 | 高清国产午夜精品久久久久久 | 一区在线电影 | 99免费在线视频观看 | 久久天天操| 成人av电影免费观看 | 亚洲黄色在线观看 | 嫩草av在线 | 欧美一级久久久久 | 狠狠色伊人亚洲综合成人 | 免费在线观看av网站 | 日韩在线高清视频 | 欧美色精品天天在线观看视频 | 成人在线一区二区 | 久久一区二区三区国产精品 | 亚洲国产精品成人va在线观看 | 99热国产在线中文 | 伊人在线视频 | 狠狠色丁香九九婷婷综合五月 | a视频在线观看免费 | av网站手机在线观看 | 久久99精品一区二区三区三区 | 久久,天天综合 | 91亚洲综合 | 免费在线播放av电影 | 91精品在线免费 | 国产美女网站在线观看 | 精品美女国产在线 | 欧美一级片免费在线观看 | 久久综合色综合88 | 国产91丝袜在线播放动漫 | 久久久久久欧美二区电影网 | 肉色欧美久久久久久久免费看 | 91亚洲精品久久久蜜桃借种 | 久久99精品久久只有精品 | 国产在线小视频 | 免费观看性生交大片3 | 人人搞人人搞 | 国产午夜一区 | 手机av电影在线 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 精品久久久久久久久久久久久 | 麻豆传媒一区二区 | 欧美性生活大片 | 992tv在线成人免费观看 | 99热精品久久 | 午夜电影 电影 | 人人澡人摸人人添学生av | 在线观看免费av片 | 亚洲精品国产精品国自产 | 亚洲精品九九 | 国产精品久久久久久久久费观看 | 91字幕 | av福利资源 | 国产福利一区二区在线 | 一区二区三区免费在线播放 | 在线午夜 | 一区二区不卡在线观看 | 国产黄色片免费在线观看 | 日韩久久精品一区二区三区下载 | 久久麻豆精品 | 亚洲在线a| 三级黄在线| 天天操综合网 | 又紧又大又爽精品一区二区 | 国产精品激情 | 中文字幕日韩一区二区三区不卡 | 久久99精品国产一区二区三区 | 日本一区二区高清不卡 | www.五月天色| 亚洲精品一区二区久 | 麻豆视频在线免费 | 国产午夜在线 | 麻豆视传媒官网免费观看 | 在线观看视频97 | 亚洲成色777777在线观看影院 | 国产精品第10页 | 超碰日韩在线 | 久久九九影视网 | www.天天操.com| 天天干天天色2020 | 97精品国产97久久久久久久久久久久 | 嫩嫩影院理论片 | 99热这里只有精品8 久久综合毛片 | 五月婷婷综合激情网 | 91人人插| 精精国产xxxx视频在线播放 | 久久综合爱 | 免费av网站在线看 | 国产伦精品一区二区三区免费 | 欧美一区二区在线刺激视频 | 免费高清在线视频一区· | av在线电影免费观看 | 亚洲区精品 | 欧美日韩国产一区 | 久久久国产精品麻豆 | 欧美天天干 | 很黄很污的视频网站 | 操操操av| 黄色电影在线免费观看 | 亚洲精品在线观看的 | 911精品视频 | 欧美一二三区在线观看 | 国产二区免费视频 | 亚洲成人国产精品 | av不卡网站| 成人免费亚洲 | 久久精品日本啪啪涩涩 | 久久综合九九 | 亚洲欧美日韩国产一区二区 | 免费色视频网址 | 免费观看9x视频网站在线观看 | 久久人人射 | 99精品99| 亚洲一区二区三区精品在线观看 | 五月天视频网 | 日本一区二区高清不卡 | 亚洲一区二区视频在线 | 夜夜爽天天爽 | 精品在线视频一区二区三区 | 国产小视频免费观看 | 久久久久成人精品 | 久久永久视频 | 久草影视在线 | www.亚洲黄 | 大胆欧美gogo免费视频一二区 | 久久超碰在线 | 亚洲国产一区在线观看 | 国产精品一区二区三区在线免费观看 | 人人爽人人香蕉 | 亚洲精品视频免费看 | 久久99亚洲精品久久 | 国产亚洲成人网 | 正在播放亚洲精品 | 91av播放| 国产日韩在线视频 | 久久新 | 正在播放五月婷婷狠狠干 | 久久网站av | 五月天婷婷狠狠 | 亚洲精品欧美视频 | 国产高清黄色 | 久草av在线播放 | 91精品国产三级a在线观看 | 99久久99热这里只有精品 | 久久高清国产视频 | 成人免费大片黄在线播放 | 99久久精 | 91丨九色丨蝌蚪丨对白 | 午夜精品久久久久久久99水蜜桃 | 欧美日韩一级久久久久久免费看 | 成人免费毛片aaaaaa片 | 国产精品久久久久久电影 | 色综合天天综合网国产成人网 | 久草视频在线新免费 | 六月丁香六月婷婷 | 成人超碰97| 久久综合欧美精品亚洲一区 | 日韩区视频| 手机av电影在线 | www.久久精品视频 | 69av免费视频 | av播放在线 | 欧美一区二区三区不卡 | 精品国产色 | 精品在线播放视频 | 综合天天| 西西44人体做爰大胆视频 | 四虎永久国产精品 | 五月婷在线视频 | 一区二区三区四区精品视频 | 日韩欧美极品 | 日韩一级黄色av | 亚洲国产精品久久久 | wwwwww国产 | 精品网站999www | 欧美污污网站 | 日韩av成人在线观看 | 97香蕉久久国产在线观看 | 免费日韩一区二区三区 | 视频直播国产精品 | 久久最新| 欧美性生爱 | 国产一区二区三区高清播放 | 久99久精品| 欧美电影黄色 | 国产午夜视频在线观看 | 亚洲激情在线视频 | 欧洲黄色片 | 成人黄色在线 | 国产麻豆精品免费视频 | 日韩三级不卡 | 五月天综合网 | 人人爽人人爽人人片av免 | 夜夜爽天天爽 | 色婷婷视频在线 | 久久艹在线观看 | 在线成人欧美 | 经典三级一区 | 日日夜夜人人天天 | 日韩视频免费观看高清 | 日韩免费看| 91精品国自产拍天天拍 | 欧洲精品亚洲精品 | 欧美日韩国产在线观看 | 日本久久免费视频 | 黄色a在线观看 | 开心丁香婷婷深爱五月 | 免费h视频| 亚洲综合情 | 成人免费一级片 | 夜夜躁日日躁 | 成人97人人超碰人人99 | 国产精品毛片久久 | 久久国产香蕉视频 | 黄色免费高清视频 | 深夜成人av | 最新av网址在线观看 | 青青河边草观看完整版高清 | 成人免费在线视频观看 | 国产乱对白刺激视频在线观看女王 | 精品欧美日韩 | 国产91精品一区二区麻豆亚洲 | 一区国产精品 | 天堂av高清 | 亚洲一区不卡视频 | 国产一区在线精品 | 午夜视频导航 | 久久久99久久 | 久久国产女人 | 亚洲自拍偷拍色图 | 毛片网在线| 人人搞人人搞 | 777xxx欧美| 国产精品久久久久免费a∨ 欧美一级性生活片 | 国产一区二区不卡在线 | 夜夜澡人模人人添人人看 | 欧美中文字幕久久 | 91中文字幕一区 | 久久国产精品久久精品 | 亚洲一区av| 成人一级| 国产精品久久久久国产a级 激情综合中文娱乐网 | 日韩精品资源 | 成人 国产 在线 | 最近的中文字幕大全免费版 | 久久免费视频在线观看6 | 国产高清一区二区 | 69视频在线播放 | 在线看片日韩 | www.色国产 | 国产精品久久嫩一区二区免费 | 在线视频99| 狠狠操狠狠干天天操 | 久久人人爽爽人人爽人人片av | 精品美女国产在线 | 97av在线视频免费播放 | 欧美精品xxx| 婷婷激情综合五月天 | 啪啪免费观看网站 | 美女网站在线观看 | 精品国产_亚洲人成在线 | 免费观看特级毛片 | 亚a在线 | 精品av在线播放 | 成人黄色免费观看 | 一级黄色在线视频 | 国产福利精品视频 | 成人黄色片在线播放 | 99re8这里有精品热视频免费 | 制服丝袜在线 | 天天操天天弄 | 在线观看aa | 国产精品久久久久久久av电影 | 91亚洲精品视频 | 成人在线视频一区 | 天天色天天操天天爽 | 日韩成人精品在线观看 | 在线免费观看国产视频 | 国产精品永久在线观看 | 五月婷婷亚洲 | 男女免费视频观看 | 91精品麻豆| 4hu视频 | 国产精品一区二区久久精品 | 免费看黄在线网站 | 亚洲精品视频免费在线 | 四虎国产精品永久在线国在线 | 99久久99久久精品国产片果冰 | 99精品视频免费全部在线 | 伊人五月婷 | 97免费中文视频在线观看 | 日韩中文在线播放 | 日日麻批40分钟视频免费观看 | 亚洲精品h | 黄色中文字幕 | 国产在线精品视频 | 黄色91在线观看 | 爱av在线网| 国产成人一级 | 精品一区二区综合 | 国产精品99久久久久久人免费 | 综合在线色 | 激情深爱 | 九九九九热精品免费视频点播观看 | 国产精品一区二区三区电影 | 国产九九九视频 | 精品国偷自产国产一区 | 亚洲国产精品成人女人久久 | 成人在线视频你懂的 | 国产一区二区三区免费在线 | 国内精品美女在线观看 | 久久亚洲二区 | 91麻豆视频网站 | 特级毛片在线观看 | 天天天天天干 | 91天堂在线观看 | 91av小视频 | 摸阴视频 | 一区二区三区四区五区在线 | 中文有码在线视频 | 热精品 | 日韩在线观看一区二区三区 | 国产精品第一页在线 | 激情xxxx| 在线免费av播放 | 天天搞夜夜骑 | 中文字幕免费播放 | 美女网站在线观看 | 98精品国产自产在线观看 | 久久伦理电影网 | 日韩欧美第二页 | 日韩电影中文字幕在线 | 国产99久久久欧美黑人 | 亚洲成人av在线播放 | 精品国产精品一区二区夜夜嗨 | 激情综合网五月 | 国产精品免费一区二区三区在线观看 | 91天堂在线观看 | 亚洲国产色一区 | 91视频在线观看大全 | 丰满少妇一级片 | 中文字幕亚洲精品在线观看 | 色欲综合视频天天天 | 中文日韩在线视频 | 亚洲视频精选 | 亚洲黄在线观看 | 久久久久国产一区二区三区四区 | 欧美精品亚洲二区 | 久久精品日本啪啪涩涩 | 精品国产免费人成在线观看 | 久草视频手机在线 | 亚洲1区 在线 | 日日夜夜网| 成人免费看视频 | 欧美高清视频不卡网 | 中文亚洲欧美日韩 | 99久久精品国产系列 | 操操色| 热精品| 国产麻豆精品久久 | 精品国产精品国产偷麻豆 | 伊色综合久久之综合久久 | 色婷婷电影 | 少妇精品久久久一区二区免费 | 日韩高清av | 操操爽| 久久亚洲欧美日韩精品专区 | 免费看91的网站 | 丁香六月激情 | 韩国在线视频一区 | 日本久久视频 | 亚洲成人av片 | 成人wwwxxx视频 | 久久不射影院 | 亚洲热视频 | 99久久精品免费视频 | 在线观看中文字幕网站 | 亚洲国产精久久久久久久 | 一级α片免费看 | 国产精选在线观看 | 黄a在线看| 91亚洲视频在线观看 | 中文字幕在线人 | 99久久综合国产精品二区 | 特黄特色特刺激视频免费播放 | 久久曰视频 | 一区二区视频免费在线观看 | 久草免费在线观看视频 | 又色又爽的网站 | 国产只有精品 | 日本中文字幕在线播放 | 大胆欧美gogo免费视频一二区 | 狠狠色丁香婷婷综合最新地址 | 亚洲精品中文字幕在线观看 | 成人久久久久久久久久 | 久久久久久久久久久影视 | 69视频在线播放 | 中文字幕在线视频一区二区三区 | 亚洲精品午夜国产va久久成人 | 婷婷在线观看视频 | 免费黄色在线 | 婷婷综合影院 | av成人亚洲 | 日韩动态视频 | 四虎国产免费 | 不卡的av在线 | 国产99久久久国产精品成人免费 | 91精品在线免费观看视频 | 天天综合成人 | 天天干天天天 | 日韩在线资源 | 国产成人亚洲精品自产在线 | 91网页版免费观看 | 亚洲电影图片小说 | 亚洲精品网站 | 亚州精品在线视频 | 96精品高清视频在线观看软件特色 | 国产精品久久久久久999 | 日日天天狠狠 | 国产黄色在线网站 | 精品视频 | 天天爽天天爽 | 日韩精品一区二区在线视频 | 黄色av电影网 | 久久综合久久综合久久综合 | 日韩久久久久 | 天天插狠狠插 | 狠狠色综合欧美激情 | 91免费版成人 | 视频成人永久免费视频 | 久久国产精品免费视频 | 国产99久久99热这里精品5 | 菠萝菠萝蜜在线播放 | a久久久久久 | 美女视频黄的免费的 | 91在线播 | 这里只有精品视频在线观看 | 美女视频黄是免费的 | 狠狠色噜噜狠狠狠 | 一区二区三区在线视频观看58 | 免费99精品国产自在在线 | 中文字幕免费久久 | 黄色a一级片 | 国产91国语对白在线 | 久久99久久99免费视频 | 国产品久精国精产拍 | 亚洲激情中文 | 国产永久免费观看 | 久久高清 | 久久久亚洲网站 | 91热视频 | 99爱视频在线观看 | 亚洲精品久久久蜜臀下载官网 | 欧美日韩在线视频观看 | 亚洲激情视频在线 | 在线观看国产麻豆 | 97超碰在线久草超碰在线观看 | 国产精品一区二区吃奶在线观看 | 久久久久久片 | 国产97视频 | 天天做日日爱夜夜爽 | 在线免费观看麻豆视频 | 亚洲综合色丁香婷婷六月图片 | 国产在线a| 综合久久精品 | 一区二区三区在线观看免费 | 成人av高清| 青青河边草观看完整版高清 | 久久久亚洲精华液 | 一本之道乱码区 | 久草9视频 | 免费在线精品视频 | 一区二区三区在线免费播放 | 久久久国产影视 | 亚洲欧美观看 | 日韩va在线观看 | 天天综合精品 | 欧美综合色 | 国产一区二区三区 在线 | 精品国产一区二区三区不卡 | 91资源在线视频 | 最新真实国产在线视频 | 精品一区二区免费视频 | 国产一区二区三区在线免费观看 | 国产一级免费av | 久久综合之合合综合久久 | 在线播放你懂 | 91尤物在线播放 | 91福利社区在线观看 | 天天天天射| 国产精品久久久久久久久久久久午夜片 | 久久99热精品这里久久精品 | 国产淫片免费看 | 成人av手机在线 | av电影一区| 色多视频在线观看 | 精品亚洲免费 | 国产黄色片免费 | 久久黄色影视 | 亚洲.www | 精品久久久久久亚洲综合网 | 婷婷av网 | 日韩欧美69 | 久久亚洲私人国产精品 | 成年人免费电影 | 亚洲砖区区免费 | 亚洲精品视频网站在线观看 | 国产日韩一区在线 | 日躁夜躁狠狠躁2001 | 国产在线a免费观看 | 九九热在线精品视频 | 蜜臀91丨九色丨蝌蚪老版 | 天天射天| 黄色网址在线播放 | 超薄丝袜一二三区 | 久久成人18免费网站 | 亚洲区另类春色综合小说校园片 | 最新国产在线视频 | 狠狠色丁香久久婷婷综合五月 | 中文字幕有码在线播放 | 国产日韩欧美在线一区 | 色婷婷狠狠操 | 青青河边草免费观看完整版高清 | 视频99爱 | 亚洲最大成人网4388xx | 五月的婷婷 | 国产色婷婷在线 | 日韩系列在线观看 | 99这里只有久久精品视频 | 中文字幕在线观看第一区 | 成人av网址大全 | 成人网页在线免费观看 | 欧美午夜精品久久久久久孕妇 | 日韩一三区 | 国产一级淫片在线观看 | 国产精品一区专区欧美日韩 | 免费在线观看成人小视频 | 精品国产欧美一区二区 | 欧美污污视频 | 婷婷久久久久 | 久久久亚洲电影 | 久久免费视频观看 | 欧美美女视频在线观看 | 日韩欧美电影 | 国产黄网站在线观看 | 在线观看你懂的网站 | 成年人看片网站 | 久久久久成 | 最近日韩免费视频 | 国产成人精品午夜在线播放 | avlulu久久精品 | 7777精品伊人久久久大香线蕉 | 天天干天天干天天 | 香蕉视频在线视频 | 在线之家免费在线观看电影 | 欧美午夜精品久久久久久浪潮 | 久久精品首页 | 久久伊人精品一区二区三区 | 超碰在线官网 | 在线观看香蕉视频 | 正在播放国产精品 | 狠狠色丁香婷婷综合橹88 | 麻豆免费看片 | 麻花豆传媒mv在线观看网站 | 国产在线成人 | 在线免费观看视频一区二区三区 | 久久免费a | 中文字幕之中文字幕 | 国产亚洲精品成人av久久ww | 国产精品一区二区av影院萌芽 | 99热免费在线 | 日本在线观看一区 | 亚洲日本韩国一区二区 | 中文字幕超清在线免费 | 美女视频是黄的免费观看 | 91人人澡人人爽人人精品 | 欧美巨乳波霸 | 国产91影院 | 色综合天天做天天爱 | 天天草天天干天天射 | 免费一级特黄毛大片 | 国产馆在线播放 | av 在线观看 | 久久精品之 | 国产免费又爽又刺激在线观看 | 97av色 | 欧美污网站 | 日本巨乳在线 | 亚洲精品国产精品乱码在线观看 | 久久99国产综合精品 | av高清一区二区三区 | 五月黄色| 天天色天天色 | 日韩精品一区二区三区免费观看视频 | 国产无遮挡猛进猛出免费软件 | 久久xxxx | 色综合久久88色综合天天免费 | 天天操天天舔天天干 | 又湿又紧又大又爽a视频国产 | 久久人人爽人人爽 | 国产精品99免费看 | 日韩精品短视频 | 国产婷婷精品av在线 | 国产xvideos免费视频播放 | 福利视频第一页 | 色五丁香 | 国产精品第52页 | 97免费视频在线播放 | 日韩二级毛片 | 日韩色爱 | 欧美日韩国产高清视频 | 久久精品国产久精国产 | 日韩精品一区在线观看 | 五月天六月色 | 久久久精品一区二区 | 免费日韩在线 | 婷婷色在线播放 | 99在线观看视频 | 久久视频国产精品免费视频在线 | 亚洲国产免费av | 国产精品久久久久久麻豆一区 | 香蕉视频在线视频 | 免费视频三区 | a天堂免费| 久久综合福利 | 欧美一区二区在线免费观看 | 日韩一级电影在线观看 | 国产成人av免费在线观看 | 激情视频一区二区 | 99在线视频免费观看 | 久久国产色 | 97人人模人人爽人人喊中文字 | 色综合婷婷久久 | 91av网站在线观看 | 91在线产啪| 安徽妇搡bbbb搡bbbb | 色视频 在线 | 国产色就色 | 免费网站色 | 天天操网站 | 69精品视频 | 啪啪小视频网站 | 黄色视屏免费在线观看 | 免费在线观看黄色网 | 国产精品不卡在线播放 | 国产男女无遮挡猛进猛出在线观看 | 欧美视频在线二区 | 日韩国产在线观看 | 亚洲精品麻豆 | 正在播放五月婷婷狠狠干 | 久草视频播放 | 国产精品国产三级国产 | 九九热视频在线播放 | 综合激情| 欧美一二三区在线播放 | 亚洲精品视频一二三 | 国产精品久久久久影院 | 久久精品爱视频 | 亚洲一区黄色 | 国产国产人免费人成免费视频 | 国产高清精 | 天天爱天天射天天干天天 | 亚洲视频在线免费观看 | 日韩一区二区三区在线看 | 国产免费黄视频在线观看 | 91在线九色 | av丝袜在线 | 91精品第一页 | 黄色在线观看免费网站 | 亚洲一区日韩 | 国产精品第一 | 免费能看的黄色片 | 国产精品国产毛片 | 丁香影院在线 | 日韩网站在线播放 | 日日夜夜天天射 | 国产精品18久久久久久久久久久久 | 69视频网站 | 日韩精品久久一区二区 | 欧美日韩久久 | 美女黄网站视频免费 | 久久午夜免费视频 | 久草视频一区 | 在线观看av黄色 | 精品在线观看一区二区 | 91视频成人免费 | 久久成年人视频 | 人人干天天干 | 免费在线观看午夜视频 | 免费成人在线网站 | 色资源在线 | 国产黄影院色大全免费 | 国产精品69久久久久 | 粉嫩一区二区三区粉嫩91 | 亚洲精品乱码久久久久久高潮 | 波多野结衣电影一区二区三区 | 亚洲欧美视频在线 | 日韩精品视频在线观看免费 | 奇米影视8888在线观看大全免费 | 日韩欧美视频免费在线观看 | 高潮久久久久久久久 | 欧美天天射 | 国产一区二区播放 | 日韩在线观看的 | 色妞色视频一区二区三区四区 | 伊人久久精品久久亚洲一区 | 亚洲精选视频在线 | 狠狠操天天射 | 黄色成人在线观看 | 成人性生活大片 | 亚洲视频久久久久 | 国产不卡av在线播放 | 97涩涩视频 | 蜜臀av夜夜澡人人爽人人 | 成年人视频免费在线播放 | 国产色资源 | 波多野结衣在线中文字幕 | 日韩色综合网 | 成人免费视频网站 | 亚洲日本三级 | 国产黄色特级片 | 伊人中文字幕在线 | 中文字幕4 | 亚洲精品自拍视频在线观看 | 国产99久久九九精品免费 | 国产精品 日韩 | 国产精品人成电影在线观看 | 日本中文字幕久久 | 日日摸日日添日日躁av | www.av在线播放 | 国产精品免费在线播放 | 中文字幕黄色av | 欧美成人在线网站 | av一区二区三区在线 | 一区二区视频在线免费观看 | 一区在线观看 | 免费看的黄色小视频 | 91色一区二区三区 | 日韩电影在线一区 | 国产精品福利在线观看 | 国产免费观看久久黄 | av电影免费在线播放 | 日本久久久精品视频 | 99视频+国产日韩欧美 | 天天干夜夜爽 | 麻豆91精品视频 | 国产午夜精品福利视频 | 久久国产美女视频 | 二区三区中文字幕 | 精品国产电影一区二区 | 一区 二区电影免费在线观看 | 天天天在线综合网 | 日韩视频一二三区 | 国产精品久久嫩一区二区免费 | 五月花婷婷 | 国外成人在线视频网站 | 欧美一区二区三区在线看 | 在线国产91 | 日韩欧美精选 | 激情欧美一区二区三区 | 亚洲丁香久久久 | 人人爽久久久噜噜噜电影 | 日韩色综合网 | 国产资源在线观看 | 91麻豆网 | 国产午夜精品久久 | 在线国产一区二区三区 | 天天天天天天操 | 91久久一区二区 | 国产小视频在线观看 | 久久久久久精 | 中文字幕日韩免费视频 | 99久久精品电影 | 免费影视大全推荐 | 中文在线a∨在线 | 国产黄色精品网站 | 成年人黄色大片在线 | 精品在线观看免费 | 最新精品国产 | 久久99精品久久久久久三级 | 91av小视频 | 中文在线免费观看 | av色综合| 精品久久久久久一区二区里番 | 日韩毛片在线一区二区毛片 | 久久99国产综合精品免费 | 久久全国免费视频 | 国产精品高 | 五月天激情开心 | 成人毛片100免费观看 | 激情久久一区二区三区 | 国内精品久久久久久久久久清纯 | 欧美一区在线观看视频 | 四虎在线免费观看 | 国产在线毛片 | 中文字幕一区二区三区四区 | 菠萝菠萝蜜在线播放 | 久草综合视频 | 手机在线黄色网址 | 香蕉97视频观看在线观看 | 免费人成在线观看 | 日韩1页 | 婷婷九九 | 国内精品久久久久久久影视简单 | 国产网站色 | 四虎成人精品在永久免费 | 激情婷婷av | 一级黄色在线视频 |