int-test mqtt <-> prediction

This commit is contained in:
naumueller
2026-02-19 21:31:49 +01:00
parent 701cc0a8b6
commit 5ed5008def
461 changed files with 53944 additions and 11 deletions
@@ -0,0 +1,81 @@
// Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
package tests.junittests;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.cef.browser.CefBrowser;
import org.cef.browser.CefFrame;
import org.cef.handler.CefDisplayHandlerAdapter;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
// Test the DisplayHandler implementation.
@ExtendWith(TestSetupExtension.class)
class DisplayHandlerTest {
private final String testUrl_ = "http://test.com/test.html";
private final String testContent_ =
"<html><head><title>Test Title</title></head><body>Test!</body></html>";
private boolean gotCallback_ = false;
@Test
void onTitleChange() {
TestFrame frame = new TestFrame() {
@Override
protected void setupTest() {
client_.addDisplayHandler(new CefDisplayHandlerAdapter() {
@Override
public void onTitleChange(CefBrowser browser, String title) {
assertFalse(gotCallback_);
gotCallback_ = true;
assertEquals("Test Title", title);
terminateTest();
}
});
addResource(testUrl_, testContent_, "text/html");
createBrowser(testUrl_);
super.setupTest();
}
};
frame.awaitCompletion();
assertTrue(gotCallback_);
}
@Test
void onAddressChange() {
TestFrame frame = new TestFrame() {
@Override
protected void setupTest() {
client_.addDisplayHandler(new CefDisplayHandlerAdapter() {
@Override
public void onAddressChange(CefBrowser browser, CefFrame frame, String url) {
assertFalse(gotCallback_);
gotCallback_ = true;
assertEquals(url, testUrl_);
terminateTest();
}
});
addResource(testUrl_, testContent_, "text/html");
createBrowser(testUrl_);
super.setupTest();
}
};
frame.awaitCompletion();
assertTrue(gotCallback_);
}
}
@@ -0,0 +1,165 @@
// Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
package tests.junittests;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.cef.callback.CefDragData;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import java.util.Vector;
// Test the TestFrame implementation.
@ExtendWith(TestSetupExtension.class)
class DragDataTest {
@Test
void createEmpty() {
CefDragData dragData = CefDragData.create();
assertNotNull(dragData);
assertFalse(dragData.isReadOnly());
assertFalse(dragData.isLink());
assertFalse(dragData.isFile());
assertTrue(dragData.isFragment()); // Default state.
assertEquals("", dragData.getLinkURL());
assertEquals("", dragData.getLinkTitle());
assertEquals("", dragData.getLinkMetadata());
assertEquals("", dragData.getFragmentText());
assertEquals("", dragData.getFragmentHtml());
assertEquals("", dragData.getFragmentBaseURL());
assertEquals(0, dragData.getFileContents(null));
assertEquals("", dragData.getFileName());
assertFalse(dragData.getFileNames(null));
// Explicit cleanup to avoid memory leaks.
dragData.dispose();
}
@Test
void createLink() {
CefDragData dragData = CefDragData.create();
assertNotNull(dragData);
assertFalse(dragData.isReadOnly());
final String linkURL = "http://test.com/test.html";
dragData.setLinkURL(linkURL);
assertEquals(linkURL, dragData.getLinkURL());
final String linkTitle = "Test Title";
dragData.setLinkTitle(linkTitle);
assertEquals(linkTitle, dragData.getLinkTitle());
final String linkMetadata = "something";
dragData.setLinkMetadata(linkMetadata);
assertEquals(linkMetadata, dragData.getLinkMetadata());
assertTrue(dragData.isLink());
assertFalse(dragData.isFile());
assertFalse(dragData.isFragment());
// Explicit cleanup to avoid memory leaks.
dragData.dispose();
}
@Test
void createFile() {
CefDragData dragData = CefDragData.create();
assertNotNull(dragData);
assertFalse(dragData.isReadOnly());
final String path1 = "/path/to/file1.txt";
final String path2 = "/path/to/file2.txt";
dragData.addFile(path1, "File 1");
dragData.addFile(path2, "File 2");
Vector<String> fileNames = new Vector<>();
assertTrue(dragData.getFileNames(fileNames));
assertEquals(2, fileNames.size());
assertEquals(path1, fileNames.get(0));
assertEquals(path2, fileNames.get(1));
assertFalse(dragData.isLink());
assertTrue(dragData.isFile());
assertFalse(dragData.isFragment());
// Explicit cleanup to avoid memory leaks.
dragData.dispose();
}
@Test
void createFragment() {
CefDragData dragData = CefDragData.create();
assertNotNull(dragData);
assertFalse(dragData.isReadOnly());
final String fragmentText = "something";
dragData.setFragmentText(fragmentText);
assertEquals(fragmentText, dragData.getFragmentText());
final String fragmentHtml = "<span>something</span>";
dragData.setFragmentHtml(fragmentHtml);
assertEquals(fragmentHtml, dragData.getFragmentHtml());
final String fragmentBaseURL = "http://test.com/test.html";
dragData.setFragmentBaseURL(fragmentBaseURL);
assertEquals(fragmentBaseURL, dragData.getFragmentBaseURL());
assertFalse(dragData.isLink());
assertFalse(dragData.isFile());
assertTrue(dragData.isFragment());
// Explicit cleanup to avoid memory leaks.
dragData.dispose();
}
@Test
void cloneObject() {
CefDragData dragData = CefDragData.create();
assertNotNull(dragData);
assertFalse(dragData.isReadOnly());
final String fragmentText = "something";
final String fragmentBaseURL = "http://test.com/test.html";
dragData.setFragmentText(fragmentText);
dragData.setFragmentBaseURL(fragmentBaseURL);
CefDragData dragData2 = dragData.clone();
assertFalse(dragData2.isReadOnly());
assertEquals(fragmentText, dragData2.getFragmentText());
assertEquals(fragmentBaseURL, dragData2.getFragmentBaseURL());
assertFalse(dragData2.isLink());
assertFalse(dragData2.isFile());
assertTrue(dragData2.isFragment());
// Explicit cleanup to avoid memory leaks.
dragData.dispose();
dragData2.dispose();
}
@Test
void disposeObject() {
CefDragData dragData = CefDragData.create();
assertNotNull(dragData);
assertFalse(dragData.isReadOnly());
final String fragmentText = "something";
dragData.setFragmentText(fragmentText);
assertEquals(fragmentText, dragData.getFragmentText());
// Explicit cleanup to avoid memory leaks.
// After dispose() the Java object is no longer backed by a CEF object.
dragData.dispose();
assertEquals(null, dragData.getFragmentText());
}
}
@@ -0,0 +1,299 @@
// Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
package tests.junittests;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static tests.junittests.TestSetupContext.debugPrint;
import org.cef.CefApp;
import org.cef.CefClient;
import org.cef.browser.CefBrowser;
import org.cef.browser.CefFrame;
import org.cef.callback.CefAuthCallback;
import org.cef.callback.CefCallback;
import org.cef.handler.CefCookieAccessFilter;
import org.cef.handler.CefLifeSpanHandler;
import org.cef.handler.CefLoadHandler;
import org.cef.handler.CefRequestHandler;
import org.cef.handler.CefResourceHandler;
import org.cef.handler.CefResourceRequestHandler;
import org.cef.misc.BoolRef;
import org.cef.misc.StringRef;
import org.cef.network.CefRequest;
import org.cef.network.CefRequest.TransitionType;
import org.cef.network.CefResponse;
import org.cef.network.CefURLRequest;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.HashMap;
import java.util.concurrent.CountDownLatch;
import javax.swing.JFrame;
// Base class for browsers that run tests.
class TestFrame extends JFrame implements CefLifeSpanHandler, CefLoadHandler, CefRequestHandler,
CefResourceRequestHandler {
private static final long serialVersionUID = -5570653778104813836L;
private boolean isClosed_ = false;
private CountDownLatch countdown_ = new CountDownLatch(1);
// Resources that have been populated for the test.
private class ResourceContent {
String content;
String mimeType;
HashMap<String, String> headerMap;
}
private HashMap<String, ResourceContent> resourceMap_ = null;
protected final CefClient client_;
protected CefBrowser browser_ = null;
TestFrame() {
client_ = CefApp.getInstance().createClient();
assertNotNull(client_);
// Browser window closing works as follows:
// 1. Sending WindowEvent.WINDOW_CLOSING calls WindowAdapter.windowClosing.
// 2. WindowAdapter.windowClosing calls CefBrowser.close(false).
// 3. CEF calls CefLifeSpanHandler.doClose() which calls CefBrowser.doClose()
// which returns true (canceling the close).
// 4. CefBrowser.doClose() triggers another call to WindowAdapter.windowClosing.
// 5. WindowAdapter.windowClosing calls CefBrowser.close(true).
// 6. For windowed browsers CEF destroys the native window handle. For OSR
// browsers CEF calls CefLifeSpanHandler.doClose() which calls
// CefBrowser.doClose() again which returns false (allowing the close).
// 7. CEF calls CefLifeSpanHandler.onBeforeClose and the browser is destroyed.
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
boolean isClosed = isClosed_;
if (isClosed) {
// Cause browser.doClose() to return false so that OSR browsers
// can close.
browser_.setCloseAllowed();
}
// Results in another call to this method.
if (debugPrint())
System.out.println("windowClosing CefBrowser.close(" + isClosed + ")");
browser_.close(isClosed);
if (!isClosed_) {
isClosed_ = true;
}
if (isClosed) {
// Dispose after the 2nd call to this method.
if (debugPrint()) System.out.println("windowClosing Frame.dispose");
dispose();
}
}
});
client_.addLifeSpanHandler(this);
client_.addLoadHandler(this);
client_.addRequestHandler(this);
setupTest();
}
protected void createBrowser(String startURL) {
assertNull(browser_);
browser_ = client_.createBrowser(startURL, false /* useOSR */, false /* isTransparent */);
assertNotNull(browser_);
getContentPane().add(browser_.getUIComponent(), BorderLayout.CENTER);
pack();
setSize(800, 600);
setVisible(true);
}
// Override this method to perform test setup.
protected void setupTest() {}
// Override this method to perform test cleanup.
protected void cleanupTest() {
if (debugPrint()) System.out.println("cleanupTest");
client_.dispose();
// Allow the test to complete.
countdown_.countDown();
}
// Call this method to terminate the test by dispatching a window close event.
protected final void terminateTest() {
if (debugPrint()) System.out.println("terminateTest");
if (!isClosed_) {
dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
}
// Block until the test completes.
public final void awaitCompletion() {
try {
countdown_.await();
} catch (InterruptedException e) {
}
if (debugPrint()) System.out.println("awaitCompletion returned");
}
protected void addResource(String url, String content, String mimeType) {
addResource(url, content, mimeType, null);
}
// Add a resource that will be returned via getResourceHandler().
protected void addResource(
String url, String content, String mimeType, HashMap<String, String> headerMap) {
if (resourceMap_ == null) resourceMap_ = new HashMap<>();
assertNull(resourceMap_.get(url));
ResourceContent rc = new ResourceContent();
rc.content = content;
rc.mimeType = mimeType;
rc.headerMap = headerMap;
resourceMap_.put(url, rc);
}
// CefLifeSpanHandler methods:
@Override
public void onAfterCreated(CefBrowser browser) {
if (debugPrint()) System.out.println("onAfterCreated id=" + browser.getIdentifier());
}
@Override
public boolean onBeforePopup(
CefBrowser browser, CefFrame frame, String target_url, String target_frame_name) {
return false;
}
@Override
public void onAfterParentChanged(CefBrowser browser) {}
@Override
public boolean doClose(CefBrowser browser) {
boolean result = browser.doClose();
if (debugPrint()) {
System.out.println(
"doClose id=" + browser.getIdentifier() + " CefBrowser.doClose=" + result);
}
return result;
}
@Override
public void onBeforeClose(CefBrowser browser) {
if (debugPrint()) System.out.println("onBeforeClose id=" + browser.getIdentifier());
cleanupTest();
}
// CefLoadHandler methods:
@Override
public void onLoadingStateChange(
CefBrowser browser, boolean isLoading, boolean canGoBack, boolean canGoForward) {}
@Override
public void onLoadStart(CefBrowser browser, CefFrame frame, TransitionType transitionType) {}
@Override
public void onLoadEnd(CefBrowser browser, CefFrame frame, int httpStatusCode) {}
@Override
public void onLoadError(CefBrowser browser, CefFrame frame, ErrorCode errorCode,
String errorText, String failedUrl) {}
// CefRequestHandler methods:
@Override
public boolean onBeforeBrowse(CefBrowser browser, CefFrame frame, CefRequest request,
boolean user_gesture, boolean is_redirect) {
return false;
}
@Override
public boolean onOpenURLFromTab(
CefBrowser browser, CefFrame frame, String target_url, boolean user_gesture) {
return false;
}
@Override
public CefResourceRequestHandler getResourceRequestHandler(CefBrowser browser, CefFrame frame,
CefRequest request, boolean isNavigation, boolean isDownload, String requestInitiator,
BoolRef disableDefaultHandling) {
return this;
}
@Override
public boolean getAuthCredentials(CefBrowser browser, String origin_url, boolean isProxy,
String host, int port, String realm, String scheme, CefAuthCallback callback) {
return false;
}
@Override
public boolean onCertificateError(CefBrowser browser, CefLoadHandler.ErrorCode cert_error,
String request_url, CefCallback callback) {
return false;
}
@Override
public void onRenderProcessTerminated(
CefBrowser browser, TerminationStatus status, int error_code, String error_string) {}
// CefResourceRequestHandler methods:
@Override
public CefCookieAccessFilter getCookieAccessFilter(
CefBrowser browser, CefFrame frame, CefRequest request) {
return null;
}
@Override
public boolean onBeforeResourceLoad(CefBrowser browser, CefFrame frame, CefRequest request) {
return false;
}
@Override
public CefResourceHandler getResourceHandler(
CefBrowser browser, CefFrame frame, CefRequest request) {
if (resourceMap_ != null) {
String url = request.getURL();
// Ignore the query component, if any.
int idx = url.indexOf('?');
if (idx > 0) url = url.substring(0, idx);
ResourceContent rc = resourceMap_.get(url);
if (rc != null) {
if (debugPrint()) System.out.println("Found resource for: " + url);
return new TestResourceHandler(rc.content, rc.mimeType, rc.headerMap);
}
}
return null;
}
@Override
public void onResourceRedirect(CefBrowser browser, CefFrame frame, CefRequest request,
CefResponse response, StringRef new_url) {}
@Override
public boolean onResourceResponse(
CefBrowser browser, CefFrame frame, CefRequest request, CefResponse response) {
return false;
}
@Override
public void onResourceLoadComplete(CefBrowser browser, CefFrame frame, CefRequest request,
CefResponse response, CefURLRequest.Status status, long receivedContentLength) {}
@Override
public void onProtocolExecution(
CefBrowser browser, CefFrame frame, CefRequest request, BoolRef allowOsExecution) {}
}
@@ -0,0 +1,63 @@
// Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
package tests.junittests;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.cef.browser.CefBrowser;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
// Test the TestFrame implementation.
@ExtendWith(TestSetupExtension.class)
class TestFrameTest {
private boolean gotSetupTest_ = false;
private boolean gotCleanupTest_ = false;
private boolean gotLoadingStateChange_ = false;
@Test
void minimal() {
final String testUrl = "http://test.com/test.html";
TestFrame frame = new TestFrame() {
@Override
protected void setupTest() {
assertFalse(gotSetupTest_);
gotSetupTest_ = true;
addResource(testUrl, "<html><body>Test!</body></html>", "text/html");
createBrowser(testUrl);
super.setupTest();
}
@Override
protected void cleanupTest() {
assertFalse(gotCleanupTest_);
gotCleanupTest_ = true;
super.cleanupTest();
}
@Override
public void onLoadingStateChange(CefBrowser browser, boolean isLoading,
boolean canGoBack, boolean canGoForward) {
if (!isLoading) {
assertFalse(gotLoadingStateChange_);
gotLoadingStateChange_ = true;
terminateTest();
}
}
};
frame.awaitCompletion();
assertTrue(gotSetupTest_);
assertTrue(gotLoadingStateChange_);
assertTrue(gotCleanupTest_);
}
}
@@ -0,0 +1,69 @@
// Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
package tests.junittests;
import org.cef.callback.CefCallback;
import org.cef.handler.CefResourceHandlerAdapter;
import org.cef.misc.IntRef;
import org.cef.misc.StringRef;
import org.cef.network.CefRequest;
import org.cef.network.CefResponse;
import java.nio.ByteBuffer;
import java.util.HashMap;
class TestResourceHandler extends CefResourceHandlerAdapter {
private int offset_ = 0;
private final String content_;
private final String mimeType_;
private final HashMap<String, String> headerMap_;
TestResourceHandler(String content, String mimeType, HashMap<String, String> headerMap) {
content_ = content;
mimeType_ = mimeType;
headerMap_ = headerMap;
}
@Override
public boolean processRequest(CefRequest request, CefCallback callback) {
callback.Continue();
return true;
}
@Override
public void getResponseHeaders(
CefResponse response, IntRef response_length, StringRef redirectUrl) {
response_length.set(content_.length());
response.setMimeType(mimeType_);
response.setStatus(200);
if (headerMap_ != null) {
HashMap<String, String> headerMap = new HashMap<>();
response.getHeaderMap(headerMap);
headerMap.putAll(headerMap_);
response.setHeaderMap(headerMap);
}
}
@Override
public boolean readResponse(
byte[] data_out, int bytes_to_read, IntRef bytes_read, CefCallback callback) {
int length = content_.length();
if (offset_ >= length) return false;
// Extract up to |bytes_to_read| bytes from |content_|.
int endPos = offset_ + bytes_to_read;
String dataToSend = (endPos > length) ? content_.substring(offset_)
: content_.substring(offset_, endPos);
// Copy extracted bytes into |data_out| and set the read length to |bytes_read|.
ByteBuffer result = ByteBuffer.wrap(data_out);
result.put(dataToSend.getBytes());
bytes_read.set(dataToSend.length());
offset_ = endPos;
return true;
}
}
@@ -0,0 +1,27 @@
// Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
package tests.junittests;
import org.junit.jupiter.api.extension.ExtensionContext;
import java.util.Optional;
// Stores global test setup state for access from package classes.
class TestSetupContext {
private static boolean debugPrint_ = false;
// Debug print statements may be enabled via `--config debugPrint=true`.
static boolean debugPrint() {
return debugPrint_;
}
// Initialize from global configuration parameters.
static void initialize(ExtensionContext context) {
Optional<String> debugPrint = context.getConfigurationParameter("debugPrint");
if (debugPrint.isPresent() && debugPrint.get().equalsIgnoreCase("true")) {
debugPrint_ = true;
}
}
}
@@ -0,0 +1,90 @@
// Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
package tests.junittests;
import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.GLOBAL;
import org.cef.CefApp;
import org.cef.CefApp.CefAppState;
import org.cef.CefSettings;
import org.cef.handler.CefAppHandlerAdapter;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import java.util.concurrent.CountDownLatch;
// All test cases must install this extension for CEF to be properly initialized
// and shut down.
//
// For example:
//
// @ExtendWith(TestSetupExtension.class)
// class FooTest {
// @Test
// void testCaseThatRequiresCEF() {}
// }
//
// This code is based on https://stackoverflow.com/a/51556718.
public class TestSetupExtension
implements BeforeAllCallback, ExtensionContext.Store.CloseableResource {
private static boolean initialized_ = false;
private static CountDownLatch countdown_ = new CountDownLatch(1);
@Override
public void beforeAll(ExtensionContext context) {
if (!initialized_) {
initialized_ = true;
initialize(context);
}
}
// Executed before any tests are run.
private void initialize(ExtensionContext context) {
TestSetupContext.initialize(context);
if (TestSetupContext.debugPrint()) {
System.out.println("TestSetupExtension.initialize");
}
// Register a callback hook for when the root test context is shut down.
context.getRoot().getStore(GLOBAL).put("jcef_test_setup", this);
// Perform startup initialization on platforms that require it.
if (!CefApp.startup(null)) {
System.out.println("Startup initialization failed!");
return;
}
CefApp.addAppHandler(new CefAppHandlerAdapter(null) {
@Override
public void stateHasChanged(org.cef.CefApp.CefAppState state) {
if (state == CefAppState.TERMINATED) {
// Signal completion of CEF shutdown.
countdown_.countDown();
}
}
});
// Initialize the singleton CefApp instance.
CefSettings settings = new CefSettings();
CefApp.getInstance(settings);
}
// Executed after all tests have completed.
@Override
public void close() {
if (TestSetupContext.debugPrint()) {
System.out.println("TestSetupExtension.close");
}
CefApp.getInstance().dispose();
// Wait for CEF shutdown to complete.
try {
countdown_.await();
} catch (InterruptedException e) {
}
}
}